BTCUSD图表枢轴点斜率超出-90~+90范围的解决方法咨询
问题解决步骤
1. 修复核心索引错误
你的代码存在索引匹配逻辑错误:pivots存储的是dfpl的行索引(比如[100, 200, 300]这类实际数据位置),但你取收盘价时用了循环变量i(如np.array(dfpl["close"])[i]),这会取到第i行的收盘价,而非枢轴点索引对应的收盘价,直接导致斜率计算完全错误,出现异常超大值。
修正后的代码片段:
import numpy as np import matplotlib.pyplot as plt if pivots: # 修正绘图的x/y轴数据匹配:用枢轴点索引对应的时间和收盘价 plt.plot(dfpl.index[pivots], dfpl["close"].iloc[pivots], linestyle='-', marker='o', color='r') for i in range(len(pivots) - 1): indx1 = pivots[i] indx2 = pivots[i+1] # 取枢轴点索引对应的收盘价 close1 = dfpl["close"].iloc[indx1] close2 = dfpl["close"].iloc[indx2] # 避免时间差为0导致的除以0错误 time_diff = indx2 - indx1 if time_diff == 0: continue # 计算原始斜率并转换为角度(范围-90°到+90°) slope = (close2 - close1) / time_diff angle = np.arctan(slope) * (180 / np.pi) plt.annotate(f"Angle: {angle:.2f}°", (dfpl.index[indx2], close2), xytext=(10, 10), textcoords='offset points', color='r')
2. 转换为角度实现预期范围
你要的-90至+90范围是线条倾斜角度,而非原始斜率(价格差/时间差)。原始斜率是角度的正切值(slope = tan(θ)),当角度接近±90°时,斜率会趋近于无穷大。通过np.arctan()将斜率转换为弧度,再乘以180/np.pi转为度数,就能得到你需要的范围。
3. 额外边界处理
- 加入
time_diff == 0的判断,避免两个枢轴点同索引时出现除以0的错误; - 绘图时用
dfpl的实际索引(比如时间戳)作为x轴,保证图表展示的时间轴与枢轴点对应。
内容的提问来源于stack exchange,提问作者Milad Ebrahimi Dastgerdi
相关产品推荐
相关产品推荐

