如何用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
相关产品推荐
相关产品推荐

