问题描述
最近在用history参数的时候,发现一个巨大的困扰。比如说,在7月24日星期五的时候,要运行程序。却发现日期只能取从23日开始的,因为24日还没有过完,就不能选24日开始。里面这个history涵数只能23日的前一天,也就是22日的数据。但是23日(也就是昨天)的历史数据都获取不到?如何在24日中盘的时候运行函数,获得23日的数据呢?
解决方案
您好!其实这是一个对 history 函数返回结果的常见误解。在 JoinQuant 聚宽平台中,当您在盘中(例如7月24日)调用 history 函数获取天级别('1d')数据时,它返回的最后一条数据正是昨天(7月23日)的数据。
根据聚宽 API 文档的说明:“当取天数据时, 不包括当天的, 即使是在收盘后;分钟数据不包括当前分钟的数据,没有未来”。这意味着,如果您在7月24日运行策略,获取过去1天的日线数据,拿到的就是7月23日的数据,并不会拿到22日的数据。
方法一:使用 history 函数
如果您在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 函数(针对单只股票)
如果您只需要查询单只股票的历史数据,使用 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)
方法三:使用 get_price 函数(指定明确的结束时间)
如果您对相对时间(过去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] 来获取返回结果中的最后一天,那就是昨天的真实数据。