问题描述
解决方案
在 JoinQuant 聚宽 API 中,get_price 函数对停牌日期数据的处理主要由 skip_paused 和 fill_paused 两个参数控制。
以下是具体的处理逻辑:
1. 默认行为
默认设置:skip_paused=False 且 fill_paused=True。
- 处理方式:不跳过停牌日期,使用前值填充。
- 具体数据:
- 价格字段(open, close, high, low):使用停牌前最后一个交易日的收盘价(即
pre_close)进行填充。 - 成交量/额(volume, money):填充为
0。
- 价格字段(open, close, high, low):使用停牌前最后一个交易日的收盘价(即
- 目的:为了保持时间轴的连续性,特别是在同时获取多只股票数据时,保证索引(日期)对齐。
2. 跳过停牌日期
设置:skip_paused=True。
- 处理方式:直接剔除停牌日期的行。
- 结果:返回的 DataFrame 中将不包含该股票停牌的日期。
- 注意:如果同时获取多只股票(
security为列表),设置此选项可能会导致不同股票返回的数据行数不一致(如果返回的是 Panel 结构或需要索引对齐的 DataFrame,可能会有限制或报错,建议配合panel=False使用)。
3. 使用 NaN 填充
设置:skip_paused=False 且 fill_paused=False。
- 处理方式:保留停牌日期的行,但数据填充为 NaN(空值)。
- 结果:日期索引是连续的,但停牌日的 open/close/high/low 等字段均为
NaN。
代码示例
# 1. 默认情况:使用前值填充 (价格为前一日收盘价, volume为0)
df_default = get_price('000001.XSHE', start_date='2015-01-01', end_date='2015-02-01')
# 2. 跳过停牌:结果中不包含停牌日
df_skip = get_price('000001.XSHE', start_date='2015-01-01', end_date='2015-02-01', skip_paused=True)
# 3. 使用 NaN 填充:保留日期,但数据为 NaN
df_nan = get_price('000001.XSHE', start_date='2015-01-01', end_date='2015-02-01', fill_paused=False)
Q&A
Q: 为什么 get_price 默认不跳过停牌日期?
A: 主要是为了在获取多只股票数据时保持时间轴(Index)的一致性。如果跳过停牌,不同股票的行数可能不同,导致数据对齐困难。
Q: 停牌期间的 volume 和 money 字段是多少?
A: 在默认模式(前值填充)下,停牌期间的 volume(成交量)和 money(成交额)通常为 0。
Q: 如果我想计算收益率,停牌填充的数据会有影响吗?
A: 会有影响。如果使用前值填充,停牌期间的价格不变,计算出的日收益率为 0。如果使用 skip_paused=True,则计算的是复牌日相对于停牌前一日的收益率。
Q: fill_paused 参数对哪些字段生效?
A: fill_paused 主要影响价格字段(open, close, high, low)。如果设置为 True(默认),则用 pre_close 填充;如果为 False,则用 NaN 填充。