【研报分享】华泰证券-人工智能选股之 Boosting 模型

研报干货
华泰
boosting模型
标签: #<Tag:0x00007fb0218b7968> #<Tag:0x00007fb0218b6360> #<Tag:0x00007fb0218b5078>

#1

摘要:

报告对各种 Boosting 集成学习模型进行系统测试

Boosting 集成学习模型将多个弱学习器串行结合,能够很好地兼顾模型的 偏差和方差,该类模型在最近几年获得了长足的发展,主要包括 AdaBoost、
GBDT、XGBoost。本篇报告我们将对这三种 Boosting 集成学习模型进行 系统性的测试,并分析它们应用于多因子选股的异同,希望对本领域的投 资者产生有实用意义的参考价值。

Boosting 集成学习模型构建:7 阶段样本内训练与交叉验证、样本外测试

Boosting 集成学习模型的构建包括特征和标签提取、特征预处理、样本内 训练、交叉验证和样本外测试等步骤。最终在每个月底可以产生对全部个 股下期上涨概率的预测值,然后根据正确率、AUC 等指标以及策略回测结 果对模型进行评价。为了让模型及时学习到市场特征的变化,我们采用了 7 阶段滚动回测方法。我们还根据模型的预测结果构建了沪深 300 成份内 选股、中证 500 成份内选股和全 A 选股策略,通过年化收益率、信息比率、 最大回撤等指标综合评价策略效果。

XGBoost 模型超额收益和信息比率的表现优于线性回归

对于沪深 300 成份股内选股的行业中性策略(每个行业选 6 只个股), XGBoost 分类模型的超额收益为 6.4%,信息比率为 1.78。对于中证 500 成份股内选股的行业中性策略,XGBoost 分类模型的超额收益为 7.2%, 信息比率为 2.03。对于全 A 选股的行业中性策略,XGBoost 分类模型相对 于中证 500 的超额收益为 31.5%,信息比率为 4.4。总体而言,XGBoost 分类模型在超额收益和信息比率方面表现不错,各种策略构建方式下都能 稳定地优于线性回归模型;最大回撤方面 XGBoost 分类相比于线性回归不 具备明显优势。

XGBoost 模型预测能力与其他集成学习模型持平,但运算速度有明显优势

我们比较了不同的 Boosting 集成学习模型的预测能力,发现 XGBoost 模 型和其他模型持平。AdaBoost、GBDT、XGBoost 三种模型样本外平均 AUC 分别为 0.5695,0.5699,0.5696,样本外平均正确率分别为 53.94%, 54.12%,54.02%。但 XGBoost 模型在运算速度上有明显优势,其他集成 学习模型训练所需时间普遍在 XGBoost 模型的 2~8 倍。

Boosting 模型比 Bagging 模型(随机森林)更简单

在达到相近预测能力和回测绩效时,Boosting 模型比 Bagging 模型(随机 森林)要简单。本文的 Boosting 模型中,每个决策树的深度都为 3,决策 树总数为 100。而 Bagging 模型中每个决策树的深度普遍在 20 以上,决 策树总数有数百个,模型的复杂程度远大于 Boosting 模型。

风险提示:通过 Boosting 集成学习模型构建选股策略是历史经验的总结, 存在失效的可能。

本文研究导读:

到目前为止,华泰金工人工智能选股系列已经推出了 5 篇报告,对广义线性模型、支持向 量机模型、朴素贝叶斯模型和随机森林模型都进行了尝试和论证。而上一篇报告所提到的 随机森林模型涉及到一种经典的 Bagging 集成学习算法,在本篇报告中,我们将继续探究 集成学习算法领域的 Boosting 类学习算法,和之前报告的模型进行充分的对比。本篇报 告将主要关注如下几方面的问题:

  1. 首先,Boosting集成学习模型包含哪些具体模型?这些模型各自的原理和特点是什么, 主要参数包括哪些?

  2. 2014 年推出的 XGBoost 框架是近年来 Boosting 集成学习领域的新宠,XGBoost 强 大的预测能力和高效的性能使得其在 Kaggle 等多个机器学习竞赛中大受欢迎。将 XGBoost 应用在多因子选股中的效果到底如何?本文将对 XGBoost 和其他集成学习 算法进行测试对比。

  3. 最后是组合构建的问题。在衡量过不同模型的表现之后,应如何利用模型的预测结果 构建策略组合进行回测?各模型在沪深300、中证500和全部A股票池内选股效果(超 额收益、最大回撤、信息比率等)的异同是什么?

我们将围绕以上问题进行系统性的测试,希望为读者提供一些扎实的证据,并寻找到有效的分类方法,能够对本领域的投资者产生参考价值。

Boosting 集成学习模型简介

“三个臭皮匠,顶个诸葛亮”。单个弱学习器的预测能力有限,如何将多个弱学习器组合成 一个强学习器,这是学习器集成需要探讨的问题。集成学习算法有两大种类,如图表 1 的 灰色方框所示,左边一支为 Bagging 系列(并行方法),右边一支为 Boosting 系列(串行 方法)。对于多棵决策树,如果以 Bagging 的方式组合起来,可以得到随机森林算法;如 果以 Boosting 的方式组合起来,可以得到梯度提升决策树(GBDT)等方法。而对于 AdaBoost 算法,它的弱学习器不一定是决策树,也可以是 SVM、广义线性回归等。

image

决策树

