基于随机森林算法的多因子选股方法分析与实现(1)

您所在的位置:网站首页 选股策略模型 基于随机森林算法的多因子选股方法分析与实现(1)

基于随机森林算法的多因子选股方法分析与实现(1)

2023-09-15 21:05| 来源: 网络整理| 查看: 265

前言

多因子量化体系在实践不断中形成了诸如 BARRA 模型的标准方法,在以往的研究报告中,有人对此进行了充分的研究其背后的金融理论及检验实践中能否获得有效的 ALPHA 因子。虽然标准化易于理解与管理,但众所周知标准化意味着各种参数的约束,因此 ALPHA 因子的构建参和个人判断,例如以什么标准选择,因子的如何配比等等。随着市场条件的不断变化,我们能够期待这些因子持续有效吗?对此,我们考虑能否充分利用数据的特征不加以主观参数约束,能够自适应地选取有效的因子,对传统多因子模型做出改善。我们自然地想到了机器学习方法。

研究思路解读

该篇文章主要探究了沪深300成分股量化投资策略,该文章的研究思路通过分析多因子特征从而先选择长期优势股,然后在从优势股票中选择短期优势股票。其研究思路可以用论文中的图概括:

基于机器学习的多因子选股模型本质上是一个分类问题。大多数情况下研究的是二分类问题,将股票池中表现好的个股标为类别 1,而表现不好的标类别-1等。建立分类器模型从而描述因子池中各因子与下期收益表现的关系。模型的输出一般表现为预测该样本为某类的概率,或者称为信任得分,信任得分越大则为该类的可能性越大。因此模型的构建主要分为两步:1,根据各股历史下一期收益率划分类标,历史当期因子数据对分类器进行训练得到相关参数。2,代入实际当期各股因子数据对各股进行分类,得到各股的信任得分。那么模型的关键落在:1.特征的提取上,IC因子分析、深度神经网络等,2.分类的选择上:传统的分类器包括决策树分类器,最近邻分类器,神经网络,支持向量机等。

那么利用解决分类问题如何做到选择优势股票组合的?

假设有 30 只股票,两个因子。首先要做的是数据的预处理。

数据预处理

因为绝大多数据机器学习算法对输入数据都比较敏感(要求数据范围在(0,1]),若含有较多的噪声数据易引起过度拟合。由于我们寻找的是强弱势股之间的相对优劣,并不关注数据的绝对大小。因此,我们计算每个股票按某因子的排序然后除以总股票数,这样因子的值归到(0,1]。然后,对下一期收益率从大到小排序,取前 30%作为强势股,后 30%作为弱势股,强势股划分类标为+1,弱势股划分类标为-1;中间百分之 40%的股票排出训练集,因为中间百分之 40%的股票收益并不强势也不弱势,相当于噪声数据。为了充分利用数据,找出相对稳定有效的因子,确保算法的稳定性,我们用过去 12 个月的面板数据来构建训练集。

训练模型选择股票

以沪深 300 指数成份股作为股票池。按照信任得分将股票池的股票分为十档组合,取最高一档作为强势组合,最低一档组合作为弱势组合。这种简单的选股策略,也就是论文中所介绍的思想之一。

为何选择随机森林算法

随机森林是一个元估计器,它适合数据集的各个子样本上的多个决策树分类器,并使用平均值来提高预测精度和控制过度拟合。 子样本大小始终与原始输入样本大小相同,但如果bootstrap = True(默认值),则会使用替换来绘制样本。由于随机决策树生成过程采用的Boostrap,因为袋外样本的存在,因此不需要进行十字交叉测试(节省时间),通过依次对每个特征赋予一个随机数,观察算法性能的变化,倘若变化大,则说明该特征重要,sklearn中会对每个特征赋予一个分数,分数越大,特征越重要,因此,可以根据特征重要性排序,然后选择最佳特征组合;过利用oob对每个特征,迭代进行,评估分数,然后做一个排序,分数越高,特征越重要,然后利用分数由到到低,进行组合,在看模型是否精度是否发生变化,从而选择最优特征组合。这样可以减少IC因子分析代码的实现。从而实现自动特征选择,从而更利用标签分类。其实为了偷懒简单特征处理环节。

调用库实现代码及参数介绍:

class sklearn.ensemble.RandomForestClassifier(n_estimators=10, crite-rion=’gini’, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=’auto’, max_leaf_nodes=None, bootstrap=True, oob_score=False, n_jobs=1, ran-dom_state=None, verbose=0, warm_start=False, class_weight=None)

criterion: ”gini” or “entropy”(default=”gini”)是计算属性的gini(基尼不纯度)还是entropy(信息增益),来选择最合适的节点。

splitter: ”best” or “random”(default=”best”)随机选择属性还是选择不纯度最大的属性,建议用默认。

max_features: 选择最适属性时划分的特征不能超过此值。

当为整数时,即最大特征数;当为小数时,训练集特征数*小数;

if “auto”, then max_features=sqrt(n_features).

If “sqrt”, thenmax_features=sqrt(n_features).

If “log2”, thenmax_features=log2(n_features).

If None, then max_features=n_features.

max_depth: (default=None)设置树的最大深度,默认为None,这样建树时,会使每一个叶节点只有一个类别,或是达到min_samples_split。

min_samples_split:根据属性划分节点时,每个划分最少的样本数。 min_samples_leaf:叶子节点最少的样本数。

max_leaf_nodes: (default=None)叶子树的最大样本数。

min_weight_fraction_leaf: (default=0) 叶子节点所需要的最小权值

verbose:(default=0) 是否显示任务进程 关于随机森林特有的参数: n_estimators=10:决策树的个数,越多越好,但是性能就会越差,至少100左右(具体数字忘记从哪里来的了)可以达到可接受的性能和误差率。  bootstrap=True:是否有放回的采样。   oob_score=False:oob(out of band,带外)数据,即:在某次决策树训练中没有被bootstrap选中的数据。多单个模型的参数训练,我们知道可以用cross validation(cv)来进行,但是特别消耗时间,而且对于随机森林这种情况也没有大的必要,所以就用这个数据对决策树模型进行验证,算是一个简单的交叉验证。性能消耗小,但是效果不错。  

n_jobs=1:并行job个数。这个在ensemble算法中非常重要,尤其是bagging(而非boosting,因为boosting的每次迭代之间有影响,所以很难进行并行化),因为可以并行从而提高性能。1=不并行;n:n个并行;-1:CPU有多少core,就启动多少job

warm_start=False:热启动,决定是否使用上次调用该类的结果然后增加新的。  

class_weight=None:各个label的权重。  

讨论QQ:525894654

论文连接:https://xueshu.baidu.com/usercenter/paper/show?paperid=1d140xp0qq4n0ph0jb6c0mg08e295178&site=xueshu_se

实现代码详解下个博客给出



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3