我在Math.Net中使用简单的移动平均线,但是现在我还需要计算EMA(指数移动平均线)或任何加权的移动平均线,因此在库中找不到。
我查看了MathNet.Numerics.Statistics及更高版本下的所有方法,但没有发现任何类似的东西。
库中是否缺少它?还是需要参考一些其他软件包?
答案 0 :(得分:0)
我在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;
}
答案 1 :(得分:0)
偶尔我发现这个包:https://daveskender.github.io/Stock.Indicators/docs/INDICATORS.html 它针对最新的 .NET 框架并且有非常详细的文档。
答案 2 :(得分:0)
试试这个:
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。