决策树是集成学习模型中最常用的弱学习器。决策树基于多个特征进行分类决策。在树的 每个结点处,根据特征的表现通过某种规则分裂出下一层的叶子节点,终端的叶子节点即 为最终的分类结果。决策树学习的关键是选择最优划分属性。随着逐层划分,决策树分支 结点所包含的样本类别会逐渐趋于一致,即节点分裂时要使得节点分裂后的信息增益 (Information Gain)最大。本文的 Boosting 集成学习算法使用的弱学习器是 CART 决策 树。关于 CART 决策树的介绍请见附录。

提升算法 AdaBoost

AdaBoost 概述

和 Bagging 并行组合弱分类器的思想不同,AdaBoost(adaptive boosting)将弱分类器 以串行的方式组合起来,如图表 2 所示。在训练之前,我们赋予全部样本相等的权重。第 一步以原始数据为训练集,训练一个弱分类器 C1,如图表 3 左图所示。对于分类错误的 样本,提高其权重。第二步以更新样本权值后的数据为训练集,再次训练一个弱分类器 C2,如图表 3 中间图所示。随后重复上述过程,每次自适应地改变样本权重并训练弱分类 器,如图表 3 右图所示。最终,每个弱分类器都可以计算出它的加权训练样本分类错误率, 将全部弱分类器按一定权值进行组合得到强分类器,错误率越低的弱分类器所占权重越高。

image

image

AdaBoost 二元分类算法基本步骤 本节中,我们介绍 AdaBoost 二元分类算法的具体步骤。 假设输入为样本集 T={(𝑥1, 𝑦1),(𝑥2, 𝑦2),…,(𝑥𝑚, 𝑦𝑚)},输出为{-1,+1},弱分类器迭代次数 K。 输出是强分类器𝑓(𝑥)。 算法主要有以下步骤: (1) 初始化样本集的权重为

image

(2) 对于 k=1,2,…,K: ① 使用具有权重𝐷(𝑘)的样本集来训练数据,得到弱分类器𝐺𝑘(𝑥𝑖) ② 计算𝐺𝑘(𝑥𝑖)的分类误差率

image

③ 计算弱分类器𝐺𝑘(𝑥)的权重系数

image

④ 更新样本集的权重分布

image

(3) 最后,构建强分类器:

image

AdaBoost 回归算法基本步骤 本节中,我们介绍 AdaBoost 回归算法的具体步骤。 假设输入为样本集 T={(𝑥1, 𝑦1),(𝑥2, 𝑦2),…,(𝑥𝑚, 𝑦𝑚)},输出为{-1,+1},弱分类器迭代次数 K。 输出是强学习器𝑓(𝑥)。 算法主要有以下步骤:
(1) 初始化样本集的权重为
image

AdaBoost 主要参数

图表 4 中列出了 AdaBoost 模型的主要参数,参数分两大类,一类是 AdaBoost 框架参数, 与具体的弱学习器无关;另一类是 AdaBoost 弱学习器参数。

image

梯度提升决策树 GBDT

GBDT 概述

梯度提升决策树 GBDT 是一种 Boosting 集成学习算法,但是却和传统的 AdaBoost 有很 大的不同,且弱学习器限定了只能使用 CART 回归树模型。在 GBDT 的迭代中,假设前 一轮迭代得到的强学习器是𝑓𝑡−1(𝑥), 损失函数是 L(y, 𝑓𝑡−1(𝑥)), 本轮迭代的目标是得到一 个 CART 回归树模型的弱学习器ℎ𝑡(𝑥),使得本轮的损失 L(y, 𝑓𝑡(𝑥))= L(y, 𝑓𝑡−1(𝑥)) + ℎ𝑡(𝑥) 最小。也就是说,本轮迭代得到的决策树,要让样本的损失尽量变得更小。

GBDT 的思想可以用一个通俗的例子解释,假如某人有 170 厘米身高,我们首先用 160 厘米去拟合,发现残差有 10 厘米,这时我们用 6 厘米去拟合剩下的残差,发现残差还有 4 厘米,第三轮我们用 3 厘米拟合剩下的残差,残差就只有 1 厘米了。如果迭代轮数还没 有完,可以继续迭代下去,每一轮迭代,拟合的身高残差都会减小。图表 5 显示了 GBDT 算法的流程。

image

GBDT 回归算法基本步骤

本节中,我们介绍 GBDT 回归算法的具体步骤。 假设输入是训练集样本 T={(𝑥1, 𝑦1),(𝑥2, 𝑦2),…,(𝑥𝑚, 𝑦𝑚)},最大迭代次数 T, 损失函数为 L。 输出是强学习器𝑓(𝑥)。 算法主要有以下步骤:

GBDT 二元分类算法基本步骤

对于二元分类 GBDT,如果用类似于 Logistic 回归的对数损失函数,则损失函数为:

image

GBDT 常用损失函数

对于回归算法,常用损失函数有如下 4 种:

对于 Huber 损失和分位数损失,主要用于健壮回归,也就是减少异常点对损失函数的影响。

对于分类算法,损失函数一般有对数损失函数和指数损失函数两种:

image

GBDT 主要参数

图表 6 中列出了 GBDT 模型的主要参数,参数分两大类,一类是 GBDT 框架参数,与具 体的弱学习器无关;另一类是 GBDT 弱学习器参数。

image

极端梯度提升算法 XGBoost

XGBoost 概述

