龙空技术网

多因子模型-构建支持向量机回归模型SVR

量化投资与策略 109

前言:

如今各位老铁们对“支持向量机算法流程”大体比较重视,同学们都需要学习一些“支持向量机算法流程”的相关知识。那么小编在网上收集了一些有关“支持向量机算法流程””的相关资讯,希望兄弟们能喜欢,看官们快快来学习一下吧!

1.线性可分SVM

线性回归用回归方程搭建各个自变量之间的关系,来解释应变量(个股收益)。SVR(Support Vector Regression)支持向量回归也有自己的办法,而且还更为智能,所以称得上是机器学习工具。要解释SVR还需要从SVM(Support Vector Machine)入手。SVM是一个分类器,而且是二类分类器,深度学习出现之前,SVM被认为是机器学习中近十几年最成功的算法。

支持向量机(Support Vecor Machine, SVM)本身是一个二元分类算法,是对感知器算法模型的一种扩展,现在的SVM算法支持线性分类和非线性分类的分类应用,并且也能够直接将SVM应用于回归应用中,同时通过OvR或者OvO的方式我们也可以将SVM应用在多元分类领域中。在不考虑集成学习算法,不考虑特定的数据集的时候,在分类算法中SVM可以说是特别优秀的。

线性可分SVM:

在感知器模型中,算法是在数据中找出一个划分超平面,让尽可能多的数据分布在这个平面的两侧,从而达到分类的效果,但是在实际数据中这个符合我们要求的超平面是可能存在多个的。

在感知器模型中,我们可以找到多个可以分类的超平面将数据分开,并且优化时希望所有的点(预测正确的点)都离超平面尽可能的远,但是实际上离超平面足够远的点基本上都是被正确分类的,所以这个是没有意义的;反而比较关心那些离超平面很近的点,这些点比较容易分错。所以说我们只要让离超平面比较近的点尽可能地远离这个超平面,那么我们的模型分类效果应该就会比较不错喽。SVM其实就是这个思想。

线性可分(Linearly Separable):在数据集中,如果可以找出一个超平面,将两组数据分开,那么这个数据集叫做线性可分数据。线性不可分(Linear Inseparable):在数据集中,没法找出一个超平面,能够将两组数据分开,那么这个数据集就叫做线性不可分数据。分割超平面(Separating Hyperplane):将数据集分割开来的直线/平面叫做分割超平面。支持向量(Support Vector):离分割超平面最近的那些点叫做支持向量。间隔(Margin):支持向量数据点到分割超平面的距离称为间隔。

SVM模型是让所有的分类点在各自类别的支持向量远离超平面的一侧,同时要求支持向量尽可能的远离这个超平面,用数学公式表示如下:

将此时的目标函数和约束条件使用KKT条件转换为拉格朗日函数,从而转换为无约束的优化函数:

因此,目标函数和约束条件:

得到:

得到:线性可分SVM算法流程:得到:案例:

线性可分SVM总结:

要求数据必须是线性可分的纯线性可分的SVM模型对于异常数据的预测可能会不太准;对于线性可分的数据,线性SVM分类器的效果非常不错。2.SVM的软间隔模型

线性可分SVM中要求数据必须是线性可分的,才可以找到分类的超平面,但是有的时候线性数据集中存在少量的异常点,由于这些异常点导致了数据集不能够线性划分;直白来讲就是:正常数据本身是线性可分的,但是由于存在异常点数据,导致数据集不能够线性可分:

SVM的软间隔模型算法流程:

SVM的软间隔模型总结:

可以解决线性数据中携带异常点的分类模型构建的问题;通过引入惩罚项系数(松弛因子),可以增加模型的泛化能力,即鲁棒性;如果给定的惩罚项系数C越小,表示在模型构建的时候,就允许存在越多的分类错误的样本, 也就表示此时模型的准确率会比较低;如果惩罚项系数越大,表示在模型构建的时候,就越不允许存在分类错误的样本,也就表示此时模型的准确率会比较高。3.非线性可分SVM

不管是线性可分SVM还是加入惩罚系数后的软间隔线性可分SVM其实都要求数据本身是线性可分的,对于完全不可以线性可分的数据,这两种算法模型就没法解决这个问题了。

