您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

如何有效地计算移动的标准偏差

如何有效地计算移动的标准偏差

答案是可以的。在80年代中期,我在FORTRAN中为过程监视和控制应用程序开发了这种算法(可能不是原始算法)。不幸的是,那是25年前的事了,我不记得确切的公式,但是该技术是移动平均数的扩展,具有二阶计算,而不仅仅是线性计算。

在看完您的代码后,我认为我可以暂缓当时的工作方式。请注意您的内部循环如何使平方和?:

            for (int x = i; x > (i - period); x--)
            {
                total_bollinger += Math.Pow(data.Values[x]["close"] - average, 2);
            }

与您的平均值最初必须具有“值总和”的方式大致相同?唯一的两个区别是阶数(阶数为2而不是1),并且您要在对每个值求平方之前减去平均值。现在这看起来分不开,但实际上它们可以分开:

SUM(i=1; n){ (v[i] - k)^2 }

SUM(i=1..n){v[i]^2 -2*v[i]*k + k^2}

变成

SUM(i=1..n){v[i]^2 -2*v[i]*k} + k^2*n

这是

SUM(i=1..n){v[i]^2} + SUM(i=1..n){-2*v[i]*k} + k^2*n

这也是

SUM(i=1..n){v[i]^2} + SUM(i=1..n){-2*v[i]}*k + k^2*n

现在,第一个项只是平方和,您可以用对平均值求和的方式来处理。最后一项(k^2*n)只是平均值的平方乘以period。由于无论如何您都将结果除以周期,因此您只需添加新的均方值即可,而无需额外的循环。

最后,在第二项(SUM(-2*v[i]) * k)中,因为SUM(v[i]) = total = k*n您可以将其更改为:

-2 * k * k * n

或,只要-2*k^2*n再次将句点(n)除掉,它就是平均值平方的-2倍。因此,最终的组合公式为:

SUM(i=1..n){v[i]^2} - n*k^2

要么

SUM(i=1..n){values[i]^2} - period*(average^2)

(请务必检查此方法的有效性,因为我是从头顶上衍生出来的)

并纳入您的代码应该看起来像这样:

public static void AddBollingerBands(ref SortedList<DateTime, Dictionary<string, double>> data, int period, int factor)
{
    double total_average = 0;
    double total_squares = 0;

    for (int i = 0; i < data.Count(); i++)
    {
        total_average += data.Values[i]["close"];
        total_squares += Math.Pow(data.Values[i]["close"], 2);

        if (i >= period - 1)
        {
            double total_bollinger = 0;
            double average = total_average / period;

            double stdev = Math.Sqrt((total_squares - Math.Pow(total_average,2)/period) / period);
            data.Values[i]["bollinger_average"] = average;
            data.Values[i]["bollinger_top"] = average + factor * stdev;
            data.Values[i]["bollinger_bottom"] = average - factor * stdev;

            total_average -= data.Values[i - period + 1]["close"];
            total_squares -= Math.Pow(data.Values[i - period + 1]["close"], 2);
        }
    }
}
其他 2022/1/1 18:14:49 有466人围观

撰写回答


你尚未登录,登录后可以

和开发者交流问题的细节

关注并接收问题和回答的更新提醒

参与内容的编辑和改进,让解决方法与时俱进

请先登录

推荐问题


联系我
置顶