|
发表于 2025-3-9 15:26:02
|
显示全部楼层
本帖最后由 cheetor 于 2025-3-9 15:48 编辑
一、原函数分析
1. 功能与公式正确性
目的:计算滚动窗口(最近 N 个数据点)的样本标准差。
数学等价性:
公式 sqrt((val - avg*avg) * N / (N-1)) 是样本标准差的简化形式,等价于:
其中 val = Σx²/N,avg = Σx/N,展开后:
因此原式正确。
2. 代码问题
循环边界:
BarPos downto BarPos-N+1 的索引需确保覆盖 N 个数据点。例如:
当 N=5, BarPos=4 时,循环为 4,3,2,1,0(共5个点),正确。
需确认平台中 BarPos 的起始索引(通常为0或1)。
未处理初始值:
当 BarPos < N 时函数无返回值,可能导致不稳定。建议返回 0 或 NaN。
二、优化版本代码
1. 修复边界问题并优化性能
- function MyStdOptimized(X, N)
- begin
- N := max(2, N); // 确保最小窗口为2
- if BarPos >= N-1 then // 假设BarPos从0开始
- begin
- sum_x := 0.0;
- sum_x2 := 0.0;
- // 遍历最近的N个数据点
- for i = 0 to N-1 do
- begin
- d := X[BarPos - i];
- sum_x := sum_x + d;
- sum_x2 := sum_x2 + d * d;
- end
- avg := sum_x / N;
- variance := (sum_x2 / N - avg * avg) * N / (N-1);
- res := sqrt(variance);
- return res;
- end
- else
- begin
- return 0; // 或返回NaN(根据平台支持)
- end
- end
复制代码
2. 优化说明
索引方向:
正向循环(0 to N-1)避免倒序逻辑错误,直接访问 X[BarPos - i] 确保取到最新到最旧的数据。
初始值处理:
当数据不足时返回 0 或明确标记缺失值。
性能:
单次遍历计算 sum_x 和 sum_x2,时间复杂度为 O(N)。
三、关键注意事项
平台索引差异:
若 BarPos 从1开始(如某些交易平台),需调整条件为 BarPos >= N。
示例代码假设 BarPos 从0开始(如Python索引)。
窗口滚动效率:
若在实时流数据中频繁调用,建议使用增量计算(如 Welford 算法),避免每次重新遍历,将复杂度降至 O(1)。
增量公式:
数据类型精度:
使用 double 而非 float 避免累积误差(尤其在金融场景)。
四、应用场景示例
股票波动率:计算最近20日的价格标准差,衡量波动风险。
量化策略:作为布林带(Bollinger Bands)的宽度指标。
质量控制:实时监测生产线数据的稳定性。
通过上述优化,函数在准确性和鲁棒性上均有提升,适用于高频数据处理场景。 |
|