【问题标题】:Math.Net Exponential Moving AverageMath.Net 指数移动平均线
【发布时间】:2019-10-11 14:05:10
【问题描述】:

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

我查看了 MathNet.Numerics.Statistics 下的所有方法及其他方法,但没有发现任何类似的方法。

库中是否缺少它或者我需要引用一些额外的包?

【问题讨论】:

    标签: math.net


    【解决方案1】:

    我在 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;
    }
    

    【讨论】:

      【解决方案2】:

      偶然发现这个包:https://daveskender.github.io/Stock.Indicators/docs/INDICATORS.html它针对的是最新的.NET框架,文档非常详细。

      【讨论】:

        【解决方案3】:

        试试这个:

        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。

        【讨论】:

          猜你喜欢
          • 2022-01-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-04-09
          • 2021-08-26
          • 2017-01-19
          • 1970-01-01
          • 2017-09-01
          相关资源
          最近更新 更多