PLUS会员

DeepAlpha短周期因子研究系列之:随机森林在量化选股中的应用

由hxgre创建,最终由hxgre 被浏览 380 用户

一、引言

DeepAlpha系列报告旨在从基础量价数据中,借鉴深度学习模型,应用于量化投资领域。学习模型包括:全连接深度网络(DNN)、卷积神经网络(CNN)、长短期记忆网络(LSTM)、对抗生成网络(GAN)、ResNet、TabNet,同时报告将引入自然语义识别NLP领域近年热门算法如BERT、Transformer、GPT、XLNet等,尝试构建各类DeepAlpha模型。

本篇文章通过传统机器学习算法对相同的量价因子进行实验,方便与深度学习模型进行对比。

二、随机森林算法介绍

随机森林属于集成学习的一种,通过集成学习的Bagging思想将多棵树集成的一种算法:它的基本单元就是决策树。随机森林的名称中有两个关键词,一个是“随机”,一个就是“森林”。“森林”很好理解,一棵叫做树,那么成百上千棵就可以叫做森林了,其实这也是随机森林的主要思想--集成思想的体现。“随机”指在训练时,随机森林中的每棵树都会从数据点的随机样本中学习。样本被有放回的抽样,称为自助抽样法(bootstrapping),这意味着一些样本将在一棵树中被多次使用。背后的想法是在不同样本上训练每棵树,尽管每棵树相对于特定训练数据集可能具有高方差,但总体而言,整个森林将具有较低的方差,同时不以增加偏差为代价。随机森林将成百上千棵决策树组合在一起,在略微不同的观察集上训练每个决策树,在每棵树中仅考虑有限数量的特征来拆分节点。随机森林的最终预测是通过平均每棵树的预测来得到的。随机森林中的特征重要性表示在该特征上拆分的所有节点的基尼不纯度减少的总和。

1. 决策树

既然随机森林是将多颗决策树组合起来,那么我们有必要对决策树算法做一个简单介绍。

决策树是一类常见的机器学习方法,其思想十分朴素,类似于我们平时利用选择做决策的过程。例如有人给我们介绍新的对象的时候,我们就要一个个特点去判断,于是这种判断的过程就可以画成一棵树:

决策树原理{w:100}{w:100}{w:100}{w:100}{w:100}{w:100}{w:100}{w:100}{w:100}{w:100}{w:100}{w:100}{w:100}{w:100}{w:100}

决策树学习的目的是为了产生一颗泛化能力强的决策树,其基本流程遵循简单且直观的“分而治之(divide-and-conquer)”策略,伪代码如下所示:

{w:100}{w:100}{w:100}显然,决策树的生成是一个递归过程,最关键的点在第8行——从属性集合A中选择最优属性a,即如何对结点进行划分。一般而言,我们希望决策树的分支结点所包含的样本尽可能属于同一类别,即结点的“纯度(purity)”越来越高。常见的决策树算法包含以下三种,关键区分点同样是在结点如何选择最优划分属性。

  • ID3决策树:信息增益(information gain)指根据指定属性a对样本D进行划分后得到的“纯度提升”程度。其中,Ent(D)指“信息熵”(information entropy),它是度量样本集合纯度最常用的一种指标,即“不纯度”(impurity),其值越小,则D的纯度越高。

    信息增益算法{w:100}{w:100}{w:100}

  • C4.5决策树:增益率(Gain ratio)在“信息增益”的基础上进行了改善。根据“信息增益”选择属性并划分结点存在一个问题:对可取值数目较多的属性有所偏好,比如“性别”只能取“男”或“女”,而“年龄”可以取任意整数,则信息增益会偏好选择“年龄”作为属性进行结点划分,而“增益率”(Gain ratio)通过在信息增益的基础上引入 IV 解决这一问题。IV称为属性a的“固有值”(intrinsic value),可以看到属性a的可能取值数目越多(即V越大),则 IV(a) 的值越大,导致“增益率”越小。

    增益率算法{w:100}{w:100}{w:100} 固有值算法{w:100}{w:100}{w:100}

  • CART决策树:基尼指数(Gini index)与“信息增益”类似。不同于用“信息熵”度量不存度,它利用基尼值。直观来说,Gini(D)反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率。因此,Gini(D)越小,则数据集D的纯度越高。

    基尼指数{w:100}{w:100}{w:100}

上述三种算法都是根据节点的不存度来选择最优的划分属性。另外,决策树算法还包括预剪枝、后剪枝、树的深度、叶子节点数量等诸多影响最终模型训练结果的内容,这里我们简要介绍一下“剪枝”,其他内容不一一展开说明。

剪枝(pruning)是决策树学习算法对付“过拟合”的主要手段。“过拟合”指模型学习得太好,把训练集数据自身的一些特点当做所有数据都具有的一般性质了。决策树剪枝可以降低过拟合风险,核心思想是在当前节点是否分支进行两次模拟,然后根据对划分前后的泛化性能进行估计,如果能提高性能则进行分支划分。

  • 预剪枝(prepruning):对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前节点标记为叶节点。
  • 后剪枝(postpruning):先生成一颗完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。

