我目前正在尝试对两个时间序列进行分析。由于我的两个时间序列都是金融股票数据,因此我想尝试找到一些相似之处。
第一件事:
问题:获取我的两个时间序列数据:
# Get quantmod for pulling the data
if (!require("quantmod")) {
install.packages("quantmod")
library(quantmod)
}
#defining the period for time series 1:
start <- as.Date("1997-08-08")
end <- as.Date("2000-12-31")
#Pulling data directly from Yahoo using the Quantmod package
getSymbols('^NDX',src='yahoo', from = start, to = end)
由于我认为我的数据有点嘈杂,因此我将5天平均值进行平滑处理,然后对数据进行归一化以比较两个时间序列:
####taking the average due to noisy daily data -> smoothing it:
ma <- function(x,n=5){filter(x,rep(1/n,n), sides=1)}
#NDX smoothing - 5 day average and delete NA (missing values)
sNDX <- na.omit(data.frame(sNDX = ma(NDX[, "NDX.Close"], n=5)))
#NDX smoothed data normalizing
nNDX <- data.frame(time = 1:nrow(sNDX), nNDX = nd(sNDX))
此过程是第二次进行...
重要的是,两个时间序列都从不同的日期开始,并且具有不同的长度。我认为开始日期并不那么重要,因为我正在对数据进行规范化并将其按索引1:n缩放。
现在,我想到了使用动态时间规整。 “在时间序列分析中,动态时间规整(DTW)是用于测量两个时间序列之间相似度的算法之一,它们之间的速度可能会发生变化。” (https://en.wikipedia.org/wiki/Dynamic_time_warping)
我在R中使用了称为dtw()的程序包,因为该程序包似乎是在两个时间序列上计算DTW的最佳程序包。
从软件包中:“动态时间扭曲是一种比较时间序列的流行技术,它既提供了对局部压缩和拉伸不敏感的距离度量,又提供了使两个输入序列之一最佳变形到屏幕上的扭曲。文献中已经讨论了各种算法和约束条件,dtw软件包提供了它们的统一性;它允许R用户自由混合各种连续性约束条件,约束窗口,端点,局部距离定义,该软件包还提供了使用几种经典图表类型可视化路线和约束的功能。“ (http://dtw.r-forge.r-project.org/)
立即打包:
# Get DTW
if (!require("dtw")) {
install.packages("dtw")
library(dtw)
}
#Defining the DTW function with query=nNDX$sNDX and index=nbdx$sbdx
ts <- dtw(nNDX$sNDX, nbdx$sbdx, keep=TRUE,step=asymmetric,
open.end=TRUE,open.begin=TRUE)
hi <- 1:length(ts$index1)
#creating a three plot:
dtwPlotThreeWay(ts,match.indices=hi)
Three Way Plot of DTW with different lenghts
上面的图片在矢量中的长度不同。
此长度几乎相同:
Three Way Plot of DTW with almost same lenghts
现在我的问题是,我可以使用更少的数据作为参考索引吗,因为第二张图表的数据量几乎相同,因此显示出巨大的垂直移动。根据DTW算法,这似乎是参考索引中的所有数据都引用查询索引中的第一个数据点。 另外,在软件包中,他们讨论了不同的步进模式移动。我使用了非对称,但是在大多数情况下,对称是最熟悉的:
anyopne可以帮助我吗,应该正确使用哪种方法?
有关更多详细信息,请告诉我。
最好, 阿伦