【问题标题】:Lagged exponential moving average of a vector向量的滞后指数移动平均值
【发布时间】:2021-08-13 06:05:23
【问题描述】:

给定一个简单的82个观察向量

x = c(102, 104, 89, 89, 76, 95, 88, 112, 81, 101, 101, 104, 94, 111, 108, 104, 93, 92, 86, 113, 93, 100, 92, 80, 92, 126, 102, 109, 104, 95, 84, 81, 103, 83, 103, 83, 58, 109, 89, 93, 104, 104, 123, 104, 93, 76, 103, 103, 100, 105, 108, 90, 122, 103, 114, 102, 87, 98, 88, 107, 102, 80, 81, 96, 107, 105, 113, 98, 93, 104, 94, 107, 107, 97, 102, 82, 90, 97, 124, 109, 96, 92)

我想以这种方式执行此向量的 EMA(指数移动平均线):

  • 新向量的第一个元素应该是NA

  • 第二个元素应该是原始向量的第一个元素

  • 第三个元素应该是原始向量的第一个和第二个元素的EMA

  • 第4个元素应该是原始向量前三个元素的EMA

    ...

  • 第82个元素应该是原始向量除最后一个之外所有值的EMA

我们的想法是对最近的向量元素赋予更大的权重,并且新向量的最后一个元素也受到原始向量的第一个元素的影响(尽管是无限小的)。

我尝试使用 TTR 包中的函数 EMAdplyr 中的 lag 来实现此目的

> library(dplyr)
> library(TTR)
> lag(EMA(x, 1, ratio = 2/(81+1)))

 [1]        NA 102.00000 102.04878 101.73052 101.42002 100.80002 100.65855 100.34981 100.63396 100.15508 100.17569
[12] 100.19579 100.28858 100.13520 100.40020 100.58556 100.66884 100.48179 100.27492  99.92675 100.24561 100.06889
[23] 100.06721  99.87045  99.38580  99.20566  99.85918  99.91139 100.13307 100.22738 100.09989  99.70721  99.25093
[34]  99.34237  98.94378  99.04271  98.65143  97.65993  97.93651  97.71855  97.60346  97.75948  97.91168  98.52360
[45]  98.65717  98.51919  97.96994  98.09262  98.21231  98.25592  98.42041  98.65405  98.44298  99.01754  99.11468
[56]  99.47773  99.53925  99.23342  99.20333  98.93008  99.12691  99.19698  98.72876  98.29635  98.24035  98.45400
[67]  98.61365  98.96454  98.94102  98.79611  98.92304  98.80296  99.00289  99.19794  99.14433  99.21398  98.79413
[78]  98.57964  98.54111  99.16206  99.40201  99.31903

但这绝对不是我想要的结果……我做错了什么? 我无法在互联网上找到有关 ratio 论点的任何全面文档,而且我不确定我是否清楚这一点。 谁能帮帮我?

为了让事情更清楚: 我到现在为止的结果如下:

> library(runner)
> mean_run(x, k = 7, lag = 1)

 [1]        NA 102.00000 103.00000  98.33333  96.00000  92.00000  92.50000  91.85714  93.28571  90.00000  91.71429
[12]  93.42857  97.42857  97.28571 100.57143 100.00000 103.28571 102.14286 100.85714  98.28571 101.00000  98.42857
[23]  97.28571  95.57143  93.71429  93.71429  99.42857  97.85714 100.14286 100.71429 101.14286 101.71429 100.14286
[34]  96.85714  94.14286  93.28571  90.28571  85.00000  88.57143  89.71429  88.28571  91.28571  91.42857  97.14286
[45] 103.71429 101.42857  99.57143 101.00000 100.85714 100.28571  97.71429  98.28571  97.85714 104.42857 104.42857
[56] 106.00000 106.28571 103.71429 102.28571 102.00000  99.85714  99.71429  94.85714  91.85714  93.14286  94.42857
[67]  96.85714  97.71429  97.14286  99.00000 102.28571 102.00000 102.00000 102.28571 100.00000 100.57143  99.00000
[78]  97.00000  97.42857  99.85714 100.14286 100.00000

所以这是 k=7 观察结果的简单移动平均线 (SMA),我使用 runner 包中的 mean_run 函数获得。 现在我想通过在每个观察值上放置指数增加的权重并确保最后一个元素也受到第一个元素的影响来“改进”这个移动平均值(该观察值的权重应该尽可能接近 0)。这意味着滚动平均值的窗口大小将为:

  • n=0 用于第一个元素(即NA

  • n=1 表示第二个元素(即原始向量的第一个元素)

  • n=2 用于 3d 元素(即第一个和第二个元素的 EMA)

  • n=3 用于第 4 个元素(即第 1、第 2 和第 3 个元素的 EMA)

    ...

  • n=81 表示第 82 个元素(即前 81 个元素的 EMA)

我仍然无法找到关于 ratio 参数(即 alpha)的任何好的文档,但我认为应该任意解决,但我不确定

【问题讨论】:

  • “指数移动平均线”这句话暗示了一个尾随函数的应用。您似乎在要求一个具有前瞻性的功能应用程序。也许你会更高兴将EMA() 应用于该向量的反转版本?或者......你可以给出你认为是“EMA”的数学定义。
  • 您如何在数学上定义 EMA?
  • 也许吧。除非您描述您的数学期望,否则我无法真正知道。
  • @IRTFM 我在我的问题中写了我期望向量的样子。我正在尝试执行滚动均值,在每个元素上放置指数权重:最后一个元素比第一个元素具有更大的影响
  • 请不要破坏您的帖子。通过在此站点上发布,您已不可撤销地授予 Stack Exchange 网络在 CC BY-SA 4.0 许可下分发该内容的权利,只要它认为合适即可。有关删除的替代方法,请参阅:I've thought better of my question; can I delete it?

标签: r vector dplyr moving-average ttr


【解决方案1】:

假设您打算写什么,即滞后 exponential moving average 而不是评论中定义的滞后加权移动平均线,我们在 iter 中定义迭代,然后像这样使用 Reduce。

alfa <- 2/(81+1)
iter <- function(y, x) alfa * x + (1-alfa) * y
ema <- c(NA, head(Reduce(iter, tail(x, -1), init = x[1], acc = TRUE), -1))

# check

identical(ema[1], NA_real_)
## [1] TRUE
identical(ema[2], x[1])
## [1] TRUE
identical(ema[3], alfa * x[2] + (1-alfa) * x[1])
## [1] TRUE
identical(ema[4], alfa * x[3] + (1-alfa) * ema[3])
## [1] TRUE

评论中的滞后加权移动平均线不是指数移动平均线,不太可能是您想要的,只是展示如何实现它,如果 rollapply 的第二个参数是包含向量的列表,那么该向量将被视为要使用的偏移量。

library(zoo)
c(NA, x[1], rollapplyr(x, list(-seq(2)), weighted.mean, c(alfa, 1-alfa)))

【讨论】:

  • 你需要细化你想要什么的想法,并通过输入和手工计算的输出清晰地呈现出来;但是,答案中已经显示的可能就是您想要的,您只需要认识到指数移动平均线可以根据答案中的链接以多种方式表示。
猜你喜欢
  • 2021-04-12
  • 2021-04-19
  • 1970-01-01
  • 2012-11-19
  • 1970-01-01
  • 2022-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多