问题描述
get_price的参数:skip_paused、fill_paused、count,有点迷,特别前两个,有没有关系?
如果股票上个交易日停牌,
skip_paused=True,fill_paused=False,count=1,就获取不到数据?
skip_paused=True,fill_paused=True,count=1,也获取不到数据?
解决方案
在 JoinQuant (聚宽) 平台中,get_price 是获取历史行情数据最常用的 API 之一。理解 skip_paused、fill_paused 和 count 这三个参数对于正确处理停牌股票的数据至关重要。
参数基本含义
count:表示你要获取的数据行数(即 K 线根数)。例如count=1表示获取距离end_date最近的 1 根 K 线数据。skip_paused:是否跳过不交易的日期(包括停牌、未上市、已退市)。True:跳过停牌日,直接往前寻找最近的一个正常交易日的数据。False(默认):不跳过停牌日,时间轴保持连续。
fill_paused:当skip_paused=False(即不跳过停牌日)时,如何填充停牌日的数据。True(默认):使用停牌前最后一个正常交易日的收盘价(pre_close)来填充停牌日的开、高、低、收价格,成交量(volume)和成交额(money)为 0。False:停牌日的所有价格和成交量数据都用NaN(空值)填充。
参数之间的关系
skip_paused 和 fill_paused 的关系是先后的:
- 如果
skip_paused=True:系统会直接把停牌的日期从结果中剔除。既然停牌日都不存在于返回的结果中了,那么fill_paused参数实际上就失效了(因为没有停牌日需要去填充)。 - 如果
skip_paused=False:系统会保留停牌的日期,此时fill_paused才会起作用,决定这个保留下来的停牌日里填的是前收盘价还是NaN。
回答您的具体问题
假设股票上个交易日停牌,您设置了 count=1(获取最近 1 天的数据):
情况 1:skip_paused=True,fill_paused=False,count=1
- 结果:能获取到数据。
- 解析:因为
skip_paused=True,系统会跳过上个交易日(停牌日),继续往前找,直到找到停牌前最后一个正常交易的日子,并返回那一天的真实交易数据。此时fill_paused=False不起作用。
情况 2:skip_paused=True,fill_paused=True,count=1
- 结果:能获取到数据。
- 解析:同上,系统跳过停牌日,返回停牌前最后一个正常交易日的数据。
fill_paused=True同样不起作用。
补充情况 3:skip_paused=False,fill_paused=False,count=1
- 结果:返回上个交易日(停牌日)的数据,但数据全是
NaN。 - 解析:不跳过停牌日,且不填充,所以返回空值。
补充情况 4:skip_paused=False,fill_paused=True,count=1
- 结果:返回上个交易日(停牌日)的数据,价格数据为停牌前的收盘价,成交量为 0。
- 解析:不跳过停牌日,且使用前收盘价填充。
总结建议
- 如果您的策略需要计算均线等技术指标,通常建议使用
skip_paused=True,这样计算出的指标是基于真实交易日的,不会被停牌日的平直线干扰。 - 如果您需要获取多只股票的数据,且要求时间轴严格对齐(例如截面数据分析),通常建议使用
skip_paused=False, fill_paused=True,这样所有股票在同一天都有数据,方便矩阵运算。