# 1. создадим вектор с рандомными значениями, это будут нашы "синтетические" цены rnd <- cumsum(rnorm(100000))+1000 plot(rnd_1,t="l") # 2. нарежем нашы цены на два "скользящие окна" но окна будут разной длинны # сделаем это через матрицу генкеля или хенкеля, черт его знает )) hankel <- function(data, r=10) { do.call(cbind, lapply(0:(r-1),function(i) { data[(i+1):(length(data)-(r-1-i))]}))} #hankel matrx # У dat.5 размер окна, те размер самого отрезка с ценой будет 5 значений. dat.5 <- hankel(rnd, r = 5) # У dat.13 размер окна, будет 13 значений dat.13 <- hankel(rnd, r = 13) # 3. нормализируем нашы матрицы построчно dat.5 <- t(apply(dat.5, 1, function(x) scale(x,T,T))) dat.13 <- t(apply(dat.13, 1, function(x) scale(x,T,T))) # 4. создадим вектор для каждой матрицы в котором будем хранить посчитаню евклидому близость dist.vector.5 <- rep(1:nrow(dat.13) ,0) dist.vector.13 <- rep(1:nrow(dat.13) ,0) install.packages("dtw") # установка пакета library(dtw) # запуск пакета # 5. Создадим вектор-паттерн с которым мы и будем искать близость со всей выборкой # длинна паттерна 8, те не совпадает размерами с выше созданых участков у них 5 и 13 # также сразу нормализирую паттерн, все сделаю в одной строчке, пусть не читабельно но зато коротко pattern <- as.vector( scale( cumsum(rnorm(8))+1000 , T,T) ) ; plot(pattern,t="l") # приблуда для отображения прогресса так как процес медленный pb <- winProgressBar(title = "progress bar", min = 0,max = nrow(dat.13), width = 300) # 6. щитаем близость по всей выбрке в двух матрицах и записываем в соответсвующие вектора for(i in 1:nrow(dat.13)){ setWinProgressBar(pb, i, title=paste( round(i/nrow(dat.13)*100, 0),"% done")) dist.vector.5[i] <- dtw( pattern, dat.5[i,], distance.only = T)$distance dist.vector.13[i] <- dtw( pattern, dat.13[i,], distance.only = T)$distance } close(pb) # 7. найдем индекс в векторе в котором была самая сильная близость с нашым паттерном - pattern idx.5 <- which.min(dist.vector.5) idx.13 <- which.min(dist.vector.13) # 8. сравним найденые близкие паттерны с нашым паттерном layout(1:3) plot(pattern,t="l" , main = "главный паттерн с размером 8", lwd=2) plot(dat.5[idx.5,], t="l" , main = "паттерн аналог с размером 5") plot(dat.13[idx.13,], t="l" , main = "паттерн аналог с размером 13")