XGBoost 是 Gradient Boosting 方法的一种高效实现,也是 GBDT 算法的改进和提高。相 比于传统的 GBDT 算法,XGBoost 在损失函数、正则化、切分点查找和并行化设计等方 面进行了改进,使得其在计算速度上比常见工具包快 5 倍以上。例如,GBDT 算法在训练 第 n 棵树时需要用到第 n-1 棵树的残差,从而导致算法较难实现并行;而 XGBoost 通过 对目标函数做二阶泰勒展开,使得最终的目标函数只依赖每个数据点上损失函数的一阶导 和二阶导,进而容易实现并行。图表 7 显示了 XGBoost 算法的流程,它与 GBDT 在数学 上的不同之处在于训练每个弱学习器时的目标函数。

image

XGBoost 的损失函数和正则化

本文主要介绍以 CART 树为基学习器的 XGBoost 算法。任给一个样本点,计算出该样本 在每个 CART 上的得分,累加起来就是该样本的最终得分,由此可进行预测或分类。 XGBoost 模型的数学描述和目标函数为:

image

其中 n 为样本的个数,𝑥𝑖表示第 i 个样本,𝑦𝑖和𝑦 ̂𝑖为第 i 个样本的真实值和预测值;K 为 CART 的个数,𝑓𝑘表示第 k 个 CART,可看做从样本点到分数的映射;𝐿(y,𝑦 ̂)为损失函数, 𝛺(𝑓𝑘)为正则项。

在训练第 t 棵树时,相当于极小化第 t 棵树的目标函数:

image

XGBoost 的特别之处就是用损失函数的二阶泰勒展开来近似原来的损失函数,上述目标函 数可近似为:

image

其中𝑔𝑖和ℎ𝑖分别为第 i 个样本点上损失函数 L 关于第二个变量的一阶和二阶偏导数。如果 我们再知道𝑓𝑡和𝛺的表达式,就能得到第 t 棵树。

目标函数中正则项部分(相当于树的复杂度)如下定义:

image

其中𝑓𝑡表示第 t 棵树,T 表示该树的叶子节点的个数,𝜔𝑗表示第 j 个叶子节点上的分数; 𝛾和 𝜆为惩罚因子,越大表明对树的复杂度的惩罚力度越大。

接下来就是对𝑓𝑡的细化,将树拆分成结构部分𝑞和权重部分𝜔: 𝑓𝑡(𝑥) = 𝜔𝑞(𝑥),𝜔 ∈ 𝑅𝑇,𝑞:𝑅𝑑 → {1,2,⋯,𝑇} 其中𝜔是一个 T 维向量,对应 T 个叶子节点上的分数;𝑞是一个映射,将样本点𝑥 ∈ 𝑅𝑑映 射到某一个叶子节点上。因此,只要确定了树的结构𝑞和每个叶子节点上的得分𝜔,就能完 全确定这棵树了。

XGBoost 算法基本步骤 XGBoost 算法的基本步骤与 GBDT 类似,差别在于构造新树的方法不同。这里主要介绍 XGBoost 构造新树的方法。

将𝑓𝑡和𝛺的表达式带入近似的目标函数中,忽略与𝑓𝑡无关的常数部分,可以得到:

image
最后一式中的𝐺𝑗和𝐻𝑦定义为

image

从最后一式可以看出,目标函数的近似是关于 T 个相互独立的变量𝜔𝑗的二次函数,可以直 接解得极小点
image

下面开始构造树的结构。上面式子中𝑂𝑏𝑗∗表示当我们指定一棵树时,可以在目标函数上最 多减少多少,因此可以把它叫做结构分数;𝑂𝑏𝑗∗越小说明树的结构越好,然后利用贪心算 法枚举出不同的树结构,选出结构分数最小的树。具体来讲,每一次尝试对已有的叶子加 入一个分割,都要通过下面的式子(该式摘录自报告“Introduction to Boosted Trees”, Tianqi Chen, Oct. 22 2014)计算𝑂𝑏𝑗∗的增益来确定是否要引入该分割:

image

引入分割不一定会使目标函数减小,因为目标函数中还有对引入新叶子的惩罚项,优化这 个目标对应了树的剪枝,当引入分割带来的增益小于一个阈值时,可以剪掉这个分割。到 此就确定了树的结构。

XGBoost 相比 GBDT 的优势
(1) 传统 GBDT 在优化时只用到了损失函数的一阶导数信息,XGBoost 则对损失函数 进行了二阶泰勒展开,用到了一阶和二阶导数信息。并且 XGBoost 可以自定义损 失函数,只要损失函数一阶和二阶可导。 (
2) XGBoost 在损失函数里加入了正则项,用于控制模型的复杂度。从方差和偏差权 衡的角度来讲,正则项降低了模型的方差,使训练得出的模型更加简单,能防止 过拟合,这也是 XGBoost 优于传统 GBDT 的一个特性。
(3) 传统GBDT以CART树作为弱分类器,XGBoost还支持线性分类器作为弱分类器, 此时 XGBoost 相当于包含了 L1 和 L2 正则项的 Logistic 回归(分类问题)或者线 性回归(回归问题)。
(4) XGBoost 借鉴了随机森林的做法,支持特征抽样,在训练弱学习器时,只使用抽 样出来的部分特征。这样不仅能降低过拟合,还能减少计算。
(5) XGBoost 支持并行。但是 XGBoost 的并行不是指能够并行地训练决策树, XGBoost 也是训练完一棵决策树再训练下一棵决策树的。XGBoost 是在处理特征 的层面上实现并行的。我们知道,训练决策树最耗时的一步就是对各个特征的值 进行排序(为了确定最佳分割点)并计算信息增益,XGBoost 对于各个特征的信 息增益计算就可以在多线程中进行。

