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