事实上,从交易所传回来的数据中,只有Tick数据,并不包含这些Bar数据。什么是Tick数据呢?你可以把交易所内的数据想象成一条河流,这个河流包含每个订单的详细数据,国内的Tick数据就是这个数据流中的某个切片,频率是每秒2次,是当时某一时刻市场交易情况的再现。
OK,开始回测:
- 开盘4950
- 价格超过前期高点5000
- 信号成立买入
- 收盘时还赚了1%
但真实的情况可能是这样的:
- 开盘4950
- 价格超过前期高点5000
- 信号成立买入
- 不久价格开始下跌
- 继续下跌至4949
- 止损信号成立卖出亏损1%
- 价格上涨5100
- 价格下跌至5050收盘
你看,上面的例子,同样的策略,同样的数据,居然会有两种截然不同的结果。究其原因还是因为数据的不同,在Bar级别回测中,如果用日K线回测,是不能知道这些日K是怎么形成的,如果用小时K线回测,是不能知道这些小时K线是怎么形成的等等,一句话:Bar数据测试什么的,弱爆了!
基于Tick数据的回测
如果能用Tick数据来做回测和分析,无疑具有很大的优势,但目前市面上好像也没有真正做到Tick数据回测和分析的量化交易平台,比如:MT4使用的是插值模拟数据,这种只是模拟了数据的变化,并不是真正的Tick数据。
当然也有号称能做到Tick级别回测的软件,名字我就不提了,只不过这些软件在设计回测引擎的时候犯了一个致命的错误,那就是:见价成交。什么意思?假如当前的Tick数据是:卖价5001、买价5000,如果我的挂的买单时5000,结果肯定是买不到的,但事实并非如此。
要知道,在真实的交易环境中,我们所下的订单是在交易所的Tick数据流中完成撮合的。交易所的撮合规则是:价格优先、时间优先。如果此时盘口订单只要不是太厚,我所挂的5000买单,是有可能被动成交的。
基于盘口数据的回测引擎原理
因此,发明者量化(fmz.com)的盘口级别回测引擎应运而生,该回测引擎不仅根据Tick数据的价格优先来撮合订单。还根据价格相同时间优先,通过计算盘口挂单量,来判断当前挂单是否达到被动成交的条件实现见量成交,以此做到真正的模拟实盘环境。我们以下图为例:
为了便于理解,上图把瞬间即逝的Tick数据并排展示:
- 第1个Tick是:
- 卖出:101 量:80
- 买入:100 量:30
- 第2个Tick是:
- 卖出:101 量:60
- 买入:100 量:50
- 第3个Tick是:
- 卖出:101 量:80
- 买入:100 量:30
- 第4个Tick是:
- 卖出:101 量:80
- 买入:100 量:10
首先第1个Tick,买价是100,挂单量是30手;此时买入信号来了,以100的价格买入20手;第2个Tick产生了,买价是100,挂单量是50手,这里面有我们20手的挂单;第3个Tick产生了,买价是100,挂单量是30手,这证明已经有20手买单被成交了或者撤单了,我们离成交又近了一步;第4个Tick产生了,买价是100,挂单量是10手,是一个大卖家,一下子把我们买单全吃了,全成。
通过上面的例子,我们可以发现,在Tick数据中,价格未变的前提下,可以通过盘口挂单量的变化,来推算自己的挂单有没有被动成交。利用的就是价格相同,时间优先的方法。这种回测引擎几乎最大程度的仿生了真实的实盘交易环境,杜绝了见价成交和虚假成交,让每一个盘口数据真实回放,使回测与实盘最大可能的一致,这样的回测才有意义。
用哪种方式回测?
在该平台中,Bar、Tick、盘口级别的回测是同时存在的,每位量化交易者,可以根据自己的交易策略,来使用不同的回测引擎,并且无论你使用哪一种回测引擎,都不用修改策略代码,每一种回测方式都可以无缝切换。
中低频策略回测并不需要复杂的撮合引擎,因为这类策略交易次数不多,滑点成本并不会对策略本身有较大的影响,一般情况下只需要在回测的时候加上几跳的滑点就可以。由于中低频策略几年才交易几十次左右,所以一般情况下使用Bar级别的回测就够了,真正需要注意的是过度拟合的问题。有些日内交易或者涉及到日内开平仓交易的策略,如果有必要,也可以在回测的配置参数页面上调整数据粒度,比如在1小时周期上回测,可以调整为更精细的15分钟数据力度。必要时也可以使用Tick级别的数据,来提高回测的精准度。
高频交易因为策略交易的次数足够多,单品种一天就能交易几十甚至上百次,所以只要撮合引擎是合理的,那么在大数定律的作用下,回测的结果基本靠谱,一般不存在过度拟合的问题。但是由于高频交易的次数很多,因此就需要对回测引擎有非常高的要求。
因为在高频交易回测中,交易频率越高,持仓的时间周期就越短,单笔的平均利润就越低,此时如果回测引擎设计的不合理,或者撮合方式与真实的交易环境不一样,那么就会出现“差之毫厘,谬以千里”的现象,所以对于高频交易来说,盘口级别的回测引擎是不二之选。
盘口数据回测实战
我们通过一个由C++编写的高频做市策略(同时也支持Python、JavaScript编写策略),来给大家演示一下,盘口级别回测是如何工作的。你可以点击下面的链接,完整复制策略并进行在线回测。下面这张图是截取自日志信息,注意看,我们在2019-07-12 14:59时同时以2231的价格买开1手,同时以2232的价格卖开1手。
- 第1个盘口数据是:
- 卖价:2232 量:409
- 买价:2231 量:73
- 第2个盘口数据是:
- 卖价:2232 量:351
- 买价:2231 量:84
- 第3个盘口数据是:
- 卖价:2232 量:369
- 买价:2231 量:67
演示策略是当赚一跳的时候就平仓,此时开完仓后,我们平仓挂单是2232平多,2231平空。按照传统的Tick级别回测,这个挂单价格无法平仓的。但该平台的盘口级别回测引擎,不断的计算盘口挂单量的变化,当进行到第3个Tick数据的时候,根据交易所的撮合机制,价格相同,时间优先的规则,我们的平多单挂单被动成交。
复制策略
点击这个链接复制完整策略,无需配置直接回测
注:目前暂时只支持国内商品期货全品种,以及数字货币okex交易所的Tick级别数据,后续我们将支持更多的交易所。
结尾
以上就是发明者量化的盘口级回测解析与实战,不仅如此,除了支持职业交易者和机构用户外,对于还没有入门的新手也非常友好,编写模型动辄百行代码伤不起有木有,可视化语言不用写代码,鼠标拖拽就可以实现。再者My语言10几句就能搞定,兼容90%以上的麦语言语法,可以说支持绝大部分文华财经的交易策略,价格只是它的五分之一,你还等什么?
想策略、做统计、搞分析……交易其实已经很辛苦了,不管你是中低频CTA、日内交易、高频交易,发明者量化交易平台都可以完美的无缝支持。我们不做玩具功能,以盘口级别精准历史回测为基础,进行多品种、多策略、多周期任意组合的测试,助你搭建最优的投资组合。