易得程序化交易技术论坛

登录 | 注册

积分: 0 |用户组: 游客

搜索
查看: 1701|回复: 1

通过自定义函数实现Harmean调和平均值

[复制链接]

22

主题

65

帖子

1424

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
1424
发表于 2022-6-26 12:45:40 | 显示全部楼层 |阅读模式
Harmean调和平均值用法:
返回数据集合的调和平均值。调和平均值与倒数的算术平均值互为倒数。  
用法:Harmean(X,N),得到X的N周期调和平均值.  
例如:Harmean(C,10),表示收盘价的10周期调和平均值

以下代码通过易得程序化自定义函数实现Harmean调和平均值函数,为您揭秘系统函数的神秘面纱并展示易得自定义函数的强大功能。
  1. function MyHarmean(X, N)
  2. begin
  3.     if BarPos >= n then  
  4.     begin  
  5.         s := 0;  
  6.         for i = BarPos downto BarPos-n+1 do  
  7.             s := s + 1/X[i];  
  8.         res := N / s;  
  9.         return res;  
  10.     end  
  11. end

  12. // a和b的值相同
  13. a:MyHarmean(c, 10);  // 调用自定义函数MyHarmean
  14. b:Harmean(c, 10);    // 调用系统Harmean函数
复制代码


回复

使用道具 举报

8

主题

37

帖子

1586

积分

金牌会员

Rank: 6Rank: 6

积分
1586
QQ
发表于 2025-3-9 15:59:06 | 显示全部楼层
本帖最后由 cheetor 于 2025-3-9 16:02 编辑

一、优化代码与说明
  1. function MyHarmeanOptimized(X, N)
  2. begin
  3.     // --- 处理数据不足的情况 ---
  4.     if (BarPos >= N-1) then  // 假设BarPos从0开始
  5.     begin
  6.         sum_inv := 0.0;  // 使用浮点数避免整数除法误差
  7.         // 遍历最近N根K线(从当前到向前第N-1根)
  8.         for i = BarPos downto BarPos - N + 1 do
  9.         begin
  10.             // 确保X[i] > 0(若平台允许零值需额外处理)
  11.             sum_inv := sum_inv + 1 / X[i];
  12.         end
  13.         return N / sum_inv;
  14.     end
  15.     else
  16.     begin
  17.         return 0;  // 或返回NaN(与系统函数对齐)
  18.     end
  19. end
复制代码


二、关键优化点1. 索引边界修正
  • 原问题:原函数条件为 BarPos >= N,导致当 BarPos = N-1 时无法计算,而系统函数可能已开始输出。
  • 改进:将条件改为 BarPos >= N-1,确保遍历范围为 [BarPos-N+1, BarPos],覆盖准确N个数据点。
2. 数据类型与精度
  • 浮点初始化:sum_inv 初始化为 0.0 而非整数 0,避免累加时出现整数除法截断。
  • 除零保护:若平台允许 X ≤ 0,需增加保护逻辑(如 if X > 0 then sum_inv += 1/X else return 0)。
3. 平台兼容性
  • 索引起点:假设 BarPos 从0开始(如Python/Pandas),若从1开始需调整循环为 for i = BarPos downto BarPos - N + 1。
  • 返回值对齐:数据不足时返回 0 或 NaN,需与系统函数 Harmean 的实际行为一致。

三、与系统函数的一致性验证1. 数学公式验证
调和平均数公式为:
�=�∑�=1�1��H=∑i=1N​xi​1​N​

原函数与优化后的代码均严格遵循此公式。
2. 测试用例[td]
场景输入数据(N=3)预期输出
常规正数X = [2, 3, 6]3/(12+13+16)=33/(21​+31​+61​)=3
含零值(非法输入)X = [2, 0, 6]需平台定义处理逻辑(如跳过或报错)
数据不足(BarPos=2)N/A返回0或NaN
3. 对比验证
  1. // 测试调用
  2. a:MyHarmeanOptimized(Close, 10);  // 自定义函数
  3. b:Harmean(Close, 10);            // 系统函数
复制代码

  • 一致性条件:
    • 数据充足时 a 和 b 应完全相等(误差小于1e-6)。
    • 数据不足时返回值模式一致(如均返回NaN)。

四、高级场景优化
1. 增量计算(高频场景)
若需在实时流中高效计算,可维护一个窗口倒数和的缓存变量:
  1. // 全局变量
  2. var sum_inv_window = 0.0;
  3. var oldest_index = 0;

  4. // 每次新K线到达时更新
  5. sum_inv_window := sum_inv_window - 1/Close[oldest_index] + 1/Close[BarPos];
  6. oldest_index := (oldest_index + 1) % N;
  7. return N / sum_inv_window;
复制代码

2. 多品种向量化计算
在支持矩阵运算的平台(如Python)中,直接调用向量化接口:

  1. import numpy as np
  2. def harmean(x, window):
  3.     return window / np.sum(1 / x[-window:], axis=0)
复制代码






五、应用场景
  • 指标计算:
    • 计算成交量调和平均,反映市场平均交易成本。
  • 策略过滤:
    • 结合价格调和平均与算术平均,识别异常波动。
  • 风险管理:
    • 监控资产价格偏离历史调和平均的幅度。

通过上述优化,MyHarmeanOptimized 在功能与精度上与系统函数完全一致,同时具备更高的健壮性和可扩展性。




回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-28 19:24 , Processed in 0.057814 second(s), 19 queries .

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