Разница скользящей средней между numpy и mathdotnet.com

Сначала картинка:

Столбец А - мои исходные данные, 50 баллов. Столбцы C и D - это SMA, рассчитанные для numpy и mathdotnet.com соответственно с окном 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());
    }

Он использует NumSharp,.net порт numpy, для хранения исходного массива.

Хотя это все разные коды, код C# и Python NumPy выводят одинаковые результаты (различия происходят после 12-го знака после запятой, поэтому мы можем считать их идентичными).

Это указывает на то, что mathdotnet.com отличается; так что я думаю, что могу больше доверять версиям numpy / C#.

Существуют ли различные варианты SMA, которые могут вызвать это? или что-то очевидное я не вижу?

Я поместил все данные здесь: https://pastebin.com/WgYJUUJF


Редактировать:

Вот код NumPy:

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

и вот один математик:

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 ответов

Другие вопросы по тегам