Unten sehen Sie meine C# -Methode zur Berechnung von Bollinger-Bändern für jeden Punkt (gleitender Durchschnitt, Aufwärtsband, Abwärtsband).Effiziente Berechnung einer sich bewegenden Standardabweichung
Wie Sie sehen können, verwendet diese Methode 2 for-Schleifen, um die sich bewegende Standardabweichung mithilfe des gleitenden Durchschnitts zu berechnen. Früher enthielt es eine zusätzliche Schleife, um den gleitenden Durchschnitt über die letzten n Perioden zu berechnen. Diesen könnte ich entfernen, indem ich den neuen Punktwert zu total_average am Anfang der Schleife hinzufüge und den i-n-Punktwert am Ende der Schleife entferne.
Meine Frage ist jetzt im Grunde: Kann ich die verbleibende innere Schleife in ähnlicher Weise entfernen, die ich mit dem gleitenden Durchschnitt geschafft habe?
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"];
}
}
}
Vielen Dank! Ich starrte blind auf diesen. Sie haben nur vergessen, die total_squares am Ende zu reduzieren: total_squares - = Math.Pow (Daten.Werte [i - Periode + 1] ["Schließen"], 2); – ChrisW
http://www.johndcook.com/blog/standard_deviation/ – odyth
@odyth Schöne Referenz! Ich hatte nicht bemerkt, dass dies in Knuth war. Ich hatte TAoCP tatsächlich einige Jahre gelesen, bevor ich dies in den 80ern schrieb, und jetzt frage ich mich, ob ich es unterbewusst plagiierte. – RBarryYoung