9.4 基于C-SVM的期货交易策略
9.4.1 引言
在实际的量化投资操作中,特定算法得出的有误差的预测值往往不能提供明确的信息依据来指导交易决策。因此一个明智的做法是将这些信息转化为"是或不是"(买或卖)的交易信号,并通过计算机自动识别这些信息,进而进行程序化的交易。那么如何才能产生相关的交易信号呢?本节将通过C-SVM分类算法构建交易策略:以当日买卖信号为目标变量,即分类标签Label∈{1, -1}(这里假设1为"做多"交易信号,-1为"做空"交易信号),以当日的价格信息或技术指标作为样本属性集合建立交易算法模型,从而将一个较为复杂的时间序列回归问题转化为一个能产生买卖信号的二分类问题。
目前就如何运用SVM进行量化投资(程序化交易),很多学者或机构做出了大量的研究,根据研究侧重点的不同得出了各种不同的结论。如Johan Blokker等认为若是在一个有效市场中(弱势有效)价格服从随机波动,那么想用SVM找出市场的有用信息是不可能的;而一些券商的研究则认为SVM算法的预测准确性和市场的价格走势及对交易时间的选择有密切的关系,在趋势中由于价格信息具有"一致性",SVM能够更好地识别这些信息,但在震荡势中由于价格信息包含过多的"噪音飞故SVM具有较低的识别能力,但总的来说,由于趋势中的获利可以抵补震荡势中的亏损,因此SVM算法对整体行情的预测仍是值得认可的。
不同的结论在不同的前提假设下都具有一定的合理性。虽然在静态仿真过程中,C-SVM算法能获得一个优异的识别率,但在动态仿真过程中,选取的两种不同的属性集合下得到的SVM模型均只能获得一个略优于随机猜测的识别率,当然这点并不会使我们感到奇怪,因为实际投资中往往会不尽如人意。那么如何克服这种低识别率产生的缺陷呢?一种直观的想法是对市场进行分类,比如在趋势时加大C-SVM模型给出的持仓比重,在震荡时进行适当减仓,从而保持最大的赢利可能性。但这样做会面临一个更加现实且严酷的问题:在大多数情况下我们无法事先准确地判断价格的走势何时处于趋势何时处于震荡。
9.4.2 模型建立
建模过程大致可以分为以下几个部分:
首先,进行数据的选取及预处理。选取2012年10月23日至2013年8月20日期间200个交易日的螺纹钢主力合约的价格信息(包括开盘价、最高价、最低价、收盘价、结算价、成交量和持仓量)作为原始的样本属性集合Train_1,并在此基础上通过运用技术指标衍生出一套新的训练样本属性集合Train_2 。在后续的仿真建模中,将对比两种不同的训练样本属性集合对构建模型的影响。
其次,建立算法模型及仿真系统。针对两种不同类型的样本属性集合Train_1和Train_2,分别通过C-SVM算法的训练得到两种不同的模型model_1 和model_2 ,并且通过静态和动态两种不同的仿真过程来检验model_1和model_2模型交易信号的预测准确率。其中静态仿真指的是在已知当日价格信息的条件下,预测当日的买卖信号,显然这是一种理想状态,但能反映出算法对样本集的敏感程度。动态仿真指的是在己知前一日价格信息的条件下,预测当日的买卖信号。
最后,一个简单的交易系统将会被建立,相应的预测精准度、最大回撤、夏普比率及信息比率等常见指标会被用来评测交易模型。
9.4.3 MATLAB 实现
1. 数据的选取及预处理
测试数据:螺纹钢主力合约(2012年10月23日至2013年8月20日)日线数据。整体样本数据存储在luowen.mat,其中数据形式为DataSet格式,包含了螺纹钢主力合约的开盘价、收盘价、最高价、最低价、平均价、成交量和持仓量7 个计量指标以及一个时间轴信息。
数据来源:wind数据斥。
数据的就入和提取的代码如下:





运行结果如图9-18所示。

这里首先以价量信息作为样本的属性集合,进行样本的归一化,代码如下:

2. 以价量信息为样本属性集合进行C-SVM静态仿真
参数寻优及模型建立过程的代码如下:

参数寻优运行结果如图9-19和图9-20所示。

