1

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

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

第二天,一个新值被添加到原始向量的末尾,x更新后的x向量为:

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

预期的输出是 -

y = [1] NA NA NA NA 13.33400 13.22267 13.52844 14.44563 16.51042 16.88695 17.28796

此输出可由 生成EMA(x, 5),但此语句将再次计算整个向量的 EMA,并且时间效率低下。由于我们已经在 vector 中计算了前一天的 EMA y,有没有办法计算过去 5 天的 EMA,而不是重新计算整个 vector 并合并 vector 中的新值y

谢谢!

4

2 回答 2

1

如果你阅读?TTR::EMA

对于“EMA”,“wilder=FALSE”(默认)使用指数平滑比“2/(n+1)”

它有助于理解在 EMA 中,该比率实际上是应用于当前( x) 的权重,而倒数 (1 减去此) 应用于先前的平均值( y)。

x = c(14.24, 13.82, 12.75, 12.92, 12.94, 13.00, 14.14, 16.28, 20.64, 17.64)
n <- 5
y <- TTR::EMA(x, n)

x = c(14.24, 13.82, 12.75, 12.92, 12.94, 13.00, 14.14, 16.28, 20.64, 17.64, 18.09)
ratio <- 2/(n+1)
ratio
# [1] 0.3333333
sum( c(y[10], x[11]) * c(1-ratio, ratio) )
# [1] 17.28796
于 2021-01-14T21:51:10.167 回答
1

正如这篇文章中已经建议的那样,查看 C 代码TTR提供了一个可能的解决方案:

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

n <- 5
y = TTR::EMA(x,n)

ratio <- 2 / (n+1)

newx <- 18.09
newy <- tail(y,1) * (1 - ratio) + ratio * newx
newy
#> [1] 17.28796

y = c(y,newy)
y
#>  [1]       NA       NA       NA       NA 13.33400 13.22267 13.52844 14.44563
#>  [9] 16.51042 16.88695 17.28796
于 2021-01-14T21:52:02.487 回答