3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
这不是 Bug,而是 JoinQuant 平台动态复权机制(use_real_price)设计的一个 Feature(特性)。
导致你在 initialize 和 market_open 阶段打印出的前复权价格不一致的根本原因,在于 set_option('use_real_price', True) 的调用时机以及复权基准日(fq_ref_date)的变化。
initialize 阶段(未开启真实价格模式)
在你的代码中,print(get_price(...)) 写在了 set_option('use_real_price', True) 之前。此时,回测引擎处于默认的传统前复权模式。
根据 JoinQuant API 文档说明,在未开启 use_real_price 时,前复权的基准日期是建立回测的现实日期(即你坐在电脑前点击“运行回测”的今天)。因此,你看到的 11.xx 是基于现实今天的复权因子计算出的前复权价格。
market_open 阶段(已开启真实价格模式)
当代码执行到 market_open 时,use_real_price 已经被设置为 True。此时引擎进入了动态复权(真实价格)模式。
文档中明确指出:开启真实价格回测后,通过 get_price 拿到的前复权价格,是**基于回测当天的逻辑日期(context.current_dt)**作为基准日的前复权价格。在你的日志中,逻辑时间是 2019-02-11,所以你看到的 20.xx 是基于 2019-02-11 这一天的复权因子计算出的前复权价格。
为什么价格会变?
因为 300600.XSHE 在 2019-02-11 到你运行回测的现实日期之间,发生了分红送转(除权除息)。基准日不同,计算出来的前复权历史价格自然就不同了。
如果你希望在 initialize 阶段获取的数据与盘中一致,请将 set_option('use_real_price', True) 放在 initialize 函数的第一行:
def initialize(context):
# 1. 必须先开启动态复权模式
set_option('use_real_price', True)
# 2. 然后再获取数据
print(get_price('300600.XSHE', fq='pre', count=2, end_date='2019-2-1'))
# 其他初始化设置...
set_benchmark('000300.XSHG')
官方文档特别提醒:
开启真实价格回测之后,你在不同日期调用 get_price 返回的前复权价格可能是不一样的(因为随着时间推移,如果遇到除权除息,前复权价格会发生变化)。因此,千万不要跨日期缓存这些 API 返回的前复权结果,每次需要历史数据时,请在当前逻辑时间点重新调用 API 获取。