使用javascript计算指数移动平均线(EMA)

Jor*_*ini 3 javascript arrays moving-average

您好可以在javascript中计算EMA吗?

我试图应用的EMA公式就是这个

EMA =数组[i]*K + EMA(上一个)*(1 - K)

其中K是平滑因子:

K = 2 /(N + 1)

N是我想要考虑的价值范围

所以,如果我有一个这样的值数组,并且这个值在这段时间内增长:

var data = [15,18,12,14,16,11,6,18,15,16];
Run Code Online (Sandbox Code Playgroud)

目标是有一个函数,返回EMA的数组,因为任何这个值,期望第一个"Range"值,有这个EMA,对于数据上的每个项目,我都有相关的EMA值.通过这种方式,我可以使用全部或仅使用最后一个来"预测"下一个.

function EMACalc(Array,Range) {
var k = 2/(Range + 1);
...
}
Run Code Online (Sandbox Code Playgroud)

我无法弄清楚如何实现这一点,任何帮助都会被贬低

Dan*_*ina 5

我不知道我是否完全理解你需要什么,但我会给你一个函数的代码,该函数返回一个数组,其中每个索引计算的EMA> 0(第一个索引没有任何先前的EMA计算,并且将返回输入的第一个值).

function EMACalc(mArray,mRange) {
  var k = 2/(mRange + 1);
  // first item is just the same as the first item in the input
  emaArray = [mArray[0]];
  // for the rest of the items, they are computed with the previous one
  for (var i = 1; i < mArray.length; i++) {
    emaArray.push(mArray[i] * k + emaArray[i - 1] * (1 - k));
  }
  return emaArray;
}
Run Code Online (Sandbox Code Playgroud)

这应该做到这一点.


Red*_*edu 5

以下可能是实施 EMA 的另一种方式。

var getEMA = (a,r) => a.reduce((p,n,i) => i ? p.concat(2*n/(r+1) + p[p.length-1]*(r-1)/(r+1)) : p, [a[0]]),
      data = [15,18,12,14,16,11,6,18,15,16],
     range = 3;

console.log(getEMA(data,range));
Run Code Online (Sandbox Code Playgroud)