问题描述
解决方案
在使用 JoinQuant API 的 history 函数获取数据时,可以通过设置参数 skip_paused=True 来跳过停牌日期。
默认情况下,history 函数的 skip_paused 参数默认为 False,这意味着如果遇到停牌日期,系统会使用停牌前一天的收盘价数据进行填充(即数据看起来是连续的,价格不变)。将其设置为 True 后,返回的数据将只包含实际交易日的数据。
代码示例
# -*- coding: utf-8 -*-
def handle_data(context, data):
# 获取股票列表,例如平安银行
security_list = ['000001.XSHE']
# 使用 history 获取过去 5 个实际交易日的数据
# 设置 skip_paused=True 以跳过停牌日期
# df=True 表示返回 DataFrame 格式
hist_data = history(count=5,
unit='1d',
field='close',
security_list=security_list,
df=True,
skip_paused=True)
log.info(hist_data)
注意事项
-
索引对齐问题:
当skip_paused=True且同时获取多只股票的数据时,返回的 DataFrame 行索引(Index)可能不再是统一的日期对象。因为不同股票的停牌时间不同,导致它们在相同的count数量下对应的历史日期不一致。在这种情况下,数据无法在时间轴上严格对齐。 -
数据填充逻辑:
skip_paused=False(默认):停牌时使用停牌前的数据填充,volume和money为 0。skip_paused=True:直接剔除停牌日的数据行,只保留有成交的日期。
-
适用范围:
该参数适用于history和attribute_history函数。
Q&A
Q: 如果我同时查询多只股票并设置 skip_paused=True,返回的数据格式是什么样的?
A: 如果查询多只股票且设置跳过停牌,由于各股票停牌时间不同,返回的 DataFrame 可能会出现索引无法对齐的情况,或者某些股票的数据长度看起来不一致(如果非 DataFrame 格式)。通常建议在需要严格时间对齐的策略中(如多因子选股),谨慎使用 skip_paused=True 获取多只股票数据,或者在获取后自行处理对齐逻辑。
Q: attribute_history 函数也可以使用这个参数吗?
A: 是的,attribute_history 函数同样支持 skip_paused 参数,且默认值通常为 True(注意:history 默认为 False,而 attribute_history 在文档中说明默认跳过停牌,具体视 API 版本而定,建议显式指定以确保符合预期)。
Q: get_price 函数如何跳过停牌?
A: get_price 函数同样拥有 skip_paused 参数。当 skip_paused=True 时,如果获取多只标的,需要将 panel 参数设置为 False(因为 Panel 结构要求索引对齐,而跳过停牌会导致索引不一致)。