问题描述
我有一个简单的向量如下:
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 参数的正确值。 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 (将#修改为@)