一尘不染

如何在C#中更快地计算简单移动平均线?

algorithm

计算简单移动平均线最快的库/算法是什么?我写了自己的,但是在330 000个十进制数据集上花费的时间太长。

  • 周期/时间(毫秒)
  • 20/300;
  • 60/1500;
  • 120/3500。

这是我的方法的代码:

public decimal MA_Simple(int period, int ii) {
    if (period != 0 && ii > period) {
        //stp.Start();
        decimal summ = 0;
        for (int i = ii; i > ii - period; i--) {
            summ = summ + Data.Close[i];
        }
        summ = summ / period;
        //stp.Stop();
        //if (ii == 1500) System.Windows.Forms.MessageBox.Show((stp.ElapsedTicks * 1000.0) / Stopwatch.Frequency + " ms");
        return summ;
    } else return -1;
}

Data.Close[]是一个固定的尺寸(1 000 000)的十进制阵列。


阅读 835

收藏
2020-07-28

共1个答案

一尘不染

您的主要问题是每次迭代都浪费了太多信息。如果要快速运行,则需要保持与帧长相同大小的缓冲区。

此代码将为整个数据集运行移动平均值:

(不是真正的C#,但您应该了解一下)

decimal buffer[] = new decimal[period];
decimal output[] = new decimal[data.Length];
current_index = 0;
for (int i=0; i<data.Length; i++)
    {
        buffer[current_index] = data[i]/period;
        decimal ma = 0.0;
        for (int j=0;j<period;j++)
            {
                ma += buffer[j];
            }
        output[i] = ma;
        current_index = (current_index + 1) % period;
    }
return output;

请注意,保持累积的运行量而不是保留整个缓冲区并为每次迭代计算值可能很诱人,但这不适用于非常长的数据长度,因为您的累加总和会变得​​很大,以至于增加较小的附加值导致舍入错误。

2020-07-28