导语
接触过机器学习或数据挖掘算法的人都应该知道支持向量机(SVM),支持向量机一经提出就得到了广泛应用。本文主要探讨该算法在金融领域量化投资多因子策略上的应用。在这篇文章中,先是介绍了SVM的基本原理,之后会介绍如何利用python的机器学习库(scikit-learn)来编程实现svm多因子选股策略,主要是通过回测实证来帮助大家更深层次的理解SVM在量化投资领域上的应用。
SVM原理
支持向量机主要分为三类:线性可分支持向量机,线性支持向量机,非线性支持向量机。
1、线性可分支持向量机,又称硬间隔支持向量机
一个数据集是线性可分当且仅当存在一个分隔超平面将数据集完美分隔,如下图所示:
如上图所示,存在一个分隔超平面将训练样本集完闰分开,对应的分类决策函数为:
正如我们所看到的,一个数据集如果是线性可分的,那么就存在无数个分隔超平面可以将其分隔开,如下图所示:
那么如何找到最优的分隔超平面,这里采用的是最大化样本集到分隔超平面的距离,具体推导可参考李航-统计学习方法这本书。这里直接给出结论:
求解带约束的极值问题用拉格朗日乘子法,最终推导公式:
求解得到:
因此就得到了最优分隔超平面:
对应的分类决策函数:
2、线性支持向量机,又称软间隔支持向量机
相对于线性可分支持向量机,线性支持向量机中数据集中有一些特异点(outlier),因些不存在一个分隔超平面将样本集完美分隔,但是除去这些特异点外,又存在分隔超平面该样本集完美分隔开。
这里采用的解决方法是对每个样本引进一个松弛变量,这样线性支持向量机的算法推导公式为:
对应的对偶问题:
最终求解:
这样就可以确定最优分隔超平面与分类决策函数。
3、非线性可分支持向量机
对于线性可分与线性近似可分数据集,我们可以采用线性可分支持向量机与线性支持向量机求解,但现实中,大多数都是线性不可分的情况,那就不得不采用非线性可分支持向量机。它的原理就是将原数据集空间映射到更高维甚至无究维上,使得映射后的数据集在高维(无穷维)空间线性可分。这里映射的技巧就是核函数。
如下图所示,原数据集(左)线性不可分,那么可以通过核函数映射到更高维使其线性可分,如右图所示:
将核函数应用于支持向量机中求解非线性可分问题算法:
求得最优解:
选择其一个满足约束条件的分量,计算
最终分类决策函数:
SVM多因子策略研究与实证
策略思想:以季度为单位,选取一些财务因子作为训练样本,对于类别值,如果未来一个季度涨幅超过5%标记为1,反之为-1,然后用支持向量机算法进行训练,预测结果为1且未持仓则买入,预测结果为-1且已持仓则卖出。
特征因子选取:选取2014-06-30(2014年半年报)时刻,沪深300成分股的市盈率、市净率、总市值、流通市值、净资产收益率roe加权、总资产报酬率roa、销售净利率、净利润/营业总收入、息税前利润/营业总收入、基本每股收益同比增长率、每股经营活动产生的现金流量净额同比增长率、营业总收入同比增长率、净利润同比增长率、经营活动产生的现金流量净额同比增长率、应收账款周转天数、应付账款周转天数、存货周转率、应收账款周转率、应付账款周转率、流动比率、速动比率共21个财务因子。
数据标准化:数据标准化方法有很多,本文采用高斯预处理方法,即每个特征因子减去它对应的均值再除以它的标准差((x–x.mean)/x.std)。
参数优化方法:本文使用交叉验证的方法对惩罚参数与径向基函数(高斯核函数)参数Sigma进行优化筛选。交叉验证方法具体为选取的训练样本集分为K份,依次选取其中的K-1份作为训练集,剩下一份作为验证集,通过算法在验证集上的表现进行打分,再对打分进行取平均作为此参数对应的分数,依次选择不同的参数进行打分,确定最终的参数。
回测结果:
初始资金:10000000
回测频率:每天
回测日期:2016-03-01 — 2017-03-01
资金曲线图如下: