专为高频策略回测开发的Tick级见量成交撮合机制

时间:2024-02-23 18:56:28


摘要

策略回测什么才是最重要的?速度?花里胡哨的绩效指标?答案是准确!是的,回测的目的是为了验证策略的逻辑和可行性。这也是回测本身的意义,其他都是次要的。一个能够真正反映策略在历史数据上的回测才具有参考价值,那些看似完美的回测曲线讲故事可以,实盘它不行。
 
回测都需要哪些数据
如何做到精准的回测,是很多量化交易者关心的问题。首先要弄清楚交易中都有哪些数据,因为数据的质量很大程度上已经决定了回测的质量。很多人都能想到K线图上的开盘价、最高价、最低价、收盘价、成交量等等,为了更好的区分,我们把这些数据统称为Bar数据,你可以理解为K线。但是大家有没有想过这些数据是从哪来的,这些数据的源头是什么?

事实上,从交易所传回来的数据中,只有Tick数据,并不包含这些Bar数据。什么是Tick数据呢?你可以把交易所内的数据想象成一条河流,这个河流包含每个订单的详细数据,国内的Tick数据就是这个数据流中的某个切片,频率是每秒2次,是当时某一时刻市场交易情况的再现。
 
那么,Bar数据就是基于Tick数据,并按照时间周期分割而成,1分钟的Bar数据是由1分钟内的Tick数据组成,5分钟的Bar数据是由5分钟内的Tick数据组成,以此类推......形成了各种分钟图、小时图、日线图等等。一分钟的K线只有一个Bar数据,但是可能包含120个Tick数据。因此,回测的历史数据可以分为:Bar数据和Tick数据,并且在同一个周期内Tick的数据量要比Bar数据量大很多。
 
基于Bar数据的回测
市面上量化交易软件几乎都支持Bar数据的回测,由于数据量少,大大简化了回测引擎的工作量,所以这种回测通常都非常快,十年左右的数据几秒之内就能回测完,甚至叠加几十个期货品种回测也不会超过一分钟。但是Bar数据回测有很多问题:
 
1、极端价格
做过交易的人都知道,在涨停中很难买入,在跌停中很难卖出,但是在回测中是可以成交的,一些做量化交易的新手,如果不在策略中对涨跌停价进行过滤,回测的结果会与实盘不一致。


2、价格真空
从跌停瞬间到涨停或者价格跳空上涨,在大周期K线图上看是一根大阳线,但是这根K线中间是没有任何实质挂单和订单的,如果你是即时价成交的策略,在Bar数据上回测,是可以成交的。
 
举个例子:当前K线一直在5000价格附近徘徊,临近收盘瞬间涨至5100,并且中间几乎没有挂单和成交。如果你的策略在这根K线上是5050开仓,那么在Bar数据回测中是可以成交的,而且这种现象很常见。
 
3、偷价和未来数据
相信很多量化交易者都遇到过这种坑,那些45度角的回测曲线,大部分都是从这来的。为了便于大家理解,我再举个例子:我们知道一根K线是4个价格,如果是1分钟的阳线,那么这根K线的形成应该是:开盘价>>>最低价>>>最高价>>>收盘价。
 
但是大周期的K线就不会这么简单了,它有可能先创新高,再创新低,再收盘;也有可能先创新低,再创新高,再收盘;甚至也可能一波三折先创新低,再创新高,再创新低,再拉高收盘;表面上看是一根有上影线和下影线的K线,中间是怎么形成的有很多种可能。
 
假如这根K线是这样的:开盘价4950、最低价4900、最高价5100、收盘价5050,一根普通阳线。你的策略是:如果最新价超过前期高点5000就买入,买入后设置1%的止损,也就是价格跌破4950就止损。
 

OK,开始回测:

  1. 开盘4950
  2. 价格超过前期高点5000
  3. 信号成立买入
  4. 收盘时还赚了1%

但真实的情况可能是这样的:

  1. 开盘4950
  2. 价格超过前期高点5000
  3. 信号成立买入
  4. 不久价格开始下跌
  5. 继续下跌至4949
  6. 止损信号成立卖出亏损1%
  7. 价格上涨5100
  8. 价格下跌至5050收盘

 

你看,上面的例子,同样的策略,同样的数据,居然会有两种截然不同的结果。究其原因还是因为数据的不同,在Bar级别回测中,如果用日K线回测,是不能知道这些日K是怎么形成的,如果用小时K线回测,是不能知道这些小时K线是怎么形成的等等,一句话:Bar数据测试什么的,弱爆了!

 

基于Tick数据的回测

如果能用Tick数据来做回测和分析,无疑具有很大的优势,但目前市面上好像也没有真正做到Tick数据回测和分析的量化交易平台,比如:MT4使用的是插值模拟数据,这种只是模拟了数据的变化,并不是真正的Tick数据。

 

当然也有号称能做到Tick级别回测的软件,名字我就不提了,只不过这些软件在设计回测引擎的时候犯了一个致命的错误,那就是:见价成交。什么意思?假如当前的Tick数据是:卖价5001、买价5000,如果我的挂的买单时5000,结果肯定是买不到的,但事实并非如此。

 

要知道,在真实的交易环境中,我们所下的订单是在交易所的Tick数据流中完成撮合的。交易所的撮合规则是:价格优先、时间优先。如果此时盘口订单只要不是太厚,我所挂的5000买单,是有可能被动成交的。

 

基于盘口数据的回测引擎原理

因此,发明者量化(fmz.com)的盘口级别回测引擎应运而生,该回测引擎不仅根据Tick数据的价格优先来撮合订单。还根据价格相同时间优先,通过计算盘口挂单量,来判断当前挂单是否达到被动成交的条件实现见量成交,以此做到真正的模拟实盘环境。我们以下图为例:

为了便于理解,上图把瞬间即逝的Tick数据并排展示:

  • 1Tick是:
  • 卖出:101 量:80
  • 买入:100 量:30

 

  • 2Tick是:
  • 卖出:101 量:60
  • 买入:100 量:50

 

  • 3Tick是:
  • 卖出:101 量:80
  • 买入:100 量:30

 

  • 4Tick是:
  • 卖出:101 量:80
  • 买入:100 量:10

 

首先第1Tick,买价是100,挂单量是30手;此时买入信号来了,以100的价格买入20手;第2Tick产生了,买价是100,挂单量是50手,这里面有我们20手的挂单;第3Tick产生了,买价是100,挂单量是30手,这证明已经有20手买单被成交了或者撤单了,我们离成交又近了一步;第4Tick产生了,买价是100,挂单量是10手,是一个大卖家,一下子把我们买单全吃了,全成。

 

通过上面的例子,我们可以发现,在Tick数据中,价格未变的前提下,可以通过盘口挂单量的变化,来推算自己的挂单有没有被动成交。利用的就是价格相同,时间优先的方法。这种回测引擎几乎最大程度的仿生了真实的实盘交易环境,杜绝了见价成交和虚假成交,让每一个盘口数据真实回放,使回测与实盘最大可能的一致,这样的回测才有意义。

 

用哪种方式回测?

在该平台中,BarTick、盘口级别的回测是同时存在的,每位量化交易者,可以根据自己的交易策略,来使用不同的回测引擎,并且无论你使用哪一种回测引擎,都不用修改策略代码,每一种回测方式都可以无缝切换。

 

中低频策略回测并不需要复杂的撮合引擎,因为这类策略交易次数不多,滑点成本并不会对策略本身有较大的影响,一般情况下只需要在回测的时候加上几跳的滑点就可以。由于中低频策略几年才交易几十次左右,所以一般情况下使用Bar级别的回测就够了,真正需要注意的是过度拟合的问题。有些日内交易或者涉及到日内开平仓交易的策略,如果有必要,也可以在回测的配置参数页面上调整数据粒度,比如在1小时周期上回测,可以调整为更精细的15分钟数据力度。必要时也可以使用Tick级别的数据,来提高回测的精准度。

 

高频交易因为策略交易的次数足够多,单品种一天就能交易几十甚至上百次,所以只要撮合引擎是合理的,那么在大数定律的作用下,回测的结果基本靠谱,一般不存在过度拟合的问题。但是由于高频交易的次数很多,因此就需要对回测引擎有非常高的要求。

 

因为在高频交易回测中,交易频率越高,持仓的时间周期就越短,单笔的平均利润就越低,此时如果回测引擎设计的不合理,或者撮合方式与真实的交易环境不一样,那么就会出现差之毫厘,谬以千里的现象,所以对于高频交易来说,盘口级别的回测引擎是不二之选。

 

盘口数据回测实战

我们通过一个由C++编写的高频做市策略(同时也支持PythonJavaScript编写策略),来给大家演示一下,盘口级别回测是如何工作的。你可以点击下面的链接,完整复制策略并进行在线回测。下面这张图是截取自日志信息,注意看,我们在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级别回测,这个挂单价格无法平仓的。但该平台的盘口级别回测引擎,不断的计算盘口挂单量的变化,当进行到第3Tick数据的时候,根据交易所的撮合机制,价格相同,时间优先的规则,我们的平多单挂单被动成交。

 

复制策略

点击这个链接复制完整策略,无需配置直接回测
注:目前暂时只支持国内商品期货全品种,以及数字货币okex交易所的Tick级别数据,后续我们将支持更多的交易所。

 

结尾

以上就是发明者量化的盘口级回测解析与实战,不仅如此,除了支持职业交易者和机构用户外,对于还没有入门的新手也非常友好,编写模型动辄百行代码伤不起有木有,可视化语言不用写代码,鼠标拖拽就可以实现。再者My语言10几句就能搞定,兼容90%以上的麦语言语法,可以说支持绝大部分文华财经的交易策略,价格只是它的五分之一,你还等什么?

 

想策略、做统计、搞分析……交易其实已经很辛苦了,不管你是中低频CTA、日内交易、高频交易,发明者量化交易平台都可以完美的无缝支持。我们不做玩具功能,以盘口级别精准历史回测为基础,进行多品种、多策略、多周期任意组合的测试,助你搭建最优的投资组合。