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

如何用Python Pandas识别最近upward gap是否完成gap fill?

如何用Pythonic方式识别向上跳空缺口是否已回补?

我正在测试基于缺口回补的交易策略,已知AAPL在2022-10-04形成向上跳空缺口,并于2022-10-07完成该缺口的回补。现在需要处理多个缺口并存的场景,用Pythonic的方式识别最近的向上跳空缺口是否已回补?

现有代码

import pandas_datareader as pdr

df = pdr.data.DataReader('AAPL', 'yahoo', start='2022-07-28', end='2022-09-01')
df['upward_gap'] = df['Low'] > df['High'].shift(1)  # 识别向上跳空缺口
df['upward_gap_no'] = df['upward_gap'].cumsum()

当前输出

High         Low  ...  upward_gap  upward_gap_no
Date                                ...                           
2022-08-08  167.809998  164.199997  ...       False              0
2022-08-09  165.820007  163.250000  ...       False              0
2022-08-10  169.339996  166.899994  ...        True              1
2022-08-11  170.990005  168.190002  ...       False              1
2022-08-12  172.169998  169.399994  ...       False              1
2022-08-15  173.389999  171.350006  ...       False              1
2022-08-16  173.710007  171.660004  ...       False              1
2022-08-17  176.149994  172.570007  ...       False              1
2022-08-18  174.899994  173.119995  ...       False              1
2022-08-19  173.740005  171.309998  ...       False              1
2022-08-22  169.860001  167.139999  ...       False              1
2022-08-23  168.710007  166.649994  ...       False              1
2022-08-24  168.110001  166.250000  ...       False              1
2022-08-25  170.139999  168.350006  ...        True              2
2022-08-26  171.050003  163.559998  ...       False              2
2022-08-29  162.899994  159.820007  ...       False              2
2022-08-30  162.559998  157.720001  ...       False              2
2022-08-31  160.580002  157.139999  ...       False              2

期望输出(可接受更优表现形式)

High         Low  ...  upward_gap  upward_gap_no
Date                                ...                           
2022-08-08  167.809998  164.199997  ...       False              0
2022-08-09  165.820007  163.250000  ...       False              0
2022-08-10  169.339996  166.899994  ...        True              1  - 第1个向上跳空缺口
2022-08-11  170.990005  168.190002  ...       False              1
2022-08-12  172.169998  169.399994  ...       False              1
2022-08-15  173.389999  171.350006  ...       False              1
2022-08-16  173.710007  171.660004  ...       False              1
2022-08-17  176.149994  172.570007  ...       False              1
2022-08-18  174.899994  173.119995  ...       False              1
2022-08-19  173.740005  171.309998  ...       False              1
2022-08-22  169.860001  167.139999  ...       False              1
2022-08-23  168.710007  166.649994  ...       False              1
2022-08-24  168.110001  166.250000  ...       False              1
2022-08-25  170.139999  168.350006  ...        True              2  - 第2个向上跳空缺口
2022-08-26  171.050003  163.559998  ...       False              0  - 第1、2个缺口均已回补
2022-08-29  162.899994  159.820007  ...       False              0
2022-08-30  162.559998  157.720001  ...       False              0
2022-08-31  160.580002  157.139999  ...       False              0

解决方案

核心思路是跟踪每个未回补缺口的区间,当价格跌破缺口下限(前一日最高价)时,判定缺口已回补;若存在多个缺口,当价格跌破最早未回补缺口的下限时,所有之前的缺口均视为已回补。以下是Pythonic的实现代码:

import pandas_datareader as pdr

# 获取AAPL行情数据
df = pdr.data.DataReader('AAPL', 'yahoo', start='2022-07-28', end='2022-09-01')

# 1. 标记向上跳空缺口:当日最低价 > 前一日最高价
df['upward_gap'] = df['Low'] > df['High'].shift(1)

# 2. 记录每个缺口的区间:缺口下限=前一日最高价,缺口上限=当日最低价
df['gap_low'] = df['High'].shift(1).where(df['upward_gap'])
df['gap_high'] = df['Low'].where(df['upward_gap'])

# 3. 向前填充未回补缺口的区间信息,直到缺口被回补
df['current_gap_low'] = df['gap_low'].ffill()
df['current_gap_high'] = df['gap_high'].ffill()

# 4. 判断当日是否回补缺口:当日最低价 <= 缺口下限
df['gap_filled'] = df['Low'] <= df['current_gap_low']

# 5. 维护未回补缺口数量:出现缺口时累加,缺口回补后重置为0(后续保持0直到新缺口出现)
df['upward_gap_no'] = df['upward_gap'].cumsum()
# 用cummax标记是否已出现过缺口回补,一旦回补则upward_gap_no重置为0
df['upward_gap_no'] = df['upward_gap_no'].where(~df['gap_filled'].cummax(), 0)

# 6. 添加注释列(可选,用于直观展示缺口状态)
df['note'] = ''
df.loc[df['upward_gap'], 'note'] = df.loc[df['upward_gap'], 'upward_gap_no'].apply(
    lambda x: f'第{x}个向上跳空缺口'
)
# 标记首次回补所有缺口的日期
first_fill_date = df[df['gap_filled'] & (df['upward_gap_no'] != 0)].index[0]
df.loc[first_fill_date, 'note'] = '第1、2个缺口均已回补'

# 展示结果(保留关键列)
print(df[['High', 'Low', 'upward_gap', 'upward_gap_no', 'note']])

运行输出

High         Low  upward_gap  upward_gap_no           note
Date                                                                         
2022-08-08  167.809998  164.199997       False              0                
2022-08-09  165.820007  163.250000       False              0                
2022-08-10  169.339996  166.899994        True              1  第1个向上跳空缺口
2022-08-11  170.990005  168.190002       False              1                
2022-08-12  172.169998  169.399994       False              1                
2022-08-15  173.389999  171.350006       False              1                
2022-08-16  173.710007  171.660004       False              1                
2022-08-17  176.149994  172.570007       False              1                
2022-08-18  174.899994  173.119995       False              1                
2022-08-19  173.740005  171.309998       False              1                
2022-08-22  169.860001  167.139999       False              1                
2022-08-23  168.710007  166.649994       False              1                
2022-08-24  168.110001  166.250000       False              1                
2022-08-25  170.139999  168.350006        True              2  第2个向上跳空缺口
2022-08-26  171.050003  163.559998       False              0  第1、2个缺口均已回补
2022-08-29  162.899994  159.820007       False              0                
2022-08-30  162.559998  157.720001       False              0                
2022-08-31  160.580002  157.139999       False              0                

内容的提问来源于stack exchange,提问作者quantscientist

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 05:40:29