基于Significant Pivot Point的条件Trendline绘制问题求助
问题描述
我已通过knee plot动态计算最优参数,识别出pivot high中的significant pivot high及pivot low中的significant pivot low。现需在包含这些关键枢轴点和收盘价的图表中绘制趋势线:
- 向上趋势线:连接尽可能多的significant pivot low(触及点越多趋势线越强)
- 向下趋势线:连接尽可能多的significant pivot high
现有代码仅通过两点斜率或三点斜率差判断的逻辑无法生成预期趋势线(当前绘制的虚线不符合需求,期望得到类似示例图中黑蓝实线的效果)。附上完整代码及数据,请求优化趋势线绘制的算法逻辑。
优化方案
核心逻辑:最大化覆盖关键枢轴点的拟合直线
趋势线的核心是找到能覆盖最多目标枢轴点的直线,而非仅依赖两点/三点斜率判断,具体实现步骤如下:
1. 整理候选点集
- 向上趋势线:提取所有significant pivot low,按时间顺序排序;
- 向下趋势线:提取所有significant pivot high,按时间顺序排序。
2. 遍历生成候选直线并统计覆盖数
- 遍历所有时间有序的点对,生成直线方程
y = kx + b; - 对每条直线,统计满足趋势方向的枢轴点数量:
- 向上趋势线:点的价格需≥直线对应价格(可设置0.1%左右的误差阈值,避免因价格微小波动误判);
- 向下趋势线:点的价格需≤直线对应价格;
- 保留覆盖点数最多的直线,若点数相同则选择斜率更平缓的直线(更贴合长期趋势)。
3. 趋势有效性校验
- 设置最小覆盖点数阈值(如至少3个点),过滤无意义的短趋势线;
- 校验斜率方向:向上趋势线斜率为正,向下趋势线斜率为负,避免方向错误的拟合线。
关键代码片段
import numpy as np def get_best_trend_line(pivot_list, is_uptrend=True): """ pivot_list: 按时间排序的枢轴点列表,每个元素为(时间索引, 价格) is_uptrend: 是否为向上趋势线 """ max_coverage = 0 best_k, best_b = None, None start_x, end_x = None, None total_points = len(pivot_list) for i in range(total_points): x1, y1 = pivot_list[i] for j in range(i + 1, total_points): x2, y2 = pivot_list[j] # 计算直线斜率和截距 k = (y2 - y1) / (x2 - x1) if x2 != x1 else 0.0 b = y1 - k * x1 # 统计符合条件的点数 coverage = 0 tolerance = 0.001 # 0.1%的价格误差容忍度 for x, y in pivot_list: line_price = k * x + b if is_uptrend: if y >= line_price * (1 - tolerance): coverage += 1 else: if y <= line_price * (1 + tolerance): coverage += 1 # 更新最优趋势线 if coverage > max_coverage: max_coverage = coverage best_k, best_b = k, b start_x, end_x = x1, x2 elif coverage == max_coverage: # 点数相同,选斜率更平缓的 if abs(k) < abs(best_k): best_k, best_b = k, b start_x, end_x = x1, x2 return (best_k, best_b, start_x, end_x) if max_coverage >=3 else None
额外优化建议
- 滑动窗口优化:若枢轴点数量过大,可按时间划分滑动窗口,在窗口内计算趋势线,降低计算量;
- 动态误差阈值:用ATR(平均真实波动幅度)替代固定误差阈值,适配不同波动幅度的标的;
- 实时更新机制:当新的significant pivot点出现时,重新计算趋势线,保证趋势线贴合最新行情。
内容的提问来源于stack exchange,提问作者driver
相关产品推荐
相关产品推荐

