Python交易算法开发:枢轴高低点识别报错排查
问题排查:ValueError - 赋值列长度不匹配
错误原因
find_pivot_highs函数返回的是枢轴高点的索引位置列表(本次返回了6个索引),但你试图直接将这个短列表赋值给拥有374行的DataFrame列ph,两者长度不匹配,触发了ValueError。之前该函数能正常运行,大概率是因为当时没有直接把列表赋值给DataFrame列,而是用列表做标记、筛选等其他操作。
解决思路
1. 标记枢轴点位置(推荐)
创建布尔列标记哪些行是枢轴高点/低点,而非直接赋值索引列表:
# 处理枢轴高点 data['ph'] = False pivot_high_indices = find_pivot_highs(high, length) data.loc[pivot_high_indices, 'ph'] = True # 处理枢轴低点 data['pl'] = False pivot_low_indices = find_pivot_lows(low, length) data.loc[pivot_low_indices, 'pl'] = True
2. 存储枢轴点价格(若业务需要)
如果要在列中存储对应枢轴点的价格,其余位置留空:
# 存储枢轴高点价格 data['ph'] = np.nan pivot_high_indices = find_pivot_highs(high, length) data.loc[pivot_high_indices, 'ph'] = high[pivot_high_indices] # 存储枢轴低点价格 data['pl'] = np.nan pivot_low_indices = find_pivot_lows(low, length) data.loc[pivot_low_indices, 'pl'] = low[pivot_low_indices]
3. 修正后续依赖代码
原代码后续逻辑依赖data['ph']的索引信息,需对应调整:
- 若用布尔标记列:
# 获取枢轴高点索引 pivot_high_indices = data[data['ph']].index data['slope_ph'] = data['slope_atr'].where(data.index.isin(pivot_high_indices)).ffill() # 同理处理枢轴低点 pivot_low_indices = data[data['pl']].index data['slope_pl'] = data['slope_atr'].where(data.index.isin(pivot_low_indices)).ffill()
- 若用价格列(带NaN):
pivot_high_indices = data[data['ph'].notna()].index pivot_low_indices = data[data['pl'].notna()].index
额外优化建议
原find_pivot_highs和find_pivot_lows用循环效率较低,可改用pandas滑动窗口函数优化,代码更简洁且运行更快:
def find_pivot_highs(series, length): # 计算左侧length窗口的最大值(当前点之前的length个值) roll_left = series.rolling(window=length, center=False).max().shift(1) # 计算右侧length窗口的最大值(当前点之后的length个值) roll_right = series.rolling(window=length, center=False).max().shift(-length) # 返回符合条件的索引 return series[(series > roll_left) & (series > roll_right)].index def find_pivot_lows(series, length): roll_left = series.rolling(window=length, center=False).min().shift(1) roll_right = series.rolling(window=length, center=False).min().shift(-length) return series[(series < roll_left) & (series < roll_right)].index
内容的提问来源于stack exchange,提问作者driver
相关产品推荐
相关产品推荐