XGBoost 主要参数

图表 8 中列出了 XGBoost 模型的主要参数,参数分两大类,一类是 XGBoost 框架参数, 与具体的弱学习器无关;另一类是 XGBoost 弱学习器参数。

image

Boosting 集成学习模型测试流程

image

本文将要测试的 Boosting 集成学习模型有 3 种:AdaBoost,GBDT,XGBoost,为了保 证三种模型的一致性和可比性,对它们采用完全相同的测试流程。Boosting 集成学习模型 的构建方法包含下列步骤:
1. 数据获取:
a) 股票池:沪深 300 成份股/中证 500 成份股/全 A 股。剔除 ST 股票,剔除每个截 面期下一交易日停牌的股票,剔除上市 3 个月内的股票,每只股票视作一个样本。
b) 回测区间:2011-01-31 至 2017-07-31。分 7 个阶段回测,如图表 11 所示。
2. 特征和标签提取:每个自然月的最后一个交易日,计算之前报告里的 70 个因子暴露 度,作为样本的原始特征;计算下一整个自然月的个股超额收益(以沪深 300 指数为 基准),作为样本的标签。因子池如图表 10 所示。
3. 特征预处理:
a) 中位数去极值:设第 T 期某因子在所有个股上的暴露度序列为𝐷𝑖,𝐷𝑀为该序列 中位数,𝐷𝑀1为序列|𝐷𝑖 −𝐷𝑀|的中位数,则将序列𝐷𝑖中所有大于𝐷𝑀 +5𝐷𝑀1的数 重设为𝐷𝑀 +5𝐷𝑀1,将序列𝐷𝑖中所有小于𝐷𝑀 −5𝐷𝑀1的数重设为𝐷𝑀 −5𝐷𝑀1;
b) 缺失值处理:得到新的因子暴露度序列后,将因子暴露度缺失的地方设为中信一 级行业相同个股的平均值。
c) 行业市值中性化:将填充缺失值后的因子暴露度对行业哑变量和取对数后的市值 做线性回归,取残差作为新的因子暴露度。
d) 标准化:将中性化处理后的因子暴露度序列减去其现在的均值、除以其标准差, 得到一个新的近似服从N(0,1)分布的序列。
4. 训练集和交叉验证集的合成:
a) 分类问题:在每个月末截面期,选取下月收益排名前 30%的股票作为正例(𝑦 = 1), 后 30%的股票作为负例(𝑦 = −1)。将训练样本合并,随机选取 90%的样本作 为训练集,余下 10%的样本作为交叉验证集。
b) 回归问题:直接将样本合并成为样本内数据,同样按 90%和 10%的比例划分训 练集和交叉验证集。
5. 样本内训练:使用 Boosting 集成学习模型对训练集进行训练,考虑到我们将回测区间 按年份划分为 7 个子区间,因此需要对每个子回测的不同训练集重复训练。同时使用 本系列第二篇报告中的 12 个月滚动回测的线性回归模型作为统一对照组。
6. 交叉验证调参:模型训练完成后,使用模型对交叉验证集进行预测。选取交叉验证集 AUC(或平均 AUC)最高的一组参数作为模型的最优参数。
7. 样本外测试:确定最优参数后,以 T 月月末截面期所有样本预处理后的特征作为模型 的输入,得到每个样本的预测值𝑓(𝒙),将预测值视作合成后的因子。进行单因子分层 回测。回测方法和之前的单因子测试报告相同,具体步骤参考下一小节。
8. 模型评价:我们以分层回测的结果作为模型评价指标。我们还将给出测试集的正确率、 AUC 等衡量模型性能的指标。


image

Boosting 集成学习模型测试结果

XGBoost 是目前 Boosting 集成学习领域最为新潮的算法,兼具学习准确率高和速度快的 优点,同时在参数方面并没有比 AdaBoost 和 GBDT 有更多复杂之处,其调参方法也较为 简便且具有代表性,因此本文以 XGBoost 分类模型为例,对模型的参数优化进行说明, 其他模型的参数优化方法与之类似。

XGBoost 分类模型参数优化

在机器学习领域,参数寻优最常用的方法是网格搜索。本文使用的方法是一次选择模型的 2 个参数(选择过多的参数会使搜索变得很慢)在给定的范围内取值,遍历得到模型的 AUC 值,最后选择 AUC 值最大时模型对应的参数来作为优化的结果。 图表 8 中列出了 XGBoost 模型的 6 个主要参数,然而在将 XGBoost 模型应用到多因子选 股时,并非全部 6 个参数都会对 AUC 值造成显著的影响。某些参数的改变只会使得 AUC 值呈现随机变化或者基本不变的状态,这样的参数没有必要进行优化,只需使用模型的默 认值即可。我们经过测试,发现图表 8 中的参数中 n_estimators,learning_rate, min_child_weight,colsample_bytree,colsample_bylevel 都不需要进行优化。需要使用 网格搜索的参数是 subsample 和 max_depth。

