3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
你好!关于你在 JoinQuant 回测环境中使用 get_bars 函数遇到的两个疑惑,以下是详细的解答:
include_now=True 会不会查询到未来数据?结论:不会查询到未来数据,但获取到的是一个“未完成的快照 Bar”。
详细解析:
9:33 运行时,如果你请求 unit='5m' 且 include_now=True,系统会返回 9:30-9:33 这 3 分钟的数据组合成的一根 Bar。close 并不是最终 9:35 结束时的真实收盘价。如果你在策略中用这个未完成的 close 去计算均线或突破逻辑,可能会与你预期的“完整 5 分钟 K 线”逻辑产生偏差。通常在严谨的分钟级回测中,建议使用 include_now=False 来获取已经完全走完的上一根 Bar,以确保信号的稳定性。fq_ref_date 取默认值时,回测过程中会前复权吗?结论:默认情况下会进行“动态前复权”。
详细解析:
根据 JoinQuant API 文档,fq_ref_date(复权基准日期)在回测/模拟环境中的默认值是 context.current_dt.date()(即策略运行当天的日期)。
什么是动态前复权?
这意味着,当你的回测运行到历史上的某一天(例如 2018-01-05)时,get_bars 会以 2018-01-05 作为复权基准日,对这天之前的数据进行前复权。这种机制完美模拟了你“穿越”到历史那一天时,在行情软件上看到的前复权价格,有效避免了未来函数(因为没有使用 2018-01-05 之后的复权因子)。
为什么你 Print 出来感觉像是未复权数据?
initialize 中设置了 set_option('use_real_price', True),系统在撮合交易和计算账户资产时使用的是真实的未复权价格。但是,为了方便计算技术指标,API(如 get_bars, history)返回的依然是基于当天的前复权数据。如果你拿 API 返回的价格和账户持仓成本去对比,可能会产生误解。fq_ref_date=None,那么获取到的就是纯粹的未复权(真实)数据。总结:只要你不显式传入 None,回测计算指标时默认使用的就是基于当天的前复权数据,你可以放心使用它来计算 MA、MACD 等技术指标,不会引入未来函数。