3 分钟快速生成代码
输入想法,AI 即刻生成可运行代码
很多量化交易者在实盘或模拟盘中都会遇到“回测如神仙,实盘如狗屎”的情况。除了您已经提到的**交易税费(cost)和滑点(slippage)**设置外,回测精度不准往往是由数据处理方式、撮合机制以及无意中引入的未来函数导致的。聚宽(JoinQuant)的数据整体质量在国内量化平台中属于第一梯队,但为了让回测尽可能贴近真实市场,您需要特别注意以下几个核心设置和底层逻辑:
传统的“前复权”回测模式存在一个致命缺陷:它使用的是基于今天(回测当天)的复权因子计算出的历史价格。这意味着历史价格中包含了未来的分红派息信息,存在严重的未来函数,会导致回测买入数量和资金计算出现偏差。
解决方案:在 initialize 函数中务必开启真实价格模式:
set_option('use_real_price', True)
开启后,回测将使用历史当时的真实价格进行撮合成交,并在发生拆分或分红时,根据历史当时的复权因子自动调整账户持股数量和现金,完美规避复权导致的未来函数。
在回测中,如果您下了一个大单,系统默认可能会全部成交,但在真实市场中,大单会受到盘口流动性的限制,甚至造成巨大的冲击成本。
解决方案:使用 order_volume_ratio 限制每日/每分钟的最大成交量比例。例如,限制您的订单成交量不超过市场真实成交量的 25%:
set_option('order_volume_ratio', 0.25)
如果下单量超过该比例,市价单超出的部分会被撤单,限价单则会继续挂单等待撮合,这能极大提升大资金回测的真实度。
未来函数是回测精度不准的罪魁祸首。聚宽提供了一个实验性功能来帮助检测和规避部分未来数据:
set_option("avoid_future_data", True)
开启后,如果您尝试获取当前逻辑时间之后的数据,系统会报错或自动剔除未来数据。
在使用 get_fundamentals 获取财务数据时,参数 date 和 statDate 的使用非常关键:
date:传入 date 时,系统会查找该日期收盘后所能看到的最近发布的数据,这符合真实交易场景,没有未来函数。statDate:如果您指定了 statDate='2020q1',由于公司发布财报有滞后性(通常在4月底才发布完一季报),如果您在3月份的回测中使用了这个数据,就引入了未来函数。在未启用盘口撮合(回测默认状态)时,如果标的“最新价+滑点”触及涨跌停板:
总结:聚宽的数据本身是可靠的,回测的“不准”多半来源于策略对市场微观结构的简化。通过开启 use_real_price、限制 order_volume_ratio、严格使用 date 获取财务数据,并深入理解平台的 Bar 撮合机制,您可以将回测的真实度提升到一个全新的水平。