R中向量的指数移动平均值

问题描述

我有一个简单的向量如下:

x = c(14.24,13.82,12.75,12.92,12.94,13.00,14.14,16.28,20.64,17.64)

我正在尝试使用以下函数找到该向量的滚动 EMA -

library(TTR)
y = EMA(x,5)

我得到的结果如下 -

 [1]     NA     NA     NA     NA 13.33400 13.22267 13.52844 14.44563 16.51042 16.88695

但是,我想要的结果如下 -

 [1]     14.24 14.03 13.06 13.43 13.33400 13.22267 13.52844 14.44563 16.51042 16.88695
  1. 第一个值应该与原始向量中的相同
  2. 第二个值应该是第一个和第二个值的 EMA
  3. 第三个值应该是初始三个值的 EMA 矢量
  4. 第四个值应该是向量中初始四个值的 EMA

其余的计算由函数 EMA 正确处理

我尝试过的解决方案 -

  1. 运行以下命令 - zoo::rollapplyr(x,width = 5,FUN = EMA,partial = TRUE) 会报错,因为 EMA 有自己的滚动窗口。

  2. 使用函数 stats::filter 有效,但答案不正确,因为我不确定 ratio 参数的正确值。 Fast R implementation of an Exponentially Weighted Moving Average? 这是一个自定义函数。

ema_2 <- function (k,width) {
  ratio <- 2/(width + 1)
  c(stats::filter(k * ratio,1 - ratio,"convolution",init = k[1]))
}

理想的解决方案最多需要两倍于 EMA 库的 TTR 函数的计算时间。

以下是 Waldi 和 Andre 分享的 2 个解决方案的性能结果。

              expr     min       lq     mean   median       uq      max neval cld
    TTR::EMA(x,5) 433.593 457.5815 500.9478 477.0535 530.7105  1128.49  1000   a
        EMA3(x,5) 445.388 468.9585 515.2009 490.4345 546.5025  1843.46  1000   a
 rollmeanEMA(x,5) 436.689 461.0885 535.7035 481.8815 538.3150 33122.75  1000   a

谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)