14.1 基于MATLAB的量化回测平台框架介绍

14.1.1 回测平台实现细节思考

量化投资进行回测的目的是尽可能真实地还原实际交易过程,进而检测策略的表现。在介绍回测平台架构前,先对一些相关细节问题进行讨论和思考。

1. 回测标的的选取

与股票数据不同,由于期货不同月份的合约会到期交割,所以相应品种的数据并不连续, 那么进行回测时选取什么回测标的?有很多种方法将相关品种的期货合约连接起来形成连续数据,但哪种才是比较合理的?

回到实际交易本身,采取不同类型的交易策略(震荡类、对冲类)会有不同选择,这里仅就单边趋势类策略而言,采取单边趋势类策略的大多数投资者会在相关品种的主力合约上进行交易。这里有一个问题:怎么定义"主力合约" ?只要给出"主力合约"的定义,那么回测标的的选取就有了答案,即用"主力连续合约"进行回测,这样能真实地反映实际交易过程。主力连续合约的构造按照主力合约的定义给出,比如可以按照成交量×持仓量的最大值来定义主力合约:假设有A、B、C、D4个同一品种不同月份的期货合约,现把这几个不同月份的合约进行连接,设T为时间轴,在第T1天计算成交量×持仓量,该值最大的合约为主力合约。但该换月过程不向后换月,只向前换月,即若某一合约K(属于A、B、C、D中的一个)在Tk天前做过主力合约,在第Tk天换月后的某一天K合约的成交量×持仓量为最大值,此时忽略K。

上面是主力连续合约构造的方式之一,也有一些量化交易员使用某一品种所有合约的加权平均的指数作为回测标的,或者采用在指数上触发信号,在主力合约上交易进行回测的方法。

2. 冲击成本的估计

冲击成本是回测中的未知量,其大小理论与市场的深度和广度相关,最好的估计方式是积累大量的实盘交易记录,进而估计某一品种的实际冲击成本的大小。一般而言,流动性好的品种使用1~2跳(跳是交易品种基本变动单位)作为冲击成本的估计,流动性不好的品种需要更大的冲击成本。

需要说明的是,冲击成本并不一定对交易系统不利,依据不同的交易思路和策略设计,可能会出现负冲击成本的情况。

3. 手续费的设置

手续费一般是固定的成本,为了严格一些,可以将手续费设得大些,比如设成交易所手续费的1.5~3倍。当然也没有必要将手续费设置得过高,因为所有的策略模型在手续费趋于无穷大时都会崩溃,而且手续费设置得过高,会淹没策略本身的某些细节。关于策略对于手续费的敏感性,可以单独做敏感性压力测试。

4. 交易系统的评价

全面地评价一个交易系统是很复杂的事情,这并不是用几个简单的指标就能很好描述的,有时可以考虑构建一个综合指标来考察交易系统的性能。

当然,检验交易系统的最佳方法就是"实战",实盘能更加真实地反映某一策略在市场上的表现。

14.1.2 回测平台框架

一个通用的基于MATLAB的期货量化回测平台应该具有如下一些特性:

(1) 可以实现日内和隔夜策略的回测。

(2) 可以实现低频和高频策略的回测。

(3) 可以实现简单和复杂策略的回测。

(4) 具有丰富的图形展示,可以自动保存相关图形文件。

(5) 可以自动生成Excel文件,保存交易记录、统计指标、资金流、累计平仓盈亏等数据指标。

(6) 可以实现多目标函数与自定义目标函数参数寻优,以及2D、3D参数分布图形展示。

整体的量化回测平台大致框架如图14-1所示。

在数据模块中, 通过.mat数据格式转换后,MATLAB直接调用.mat文件会比从第三方的数据源(数据库)调用数据更加高效,数据的存储格式推荐直接使用double型的矩阵。对于大数据量的回测,不建议使用struct、dataset等复杂的数据格式。虽然struct 、dataset等复杂的数据格式在数据的操作上会稍微方便一些,但在进行大数据量的回测时,这些复杂的数据格式的访问读/写会比double型的耗时很多。

在回测模块中,可以分别实现计算和图形展示,这样系统糯合性不高、扩展性强。

在模型参数寻优模块中,可以考虑使用并行计算(相关MATLAB函数matlabpooL、parfor) 进行参数寻优,提高效率。事实上,在数据模块的数据清洗中,也可以考虑井行化的计算处理,这样可以在很大程度上提高整体的工作效率。

这里给出的回测平台框架仅供参考,具体实现时可以根据不同的平台需求进行相关的细节设计。