【问题标题】:Efficient computation of "variable (number of points included)" moving average in RR中“变量(包括点数)”移动平均线的有效计算
【发布时间】:2010-10-07 07:26:46
【问题描述】:

我正在尝试对日内数据的时间序列(即 10 秒)实施可变指数移动平均线。通过变量,我的意思是移动平均线中包含的窗口大小取决于另一个因素(即波动性)。我在想以下几点:

MA(t)=alpha(t)*price(t) + (1-alpha(t))MA(t-1),

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

在对庞大系列(超过 100000 个)点的回测中,这种计算给我带来了“麻烦”。我有完整的向量 alpha 和 price,但对于 MA 的当前值,我总是需要之前计算的值。因此,到目前为止,我还没有看到矢量化解决方案????

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

如果有人能帮我解决我的问题会很友好???甚至其他关于如何构建可变移动平均线的建议也很棒。

提前致谢 马丁

【问题讨论】:

  • 我会在接下来的几天内将此功能添加到 TTR 包中。

标签: variables r performance moving-average


【解决方案1】:

通过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)) 

这只是左侧,其他选择也是可能的。

【讨论】:

  • 非常感谢您的所有提示,
  • 看到你的名字,我知道得到了真正有经验的 R 用户甚至开发人员的帮助......
  • 很高兴!确认的方法是 a) 对你认为有帮助的问题“投票”,这样你就可以点击向上的三角形(如果你不同意的话,可以点击向下的三角形),同样 b) 如果你是一问。
【解决方案2】:

有关时间序列,请参阅 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 之间。

【讨论】:

  • @Martin:我也实现了你自己的计算。我误解了你真正想要做什么,希望我现在明白了。干杯
【解决方案3】:

我刚刚在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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-02-04
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    相关资源
    最近更新 更多