我有一个简单的向量如下:
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
- 第一个值应与原始向量中的相同
- 第二个值应该是第一个和第二个值的 EMA
- 第三个值应该是向量中初始三个值的 EMA
- 第四个值应该是向量中初始四个值的 EMA
其余的计算由函数正确处理EMA
我尝试过的解决方案 -
运行以下命令 -
zoo::rollapplyr(x, width = 5, FUN = EMA, partial = TRUE)
将给出错误,因为 EMA 有自己的滚动窗口。使用函数
stats::filter
有效,但答案不正确,因为我不确定 ratio 参数的正确值。指数加权移动平均线的快速 R 实现? 这是一个自定义函数。
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
谢谢!