DeepAlpha短周期因子研究系列之:随机森林在量化选股中的应用
由kenshin716创建,最终由kenshin716 被浏览 43 用户
一、引言
DeepAlpha系列报告旨在从基础量价数据中,借鉴深度学习模型,应用于量化投资领域。学习模型包括:全连接深度网络(DNN)、卷积神经网络(CNN)、长短期记忆网络(LSTM)、对抗生成网络(GAN)、ResNet、TabNet,同时报告将引入自然语义识别NLP领域近年热门算法如BERT、Transformer、GPT、XLNet等,尝试构建各类DeepAlpha模型。
本篇文章通过传统机器学习算法对相同的量价因子进行实验,方便与深度学习模型进行对比。
二、随机森林算法介绍
随机森林属于集成学习的一种,通过集成学习的Bagging思想将多棵树集成的一种算法:它的基本单元就是决策树。随机森林的名称中有两个关键词,一个是“随机”,一个就是“森林”。“森林”很好理解,一棵叫做树,那么成百上千棵就可以叫做森林了,其实这也是随机森林的主要思想--集成思想的体现。“随机”指在训练时,随机森林中的每棵树都会从数据点的随机样本中学习。样本被有放回的抽样,称为自助抽样法(bootstrapping),这意味着一些样本将在一棵树中被多次使用。背后的想法是在不同样本上训练每棵树,尽管每棵树相对于特定训练数据集可能具有高方差,但总体而言,整个森林将具有较低的方差,同时不以增加偏差为代价。随机森林将成百上千棵决策树组合在一起,在略微不同的观察集上训练每个决策树,在每棵树中仅考虑有限数量的特征来拆分节点。随机森林的最终预测是通过平均每棵树的预测来得到的。随机森林中的特征重要性表示在该特征上拆分的所有节点的基尼不纯度减少的总和。
1. 决策树
既然随机森林是将多颗决策树组合起来,那么我们有必要对决策树算法做一个简单介绍。
决策树是一类常见的机器学习方法,其思想十分朴素,类似于我们平时利用选择做决策的过程。例如有人给我们介绍新的对象的时候,我们就要一个个特点去判断,于是这种判断的过程就可以画成一棵树:
决策树学习的目的是为了产生一颗泛化能力强的决策树,其基本流程遵循简单且直观的“分而治之(divide-and-conquer)”策略,伪代码如下所示:
显然,决策树的生成是一个递归过程,最关键的点在第8行——从属性集合A中选择最优属性a,即如何对结点进行划分。一般而言,我们希望决策树的分支结点所包含的样本尽可能属于同一类别,即结点的“纯度(purity)”越来越高。常见的决策树算法包含以下三种,关键区分点同样是在结点如何选择最优划分属性。
-
ID3决策树:信息增益(information gain)指根据指定属性a对样本D进行划分后得到的“纯度提升”程度。其中,Ent(D)指“信息熵”(information entropy),它是度量样本集合纯度最常用的一种指标,即“不纯度”(impurity),其值越小,则D的纯度越高。
-
C4.5决策树:增益率(Gain ratio)在“信息增益”的基础上进行了改善。根据“信息增益”选择属性并划分结点存在一个问题:对可取值数目较多的属性有所偏好,比如“性别”只能取“男”或“女”,而“年龄”可以取任意整数,则信息增益会偏好选择“年龄”作为属性进行结点划分,而“增益率”(Gain ratio)通过在信息增益的基础上引入 IV 解决这一问题。IV称为属性a的“固有值”(intrinsic value),可以看到属性a的可能取值数目越多(即V越大),则 IV(a) 的值越大,导致“增益率”越小。
-
CART决策树:基尼指数(Gini index)与“信息增益”类似。不同于用“信息熵”度量不存度,它利用基尼值。直观来说,Gini(D)反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率。因此,Gini(D)越小,则数据集D的纯度越高。
上述三种算法都是根据节点的不存度来选择最优的划分属性。另外,决策树算法还包括预剪枝、后剪枝、树的深度、叶子节点数量等诸多影响最终模型训练结果的内容,这里我们简要介绍一下“剪枝”,其他内容不一一展开说明。
剪枝(pruning)是决策树学习算法对付“过拟合”的主要手段。“过拟合”指模型学习得太好,把训练集数据自身的一些特点当做所有数据都具有的一般性质了。决策树剪枝可以降低过拟合风险,核心思想是在当前节点是否分支进行两次模拟,然后根据对划分前后的泛化性能进行估计,如果能提高性能则进行分支划分。
- 预剪枝(prepruning):对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前节点标记为叶节点。
- 后剪枝(postpruning):先生成一颗完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。
2. 回归树
由于金融领域一般遇到的是回归问题,而非分类问题,因此我们有必要对回归树进行单独的介绍。回归树就是用树模型做回归问题,每一片叶子都输出一个预测值。预测值一般是叶子结点所含训练集输出的均值。
回归树和分类树最大的区分点在于从属性集合A中选择最优属性a进行结点划分的规则。不同于分类树使用熵、信息增益、基尼指数等指标,由于回归问题一般涉及连续值,因此其一般使用 MSE 和 MAE 作为划分标准。
-
MSE(mean square error,均方误差)是真实值与预测值的差值的平方然后求和再平均。
-
MAE(mean absolute error,平均绝对误差)是真实值与预测值的差值的绝对值的平均。
可以看见,MSE和MAE都是用来衡量真实值与预测值的差异程度的,一般来说我们在选择属性进行结点划分时会选择值最小的属性。但是,我们如何在MSE和MAE之间进行选择呢?接下来解释MSE和MAE的两个重要差异:
-
MSE 通常比 MAE 可以更快地收敛。当使用梯度下降算法时,MSE 损失的梯度为 2/n*(y*-y)w,而 MAE 损失的梯度为 1或-1,即 MSE 的梯度的 scale 会随误差(y*-y)减小而减小,而 MAE 的梯度的 scale 则一直保持不变,即便在绝对误差 很小的时候 MAE 的梯度 scale 也同样为 1,这实际上是非常不利于模型的训练的。当然你可以通过在训练过程中动态调整学习率缓解这个问题,但是总的来说,损失函数梯度之间的差异导致了 MSE 在大部分时候比 MAE 收敛地更快。这个也是 MSE 更为流行的原因。
-
MAE 对于 outlier 更加 robust,即受outlier的影响越小。由于MAE 损失与绝对误差之间是线性关系,MSE 损失与误差是平方关系,当误差非常大的时候,MSE 损失会远远大于 MAE 损失。因此当数据中出现一个误差非常大的 outlier 时,MSE 会产生一个非常大的损失,对模型的训练会产生较大的影响。
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 进行结合的常见策略如下:
- 平均法(averaging):将基学习器的预测结果平均集合,比如:简单平均法、加权平均法。
- 投票法:根据基学习器的预测某标记的数量多少,数量占比越大则选择该标记,比如:绝对多数投票法(majority voting)、相对多数投票法(plurality voting)、加权投票法(weighted voting)。
- 学习法:当训练数据很多时,通过另一个学习器来进行结合,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为模型未能解释的部分,而数据自带的偏差部分。
由于SST = SSR + SSE(回归平方和),所以R^2为是回归平方和与总平方和的比值,反映了自变量对因变量的可解释比例,比如R^2=0.8,表示自变量能够解释80%关于因变量的变化。R^2可以为负的——当模型解释能力或者说模型的偏差大于数据自带的偏差,即拟合得更差的时候,比如下面这张图。
四、实证研究
1. 因子构建
本报告参考《DeepAlpha短周期因子研究系列之:DNN在量化选股中的应用》相关报告,主要以量价数据作为原始数据计算一系列的因子,基础因子包括开盘价、收盘价、最高价、成交量、换算率等行情数据,通过相关系数、标准差、时序最大、时序最小、时序求和、加权平均等统计聚合方法,构建新的因子。接下来,介绍因子构建时用到的一些表达式:
表达式 | 含义 | 说明 |
---|---|---|
mean | 时序平均 | 共生成7个衍生因子,例如mean(close_0,5) |
ts_max | 时序求最大 | 共生成7个衍生因子,例如ts_max(close_0,5) |
ts_min | 时序求最小 | 共生成7个衍生因子,例如ts_min(close_0,5) |
std | 时序标准差 | 共生成7个衍生因子,例如std(close_0,5) |
ts_rank | 时序排序 | 共生成7个衍生因子,例如ts_rank(close_0,5) |
decay_linear | 时序加权平均 | 共生成7个衍生因子,例如decay_linear(close_0,5) |
correlation | 时序相关性 | 生成21个个衍生因子,例如correlation(close_0,volume_0,5) |
close_* | 向前偏移 | 7*5=35个,例如close_4 |
衍生因子数 | 共计98个(7*6+21+35) |
2. 基准组合
在得到因子数据之后,我们构建一个标准的随机森林模型,利用历史数据进行训练并根据模型预测结果构建投资组合进行回测。具体参数如下:
- 训练数据集:2018年1月1日至2020年12月31日,全A股上市公司,上述98个量价因子数据作为特征数据,个股未来五日的收益率作为标签值。
- 测试数据集:2021年1月1日至2021年12月31日,全A股上市公司,上述98个量价因子数据作为特征数据,个股未来五日的收益率作为标签值。
- 模型参数1 基准学习器数量:20
- 模型参数2 决策树属性划分准则:MSE
- 模型参数3 特征使用率:0.7
- 模型参数4 决策树最大深度:30
- 模型参数5 叶子结点最小样本数:200
根据上述数据和参数,我们训练了一个随机森林模型,并将部分评估结果展示如下。
- 决定系数(R^2)是反映模型的拟合程度,值越大,模型拟合越好,最好的情况下R^2为1,而该模型的预测准确性为 -0.00156322,说明模型的解释能力较差。
- 特征重要性(feature importance)是衡量输入特征对模型预测结果贡献的指标,即某个特征上的微小变化如何改变预测结果。我们提取前10个特征的重要性,展示如下:return_0 作为特征重要性值最大(0.06)的因子,在模型中的重要性明显强于其他因子;从第二个因子ts_min(return_0,5)开始,其值都维持在0.03附近。
最后,根据训练模型对预测集数据进行预测,并利用预测结果进行选股回测。回测具体参数如下:
- 回测时间:2021年1月1日 - 2021年12月31日
- 股票池:全A股
- 手续费:买入 0.03%、卖出 0.13%
- 选股规则:模型预测打分最高前50名
- 调仓周期:5个交易日
- 单股资金最大占比:0.2
- 单股权重:得分排序加权
3.对比实验
随机森林模型具有许多参数,不同的输入参数和不同的输入数据都会导致最后训练的模型差异较大,因此,我们选择一些重要的参数进行调整并对比模型预测结果和回测净值表现。
- 基准学习器数量(n_estimators):一般来说,n_estimators太小,容易欠拟合,n_estimators太大,计算量会太大,且模型提升程度会逐渐变小。
- 决策树划分准则(criterion):回归树的准则为 MSE(均方差)、MAE(绝对值差)。
- 最大特征数(max_features):一般来说,划分时选用的特征数越多越好,但也可以用来控制决策树的生成时间。
- 最大深度(max_depth):具体取值取决于数据的分布,常用为10-100之间。
- 叶节点容量(min_samples_leaf):叶子结点的最小容量,容量越小,模型越复杂。
- 数据时间周期(Periods):历史数据的选择周期。
我们选择5组输入参数进行对照试验,各组模型的参数输入值如下所示:
基准组合 | 对照组1 | 对照组2 | 对照组3 | 对照组4 | 对照组5 | |
---|---|---|---|---|---|---|
n_estimators | 20 | 100 | 20 | 20 | 20 | 20 |
criterion | MSE | MSE | MSE | MSE | MSE | MSE |
max_features | 0.7 | 0.7 | 1 | 0.7 | 0.7 | 0.7 |
max_depth | 30 | 30 | 30 | 50 | 30 | 30 |
min_samples_leaf | 200 | 200 | 200 | 200 | 50 | 200 |
periods | 2018-2020 | 2018-2020 | 2018-2020 | 2018-2020 | 2018-2020 | 2010-2020 |
最后,对比各组模型的性能和回测结果:
基准组合 | 对照组1 | 对照组2 | 对照组3 | 对照组4 | 对照组5 | |
---|---|---|---|---|---|---|
模型训练时间 | 0:24 hs | 1:40 hs | 0:00:29 hs | 00:26:35 | 0:29:41 | 1:28:26 |
预测准确度 | -0.0015632 | 0.0002206 | 0.0006929 | -0.0013705 | -0.006209 | -0.000651 |
最大特征重要性名称 | return_0 | return_0 | return_0 | return_0 | return_0 | std(amount_0,5) |
最大特征重要性值 | 0.06 | 0.065 | 0.026 | 0.065 | 0.035 | 0.045 |
回测-年化收益率 | 63.69% | 67.93% | 21.22% | 44.38% | 50.73% | 47.72% |
回测-夏普比率 | 2.67 | 2.82 | 1.07 | 2.04 | 2.23 | 2.0 |
回测-最大回测 | 8.48% | 7.71% | 10.01% | 7.48% | 7.69% | 11.56% |
各对比组回测收益率曲线如下所示:
通过对比试验,我们得出如下结论:
- 模型复杂度越高,训练时间越久,准确率有一定提升。
- 特征使用率对模型的影响较大,模型随机性越高,泛化能力越强,测试集的预测效果更好。
- 基学习器数量、最大深度、叶节点容量、训练集时长等影响模型复杂度的参数在某种程度上可以提高预测效果,但程度不一。
4.参数调优
机器学习模型的参数对最终的训练结果有较大的影响,如何选择最优的一组参数训练模型是机器学习工程实践中重要的一部分。参数调优有四种方法:
- 网格搜索(GridSearch):从预先设定好的参数集中遍历,通过交叉验证等评选效果最优的一组参数。
- 随机搜索(RandomSearch):不同于网格搜索的暴力遍历。随机搜索从参数分布中采样,更加高效。
- 贝叶斯搜索(BayesSearch)
模型调参,第一步是要找准目标:我们要做什么?一般来说,这个目标是提升某个模型评估指标,比如对于随机森林来说,我们想要提升的是模型在未知数据上的准确率(由score或oob_score_来衡量)。找准了这个目标,我们就需要思考:模型在未知数据上的准确率受什么因素影响?在机器学习中,我们用来衡量模型在未知数据上的准确率的指标,叫做泛化误差(Genelization error)。
本文选择网格搜索的方法遍历以下参数值:
n_estimators | feature_fraction | max_depth |
---|---|---|
20 | 0.7 | 30 |
50 | 1 | 80 |
100 |
每组参数值下,模型的训练结果如下。观察每组数据,我们可以得到以下几条规律:
- R^2(即score列):特征使用率(feature_fraction)对R^2影响明显。 特征使用率为1,则 R^2 值普遍为正,说明随机性越低,模型训练的预测准确性越高。
- 基学习器数量(iterations)越大,R^2 值普遍越高,说明模型训练的预测准确性越高。 特征重要性:特征使用率为1时,特征重要性普遍更加平均,即最大和最小的差值更小(0.0223 vs 0.0616)
参数组 | score | 最大特征 | 最大特征值 | 最小特征 | 最小特征值 |
---|---|---|---|---|---|
iterations:20, feature_fraction:0.7, max_depth:30 | -0.00155 | return_0 | 0.064327 | decay_linear(close_0, 5) | 0.000515 |
iterations:20, feature_fraction:0.7, max_depth:80 | -0.00161 | return_0 | 0.062213 | decay_linear(open_0, 5) | 0.000506 |
iterations:20, feature_fraction:1, max_depth:30 | 0.000763 | return_0 | 0.025724 | correlation(volume_0, turn_0, 5) | 0.001125 |
iterations:20, feature_fraction:1, max_depth:80 | 0.000685 | mean(turn_0, 5) | 0.0239 | correlation(volume_0, turn_0, 5) | 0.001173 |
iterations:50, feature_fraction:0.7, max_depth:30 | -0.00027 | return_0 | 0.062088 | decay_linear(open_0, 5) | 0.000519 |
iterations:50, feature_fraction:0.7, max_depth:80 | -0.00028 | return_0 | 0.060339 | decay_linear(open_0, 5) | 0.000508 |
iterations:50, feature_fraction:1, max_depth:30 | 0.001307 | return_0 | 0.021692 | correlation(volume_0, turn_0, 5) | 0.000877 |
iterations:50, feature_fraction:1, max_depth:80 | 0.00126 | return_2 | 0.02184 | correlation(volume_0, turn_0, 5) | 0.000878 |
iterations:100, feature_fraction:0.7, max_depth:30 | 9.16E-05 | return_0 | 0.062884 | mean(close_0, 5) | 0.000491 |
iterations:100, feature_fraction:0.7, max_depth:80 | 0.000169 | return_0 | 0.061353 | mean(close_0, 5) | 0.000494 |
iterations:100, feature_fraction:1, max_depth:30 | 0.001465 | return_0 | 0.024161 | correlation(volume_0, turn_0, 5) | 0.000739 |
iterations:100, feature_fraction:1, max_depth:80 | 0.001444 | decay_linear(return_0, 5) | 0.022426 | correlation(volume_0, turn_0, 5) | 0.000746 |
回测结果如下:可以发现当特征使用率为0.7时,回测表现普遍更好,且模型的复杂度越高,收益表现越好。
参数组 | cumprod_ret | excess_return | information | sharpe | sortino | max_drawdown |
---|---|---|---|---|---|---|
iterations:20, feature_fraction:0.7, max_depth:30 | 0.581289 | 0 | 0.154211 | 2.689979 | 4.806215 | -0.07337 |
iterations:20, feature_fraction:0.7, max_depth:80 | 0.478552 | 0 | 0.132309 | 2.295339 | 4.0873 | -0.09104 |
iterations:20, feature_fraction:1, max_depth:30 | 0.150428 | 0 | 0.068731 | 0.775915 | 1.418573 | -0.1186 |
iterations:20, feature_fraction:1, max_depth:80 | 0.138614 | 0 | 0.064055 | 0.712252 | 1.300072 | -0.10666 |
iterations:50, feature_fraction:0.7, max_depth:30 | 0.605732 | 0 | 0.154484 | 2.763176 | 5.032416 | -0.07544 |
iterations:50, feature_fraction:0.7, max_depth:80 | 0.564991 | 0 | 0.146138 | 2.534916 | 4.587076 | -0.07241 |
iterations:50, feature_fraction:1, max_depth:30 | 0.176584 | 0 | 0.073437 | 0.892457 | 1.621277 | -0.11268 |
iterations:50, feature_fraction:1, max_depth:80 | 0.185063 | 0 | 0.075508 | 0.935017 | 1.661902 | -0.11997 |
iterations:100, feature_fraction:0.7, max_depth:30 | 0.599526 | 0 | 0.152554 | 2.720396 | 4.911386 | -0.07124 |
iterations:100, feature_fraction:0.7, max_depth:80 | 0.614858 | 0 | 0.154412 | 2.691773 | 4.873879 | -0.07398 |
iterations:100, feature_fraction:1, max_depth:30 | 0.216081 | 0 | 0.082705 | 1.084118 | 1.918366 | -0.11582 |
iterations:100, feature_fraction:1, max_depth:80 | 0.225693 | 0 | 0.087513 | 1.122787 | 1.936267 | -0.11287 |
下图是回测收益曲线:曲线根据特征使用率明显分为两组,且特征使用率为 0.7 的组明显更好。
5. 滚动训练
国内股票市场市场存在明显的周期性,每个周期的市场风格在不断变换,具备不同的风格特征,典型的比如2017年前的小市值风格因子。不同周期的股票池在模型训练时,其训练后的模型效果也不相同。因此,为了尽量避免策略失效,我们可以定期更新训练集数据,也就是通过滚动训练的方式更新预测模型以适应最新市场行情的变化。
本文采用2010年1月1日至2021年12月31日的数据周期,采用每年一滚动的形式,每次选取前3年的数据进行模型训练,共产生了7个数据集和7个训练模型。周期跨度如下图所示
同时,基于前文的研究,我们选择以下这组参数去训练模型:
基学习器数量 | 特征使用率 | 树的最大深度 | 树的分类准则 | 叶节点最小容量 |
---|---|---|---|---|
40 | 0.7 | 30 | mse | 200 |
拟合2013年至2021年的回测曲线,如下图所示:
滚动训练每年回测绩效表现:
年份 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020 | 2021 |
---|---|---|---|---|---|---|---|---|---|
累计收益率(%) | 109.13 | 119.85 | 143.37 | 33.97 | -4.10 | 16.78 | 45.66 | 12.19 | 34.94 |
五、结论
通过上述实验,我们可以得到以下结论:
- 随机森林算法在传统量价因子上具有一定的预测效果,无论是基准组合还是在对照组都具备较好的收益率表现。
- 特征使用率(max_depth)对样本外数据的预测效果影响较大,随机性越高,模型的泛化能力越好,预测效果越好。
- 复杂度影响模型的准确性,复杂度越高,预测效果更好。
- 从特征重要性来看,复杂度越高,模型准确性越强,因子间的特征重要性差距越小。
- 从滚动训练的结果来看,随机森林算法在传统量价因子上取得较好的alpha收益,在特殊行情下仍然有较大的波动风险。
但是,上述实验仍然存在诸多不足之处,有待后续深入研究改进:
-
调参优化:虽然本文进行了参数调优的实验,但对各组参数以及训练后的模型结果的解释较为浅显。
-
数据集选择:从滚动训练结果来看,选择不同时间周期的训练集数据和预测集数据对模型训练和评估有不同的效果。
-
因子特征选择和理解:本文选择了传统量价因子作为特征集,后续可以选择更加多元化的因子集合,比如财务因子、估值因子、宏观因子、基本面因子等。同时,对于因子和标签需要进一步深入的理解和实验,比如标签除了5日收益率外,其他类型的收益率是否有显著不同。
\
https://bigquant.com/experimentshare/e9f0ea55eb4a445988e59c1977e54f2e
\