🚀 AI 一键生成 joinquant 策略代码
立即体验
👉 AI 生成代码 👈

JoinQuant聚宽平台如何使用history函数获取昨天的历史数据?

joinquant | 发布时间: 2026/6/24
以下内容由 EasyQuant 生成。

问题描述

history如何从运行那天开始,获得昨天的数据?

最近在用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] 来获取返回结果中的最后一天,那就是昨天的真实数据。