Math.Net 指数移动平均线

Math.Net Exponential Moving Average

我在 Math.Net 中使用的是简单移动平均线,但现在我还需要计算 EMA(指数移动平均线)或任何一种加权移动平均线,我在库中找不到它.

我查看了 MathNet.Numerics.Statistics 及以后的所有方法,但没有发现任何类似的东西。

它是否在库中丢失或者我需要引用一些额外的包?

我在 MathNet.Numerics 中没有看到任何 EMA,但是编程起来很简单。下面的例程基于 Investopedia 上的定义。

public double[] EMA(double[] x, int N)
{
    // x is the input series            
    // N is the notional age of the data used
    // k is the smoothing constant

    double k = 2.0 / (N + 1);
    double[] y = new double[x.Length];
    y[0] = x[0];
    for (int i = 1; i < x.Length; i++) y[i] = k * x[i] + (1 - k) * y[i - 1];

    return y;
}

偶尔我发现了这个包:https://daveskender.github.io/Stock.Indicators/docs/INDICATORS.html它针对最新的 .NET 框架并且有非常详细的文档。

试试这个:

public IEnumerable<double> EMA(IEnumerable<double> items, int notationalAge)
{
    double k = 2.0d / (notationalAge + 1), prev = 0.0d;

    var e = items.GetEnumerator();
    if (!e.MoveNext()) yield break;

    yield return prev = e.Current;    
    while(e.MoveNext())
    {
        yield return prev = (k * e.Current) + (1 - k) * prev;
    }
}

它仍然适用于数组,但也适用于 List、Queue、Stack、IReadOnlyCollection 等。

虽然没有明确说明,但我也觉得这是在用钱工作,在这种情况下,它确实应该使用 decimal 而不是 double。