我们取subsample = (0.6, 0.65, 0.7, 0.75, 0.8, 0.85, 0.9, 0.95, 1),max_depth = (3, 4, 5, 6, 7, 8),测试每一组 subsample 和 max_depth 值,得到交叉验证集的 AUC 值,全局最优 解为 max_depth=3,subsample=0.95。图表 12 中展示了交叉验证集和测试集的正确率、 AUC 的详细结果。

Boosting 集成学习模型正确率与 AUC 分析

下图展示了 AdaBoost、GBDT、XGBoost 和线性回归模型(分阶段回测同本文)每一期 样本外的 AUC 值随时间的变化情况。四种模型样本外平均 AUC 分别为 0.5695,0.5699, 0.5696,0.5512,样本外平均正确率分别为 53.94%,54.12%,54.02%,51.44%。从图 表 13~图表 15 中可以看出,三种模型的 AUC 波动方向基本与线性回归一致,AUC 均值 相对线性回归都要高出一些,但是 AUC 的波动更大,这可能造成选股后组合净值波动率较大。


image

Boosting 集成学习模型决策树结构分析

本文所研究的 Boosting 集成学习模型所使用的弱学习器都是决策树,运用决策树的一大 优势就是可以通过可视化的方法呈现决策树的决策过程和树结构,进而帮助人们理解模型 逻辑并发现问题。

在图表 16~图表 18 中,我们列出了 AdaBoost,GBDT,XGBoost 三种模型第一个决策 树的结构,由于这三种模型都是 Boosting 模型,决策树按照串行方式训练,因此从第一 个决策树中最能看出对模型结果影响最大的因子都有哪些。

image

image

image

上面图表所对应的的三种模型中,都将决策树的最大深度设为 3,因此这些图中显示的树 的深度都为 3。三种模型的第一个决策树都选择从 exp_wgt_return_3m(3 个月改进的动 量反转因子)开始进行划分,说明使用该因子进行划分所带来的信息增益较大。在决策树 的下面两层中,也有一些因子被三种模型共同选中,如 turn_1m(一个月日均换手率), In_capital(对数市值)。注意到 GBDT 和 XGBoost 的第一个决策树使用的划分因子完全 一样,只是划分值有所不同,这是因为 XGBoost 实际上是 GBDT 的一种高效实现,二者 有很多共同之处。

XGBoost 分类模型因子特征重要性统计

XGBoost 分类模型可以导出模型因子特征的重要性,这能帮助我们直观地观察模型主要受 那些因子影响。下面我们给出 2011~2017 年间 XGBoost 七阶段测试模型的特征重要性 评分表:


我们选取排名前 5 名的因子,自 2011 年 1 月以来,每个月用之前六年的数据训练 XGBoost 模型的因子重要性,得出因子重要性时间序列。图表 21 显示了排名前 5 名的因子的重要 性随时间的变化。ln_capital(对数市值)在 2017 年之前一直是市场上最为有效的因子, 重要性远超其他因子,但在 2017 年之后其重要性迅速下滑。另外四个因子则重要性相差 不大,且其时间序列呈现出近似平稳的状态。

image

XGBoost 分类模型分层回测分析

Boosting 集成学习分类器,最终在每个月底可以产生对全部个股下月上涨或下跌的预测值; 而 Boosting 集成学习回归模型,在每个月底可以产生对全部个股下月收益的预测值。因 此可以将两者都看作一个因子合成模型,即在每个月底将因子池中所有因子合成为一个 “因子”。接下来,我们对该模型合成的这个“因子”(即个股下期收益预测值)进行分层 回测,从各方面考察该模型的效果。仿照华泰单因子测试系列报告中的思路,分层回测模 型构建方法如下:

  1. 股票池:全 A 股,剔除 ST 股票,剔除每个截面期下一交易日停牌的股票,剔除上市 3 个月以内的股票。
  2. 回测区间:2011-01-31 至 2017-07-31(按年度分为 7 个子区间)。
  3. 换仓期:在每个自然月最后一个交易日核算因子值,在下个自然月首个交易日按当日 收盘价换仓。
  4. 数据处理方法:将 Boosting 集成学习模型的预测值视作单因子,因子值为空的股票不 参与分层。
  5. 分层方法:在每个一级行业内部对所有个股按因子大小进行排序,每个行业内均分成 N 个分层组合。如图表 24 所示,黄色方块代表各行业内个股初始权重,可以相等也 可以不等(我们直接取相等权重进行测试),分层具体操作方法为 N 等分行业内个股 权重累加值,例如图示行业1中, 5只个股初始权重相等(不妨设每只个股权重为0.2), 假设我们欲分成 3 层,则分层组合 1 在权重累加值 1/3 处截断,即分层组合 1 包含个 股 1 和个股 2,它们的权重配比为 0.2:(1/3-0.2)=3:2,同样推理,分层组合 2 包含个 股 2、3、4,配比为(0.4-1/3):0.2:(2/3-0.6)=1:3:1,分层组合 4 包含个股 4、5,配比 为 2:3。以上方法是用来计算各个一级行业内部个股权重配比的,行业间权重配比与 基准组合(我们使用沪深 300)相同,也即行业中性。
  6. 评价方法:回测年化收益率、夏普比率、信息比率、最大回撤、胜率等。

image

这里我们将展示 XGBoost 分类模型(subsample=0.95;max_depth=3)的分层测试结果。

