| 
 | 
 
 
发表于 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)的宽度指标。 
质量控制:实时监测生产线数据的稳定性。 
通过上述优化,函数在准确性和鲁棒性上均有提升,适用于高频数据处理场景。 |   
 
 
 
 |