TBQ的回测方式,会产生一个因为数据原因导致的回测结果与实盘绩效存在误差的问题。
直接上图:
1、如下图,实盘帐户显示,工业硅在20241008-14:43:26产生了一笔卖出委托价为9725的空单,该9725这个委托价是代码里的指定价,与代码对得上。
2、如下图,直接打开回测报告,实盘帐户和回测的交易记录对得上,在20241008-14:43:26这个时间点,卖出价是9725。
3、如下图,关闭策略单元再重启,再打开回测报告,在20241008-14:43:26这个时间点,卖出价却是9730。
4、如下图,为了找出原因,打开K线图看,在20241008-14:43:26这个时间点,高开低收都是9730。所以可以理解,在回测模式下,因为这1秒只有一个价,且9730这个卖出价还优于9725这个卖出价,所以回测系统以9730这个价来统计绩效,看似也没有毛病。
5、但是问题来了:
(1)首先我的理解是:在实时数据路径和历史数据路径两种模式下处理方式有所不同:TBQ的历史BAR数据不能同步对应的盘口信息来模拟撮合成交。历史数据路径下没有盘口信息,因此如果代码的指定价在图表上找不到相应的价格时,且图表数据更优于指定价时,会自动调整为以图表数据为准,比如把9725的卖出价调整成9730。而在实时数据模式下,因为有不同价格的挂单,所以以9725进行委托的话,不会以9730成交,而是会以9725成交。
请问,上述理解是否正确?
(2)但是,如果上述的理解是对的,那么回测结果就会失真,以回测结果作为参考会高估策略的绩效。如果上述这个问题在TBQ的现有机制下无解,那么有没有什么办法可以避免策略回测时出现上述情况?以上述的情况为例,我不想让策略在回测时以9730作为卖出价来统计绩效,而就是以9725这个指定价来统计绩效,因为9725成交才是真实情况。
谢谢!
谢谢刘总的回复。那也就是我的理解基本是对的。如果要强调回测和实盘的一致性,策略加上对价格的过滤矫正机制,应该如何设计呢?
比如,buy(lots,AA);
假如,AA是指定价,那么应该怎么样处理这个AA呢?
谢谢
实盘的时候,如果你计算出的信号价格在k线范围外,是会按照你的计算结果生成信号并报单的。
如果是回测,在历史bar上,那么信号一定会矫正到k线数据范围内。
这个机制需求是很早一些老客户提出的,他们并不需要回测,所以不存在最后信号变化导致回测报告变化的问题。他们就是需要在k线范围外挂单处理。比如突破向上突破以后我反而在下方挂单,等回落成交。
如果你强调回测和实盘的一致性,那你的策略里应该加上对价格的过滤矫正处理。