如何在Pandas DataFrame中定位突破枢轴点的K线(仅标记一次)
定位突破枢轴点的K线解决方案
核心思路
先提取所有枢轴点的价格位置(pivot=1对应低点,pivot=2对应高点),再检查后续K线是否突破这些价格,最后给突破的K线打上对应标记。用pandas向量化操作替代循环,效率更高。
具体实现步骤
1. 提取枢轴点的价格和位置
把pivot列中值为1和2的行单独提取,记录对应的价格和索引:
# 提取低点枢轴(pivot=1)的价格与索引 pivot_low = df[df['pivot'] == 1][['low']].rename(columns={'low': 'pivot_low_price'}) # 提取高点枢轴(pivot=2)的价格与索引 pivot_high = df[df['pivot'] == 2][['high']].rename(columns={'high': 'pivot_high_price'})
2. 匹配并标记突破的K线
用merge_asof匹配每个K线之前最近的枢轴点,判断是否突破后标记:
import pandas as pd # 初始化标记列,默认值为0 df['takes_pivot'] = 0 # 确保数据按时间/索引排序(假设索引为日期且已排序) df_sorted = df.sort_index() # 处理突破低点枢轴的情况 pivot_low_sorted = pivot_low.sort_index() merged_low = pd.merge_asof(df_sorted, pivot_low_sorted, left_index=True, right_index=True, direction='backward') # 当前K线最低价低于枢轴低点时标记为1 mask_low = merged_low['low'] < merged_low['pivot_low_price'] df.loc[mask_low, 'takes_pivot'] = 1 # 处理突破高点枢轴的情况 pivot_high_sorted = pivot_high.sort_index() merged_high = pd.merge_asof(df_sorted, pivot_high_sorted, left_index=True, right_index=True, direction='backward') # 当前K线最高价高于枢轴高点时标记为2 mask_high = merged_high['high'] > merged_high['pivot_high_price'] df.loc[mask_high, 'takes_pivot'] = 2
3. 冲突处理(可选)
若单个K线同时突破多个枢轴点,可按需求设置优先级,比如优先标记高点突破:
df['takes_pivot'] = 0 # 先标记高点突破 mask_high = merged_high['high'] > merged_high['pivot_high_price'] df.loc[mask_high, 'takes_pivot'] = 2 # 仅给未标记的K线标记低点突破 mask_low = (merged_low['low'] < merged_low['pivot_low_price']) & (df['takes_pivot'] == 0) df.loc[mask_low, 'takes_pivot'] = 1
说明
merge_asof能高效匹配每个K线之前最近的枢轴点,比循环更适合处理大规模K线数据。- 若DataFrame未按时间排序,需先对时间列或索引进行排序操作。
内容的提问来源于stack exchange,提问作者Глеб Дубовенко
相关产品推荐
相关产品推荐

