指数移动平均线的权重向量?

信息处理 过滤器 移动平均线 平均
2022-02-21 09:33:42

对于权重向量,我的意思是具有权重的向量,您必须乘以在数据上滑动的窗口中的观察结果,因此如果将这些产品加在一起,它会返回窗口右侧的 EMA 值。

对于线性加权移动平均,找到权重向量的公式是:((1:n)/sum(1:n)在 R 代码中)。这一系列的长度n加起来为 1。因为n=10它将是

0.01818182
0.03636364
0.05454545
0.07272727
0.09090909
0.10909091
0.12727273
0.14545455
0.16363636
0.18181818

数字 1 到 10 / 55,其中 55 是数字 1 到 10 的总和。

如何计算长度为 n 的指数移动平均线 (EMA) 的权重向量?

维基百科告诉我

如果n是窗口的长度,那么alpha<-2/(n+1)等等i<-1:nEmaWeightVector<-((alpha*(1-alpha)^(1-i)))

它是否正确?

尽管 EMA 并不真正局限于一个有开始和结束的窗口,但权重不应该像 LWMA 那样加起来为 1 吗?

3个回答

好的解决方案是:(在R中)

emaweights<-function(m)
{
  alpha<-2/(m+1)
  i<-1:m
  sm<-sum((alpha*(1-alpha)^(1-i)))
  return(((alpha*(1-alpha)^(1-i)))/sm)  
}

这里的权重加起来是 1。

我相信 Wikipedia 参考资料可能指的是 Hunter (1986),但 Wikipedia 文章确实会随着时间的推移而变化。不太令人满意的公认答案的一个方面是除以总和的代码。

当前的文章提到了这个图表。

权重图

https://en.wikipedia.org/wiki/Moving_average#/media/File:Exponential_moving_average_weights_N=15.png给出了与之相关的代码。

$N = 15;
$f = 1 - 2/($N+1);

$total = 0;
foreach $i (0..20) {
  $value = (1 - $f) * ($f ** $i);
  print "$i $value\n";
  $total += $value;
}
print "# total $total (should approach 1)\n";

在R中本质上是:

N = 15;
a = 1 - 2/(N+1); #it is more customary to use a for the alpha rather than f
i=0:20 #increase this to a larger number to see how the sum approaches 1.0
value = (1 - a) * (a ^ i);
sum(value) #the sum eventually approaches 1.0 
plot(value);grid()

上述权重最终确实总和为 1,因为它们应该没有被强制...

我希望这可能有用。

这将使您接近封闭形式的解决方案......

每个向量的权重为:

(1L)Lt1LT

在哪里:

  • L是你的平滑常数;(1L)通常被称为阿尔法
  • t是你的时间向量
  • T你最后一次t+1

这在互联网上的其他任何地方都不存在,所以我不得不发明它。因此,它可能会导致权重略有不同,但它确实有效。