2010-10-07 67 views
2

我试图在时间序列的日内数据(即10秒)上实现可变指数移动平均值。通过变量,我的意思是包含在移动平均数中的窗口大小取决于另一个因素(即波动率)。我想的以下内容:高效计算“变量(包含的点数)”移动平均数R

MA(T)=α(t)的*价格(T)+(1-α(t))的MA(T-1),

其中alpha例如对应于到波动性指数的变化。

在一个巨大系列(超过100000)点的回测中,这个计算会导致我“麻烦”。我有完整的矢量alpha和价格,但对于MA的当前值,我总是需要之前计算的值。因此,到目前为止,我没有看到一个矢量化的解决方案?

我的另一个想法是试图直接将实现的EMA(..,n = f())函数应用于每个数据点,因为f()始终具有不同的值。但是到目前为止我还没有找到一个快速的解决方案。

如果有人可以帮我解决问题,会非常友善吗???甚至关于如何构建变量移动平均线的其他建议也会很好。

THX很多提前 马丁

+0

我会在接下来的几天将这个功能添加到TTR包中。 – 2010-10-07 11:48:39

回答

0

对于时间序列,在动物园里看到包的功能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) 
}) 

这个计算的平均值作为垫的线性组合,由阿尔法的累计产品定义权重。

在一个旁注:我假定索引躺下1.一种非常有效的移动平均运算经由filter()介于0和

+0

感谢您的回答,但这些函数假设固定的窗口...... – Martin 2010-10-07 09:10:47

+0

@Martin:我也实现了你自己的计算。我误解了你真正想做的事情,希望我现在明白了。干杯 – 2010-10-07 10:00:13

3

也是可能的:

## 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)) 

即仅左侧,其他选择是可能的。

+0

我非常感谢你的提示, – Martin 2010-10-09 07:02:47

+0

看到你的名字,我知道得到真正有经验的R用户甚至开发者的帮助...... – Martin 2010-10-09 07:04:02

+1

快乐!认识周围的方法是:a)对你觉得有帮助的问题进行“投票”,所以你点击向上三角形(或者如果你不够强烈地反对,就下来),同样b)如果你是“接受”一个问。 – 2010-10-09 15:44:29

0

我刚刚为TTR包添加了一个VMA函数来执行此操作。例如:

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上。