向量的滞后指数移动平均数
Lagged exponential moving average of a vector
给定一个包含 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
第二个元素应该是原始向量的第一个元素
第3个元素应该是原向量的第一个和第二个元素的EMA
第4个元素应该是原向量前三个元素的EMA
...
第82个元素应该是原始向量除最后一个以外的所有值的EMA
想法是将更大的权重放在最近的向量元素上,并且新向量的最后一个元素也会受到原始向量的第一个元素的影响(尽管是无限小的)。
我尝试使用包 TTR
中的函数 EMA
和 dplyr
中的 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
但这绝对不是我想要的结果....我做错了什么?
我无法在 Internet 上找到任何关于 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)来“改进”这个移动平均线。这意味着滚动平均值的 window 大小将是:
n=0
第一个元素(即 NA
)
n=1
为第二个元素(即原始向量的第一个元素)
n=2
对于 3d 元素(即第 1 和第 2 个元素的 EMA)
n=3
第 4 个元素(即第 1、2、3 个元素的 EMA)
...
n=81
第82个元素(即前81个元素的EMA)
我仍然找不到关于 ratio
参数(即 alpha)的任何好的文档,但我认为它应该任意解决,但我不确定
假设你想要你写的东西,即滞后 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)))
给定一个包含 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
第二个元素应该是原始向量的第一个元素
第3个元素应该是原向量的第一个和第二个元素的EMA
第4个元素应该是原向量前三个元素的EMA
...
第82个元素应该是原始向量除最后一个以外的所有值的EMA
想法是将更大的权重放在最近的向量元素上,并且新向量的最后一个元素也会受到原始向量的第一个元素的影响(尽管是无限小的)。
我尝试使用包 TTR
中的函数 EMA
和 dplyr
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
但这绝对不是我想要的结果....我做错了什么?
我无法在 Internet 上找到任何关于 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)来“改进”这个移动平均线。这意味着滚动平均值的 window 大小将是:
n=0
第一个元素(即NA
)n=1
为第二个元素(即原始向量的第一个元素)n=2
对于 3d 元素(即第 1 和第 2 个元素的 EMA)n=3
第 4 个元素(即第 1、2、3 个元素的 EMA)...
n=81
第82个元素(即前81个元素的EMA)
我仍然找不到关于 ratio
参数(即 alpha)的任何好的文档,但我认为它应该任意解决,但我不确定
假设你想要你写的东西,即滞后 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)))