下图是分五层组合回测绩效分析表(20110131~20170731)。其中组合 1~组合 5 为按该 因子从小到大排序构造的行业中性的分层组合。基准组合为行业中性的等权组合,具体来 说就是将组合 1~组合 5 合并,一级行业内部个股等权配置,行业权重按当期沪深 300 行 业权重配置。多空组合是在假设所有个股可以卖空的基础上,每月调仓时买入组合 1,卖 空组合 5。回测模型在每个自然月最后一个交易日核算因子值,在下个自然月首个交易日 按当日收盘价调仓。

下面四个图依次为:

  1. 分五层组合回测净值图。按前面说明的回测方法计算组合 1~组合 5、基准组合的 净值,与沪深 300、中证 500 净值对比作图。
  2. 分五层组合回测,用组合 1~组合 5 的净值除以基准组合净值的示意图。可以更 清晰地展示各层组合在不同时期的效果。
  3. 组合 1 相对沪深 300 月超额收益分布直方图。该直方图以[-0.5%,0.5%]为中心区 间,向正负无穷方向保持组距为 1%延伸,在正负两个方向上均延伸到最后一个频 数不为零的组为止(即维持组距一致,组数是根据样本情况自适应调整的)。
  4. 分五层时的多空组合收益图。再重复一下,多空组合是买入组合 1、卖空组合 5 (月度调仓)的一个资产组合。多空组合收益率是由组合 1 的净值除以组合 5 的 净值近似核算的。

下图为分十层组合回测时,各层组合在不同年份间的收益率及排名表。每个单元格的内容 为在指定年度某层组合的收益率(均为整年收益率),以及某层组合在全部十层组合中的 收益率排名。最后一列是分层组合在 2011~2017 的排名的均值。

下图是不同市值区间分层组合回测绩效指标对比图(分十层)。我们将全市场股票按市值 排名前 1/3,1/3~2/3,后 1/3 分成三个大类,在这三类股票中分别进行分层测试,基准组 合构成方法同前面所述(注意每个大类对应的基准组合并不相同)。

image

各种集成学习模型运行速度比较

XGBoost 模型的一大优点就是运行速度很快,训练模型时可以节省很多时间。在图表 31 中,我们对比了各种集成学习模型进行 7 阶段模型训练所耗用的时间。可以看到 XGBoost 模型在运行速度上优势非常明显。

image

各种集成学习模型选股指标比较

我们比较了 XGBoost 分类、XGBoost 回归、GBDT 分类、GBDT 回归 1(平方损失)、 GBDT 回归 2(绝对损失)、GBDT 回归 3(Huber 损失)、AdaBoost 分类、AdaBoost 回 归 8 种不同的 Boosting 集成学习模型。我们对 8 种模型的主要参数进行网格搜索,选取 交叉验证集 AUC 最高的参数组合作为最终选定的参数,其他参数取默认值。同时将本系 列上一篇报告的随机森林模型也加入测试进行对照。并设置两个统一对照组:①沿用本系 列第二、三篇报告中的 12 个月滚动回测的线性回归模型;②利用与 XGBoost 模型相同的 训练周期和训练集构成构建 7 阶段线性回归模型。以全 A 选股模型为例,各个模型的具体 参数如图表 32 所示。

image

首先,我们构建了沪深 300 和中证 500 成份内选股策略并进行回测。选股策略分为两类: 一类是行业中性策略,策略组合的行业配置与基准(沪深 300、中证 500)保持一致,各 一级行业中选 N 个股票等权配置(N=2,5,10,15,20);另一类是个股等权策略,直接在票 池内不区分行业选 N 个股票等权配置(N=20,50,100,150,200),比较基准取为 300 等权、 500 等权指数。两类策略均为月频调仓,个股入选顺序为它们在被测模型中的当月的预测 值顺序。

然后,我们构建了全 A 选股策略并进行回测,各项指标详见图表 35 和图表 36。选股策略 分为两类:一类是行业中性策略,策略组合的行业配置与基准(沪深 300、中证 500、中 证全指)保持一致,各一级行业中选 N 个股票等权配置(N=2,5,10,15,20);另一类是个 股等权策略,直接在票池内不区分行业选 N 个股票等权配置(N=20,50,100,150,200), 比较基准取为 300 等权、500 等权、中证全指指数。三类策略均为月频调仓,个股入选顺 序为它们在被测模型中的当月的预测值顺序。

先总体观察图表 33~36,XGBoost 分类、GBDT 分类、AdaBoost 分类相比 XGBoost 回 归、GBDT 回归、AdaBoost 回归在年化超额收益率、信息比率和 Calmar 比率整体上要 更加优秀,这是因为本文的回归算法(除了线性回归)都使用全部训练集进行训练,而分 类算法只取收益率最优的前 30%和后 30%的训练样本进行训练,这使得分类算法的训练 不会受到中间 40%收益率特征不明显的样本干扰。

对于沪深 300 成份股内选股的行业中性策略(图表 33 左侧),XGBoost 分类、GBDT 分 类、AdaBoost 分类相比其他算法在年化超额收益率、信息比率整体上优于统一对照组, 与随机森林分类模型表现相近。总体来说,表现最优的选股数量是每个行业入选5只个股。 对于中证 500 成份股内选股的行业中性策略(图表 33 右侧),除了 Calmer 比率指标, XGBoost 分类、GBDT 分类、AdaBoost 分类相比其他模型都没有呈现出明显优势。

对于沪深 300 成份股和中证 500 成份股内选股的个股等权策略(图表 34),整体来看,所 有模型的表现都比统一对照组较差。