可以看到,在己知当日价格信息的条件下,预测当日的买卖信号,在交叉验证(CrossValidation)下最佳的分类准确率为84.4221%,最佳参数c=256,g=0.35355。
3. 以技术指标为样本属性集合进行C-SVM静态仿真
下面通过技术指标来构建另外一组样本属性集合。这里使用常见的移动平均线来实现,共选取5组长度不同的快慢均线(1,3)、(4,12)、(7,21)、(10,30)和(13,39)来构造样本属性集合,不同的移动平均线参数的选取代表不同的周期结构。均线的生成和展示代码如下:


运行结果如图9-21所示。

对于每组均线,利用长短均线的穿插来生成新的样本属性集合Train2,并进行参数寻忧,构建SVM模型,代码如下:


参数寻优运行结果如图9-22和图9-23所示。

由图9-23可知,在己知当日价格信息的条件下,预测当日的买卖信号,在交叉验证(Cross Validation)下最佳的分类准确率为77.8894%,最佳参数c=0.08838,g=0.17678。
对比以价量信息为样本属性集合构建的SVM模型和以技术指标为样本属性集合构建的SVM模型,ROC曲线C Receiver Operating Cbaracteristic Curve)对比如下:

运行结果如图9-24所示。

由图9-24可以看到在静态仿真中,以价量信息为样本属性集合构建的SVM模型与以技术指标为样本属性集合构建的SVM 模型相比,能获得一个更高的买卖信号识别率。若能够有效获得当日价格的所有信息,两种不同的训练样本属性集合都能获得较好的识别效果。
4. C-SVM动态仿真
上面的C-SVM静态仿真建模得到的买卖信号识别率虽然很高,但并不具有实际操作性。接下来进行C-SVM动态仿真建模,该建模过程更符合实际情况,更具有实际的可操作性。
由于是动态建模,就需要给出构建SVM模型的最佳时间窗口长度,惩罚参数c和核函数参数g可以使用静态仿真建模中的最佳参数,最佳时间窗口长度(最优滑窗长度)可由以下代码给出:

运行结果如图9-25和图9-26所示。

由图9-25和图9-26可知,在动态仿真建模中,两个不同的样本属性集合构建的SVM模型都只能给出一个略优于随机猜测的"弱可学习器",其中以价量信息为样本属性集合的最优滑窗长度为20,最佳准确率为58.427%;以技术指标为样本属性集合的最优滑窗长度为24,最佳准确率为57.471%,其最优滑窗长度基本都为月线级别的时间长度,这一点也比较符合直观。
在得到最佳时间窗口长度的基础上,可以使用得到的SVM模型预测交易信号,并以实际的买卖信号进行对比,相关代码如下:

运行结果如图9-27和图9-28所示。




一个完整的交易系统需要有适当的止损机制,即如果模型给出的交易信号与当日的价格走势相悖,且偏离大于某一阙值时进行止损,该阈值作为参数,这里选取30个点。止损机制的加入,可以使得构建的SVM模型在螺纹钢主力合约上得到较好的回测结果,测试代码如下:



运行结果如图9-29和图9-30所示。


从两种模型的累计收益图中可以发现在加入了适当的止损策略后,两种模型在一段完整的价格走势中均能实现稳定的盈利目标。其中以价量信息为样本周性集构述的模型表现稍好于以技术指标为样本属性柴构建的模型,可以通过一些常见的评价指标来进行量化对比,代码如下:



运行结果如下:


5. 小结
本节建立了一个基于C-SVM算法的期货量化交易模型,并通过在模型中引入相应的止损机制,实现在分类"低"准确率下的交易高胜率,从而达到构建的SVM 模型在整体市场价格走势中稳定拍利的目的。对整个模型的验证及仿真结果显示,加入止损机制后的C-SVM算法对不同的样本届性集合构边的模型均能产生一个有效的收益。
需要说明的是在C-SVM动态建模回测过程中并没有考虑手续费和冲击成本等因素,这里给出的仅仅是一个大概的测试结果,目的是为了说明使用SVM进行交易策略建棋的思想和过程。还有这里仅选取了蝶纹钢主力合约的日线数据进行测试,是为了方便测试和建模,本节提出的模型也可以扩展到小时级别、分钟级别等其他频率的交易数据进行模型的构建,也可以构建tick级别的高频模型。
这里给出的模型框架可能有些地方不是非常严谨,仅仅是一个比较"粗"的模型,权当抛砖引玉,读者可以循此进行思考和优化。