You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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,提问作者Глеб Дубовенко

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 10:22:23