Dưới đây bạn có thể thấy phương pháp C# của tôi để tính Bollinger Bands cho mỗi điểm (trung bình di chuyển, băng lên, băng xuống).Cách tính hiệu quả độ lệch chuẩn di chuyển
Như bạn có thể thấy, phương pháp này sử dụng 2 cho các vòng để tính toán độ lệch chuẩn di chuyển bằng cách sử dụng trung bình di chuyển. Nó được sử dụng để chứa một vòng lặp bổ sung để tính toán di chuyển trung bình trong n thời gian qua. Điều này tôi có thể loại bỏ bằng cách thêm giá trị điểm mới vào total_average ở đầu vòng lặp và loại bỏ giá trị điểm i - n ở cuối vòng lặp.
Câu hỏi của tôi bây giờ về cơ bản: Tôi có thể xóa vòng lặp bên trong còn lại theo cách tương tự mà tôi đã quản lý với mức trung bình di chuyển không?
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"];
}
}
}
Cảm ơn rất nhiều! Tôi đã nhìn chằm chằm vào cái này. Bạn chỉ quên giảm total_squares ở cuối: total_squares - = Math.Pow (dữ liệu.Giá trị [i - period + 1] ["close"], 2); – ChrisW
http://www.johndcook.com/blog/standard_deviation/ – odyth
@odyth Tham chiếu hấp dẫn! Tôi đã không nhận ra điều này là ở Knuth. Tôi đã thực sự đọc TAoCP vài năm trước khi tôi viết điều này vào những năm 80, và bây giờ tôi tự hỏi liệu tôi có vô thức ăn cắp nó hay không. – RBarryYoung