首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Math.Net指数移动平均

Math.Net指数移动平均
EN

Stack Overflow用户
提问于 2019-10-11 22:05:10
回答 3查看 1.5K关注 0票数 3

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-10-15 01:27:15

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

代码语言:javascript
复制
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;
}
票数 3
EN

Stack Overflow用户

发布于 2021-03-21 10:25:21

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

票数 2
EN

Stack Overflow用户

发布于 2021-03-21 11:15:53

试试这个:

代码语言:javascript
复制
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。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58342977

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档