La façon la plus efficace de calculer un Écart-type de déménagement

Ci-dessous vous pouvez voir mon C# méthode pour calculer les Bandes de Bollinger pour chaque point (moyenne mobile, bande, vers le bas de la bande).

Comme vous pouvez le voir, cette méthode utilise 2 boucles for pour calculer le déplacement de l'écart type à l'aide de la moyenne mobile. Il sert à contenir une boucle supplémentaire pour calculer la moyenne mobile sur les n dernières périodes. Ce que je pouvais enlever par l'ajout de la nouvelle valeur de point de total_average au début de la boucle et en supprimant la i - n valeur du point à la fin de la boucle.

Ma question maintenant, c'est en gros: puis-je déposer le reste de la boucle interne similaire à la façon dont j'ai géré avec la moyenne mobile?

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

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

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

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

                double stdev = Math.Sqrt(total_bollinger / 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"];
            }
        }
    }