2. 回归树

由于金融领域一般遇到的是回归问题,而非分类问题,因此我们有必要对回归树进行单独的介绍。回归树就是用树模型做回归问题,每一片叶子都输出一个预测值。预测值一般是叶子结点所含训练集输出的均值。

回归树{w:100}{w:100}{w:100}

回归树和分类树最大的区分点在于从属性集合A中选择最优属性a进行结点划分的规则。不同于分类树使用熵、信息增益、基尼指数等指标,由于回归问题一般涉及连续值,因此其一般使用 MSE 和 MAE 作为划分标准。

  • MSE(mean square error,均方误差)是真实值与预测值的差值的平方然后求和再平均。

    MSE算法{w:100}{w:100}{w:100}

  • MAE(mean absolute error,平均绝对误差)是真实值与预测值的差值的绝对值的平均。

MAE算法{w:100}{w:100}{w:100}可以看见,MSE和MAE都是用来衡量真实值与预测值的差异程度的,一般来说我们在选择属性进行结点划分时会选择值最小的属性。但是,我们如何在MSE和MAE之间进行选择呢?接下来解释MSE和MAE的两个重要差异:

  1. MSE 通常比 MAE 可以更快地收敛。当使用梯度下降算法时,MSE 损失的梯度为 2/n*(y*-y)w,而 MAE 损失的梯度为 1或-1,即 MSE 的梯度的 scale 会随误差(y*-y)减小而减小,而 MAE 的梯度的 scale 则一直保持不变,即便在绝对误差  很小的时候 MAE 的梯度 scale 也同样为 1,这实际上是非常不利于模型的训练的。当然你可以通过在训练过程中动态调整学习率缓解这个问题,但是总的来说,损失函数梯度之间的差异导致了 MSE 在大部分时候比 MAE 收敛地更快。这个也是 MSE 更为流行的原因。

    收敛程度{w:100}{w:100}{w:100}

  2. MAE 对于 outlier 更加 robust,即受outlier的影响越小。由于MAE 损失与绝对误差之间是线性关系,MSE 损失与误差是平方关系,当误差非常大的时候,MSE 损失会远远大于 MAE 损失。因此当数据中出现一个误差非常大的 outlier 时,MSE 会产生一个非常大的损失,对模型的训练会产生较大的影响。

    异常值影响{w:100}{w:100}{w:100}

3. 集成学习

随机森林运用了集成学习的Bagging思想,因此我们简要介绍一下集成学习的内容。

集成学习(ensemble learning)通过构建并结合多个学习器来完成学习任务,有时也被称为多分类器系统(multi-classifier system)、基于委员会的学习(committee-based learning)等。

根据个体学习器的生成方式,目前的集成学习方法大致可分为两大类:

  • Boosting 指个体学习器间存在强依赖关系、必须串行生成的并行化方法,如XGBoost。
  • Bagging 指个体学习器不存在强依赖关系、可同时生成的并行化方法。

随机森林属于 Bagging 一类。Bagging基于自助采样法(bootstrap sampling),即给定包含m个样本的数据集,随机取出一个样本放入采样集,再把该样本放回初始数据集。经过 m 次随机采样,得到含 m 个样本的采样集,由式(2.1)(详见机器学习周志华P27)可知,初始训练集中约有63.2%的样本出现在采样集中。我们进行 T 次自助采样,得到 T 个含 m 个训练样本的采样集,然后基于每个采样集训练出一个基学习器,再将这些基学习器进行结合。在对预测输出进行结合时,Bagging 通常对分类任务使用简单投票法,对回归任务使用简单平均法。

随机森林(Random Forest,RF)是以决策树为基学习器构建 Bagging 集成的基础上,进一步在决策树的训练过程中引入了随机属性选择。与 Bagging 不同,随机森林中基学习器的多样性不仅来自于样本扰动(训练数据选取),还来自于属性扰动。

传统决策树在选择划分属性时是在当前结点的属性集合(假定有d个属性)中选择一个最优属性;而在 RF 中,对基决策树的每个结点,先从该结点的属性集合中随机选择一个包含 k 个属性的子集,然后再从这个子集中选择一个最优属性用于划分,若 k=d,则基决策树的构建与传统决策树相同。一般情况下,推荐 k=log2d。

4. 基学习器的结合

在得到训练学习后基学习器时,我们需要通过某种方法将这些学习器进行结合,得到一个“强学习器”,使其性能更好。集成基学习器能带来三个好处:

  • 由于学习任务假设空间很大,可能有多个假设在训练集上达到同等性能,集成可以避免误选单学习导致泛化性能不佳
  • 学习算法会陷入局部最小,有的局部最小点所对应的泛化性能可能很糟糕。
  • 某些学习任务的真实假设可能不在当前学习器算法所考虑的假设空间中,则此时该学习器肯定无效。

