numpy和mathdotnet.com之间的移动平均差

时间:2019-07-18 20:55:21

标签: numpy moving-average math.net

首先,一张图片:

enter image description here

A列是我的源数据,满分50分。 C列和D列分别是使用numpy和mathdotnet.com计算的SMA,窗口为15。

F列是增量。

如我们所见,大约一半,数据变得相同,但前半部分却不相同。我不明白为什么,更重要的是,我不知道该信任什么。

因此,我从SO获得了SMA的优化版本,并通过它运行了数据。 代码在这里:

    private static NDArray SMA(this NDArray Data, int Period)
    {
        var Length = Data.len;

        // calculate the moving average
        var Buffer = new double[Period];
        var Output = new double[Length];

        var CurrentIndex = 0;
        for (var i = 0; i < Length; i++)
        {
            Buffer[CurrentIndex] = Data.GetDouble(i) / Period;
            var MA = 0.0;
            for (var j = 0; j < Period; j++)
            {
                MA += Buffer[j];
            }

            Output[i] = MA;
            CurrentIndex = (CurrentIndex + 1) % Period;
        }

        var R = new ArraySegment<double>(Output, Period - 1, Length - Period + 1);
        return new NDArray(R.ToArray());
    }

它使用numpy的.net端口NumSharp来保存源数组。

虽然都是不同的代码,但是C#代码和python numpy输出的结果相同(差异在小数点后12位出现,因此我们可以认为它们是相同的)。

这表明mathdotnet.com与众不同;所以我想我可以更信任numpy / C#版本。

是否存在可能导致此变化的SMA不同?还是我看不到的明显东西?

我已将所有数据放在这里:https://pastebin.com/WgYJUUJF


编辑:

这是数字代码:

import numpy as np

def calcSma(data, smaPeriod):
    j = next(i for i, x in enumerate(data) if x is not None)
    our_range = range(len(data))[j + smaPeriod - 1:]
    empty_list = [None] * (j + smaPeriod - 1)
    sub_result = [np.mean(data[i - smaPeriod + 1: i + 1]) for i in our_range]

    return np.array(empty_list + sub_result)

def calcSma2(data_set, periods=3):
    weights = np.ones(periods) / periods
    return np.convolve(data_set, weights, mode='valid')

a = np.array([1.1282553063375, 1.13157696082132, 1.13275406120136, 1.1332879715733, 1.12761933580452, 1.12621836040801, 1.12282485875706, 1.12265572041877, 1.13094386506532, 1.12320520490577, 1.12427293064877, 1.1328332027022, 1.13099445663901, 1.12843355605048, 1.13002750724853, 1.12843355605048, 1.13099445663901, 1.12709476494142, 1.12684879712348, 1.12672349888807, 1.12600933402474, 1.13112070248549, 1.12985951088976, 1.12822416032659, 1.12471789559362, 1.12651004224413, 1.12442669033881, 1.12334638977164, 1.12714333124378, 1.1312233808195, 1.12713229372575, 1.128255040952, 1.12585669781931, 1.12763457442902, 1.12470631424376, 1.12223443223443, 1.12506842815956, 1.12691187181355, 1.12385654130971, 1.13026344596074, 1.12237927400894, 1.1245915922457, 1.13088395780284, 1.13211944646759, 1.12590649028825, 1.12829127560895, 1.11876736364966, 1.12222667492441, 1.12169543369019, 1.12199031071285])


b = calcSma(a, 15)
c = calcSma2(a, 15)

print b

print "----------------------------------"

print c

这是mathdotnet之一:

var data = Vector<double>.Build.Dense(new[] { 1.1282553063375, 1.13157696082132, 1.13275406120136, 1.1332879715733, 1.12761933580452, 1.12621836040801, 1.12282485875706, 1.12265572041877, 1.13094386506532, 1.12320520490577, 1.12427293064877, 1.1328332027022, 1.13099445663901, 1.12843355605048, 1.13002750724853, 1.12843355605048, 1.13099445663901, 1.12709476494142, 1.12684879712348, 1.12672349888807, 1.12600933402474, 1.13112070248549, 1.12985951088976, 1.12822416032659, 1.12471789559362, 1.12651004224413, 1.12442669033881, 1.12334638977164, 1.12714333124378, 1.1312233808195, 1.12713229372575, 1.128255040952, 1.12585669781931, 1.12763457442902, 1.12470631424376, 1.12223443223443, 1.12506842815956, 1.12691187181355, 1.12385654130971, 1.13026344596074, 1.12237927400894, 1.1245915922457, 1.13088395780284, 1.13211944646759, 1.12590649028825, 1.12829127560895, 1.11876736364966, 1.12222667492441, 1.12169543369019, 1.12199031071285 });
var sma = Vector<double>.Build.Dense(data.MovingAverage(15).Skip(14).ToArray());
var s = sma.Aggregate(string.Empty, (Current, v) => Current + $"{v}, ");
Console.WriteLine(s);

0 个答案:

没有答案