对于行业中性和个股等权的全 A 选股(图表 35 和图表 36),XGBoost 分类、GBDT 分类、 AdaBoost 分类相比其他算法在年化超额收益率、信息比率和 Calmar 比率整体上优于其他 模型,与随机森林分类模型表现相近。

总的来看,Boosting 分类模型(XGBoost 分类、GBDT 分类、AdaBoost 分类)在年化超 额收益率、信息比率和 Calmar 比率上优于线性回归算法,但是最大回撤普遍大于线性回 归算法。说明 Boosting 分类模型是一种高收益、高回撤的选股模型,但能够提升投资组 合的信息比率和 Calmar 比率。而 XGBoost 分类、GBDT 分类、AdaBoost 分类、随机森 林分类之间相比并没有太大差别。





XGBoost 分类模型选股策略详细分析

下面我们对策略组合的详细回测情况加以展示。因为篇幅有限,我们根据上面的比较测试 结果,选择展示 XGBoost 分类模型选股策略。下图中,我们分别展示了沪深 300 成份股 内选股(基准:沪深 300)、中证 500 成份股内选股(基准:中证 500)、全 A 选股(基准: 中证 500)策略的各种详细评价指标。

观察下面的图表可知,对于 XGBoost 分类模型的行业中性策略来说,随着每个行业入选 个股数目增多,年化收益率在下降、信息比率和 Calmar 比率先升后降,最优每个行业入 选个股数目在 6 个左右。



image
image

总结和展望

以上我们对包括 Adaboost、GBDT 以及 XGBoost 在内的三种 Boosting 集成学习模型进 行了系统的测试,并且利用三种方法构建沪深 300、中证 500 和全 A 选股策略,初步得到 以下几个结论:

一、Boosting 分类模型具备不错的预测能力。我们在 2011-01-31 至 2017-07-31 的回测 区间中分 7 个阶段训练并测试模型,Adaboost、GBDT 以及 XGBoost 三种模型样本外平 均 AUC 分别为 0.5695,0.5699,0.5696,样本外平均正确率分别为 53.94%,54.12%, 54.02%。

二、Boosting 集成学习模型的参数较多,普遍有 5~10 个,但在实际调参中,能显著提高 模型预测能力的参数很少(1~3 个),其他参数使用默认值即可。这是因为 Boosting 集 成学习模型已经对多个深度很浅(深度为 3)的决策树进行了集成,模型的偏差和方差都 得到了兼顾,所以再调整其他参数收效不大。

三、我们分别以沪深 300、中证 500 和全 A 股为股票池,利用 Boosting 学习模型构建选 股策略。对于沪深 300 成份股内选股的行业中性策略,Boosting 分类模型的超额收益在 2.4%~8.1%之间,信息比率在 0.82~1.74 之间,超额收益、信息比率、Calmar 优于线性 回归模型。对于中证 500 成份股内选股的行业中性策略,Boosting 分类模型的超额收益在 3.32%~8.99%之间,信息比率在 1.07~2.11 之间,相比线性回归模型优势不大。对于全 A 选股的行业中性策略,Boosting 分类模型相对于中证 500 的超额收益在 24.1%~35.3%之 间,超额收益最大回撤在 14.4%~18.8%之间,信息比率在 3.91~4.44 之间,除了最大回 撤,表现优于线性回归。总的来看,Boosting 分类模型(XGBoost 分类、GBDT 分类、 AdaBoost 分类)在年化超额收益率、信息比率和 Calmar 比率上优于线性回归算法,但是 最大回撤普遍大于线性回归算法。说明 Boosting 分类模型是一种高收益、回撤较大的选 股模型,但能够提升投资组合的信比率和 Calmar 比率。而 XGBoost 分类、GBDT 分类、 AdaBoost 分类、随机森林分类之间相比并没有太大差别,但是 XGBoost 分类相比与另外 三种分类模型在训练速度上有优势。

四、文中 Boosting 分类模型总体表现略优于线性回归,但是最大回撤普遍大于线性回归, 我们认为这主要是两类模型在对待特征的处理方式上有区别所导致。本文的 Boosting 分 类模型使用的弱学习器都是决策树,决策树是针对一个一个特征进行处理,而线性模型是 所有特征给予权重相加得到一个新的值。决策树可以根据各个特征的信息增益进行有先后 的分裂,具有一定的特征筛选功能;而且在 Boosting 模型的框架下,信息增益较大的特 征很可能会在多个决策树中都被使用。综合以上两点,样本内表现优秀的特征会得到更大 的重视,而由于决策树深度的限制,另一些表现一般的特征在模型中所起的作用会非常有 限。所以在市场风格变化较小的时候,Boosting 分类模型能充分利用有效特征,带来更高 的收益。但是一旦市场风格巨变,之前的有效特征失效,Boosting 分类模型会呈现出较大 回撤。

五、本系列的第三篇报告(人工智能选股之支持向量机模型)使用了固定样本内和样本外 数据集的回测方法。这种方法以 2005-01-31 至 2010-12-31 的数据作为样本内数据,以 2011-01-31 至 2017-04-28 的数据作为样本外数据。样本内数据离当前时间过于久远,可 能已经无法准确描述当前市场的特征。所以在这篇报告里,我们尝试了分 7 段回测的方法 (见图表 11),该回测方法由于使用了更新的数据训练模型,使得策略的表现更加优秀。