假设集成包含 T 个基学习器 {h1,h2, ... , hT},则对 hi 进行结合的常见策略如下:

  1. 平均法(averaging):将基学习器的预测结果平均集合,比如:简单平均法、加权平均法。
  2. 投票法:根据基学习器的预测某标记的数量多少,数量占比越大则选择该标记,比如:绝对多数投票法(majority voting)、相对多数投票法(plurality voting)、加权投票法(weighted voting)。
  3. 学习法:当训练数据很多时,通过另一个学习器来进行结合,stacking是该方法的典型代表。用于结合的学习器称为次级学习器或元学习器(meta-learner)。

5. 多样性

正如算法名字暗示的,随机森林模型需要一定程度上的“随机性”即“多样性”。误差-分歧分解:根据数学推导的公式,个体学习器准确性越高、多样性越大,则集成越好。我们可以通过以下两种方式增加模型的多样性:

多样性度量:度量集成中个体分类器多样性的方法如下:

  • 不合度量(disagreement measure)
  • 相关系数(correlation coefficient)
  • Q-统计量(Q-statistic)
  • K-统计量(K-statistic)

多样性增强:一般来说,通过在学习过程中引入随机性可增强集成学习的多样性。

  • 数据样本扰动
  • 输入属性扰动
  • 输出表示扰动
  • 算法参数扰动

三、模型参数诠释

我们参考 sklearn 库中的 随机森林 算法,其中包含 决策树随机森林 和 回归树随机森林 两类,调用方式如下:

from sklearn.ensemble import RandomForestClassifier
 
RandomForestClassifier(n_estimators=100, criterion='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, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=True, oob_scroe=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, class_weight=None)

from sklearn.ensemble import RandomForestRegressor

from sklearn.ensemble import RandomForestRegressor

RandomForestRegressor(n_estimators=100, *, criterion='squared_error', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features='auto', max_leaf_nodes=None, min_impurity_decrease=0.0, bootstrap=True, oob_score=False, n_jobs=None, random_state=None, verbose=0, warm_start=False, ccp_alpha=0.0, max_samples=None)

对模型中涉及的重要参数(Parameters)解释如下:

参数名 类型 默认值 可选项 解释
n_estimators int 100 随机森林中决策树的数量,即生成的基学习器个数
criterion(决策树) str gini {"gini", "entropy"} 决策树选择最优划分属性的准则,即计算不纯度的方法
criterion(回归树) str squared_erro {"squared_error", "absolute_error","poisson"} 回归树选择最优划分属性的准则,即计算不纯度的方法
max_depth int None 决策树的最大深度
min_samples_split int or float 2 决策树节点再划分所需的最小样本数
min_samples_leaf int or float 1 决策树叶子节点最小样本数
min_weight_fraction_leaf float 0.0 决策树叶子节点最小的样本权重和
max_features int or float auto {"auto", "sqrt", "log2"} 随机抽取的划分属性集的最大特征数(属性采样)
max_leaf_nodes int None 决策树最大的叶子节点数量
mini_impurity_decrease float 0.0 当划分节点后,不纯度减少值大于该值,则节点会被划分

模型训练完成后,可以通过以下方法查看训练模型结果:

方法名 解释
apply(X)
decision_path(X) 返回森林的分枝路径
fit(X, y[, sample_weight, check_input, ...]) 建模
get_params([deep]) 获取模型的参数
predict(X) 预测 X 的分类
predict_log_proba(X) 预测 X 的log-probabilities
predict_proba(X) 预测X的分类概率
score[X, y[, sample_weight]) 返回给定测试集和测试标签的平均预测准确率,回归树为R^2。

附注:

R^2,又称可决系数,是反映模型拟合程度,R^2最大为1表示完全拟合。SSR为残差平方和(residual sum of residual),SST为总离差平方和(total sum of squares)。SSR为模型未能解释的部分,而数据自带的偏差部分。

可决系数{w:100}{w:100}{w:100}

由于SST = SSR + SSE(回归平方和),所以R^2为是回归平方和与总平方和的比值,反映了自变量对因变量的可解释比例,比如R^2=0.8,表示自变量能够解释80%关于因变量的变化。R^2可以为负的——当模型解释能力或者说模型的偏差大于数据自带的偏差,即拟合得更差的时候,比如下面这张图。

可决系数为负{w:100}{w:100}{w:100}

四、实证研究

1. 因子构建

本报告参考《DeepAlpha短周期因子研究系列之:DNN在量化选股中的应用》相关报告,主要以量价数据作为原始数据计算一系列的因子,基础因子包括开盘价、收盘价、最高价、成交量、换算率等行情数据,通过相关系数、标准差、时序最大、时序最小、时序求和、加权平均等统计聚合方法,构建新的因子。接下来,介绍因子构建时用到的一些表达式:

标签

DeepAlpha系列报告量化投资深度学习模型量化选股
{link}