问题描述
解决方案
在使用 JoinQuant 的 attribute_history 函数获取数据时,如果希望包含停牌日期的通过设置参数 skip_paused=False 来实现。
设置方法
在调用 attribute_history 时,显式指定 skip_paused=False。
# 获取过去5天的数据,包含停牌日期
data = attribute_history(
security='000001.XSHE',
count=5,
unit='1d',
fields=['open', 'close', 'volume'],
skip_paused=False # 关键设置:设置为 False 即不跳过停牌
)
数据填充规则
当设置 skip_paused=False 时,对于停牌的日期,系统会按照以下规则填充数据:
- 价格字段 (open, close, high, low, pre_close): 使用停牌前最后一个交易日的收盘价进行填充。
- 成交量/额 (volume, money): 填充为 0。
- 停牌标识 (paused): 如果获取
paused字段,该日期的值为1(或True)。
示例代码
以下是一个完整的策略代码片段,展示了如何获取包含停牌日的数据并打印验证:
# -*- coding: utf-8 -*-
def initialize(context):
# 选择一只历史上曾长期停牌的股票作为示例,例如 万科A (000002.XSHE) 在2015年底至2016年中曾停牌
g.security = '000002.XSHE'
run_daily(print_history_data, 'every_bar')
def print_history_data(context):
# 获取过去5天的数据,不跳过停牌
# 注意:为了演示效果,这里假设回测时间段包含了停牌期
h = attribute_history(
g.security,
count=5,
unit='1d',
fields=['close', 'volume', 'paused'],
skip_paused=False
)
# 打印数据查看
# 如果遇到停牌日,你会看到 volume 为 0,close 为前一日收盘价,paused 为 1
log.info("\n" + str(h))
Q&A
Q: attribute_history 函数默认会跳过停牌日期吗?
A: 是的,attribute_history 的 skip_paused 参数默认值为 True,即默认会自动跳过停牌日期,只返回实际交易日的数据。
Q: 如果我不跳过停牌,停牌那天的开盘价和收盘价是一样的吗?
A: 是的。当 skip_paused=False 时,停牌期间的 open、close、high、low 都会被填充为停牌前最后一个交易日的收盘价,因此这四个价格在停牌日是相等的。
Q: 获取分钟数据时 skip_paused=False 有效吗?
A: 有效。无论是天频率 (1d) 还是分钟频率 (1m),设置 skip_paused=False 都会用前一个有效数据填充停牌的时间段,保持时间轴的连续性。