六、本文的测试还表明,在达到相近预测能力和回测绩效时,Boosting 模型比 Bagging 模型(随机森林)要简单。本文的 Boosting 模型中,每个决策树的深度都为 3,决策树总 数为 100。而 Bagging 模型中每个决策树的深度普遍在 20 以上,决策树总数有数百个, 模型的复杂程度远大于 Boosting 模型。

通过以上的测试和讨论,我们初步理解了 Boosting 集成学习模型应用于多因子选股的一 些规律。接下来我们的人工智能系列研究将继续探讨神经网络、深度学习等方法在多因子 选股上的表现,敬请期待。

附录

CART 决策树

目前主流的决策树算法包括 C4.5 和 CART:C4.5 每个节点可分裂成多个子节点,不支持 特征的组合,只能用于分类问题;CART 每个节点只分裂成两个子节点,支持特征的组合, 可用于分类和回归问题。而在随机森林中,通常采用 CART 算法来选择划分属性,并使用 “基尼指数” (Gini Index)来定义信息增益程度。分类问题中,假设有 K 个类,样本集 D 中的点属于第 k 类的概率为𝑃𝑘,则其 Gini 指数为
image

Gini(D)反映了从数据集 D 中随机抽取两个样本,其类别标记不一致的概率,Gini(D)越小, 数据集 D 的纯度越高。二分类问题中,若对于给定的样本集合 D(|D|表示集合元素个数), 根据特征 A 分裂为𝐷1和𝐷2两不相交部分,则分裂后的

Uploading: image.png…

从根节点开始,递归地在每个结点分裂时选取Gini(𝐷,A)最小的特征 A 为划分属性,将训 练集依特征分配到两个子结点中去。照此逐层划分,直至结点中样本个数小于预定阈值, 或样本集的 Gini 指数小于预定阈值,抑或没有更多特征,即生成了一棵可进行分类预测的 决策树。下面我们试举一例说明。

假如我们希望根据当前市场股票的市值风格(大、中或小)和板块风格(消费、周期或成 长)预测涨跌情况,模拟数据如图表 42。直观地看,大市值股票全部属于“涨”类别, 中小市值股票绝大多数属于“跌”类别。似乎以“是否为大市值”为规则进行首次分裂比 较好。那么决策树将如何学习这一步呢?

image

前面提到,节点分裂的原则是使得分裂后的信息增益最大,即挑选Gini(𝐷,A)最小的特征 A 为划分属性。第一步分裂前,全部 8 个样本中有 3 个属于“涨”类别,概率为𝑃(𝜔涨) = 3 8 ⁄ ; 5 个属于“跌”类别,概率为𝑃(𝜔跌) = 5 8 ⁄ 。因此分裂前的 Gini 指数为:

image

如果我们以“是否为大市值”作为规则将全样本分裂成两个子节点,在 2 个大市值样本中 属于“涨”类别的概率为𝑃(𝜔涨) = 0,属于“跌”类别的概率为𝑃(𝜔跌) = 1,该子节点的 Gini 指数为

Uploading: image.png(1)…

类似地,中小市值子节点的 Gini 指数为:
image

上述分裂过程中,分裂到大市值的概率为𝑃(𝜔大市值) = 2 8 ⁄ ,分裂到中小市值的概率为 𝑃(𝜔中小市值) = 6 8 ⁄ 。因此Gini(𝐷,市值)为:
image
如果换成“是否为小市值”或“是否为消费类”作为分裂规则,计算出 Gini 指数为:

image

事实上,在所有可能的分裂规则中,“是否为大市值”的 Gini 指数最小。我们据此进行首 次分裂,如图表 43 所示。接下来依照相同办法,继续对子节点进行分裂,直到每个样本 都归入终端的叶子节点,如图表 44 所示,最终完成整棵决策树的学习。

特征重要性评分

在具体的决策树模型构建中,我们将当期股票的各个因子作为输入特征,按照股票下月收 益情况分为不同类别,以此进行模型训练。对于决策树这一非线性分类器,我们依然可以 通过特征划分过程来计算评估各个因子特征的重要性,这与传统线性回归模型中的因子权 重相仿。

特征影响力的计算需要借助于结点分裂时 Gini 指数,方法如下:

image

其中,𝐼𝑖(𝐴)表示结点 i 根据特征 A 分裂为两个子结点后,Gini 指数相对于母结点分裂前的 下降值。故而可定义特征 A 的绝对重要性𝑆(𝐴)为所有按特征 A 分裂的结点处的𝐼𝑖(𝐴)之和。 将所有特征的绝对重要性标准化,即可得到各个特征的重要性评分,易知所有特征重要性 评分和为 1。

如上,我们逐层地根据特征对训练集进行划分,这样便形成了一个分类准则,即决策树算 法的本质所在。相较于其他机器学习算法,决策树的优势主要包括:1.训练速度快;2.可 以处理非数值类的特征,如不同板块风格股票涨跌分类问题;3.可以实现非线性分类,如 图表 45 的异或问题(横纵坐标 x、y 相同则分类为 1,不同则分类为 0),该问题在逻辑回 归、线性核的支持向量机下无解,但是使用决策树可以轻松解决。但同时,决策树的缺陷 在于不稳定,对训练样本非常敏感,并且很容易过拟合。

image

风险提示

通过 Boosting 模型构建选股策略是历史经验的总结,存在失效的可能。