易得程序化交易技术论坛

登录 | 注册

积分: 0 |用户组: 游客

搜索
查看: 1780|回复: 1

通过自定义函数实现Std估算标准差

[复制链接]

22

主题

65

帖子

1423

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1423
发表于 2022-6-26 12:57:58 | 显示全部楼层 |阅读模式
估算标准差。  
用法:  
Std(X,N)为X的N日估算标准差

以下代码通过易得程序化自定义函数实现Std估算标准差函数,为您揭秘系统函数的神秘面纱并展示易得自定义函数的强大功能。
  1. function MyStd(X, N)
  2. begin
  3.     N := max(2, N);
  4.     if BarPos >= N then  
  5.     begin  
  6.         avg := 0; val := 0;
  7.         for i = BarPos downto BarPos-N+1 do  
  8.         begin
  9.             d := X[i];
  10.             avg := avg + d;
  11.             val := val + d*d;
  12.         end

  13.         avg := avg / N;
  14.         val := val / N;
  15.         res := sqrt((val-avg*avg)*N/(N-1));  
  16.            
  17.         return res;  
  18.     end  
  19. end

  20. // a和b的值相同
  21. a:MyStd(c, 10);  // 调用自定义函数MyHarmean
  22. b:Std(c, 10);    // 调用系统Harmean函数
复制代码


回复

使用道具 举报

8

主题

37

帖子

1586

积分

金牌会员

Rank: 6Rank: 6

积分
1586
QQ
发表于 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. 修复边界问题并优化性能
  1. function MyStdOptimized(X, N)
  2. begin
  3.     N := max(2, N);  // 确保最小窗口为2
  4.     if BarPos >= N-1 then  // 假设BarPos从0开始
  5.     begin
  6.         sum_x := 0.0;
  7.         sum_x2 := 0.0;
  8.         // 遍历最近的N个数据点
  9.         for i = 0 to N-1 do
  10.         begin
  11.             d := X[BarPos - i];
  12.             sum_x := sum_x + d;
  13.             sum_x2 := sum_x2 + d * d;
  14.         end
  15.         avg := sum_x / N;
  16.         variance := (sum_x2 / N - avg * avg) * N / (N-1);
  17.         res := sqrt(variance);
  18.         return res;
  19.     end
  20.     else
  21.     begin
  22.         return 0;  // 或返回NaN(根据平台支持)
  23.     end
  24. 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)的宽度指标。
质量控制:实时监测生产线数据的稳定性。
通过上述优化,函数在准确性和鲁棒性上均有提升,适用于高频数据处理场景。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|小黑屋|易得程序化 ( 粤ICP备2022064048号 )

GMT+8, 2025-4-28 16:32 , Processed in 0.054876 second(s), 19 queries .

快速回复 返回顶部 返回列表