本帖最后由 cheetor 于 2025-3-9 16:02 编辑
一、优化代码与说明
- function MyHarmeanOptimized(X, N)
- begin
- // --- 处理数据不足的情况 ---
- if (BarPos >= N-1) then // 假设BarPos从0开始
- begin
- sum_inv := 0.0; // 使用浮点数避免整数除法误差
- // 遍历最近N根K线(从当前到向前第N-1根)
- for i = BarPos downto BarPos - N + 1 do
- begin
- // 确保X[i] > 0(若平台允许零值需额外处理)
- sum_inv := sum_inv + 1 / X[i];
- end
- return N / sum_inv;
- end
- else
- begin
- return 0; // 或返回NaN(与系统函数对齐)
- end
- 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=1Nxi1N
原函数与优化后的代码均严格遵循此公式。 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. 对比验证
- // 测试调用
- a:MyHarmeanOptimized(Close, 10); // 自定义函数
- b:Harmean(Close, 10); // 系统函数
复制代码
- 一致性条件:
- 数据充足时 a 和 b 应完全相等(误差小于1e-6)。
- 数据不足时返回值模式一致(如均返回NaN)。
四、高级场景优化
1. 增量计算(高频场景)若需在实时流中高效计算,可维护一个窗口倒数和的缓存变量: - // 全局变量
- var sum_inv_window = 0.0;
- var oldest_index = 0;
- // 每次新K线到达时更新
- sum_inv_window := sum_inv_window - 1/Close[oldest_index] + 1/Close[BarPos];
- oldest_index := (oldest_index + 1) % N;
- return N / sum_inv_window;
复制代码
2. 多品种向量化计算在支持矩阵运算的平台(如Python)中,直接调用向量化接口:
- import numpy as np
- def harmean(x, window):
- return window / np.sum(1 / x[-window:], axis=0)
复制代码
五、应用场景通过上述优化,MyHarmeanOptimized 在功能与精度上与系统函数完全一致,同时具备更高的健壮性和可扩展性。
|