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_stocks和get_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(默认行为),聚宽的底层引擎会自动为您匹配当时真实可见的最新权重数据,从根本上杜绝了未来函数的问题。