R中向量最后一个值的指数移动平均值
Exponential moving average of just the last value of a vector in 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
第二天,一个新值被添加到原始向量 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,并且时间效率低下。
由于我们已经在向量 y
中进行了前一天的 EMA 计算,
有没有办法计算最近 5 天的 EMA,而不是重新计算整个向量并将新值合并到向量 y
?
谢谢!
如果您阅读 ?TTR::EMA
,
For 'EMA', 'wilder=FALSE' (the default) uses an exponential smoothing ratio of '2/(n+1)'
有助于理解在 EMA 中,该比率实际上是应用于当前 值 (x
) 的权重,以及倒数(一减去这个)应用于之前的平均值 (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
正如 中已经建议的那样,查看 TTR
的 C 代码提供了一个可能的解决方案:
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
我有一个简单的向量如下:
x = c(14.24, 13.82, 12.75, 12.92, 12.94, 13.00, 14.14, 16.28, 20.64, 17.64)
我使用
找到了这个向量的 EMAlibrary(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,并且时间效率低下。
由于我们已经在向量 y
中进行了前一天的 EMA 计算,
有没有办法计算最近 5 天的 EMA,而不是重新计算整个向量并将新值合并到向量 y
?
谢谢!
如果您阅读 ?TTR::EMA
,
For 'EMA', 'wilder=FALSE' (the default) uses an exponential smoothing ratio of '2/(n+1)'
有助于理解在 EMA 中,该比率实际上是应用于当前 值 (x
) 的权重,以及倒数(一减去这个)应用于之前的平均值 (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
正如 TTR
的 C 代码提供了一个可能的解决方案:
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