下面您可以看到我的C#方法來計算每個點(移動平均線,上帶,下帶)的布林帶。如何高效地計算移動的標準差
正如您所見,此方法使用2 for循環來計算使用移動平均值的移動標準偏差。它用來包含一個額外的循環來計算最近n個週期的移動平均線。我可以通過在循環開始處將新點值添加到total_average並在循環結束時刪除i-n點值來刪除這一個。
我現在的問題基本上是:我可以使用移動平均線處理的類似方法刪除剩餘的內部循環嗎?
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"];
}
}
}
非常感謝!我瞎了眼睛。 你只會忘記減少最後的total_squares: total_squares - = Math.Pow(data。值[i - period + 1] [「close」],2); – ChrisW
http://www.johndcook.com/blog/standard_deviation/ – odyth
@odyth很好的參考!我沒有意識到這是在Knuth。在80年代我寫這本書之前的幾年,我實際上已經閱讀過TAoCP,現在我想知道我是不是下意識地剽竊了它。 – RBarryYoung