Stacking多因子选股策略思想
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Stacking多因子选股策略思想:
Stacking是一种集成学习框架,一般分为两层,第一层是学习层,用N个不同的基分类器,或者用多个参数不同的模型(比如高斯核SVM,线性核SVM)预测结果,然后将预测结果合并成为新的特征集来作为第二层分类器的输入,由第二层的分类器再次根据标签进行训练,得到一个完整的框架。
Sacking是一种表示学习,即模型能够自己从原始数据中自动提取到有用的特征。
第一层的多个学习器起到的就是特征提取的作用。
数据集经过第一层实现了压缩处理,有效特征被提取之后传入第二层,所以Stacking第一层的多个分类器应该在效果好的同时尽可能地有差异化(使得彼此间提取的特征相关性小)。
为了避免过拟合的问题,要在Stacking基分类器内部使用交叉验证。
股票池:中证500成分股
选取的因子:
ROE同比增长率、销售毛利率、营业收入增长率TTM、资产负债率、20日成交金额移动平均、std_3m、资金流出等31个因子。
对冲基准:中证500指数
标签设立:
为了保证标签有足够的差异化,把下一期收益率大于百分之70分位点的股票标记为1,下一期收益率小于百分之30分位点的股票标记为0,下一期收益率处在百分之30和百分之70分位点之间的股票样本进行剔除。
基分类器的选择:
前面说到,Stacking第一层的基分类器应该满足准确率高和差异化大的条件。
所以测试了MLP、SVM(线性核、高斯核)、随机森林、高斯贝叶斯、XGboost、LDA、QDA等八种分类器;模型训练为滚动训练,训练周期为六个月,每次训练分类器的参数在样本数据内用贝叶斯优化动态调整。
选择其中效果最好的MLP、SVM(高斯核)、高斯贝叶斯三个基分类器作为第一层的学习器。
第二层分类器使用Logistic回归模型。
GaussianNB分类器
MLP分类器
SVM高斯核分类器
接着测试第一层各个分类器之间的输出的相关性,发现他们的相关性是呈现一个变化的过程,本质的原因是各个分类器提取的特征在不同的时间段相关性是不同的,基于这个原因,所以不打算在三个分类器中再剔除一个。
从净值曲线上也可以看出来:
左边是GaussianNB、MLP的stacking净值曲线
右边是GaussianNB、MLP、SVM的stacking净值曲线
尝试在第二层引入排序学习:
在第一层依旧使用GaussianNB、MLP、SVM三个基分类器,在第二层使用Ranking SVM。
对第一层的基分类器输出作一个处理,每两个样本进行两两配对相减,做完处理后,剔除掉label为0的(因为它们属于同一类,对模型没有任何帮助),把做完处理之后的点输出到三维平面上,发现昨晚处理之后的点变得线性可分。
第二层使用RankingSVM:
接着使用线性SVM(核函数设置为线性核),我们可以求出我们的W,也就是法向量。
接着用我们的测试数据乘上这个W法向量,根据这个值的大小来买卖股票。
Ranking SVM净值曲线
第二层使用RankNet:
用神经网络帮助我们构造一个打分函数,RankNet 帮我们把参数训练出来。
跟Ranking SVM 一样,对第一层基分类器的输出做同样的处理,然后在第二层使用RankNet,构建完神经网络结构后,把数据分为两部分,x1和x2,假设x1一直比x2优秀,训练集的label 全部设置为1,激活函数为sigmoid 函数,损失函数为交叉熵函数。
激活函数:))()(exp(1))()(exp(,v u v u v u X f X f X f X f P -+-=
损失函数:)
1log()1()(log ,_
,,_,v u v u v u v u P P f P P ----我们的目的就是训练出打分函数)(X f ,用这个打分函数对我们的测试数据进行打分来选股。
RankNet 净值曲线
第二层使用Ranking_Logistic:
Logistic回归模型也可以帮我们构造一个打分函数,与RankingSVM类似,求出Logistic 回归模型的W权重,将测试数据乘上这个W权重,根据这个值的大小来买卖股票。
(Logistic 模型的偏置为0)
Ranking_Logistic净值曲线。