🚀 AI 一键生成 joinquant 策略代码

JoinQuant 聚宽 get_index_weights 指数权重数据何时更新?如何避免未来函数?

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

问题描述

get_index_weights数据更新问题

我调了下get_index_weights这个接口,发现每月月末才会更新,似乎是交易日才更新,想知道你们具体的更新时间以免写入未来函数。是月末交易日开盘前的8点么?

解决方案

关于 JoinQuant 聚宽平台 get_index_weights 接口的数据更新时间以及如何避免未来函数,根据官方 API 文档的说明,具体情况如下:

1. 数据更新频率与时间

  • 更新频率:官方文档指出,指数成分股权重数据是每月更新一次,一般在月底或者月初。这与指数公司(如中证指数公司)实际发布权重调整公告的节奏一致。
  • 具体更新时间:聚宽平台当日的回测数据(包括各类行情和基础数据)通常会在收盘后通过多数据源进行校验,并在 T+1(第二天)的 00:01 更新。因此,如果某个月末交易日指数公司公布了新的权重,聚宽通常会在该交易日的次日凌晨完成数据入库。

2. 如何避免未来函数

您完全不需要担心在正常调用时会引入未来函数,原因如下:

  • 时间对齐机制:在回测或模拟交易环境中,当您调用 get_index_weights(index_id, date=None) 且不传入 date 参数时,系统会默认使用 context.current_dt.date()(即策略当前运行到的逻辑日期)。
  • 向后查找逻辑:如果查询的对应日期没有恰好发生权重更新,或者当天无权重数据,API 的底层逻辑是返回距离查询日期最近的(历史)日期的权重信息。它绝对不会去获取 context.current_dt 之后的数据。
  • 官方保障:文档中明确提到:“为了避免未来函数,我们支持获取历史任意时刻的指数成分股信息,具体见 get_index_stocksget_index_weights。”

3. 最佳实践建议

为了确保策略的严谨性,建议在策略中这样调用:

def handle_data(context, data):
    # 不传入 date 参数,默认使用 context.current_dt.date()
    # 这样获取到的永远是策略当前时刻所能看到的最新历史权重,绝无未来函数
    weights_df = get_index_weights('000300.XSHG')
    
    # 如果需要明确指定日期,请确保传入的日期 <= context.current_dt.date()
    # weights_df = get_index_weights('000300.XSHG', date=context.previous_date)

总结:您不需要刻意去卡“月末交易日开盘前的8点”这个时间点。只要在回测/模拟中依赖 context.current_dt(默认行为),聚宽的底层引擎会自动为您匹配当时真实可见的最新权重数据,从根本上杜绝了未来函数的问题。