【问题标题】:Exponential moving average of just the last value of a vector in RR中向量的最后一个值的指数移动平均值
【发布时间】:2021-04-19 20:12:53
【问题描述】:

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

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

谢谢!

【问题讨论】:

  • 最后一个值是什么意思。只有一个元素
  • 我仍在试图了解您是如何从tail(x, 5) 获得 18.09 的
  • 18.09计算不清楚。我没有得到那个价值
  • 你能不能显示你的预期输出,因为我不清楚
  • 我检查了你的更新,但它仍然是与18.09 相同的输入“x”。不清楚您的预期输出是什么

标签: r ttr


【解决方案1】:

如果你读到?TTR::EMA

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

这有助于理解,在 EMA 中,这个比率实际上是应用于当前 (x) 的权重,而倒数 (1 减去 this) 应用于前一个 平均 (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

【讨论】:

  • 感谢您简单地解释 EMA。它使我对 EMA 的理解更加清晰。
【解决方案2】:

正如this post 中已经建议的那样,查看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

【讨论】:

  • 谢谢!使用 y[length(y)] 而不是 tail(y,1) 可以大大加快速度。
  • 感谢您的反馈,与 R 一样,基准测试是找出哪个解决方案更快的唯一方法!
猜你喜欢
  • 2021-04-12
  • 2021-08-13
  • 2018-06-14
  • 1970-01-01
  • 1970-01-01
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多