- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
您可以在下面看到我的 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"];
}
}
}
最佳答案
计算平方和的方法的问题在于它和平方和可能会变得非常大,计算它们的差值可能会引入 very large error。 ,让我们想想更好的办法。为什么需要这样做,请参阅关于 Algorithms for computing variance 的维基百科文章和约翰库克 Theoretical explanation for numerical results )
首先,我们不计算 stddev,而是关注方差。一旦我们有了方差,stddev 就是方差的平方根。
假设数据在一个名为x
的数组中;滚动一个 n 大小的窗口可以被认为是删除 x[0]
的值并添加 x[n]
的值。让我们分别用 µ 和 µ’ 表示 x[0]..x[n-1]
和 x[1]..x[n]
的平均值。 x[0]..x[n-1]
和 x[1]..x[n]
的方差之间的差异是,在抵消了一些项之后并应用 (a²-b²) = (a+b)(a-b)
:
Var[x[1],..,x[n]] - Var[x[0],..,x[n-1]]
= (\sum_1^n x[i]² - n µ’²)/(n-1) - (\sum_0^{n-1} x[i]² - n µ²)/(n-1)
= (x[n]² - x[0]² - n(µ’² - µ²))/(n-1)
= (x[n]-µ’ + x[0]-µ)(x[n]-x[0])/(n-1)
因此,方差会受到一些不需要您保持平方和的因素的干扰,这对于数值精度来说更好。
您可以在开始时使用适当的算法 (Welford's method) 计算一次均值和方差。之后,每次您必须将窗口 x[0]
中的值替换为另一个 x[n]
时,您会像这样更新平均值和方差:
new_Avg = Avg + (x[n]-x[0])/n
new_Var = Var + (x[n]-new_Avg + x[0]-Avg)(x[n] - x[0])/(n-1)
new_StdDev = sqrt(new_Var)
关于c# - 如何有效地计算移动标准偏差,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14635735/
我想要一个标准偏差的 std.m 文件。它位于 data fun 工具箱中,但是我错误地更改了代码,std 命令不再起作用。如何运行原始的 std(标准偏差)命令? 最佳答案 去掉所有注释,函数std
我们写了一个监控系统。这个监视器是由代理组成的。每个代理在不同的服务器上运行,并监控特定的服务器资源(RAM、CPU、SQL Server 状态、复制状态、可用磁盘空间、Internet 访问、特定业
如何在 numpy 数组中沿特定轴在掩码下获取标准偏差? data = array([[ 0, 1, 2, 3, 4], [ 5, 6, 7, 8, 9],
我已经在 GLSL 中实现了一个高斯模糊片段着色器。我理解这一切背后的主要概念:卷积、使用线性分离 x 和 y、多次通过以增加半径...... 不过我还有几个问题: 西格玛和半径有什么关系? 我读过
这是我的数据集: 我有很多测试(测试 1 和测试 2),并且对于每个测试,有 4 个条件(C1、C2、C3 和 C4)。 我正在寻找一种解决方案,在 Excel 上按条件从测试中选择数据。所以这里每四
作业是创建一个程序,将从标准输入(包含整数列表的文件)读取到数组中,然后查找这些整数的平均值、最大值、最小值、中位数和标准差。首先,这是代码: import java.io.*; import jav
我需要一个 javascript 函数来匹配 Excel 的 STDEV 函数中使用的数学。 当我使用数组 [1,2,4,6] 时,我发现每个 js 脚本的标准偏差为 1.9202。但是,当我通过 E
因此,我想创建一个表格,显示导入的 CSV 数据文件中两个变量的均值、标准差和所有缺失值。 csv 文件如下所示: Group Var1 Var2 1 10 100 1
我想要这样的图片: x轴上下限已给定,远大于/小于给定数据。 我找到的所有图都只有 ± 1* 标准差。 我也不确定如何像这样修复 x 轴。 我的数据是一个 float 的 python 列表。 现在,
我是一名优秀的程序员,十分优秀!