我正在尝试在日内数据的时间序列(即10秒)上实现可变指数移动平均线。通过变量,我的意思是移动平均线中包含的窗口大小取决于另一个因素(即波动率)。我在考虑以下几点:
MA(t)= alpha(t)* price(t)+(1-alpha(t))MA(t-1),
其中alpha对应于变化的波动率指数。
在大型系列(超过100000)点的回测中,这个计算导致我“麻烦”。我有完整的向量alpha和价格,但对于MA的当前值我总是需要之前计算的值。因此,到目前为止,我没有看到矢量化解决方案????
我的另一个想法是尝试直接将实现的EMA(..,n = f())函数应用于每个数据点,总是为f()设置不同的值。但到目前为止我还没有找到快速解决方案。
如果有人可以帮助我处理我的问题,那会非常友好吗?甚至关于如何构建可变移动平均线的其他建议也会很棒。
提前做了很多事 马丁
答案 0 :(得分:3)
通过filter()
:
## create a weight vector -- this one has equal weights, other schemes possible
weights <- rep(1/nobs, nobs)
## and apply it as a one-sided moving average calculations, see help(filter)
movavg <- as.vector(filter(somevector, weights, method="convolution", side=1))
这只是左翼,其他选择是可能的。
答案 1 :(得分:0)
对于时间序列,请参阅zoo包中的函数rollmean
。
您实际上并不计算移动平均线,而是某种加权累积平均值。 (加权)移动平均线将类似于:
price <- runif(100,10,1000)
alpha <- rbeta(100,1,0.5)
tp <- embed(price,2)
ta <- embed(alpha,2)
MA1 <- apply(cbind(tp,ta),1,function(x){
weighted.mean(x[1:2],w=2*x[3:4]/sum(x))
})
确保重新调整权重,使它们与观察量相加。
对于您自己的计算,您可以尝试类似:
MAt <- price*alpha
ma.MAt <- matrix(rep(MAt,each=n),nrow=n)
ma.MAt[upper.tri(ma.MAt)] <- 0
tt1 <- sapply(1:n,function(x){
tmp <- rev(c(rep(0,n-x),1,cumprod(rev(alpha[1:(x-1)])))[1:n])
sum(ma.MAt[i,]*tmp)
})
这将平均值计算为MAt的线性组合,权重由alpha的累积乘积定义。
在旁注上:我假设指数介于0和1之间。
答案 2 :(得分:0)
我刚刚在VMA
包中添加了TTR
函数来执行此操作。例如:
library(quantmod) # loads TTR
getSymbols("SPY")
SPY$absCMO <- abs(CMO(Cl(SPY),20))/100
SPY$vma <- VMA(Cl(SPY), SPY$absCMO)
chartSeries(SPY,TA="addTA(SPY$vma,on=1,col='blue')")
x <- xts(rnorm(1e6),Sys.time()-1e6:1)
y <- xts(runif(1e6),Sys.time()-1e6:1)
system.time(VMA(x,y)) # < 0.5s on a 2.2Ghz Centrino
文档中的一些注释:
'VMA'计算可变长度 基于绝对值的移动平均线 'w'的价值。更高(更低)的值 'w'会导致'VMA'反应 更快(更慢)。
pre-compiled binaries应在24小时内R-forge上。