3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
您好!其实这是一个对 history 函数返回结果的常见误解。在 JoinQuant 聚宽平台中,当您在盘中(例如7月24日)调用 history 函数获取天级别('1d')数据时,它返回的最后一条数据正是昨天(7月23日)的数据。
根据聚宽 API 文档的说明:“当取天数据时, 不包括当天的, 即使是在收盘后;分钟数据不包括当前分钟的数据,没有未来”。这意味着,如果您在7月24日运行策略,获取过去1天的日线数据,拿到的就是7月23日的数据,并不会拿到22日的数据。
如果您在7月24日盘中运行,想要获取昨天(7月23日)的收盘价,可以直接这样写:
def handle_data(context, data):
# 获取股票池中所有股票过去1天的收盘价(即昨天的收盘价)
# 返回的是一个 DataFrame,行索引是日期,列索引是股票代码
hist_data = history(1, '1d', 'close')
# 假设我们要获取平安银行昨天的收盘价
yesterday_close = hist_data['000001.XSHE'][-1]
log.info("昨天的收盘价是: %s" % yesterday_close)
如果您只需要查询单只股票的历史数据,使用 attribute_history 会更加方便:
def handle_data(context, data):
security = '000001.XSHE'
# 获取过去1天的日线数据,默认不包含今天
df = attribute_history(security, 1, '1d', ['close'])
# df['close'][-1] 就是昨天的收盘价
yesterday_close = df['close'][-1]
log.info("昨天的收盘价是: %s" % yesterday_close)
如果您对相对时间(过去N天)感到不放心,希望用绝对时间来获取,可以使用 get_price 函数,并将 end_date 设置为昨天,或者设置为 context.previous_date:
def handle_data(context, data):
security = '000001.XSHE'
# context.previous_date 会自动获取前一个交易日的日期(即昨天)
df = get_price(security, count=1, end_date=context.previous_date, frequency='daily', fields=['close'])
yesterday_close = df['close'][0]
log.info("昨天的收盘价是: %s" % yesterday_close)
总结:
在7月24日盘中调用 history(1, '1d', 'close'),您获取到的绝对是7月23日的数据。如果您发现取到了22日的数据,可能是因为您在切片时使用了错误的索引(例如 [-2]),或者在非交易日进行了测试。请放心使用 [-1] 来获取返回结果中的最后一天,那就是昨天的真实数据。