QMT策略在多周期数据下如何对齐?避免未来数据泄露
发布时间:2小时前阅读:21

编写较复杂的量化策略时,常常需要同时使用日线、60分钟线和5分钟线数据。例如,用日线判断大趋势,用60分钟线找入场点,用5分钟线精确执行。但在QMT中处理多周期数据容易犯一个严重错误:未来函数。意思是,在回测中使用了当前时间点之后的数据。下面解释如何正确对齐。
在QMT的回测中,handle_bar函数是按K线周期依次调用的。如果你选择日线作为主周期,那么每次调用时,你只能获取到当天的日线收盘价,不能获取到当天尚未发生的分钟线数据。如果你想同时获取不同周期的数据,需要采用“异步订阅”或“逐笔合成”的方式。
正确做法:在主周期为日线的回测中,要获取60分钟线,只能取到昨天及更早的60分钟数据。比如今天是2026年5月15日,在handle_bar中,你只能获取到2026年5月14日收盘时的60分钟线。用昨天的60分钟线来指导今天的交易,这是合理的,没有未来函数。但有些新手会错误地调用get_market_data并传入当前日期,导致获取到今天收盘后的60分钟数据,那就是未来数据。
具体实现技巧:使用xtdata.get_market_data时,指定period='60m',并且start_time和end_time参数要设置为上一根K线的结束时间。或者,你也可以提前缓存数据:在init中下载全部历史多周期数据,在handle_bar中根据当前日期索引对应的数据(注意只能索引到昨天)。
另一种方法是使用ContextInfo.get_kline_serial函数,它可以获取指定周期的时间序列,但要注意最后一个bar是否是未完成的。对于盘中回测,未完成的bar会随行情变化,不适合用于决策。
如果你开发的是盘中策略(比如15分钟线),那么可以直接用15分钟作为主周期,然后获取日线数据时,需要取“昨天”的日线数据,因为今天的日线要收盘后才确定。
为了彻底避免未来函数,建议在回测后打印几个关键日期的数据值,手动验证是否使用了未来的信息。
对于需要多周期共振的策略,一个安全的设计模式是:主周期使用较小周期(如5分钟),在其中获取较大周期的数据时,强制将时间向前回拨一个周期。例如,在5分钟K线中,使用get_market_data(period='day', count=1, end_time=context.now - datetime.timedelta(minutes=5))。
国金证券的QMT提供完整的多周期数据接口,10万资金即可开通。在量化社群中,有经验丰富的用户分享他们处理多周期数据的代码模板,可以直接参考。同时,两融全线上办理,让你在策略产生信号后能快速调动资金。记住,没有未来函数的回测才值得信赖,否则一切都是自欺欺人。
温馨提示:投资有风险,选择需谨慎。
-
养虾理财用的金融Skill是什么?国泰海通灵犀Skills实测,新手也能装
2026-05-09 13:41
-
豆包开启付费!AI行业迎来拐点,普通投资者该怎么布局?
2026-05-09 13:41
-
2026国金证券新人开户能够享受哪些福利?(含6888元品质礼包)
2026-05-09 13:41


问一问

+微信
分享该文章