结合多项式回归在处理非线性可分数据时候的作用,在SVM的线性不可分的数据上,如果将数据映射到高维空间中,那么数据就会变成线性可分的,从而就可以使用线性可分SVM模型或者软间隔线性可分SVM模型。也就是说,对于线性不可分SVM模型来讲,重点在于低维特征数据到高维特征数据之间的映射。

这样一来问题就解决了吗?似乎是的:拿到非线性数据,就找一个映射,然后一股脑把原来的数据映射到新空间中,再做线性 SVM 即可。不过事实上没有这么简单!其实刚才的方法稍想一下就会发现有问题:在最初的例子里做了一个二阶多项式的转换,对一个二维空间做映射,选择的新空间是原始空间的所有一阶和二阶的组合,得到了5个维度;如果原始空间是三维,那么我们会得到9维的新空间;如果原始空间是n维,那么我们会得到一个n(n+3)/2维的新空间;这个数目是呈爆炸性增长的,这给计算带来了非常大的困难,而且如果遇到无穷维的情况,就根本无从计算。

核函数:

核函数在解决线性不可分问题的时候,采取的方式是:使用低维特征空间上的计算来避免在高维特征空间中向量内积的恐怖计算量;也就是说此时SVM模型可以应用在高维特征空间中数据可线性分割的优点,同时又避免了引入这个高维特征空间恐怖的内积计算量。

即:用低维空间中少的内积的计算量来让模型具有高维空间中的线性可分的优点。

核函数的种类有:

核函数的形态如下:

核函数总结:

核函数可以自定义;核函数必须是正定核函数,即Gram矩阵是半正定矩阵;核函数的价值在于它虽然也是将特征进行从低维到高维的转换,但核函数它事先在低维上进行计算,而将实质上的分类效果表现在了高维上,也就如上文所说的避免了直接在高维空间中的复杂计算;通过核函数,可以将非线性可分的数据转换为线性可分数据;

高斯核公式证明(扩展):

4.scikit-learn SVM算法库概述

scikit-learn中SVM的算法库主要分为两类,一类是分类算法,包括:SVC、NuSVC和LinearSVC这三个类,另外一类是回归算法,包括:SVR、NuSVR和LinearSVR这三个类;除此之外,用的比较多的SVM模型还有OneClassSVM类(主要功能是:异常点检测)。

详见:

分类算法:

回归算法:

5.支持向量回归算法SVR6.SVR构建多因子模型

讲完支持向量机算法SVM后,我们继续探讨线性模型和非线性模型的问题,首先多元线性回归是线性模型,而SVR在采用了核函数RBF之后是非线性模型。但我们面对的经济学问题,特别是股票市场价格影响因素,是非线性的。比如动量在一定幅度内表示价格启动上涨是健康的,但波动率过大动量意味着价格过度上涨,之后价格将充满回复性。再如市场率较低一定程度上是企业估值较低,有可能是估值洼地,有反弹潜质,但如果某个样本持续出现市净率过低,则可能是它无法被市场资金青睐,处于走势加剧恶化的过程中。

因子选择至关重要,如果是中低频多因子模型,应该多从企业估值和成长角度入手,筛选财务报表类因子。虽然这种模型缺乏市场数据的活跃性,但依然对股票分类具有至关重要的作用。如果我们的模型倾向于快速调仓,那么也要添加一些中高频的量价关系因子或舆情类因子。

核心代码如下:

from sklearn.svm import SVRsvr = SVR(kernel = 'rbf', gamma = 0.1)model = svr.fit(X_train, Y_train)Y_test_predict = svr.predict(X_test)residual = Y_test - Y_test_predictif residual < 0:    buy()elif residual > 0:    sell()

X为量价因子,Y为总市值,训练并生成该模型,该模型通过短期量价变化活跃来解释市值大小,然后通过具体的交易规则:残差(residual) = 真实值 - 回归值,如果回归市值显著高于真实市值,则残差显著低于0(负值),按照残差向0均值回归理论,这类个股需要做多,因为它本身有增长空间;在相反情况下,残差显著高于0(正值),这类股票要做空,这就是以SVR非线性模型为代表的回归类模型的交易方法。

标签: #支持向量机算法流程