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


#1

摘要:

采用统一的视角解释与测试所有的广义线性模型

多因子模型的本质是关于股票当期因子暴露和未来收益之间的线性回归模 型。我们希望引入机器学习的思想,对传统多因子模型进行优化,最自然 的想法正是从简单的线性模型入手。本文中,我们试图采用统一的视角解 释与测试所有的广义线性模型,并分析它们应用于多因子选股的异同,希 望对本领域的投资者产生有实用意义的参考价值。

广义线性模型的构建和回测

广义线性模型的构建包括特征和标签提取、特征预处理、训练集合成和滚 动训练等步骤。最终在每个月底可以产生对全部个股下期收益的预测值, 也可以将广义线性模型看作一个因子合成模型,即在每个月底将因子池中 所有因子合成为一个“因子”。我们对该模型合成的这个“因子”进行分层 回测,随后根据模型构建出基于沪深 300 行业中性、中证 500 行业中性和 不做行业中性的选股策略。根据模型回测结果以及测试集 IC 或正确率对模 型进行评价。

对滚动训练集长度等重要参数进行参数敏感性分析

我们对线性回归模型的滚动训练集长度、主成分分析选取的主成分个数和 训练集样本量进行参数敏感性分析。结果表明滚动训练集长度为 12~24 个 月时回测效果较好;主成分分析保留的成分越多,回测效果越好;选取全 部样本在沪深 300 行业中性基准下表现最好,选取前后排名 20%的样本在 中证 500 行业中性基准下表现最好。

正则化对选股效果没有明显的提升

正则化对选股效果没有明显的提升作用。岭回归、Lasso 回归和弹性网络 的表现和线性回归类似。可能的原因是样本的所有特征都是已被证明有效 的因子,不存在使用正则化筛选有效因子的必要。其次预处理过程中包含 去极值和标准化等步骤,减少了极端样本的出现概率,进一步削弱正则化 的价值。

逻辑回归和随机梯度下降分类器(SGD)的表现优于线性回归

将回归问题转换为分类问题能够提升模型表现。逻辑回归、SGD + hinge 损失函数、SGD + modified Huber 损失函数这三个分类器的回测效果均优 于传统的线性回归模型。三者之中又以 SGD + hinge 损失模型表现最佳, 以中证 500 作为行业中性基准,每个行业选 10~15 只个股的策略,信息比 率和 Calmar 比率均在 4 左右,超额收益最大回撤在 5%左右。三种分类器 之所以优于线性回归,可能的原因是对原始收益率进行二值化处理后,在 损失部分信息的同时消除了大量噪音,使得模型能够更准确地捕捉数据中 蕴含的规律。

风险提示:广义线性模型是历史经验的总结,存在失效的可能。

本文研究导读

经典的多因子模型表达式为:

image

多因子模型的本质是关于股票当期因子暴露和未来收益之间的线性回归模型。我们希望引 入机器学习的思想,对传统多因子模型进行优化,最自然的想法正是从简单的线性模型入 手。上式显示的就是比较流行的多元线性回归模型,是多因子模型中最常用的数学分析工 具。然而除了线性回归之外,您是否知道一些常见的机器学习算法也属于广义的线性模型? 本文中,我们试图采用统一的视角解释与测试所有的广义线性模型,并分析它们应用于多 因子选股的异同,希望对本领域的投资者产生有实用意义的参考价值。

本文主要关注并讨论了广义线性模型的如下几个环节:

  1. 首先是模型选择的问题。除了传统的线性回归之外,逻辑回归、线性支持向量机等方 法同属于广义的线性模型,在业界有着相当广泛的应用。这些方法能否对多因子选股 的效果有进一步的提升?

  2. 其次是正则化的问题。传统的线性回归模型中,在拟合回归方程这一步,我们不对参 数的取值范围做任何限定。然而在机器学习领域,最普遍的做法是引入正则化,对参 数的选择加以限制,防止过拟合的发生。现在流行的岭回归、Lasso 回归和弹性网络 方法,正是将不同正则化方法和线性回归结合起来的产物。那么,在多因子选股模型 中,正则化是否有助于提升选股效果?

  3. 再次是预处理方法的问题。在多元线性回归中,因子共线性是需要尽力避免的问题。 消除因子共线性的方法之一是对多元变量做主成分分析,得到一组新的共线性程度较 小的变量。在多因子选股模型中,我们关心主成分分析是否有效,对模型有多大的提 升作用?

  4. 最后是模型参数的问题。多因子选股模型中包含一系列自由参数。例如,对于 T+1期 因子预期收益的估计通常需回溯前 N期的历史收益,N的取值多少最为合理?又如选 择不同正则化系数、不同损失函数,最终的选股效果是否存在差别?

我们将围绕以上的问题进行系统性的测试,希望为读者提供一些扎实的证据,并寻找到最 优的线性模型,为后续的非线性机器学习方法做铺垫。

广义线性模型

线性模型回顾

常用的线性模型包括线性回归、岭回归、Lasso 回归、逻辑回归、线性判别分析和线性支 持向量机等,我们在上一篇报告中已经做了详细阐述。这里我们将对部分方法进行简要回 顾。随后我们将从损失函数的视角,换一个角度理解线性模型。

线性回归

多元线性回归模型可以表示为: 𝑦 = 𝑤0 + 𝑤1𝑥1 + 𝑤2𝑥2 + ⋯+ 𝑤𝑝𝑥𝑝 其中 x1,x2,……,xp 是样本的 p 个特征,y 是样本的标签,𝑤 ⃗⃗ = (wo, w1, ……, wp) 是需要拟合的系数向量。如果写成矩阵的形式,令 X = (1, x1,……,xp),那么线性回 归模型可以简洁地表示为:𝑦 = 𝑋𝑤 ⃗⃗ 。从多因子选股的角度来看,x1,x2,……,xp可以视 作截面期的 p 个因子暴露度, y 是下期收益, 𝑤 ⃗⃗ 反映了不同因子对收益的影响方向和程度。

定义线性回归的损失函数𝐶(𝑤 ⃗⃗ )为全部 N个样本拟合残差的平方和:

image

表示成矩阵形式(‖𝑎 ‖等价于‖𝑎 ‖^2,代表向量𝑎 的 2 范数,即向量各元素平方和的开方; ‖𝑎 ‖2 代表向量𝑎 各元素的平方和,下同): 𝐶(𝑤 ⃗⃗ ) = ‖𝑦 − 𝑋𝑤 ⃗⃗ ‖2 当样本量较小,并且不考虑正则化时,可以通过最小二乘法直接求出使得损失函数取最小 值的系数向量𝑤 ⃗⃗ :
image

逻辑回归

线性回归主要用以解决“回归”问题。当面对“分类”问题时,通常采用逻辑回归。逻辑 回归模型可以表示为:

image

其中𝑃(𝑦 = 1|𝑥)代表样本 x 属于正例(𝑦 = 1)的概率,𝑃(𝑦 = 0|𝑥) = 1− 𝑃(𝑦 = 1|𝑥)代表 样本 x属于反例(𝑦 = 0)的概率。当某个样本𝑃(𝑦 = 1|𝑥)大于 0.5 时,预测该样本属于正 例(𝑦 ̂ = 1),反之则归入反例(𝑦 ̂= 0)。

逻辑回归的似然函数𝐿(𝑤 ⃗⃗ )为:

image

定义逻辑回归的损失函数𝐶(𝑤 ⃗⃗ )为似然函数的负对数:

image

以上讨论的是两类样本的标签𝑦 = {0,1}时的情形。当两类样本的标签𝑦 = {1,−1}时,逻辑 回归模型可以表示为:

image

表示成矩阵形式:

image

线性支持向量机

线性支持向量机既可以解决回归问题,也可以用来分类。以分类问题为例,假设正例样本 的标签𝑦 = 1,反例样本的标签𝑦 = −1。我们试图寻找一个分类超平面,使得两类样本的 分类间隔最大。用数学的语言描述,我们希望找到一组系数向量𝑤 ⃗⃗ = (w1, w2, ……, wp), 使得下面式子中的 b 取得最大值,并且对于每个样本(𝑥𝑖,𝑦𝑖),满足以下所有约束条件:

image

注意到等号右侧的 C 为惩罚系数,和损失函数𝐶(𝑤 ⃗⃗ )的含义完全不同。通常采用拉格朗日 乘子法,求出使得损失函数取最小值的𝑤 ⃗⃗ 。

正则化

在线性回归和逻辑回归中,系数向量𝑤 ⃗⃗ 不可能取很大的正数或很小的负数,并且多个特征 中可能只有少数特征具有预测效力,因此我们引入正则化(regularization)思想,在线性 回归和逻辑回归的损失函数后面加入惩罚项。当惩罚项为系数向量𝑤 ⃗⃗ 的平方和(即 2 范数 的平方)时,称为 L2 正则化;当惩罚项为系数向量𝑤 ⃗⃗ 的绝对值之和(即 1 范数)时,称 为 L1 正则化。

以线性回归为例,L2 正则化的线性回归模型又称为岭回归,损失函数为:

image

表示成矩阵形式:

以上介绍了 Lasso,岭回归和弹性网络三种回归参数正则化的方式。回想回归的目的,其 实就是要在尽可能“简单”的模型下,最小化数据拟合方差。而 Lasso,岭回归以及弹性 网络的目的就是用模型的 1 范数,2 范数以及两者的混合来使模型尽可能简单。Zou 和 Hastie(2004)的文章提出弹性网络,并用理论和实际数据的数值实验对比了三种正则化 方法的优劣。Lasso 用的 1 范数在 0 附近时比 2 范数收敛更快,也即更加敏感,反之在远 离 0 的时候,岭回归使用的 2 范数比1 范数更加敏感。

换言之,Lasso 和岭回归其实是在不同的范围内,对模型复杂度约束的敏感度不同。就好 比陆军在陆地作战能力强,对于海洋作战就一筹莫展,但是海军则无疑是海洋的霸主。如 果你想要训练一只两栖的海军陆战队,可能单方面都不如海军和陆军,但是它却能在两方 面都有作战能力。所以弹性网络把 1 范数和 2 范数混合,就相当于得到了海军陆战队,在 所有实数域上都有一定的敏感性。在 Zou 和 Hastie(2004)文章中的理论数值计算证明 弹性网络的表现总是优于 Lasso,大部分时候优于岭回归。

损失函数

通过以上对常见线性模型的回顾,我们发现每一种方法都对应一个损失函数。接下来我们 将从损失函数的维度,重新审视机器学习中的线性模型,并总结常用的损失函数。记 y为 样本的真实类别标签,取值为 1 或﹣1; 𝑓(𝑥) = 𝑋𝑤 ⃗⃗ 为线性模型的预测值。两者的乘积𝑦𝑓(𝑥) 反映了真实数据和预测值的接近程度。当 y 与𝑓(𝑥)符号相同,预测正确,此时𝑦𝑓(𝑥)为正 数;当 y与𝑓(𝑥)符号相反,预测错误,此时𝑦𝑓(𝑥)为负数;𝑦𝑓(𝑥)越小,说明真实数据和预 测值相差越远。

1)平方损失(squared loss):

image

2)对数损失(log loss):

image

对数损失等价于未正则化的逻辑回归损失函数。

3)hinge 损失(hinge loss):

image

hinge 损失等价于未正则化的线性支持向量机。下面我们将简要地证明。

线性支持向量机的损失函数为:

4)Huber损失(Huber loss):

Huber损失是为了增强平方损失对异常值(outliers)的 抗干扰能力而提出的一种损失函数, 具体形式如下:

image

当预测误差|𝑦 −𝑓(𝑥)|较小(小于阈值𝛿)时 ,损失函数为二次形式,与 平方损失(𝑦− 𝑓(𝑥))2 非常相似;当预测误差|𝑦− 𝑓(𝑥)|较大时,损失函数为线性形式。因此,异常值带来的预测 误差并不会造成过大的 Huber损失,使得模型对极端值不敏感。

5)modified Huber损失(modified Huber loss): 在分类中常用到 Huber损失函数的变形 modified Huber。具体形式为:

image

当预测误差|𝑦 −𝑓(𝑥)|较小时,modified Huber 损失等价于 hinge 损失max (0,1− 𝑦𝑓(𝑥))的 平方。因此,modified Huber 损失相当于二次平滑后的 hinge 损失。

部分损失函数的图像如图表 1 所示。当分类正确时,𝑦𝑓(𝑥)为正值,损失函数接近于 0; 当分类错误时,𝑦𝑓(𝑥)为负值,损失函数随𝑦𝑓(𝑥)的减小而增加。

优化算法

在上节中,我们介绍了各式各样的损失函数,但是如何快速有效地对损失函数求最小值, 从而估计模型的参数,这就涉及到优化问题。对于最常见的线性回归𝑋𝑤 ⃗⃗ = 𝑦,通常以最小 化残差平方和(即最小二乘)为目标,给出系数向量𝑤 ⃗⃗ 的一个线性无偏估计𝑤 ⃗⃗ = (𝑋T𝑋)−1𝑦。 但是现实往往不是那么简单,尤其在当今的大数据时代,当数据数量爆炸式增长时,反演 矩阵(𝑋T𝑋)−1的大小将以样本数量平方的速度增长,对计算机的存储提出了很大的挑战。 另外,各种损失函数的性质并不像残差平方和那么简单,反演矩阵的寻找也就变得不那么 直观。正是由于以上两个原因,基于梯度的优化算法应运而生,并且不断发展。其中最简 单,也非常快速和有效的方法,当属梯度下降法及其衍生出的随机梯度下降法。这类算法 在解决凸损失函数优化问题中备受青睐,接下来我们将详细介绍其原理。

梯度下降

损失函数定量描述了模型输出的预测量和真实数据之间的差异,我们希望最小化损失函数, 从而估计出模型的参数,以便对新的数据进行预测。在本节,我们将介绍损失函数优化问题中最常用的梯度下降法(gradient decent)。

假设一个损失函数𝐶(𝑤 ⃗⃗ ),它是模型参数向量𝑤 ⃗⃗ 的函数。以最基本的均方误差(MSE)损失 函数为例,如下式所示:

image

其中,𝑦(𝑥)是模型输入为 x时数据的真实值,𝑦 ̂(𝑥)是输入为 x时模型的预测值,N是训练 样本个数。

这里的 MSE 虽然给出了一个具体的损失函数形式,但是在后面介绍梯度下降法时,我们 提醒读者梯度下降法的原理与损失函数的具体形式无关,这里的 MSE 只是给出一个比较 形象的代数形式。

回到损失函数𝐶(𝑤 ⃗⃗ ),它可以是任意多元的实值函数,图像上是高维空间里的一个超平面, 但是人类的想象往往逃不出三维空间,那么为了理解的直观和方便,不妨把𝐶(𝑤 ⃗⃗ )看成是一 个只有两个变量𝑤1,𝑤2的函数,如图表 2 所示。我们要找的就是使损失函数取到最小值的 𝑤1,𝑤2。从图表 2 中我们可以立刻观察到结果,最小值位于“锅底”的位置。但是,不要 忘记这只是我们给出的一个很简单的二元损失函数,对于多元损失函数,仅仅是高维空间 就很难想象,几乎不可能直接观察出最小点的位置。

虽然几何的方法给寻找极小值关闭了一扇门,但是代数微积分的方法却打开了一扇窗,高 维空间也不过就是数学家代数的游戏而已。如果损失函数 C只是一个或者少数几个变量的 函数,那么通过计算导数可以寻找到损失函数的极值点,但是如果损失函数的参数太多, 那么计算导数的过程也就如噩梦一般了。

幸运的是,梯度下降法给出了一种有效的方案。把损失函数想象成一个山谷(如图表 2 所 示),一个小球自由地滚下,可以预测到,小球一定会落在谷底,即损失函数的极小值处。 用数学的语言来说,损失函数的导数描述了山谷中局部的“形态”,而万有引力定律则保 证能够牵引小球沿着山谷下降方向走。梯度下降法实现的正是模拟小球在每一步都沿着这 个山谷下降方向(损失函数梯度的负方向)滚动。

我们回到更加复杂的高维空间和代数表达。假设我们让每个模型参数上变化一个小量 Δ𝑤 ⃗⃗ = (Δ𝑤1,Δ𝑤2,… ,Δ𝑤n),微积分告诉我们:

image

其中,∇𝐶 = (∂C ∂𝑤1 ⁄ ,∂C ∂𝑤2 ⁄ ,…,∂C ∂𝑤n ⁄ ),是损失函数 C的梯度,也就是 C的偏导数组 成的向量。∇符号可能对于大部分人很新鲜,但是大家只需要知道它是一个计算损失函数 在各个参数上偏导的算符。我们关注Δ𝐶 ≈ ∇𝐶 ⋅ Δ𝑤 ⃗⃗ ,可以发现正是∇𝐶将模型参数变化Δ𝑤 ⃗⃗ 和 损失函数的变化Δ𝐶关联在一起,这也是我们称∇𝐶为梯度向量的原因。上面的方程,也给 我们指出了一条如何选择Δ𝑤 ⃗⃗ 使得Δ𝐶为负数的道路(Δ𝐶为负保证了我们对参数的调整朝着 C变小的方向进行)。试想,我们选取:

Δ𝑤 ⃗⃗ = −𝜂 ⋅ ∇𝐶

其中𝜂称为学习率,通常取一个很小的正数,那么:

Δ𝐶 ≈ −𝜂∇𝐶 ⋅ ∇𝐶 ≈ −𝜂‖∇𝐶‖^2

显然,Δ𝐶 ≤ 0,因此按照Δ𝑤 ⃗⃗ = −𝜂 ⋅ ∇𝐶这个规则改变𝑤 ⃗⃗ ,那么损失函数 C将一直减少,直 到落入一个极小点。所以,我们似乎在数学上找到了一个类似于自然界的万有引力,只要 按照这个“运动规则”重复改变模型规则,我们就能找到最优化的模型参数。事实上,数 学上也不难证明梯度方向是目标函数 C减小最快的方向。

以上,我们介绍了梯度下降法的基本原理,下面我们总结梯度下降法的基本步骤:

1) 给出初始模型参数,计算损失函数;
2) 计算损失函数的梯度∇𝐶;
3) 以一定的学习率对模型参数进行调整,𝑤 ⃗⃗ → 𝑤 ⃗⃗ ′ = 𝑤 ⃗⃗ − 𝜂 ⋅ ∇𝐶;
4) 用更新后的参数重新与输入数据重新计算模型预测值,重新计算损失函数;
5) 如果损失函数达到要求或迭代次数达到上限,停止计算,输出模型,否则,重复第 2~ 5 步。

最后,需要提醒读者的是,以上所有的推导都是基于Δ𝑤 ⃗⃗ 是小量的前提,所以学习率𝜂的选 择必须足够小,以保证泰勒展开一阶小量近似整个函数的变化量,但是学习率𝜂也不能太 小,否则收敛会十分缓慢。常用的方法是自适应地调整学习率𝜂的大小,在迭代的前期选 择相对较大的𝜂,而在后期逐步减小𝜂。

随机梯度下降

梯度下降法已经是不错的优化算法,然而在实际应用中存在一些缺陷。为了理解梯度下降 法的问题所在,我们仍然以 MSE损失函数为例。MSE需要计算每个输入数据 x的预测值 与真实值的残差𝐶x,最后得到总的残差平方和𝐶 = ∑ 𝐶𝑥 x ,因此为了计算梯度∇𝐶,我们需 要遍历计算每一个输入 x的梯度,随后加总∇𝐶 = ∑ ∇𝐶𝑥 𝑥 /𝑁。当有大量训练数据时,整个 训练过程变得非常缓慢,此外不同输入样本之间的梯度可能会相互抵消,导致整个参数改 变幅度小。

基于以上的问题,人们将梯度下降法向前推进了一步,改进成随机梯度下降法(stochastic gradient decent,SGD)。随机梯度下降法的核心思想是每次随机选取全部训练样本中的 单个样本,计算方向梯度∇𝐶𝑥,随后更新模型参数:𝑤 ⃗⃗ → 𝑤 ⃗⃗ ′ = 𝑤 ⃗⃗ − 𝜂 ⋅∇𝐶𝑥。将全部训练样 本遍历一次,称为一次迭代;多次迭代后,𝑤 ⃗⃗ 将收敛到最优值。随机梯度下降法使用∇𝐶𝑥代 替梯度下降法中的∇𝐶,大大加快了运算速度,适用于大规模数据的模型优化问题。

梯度下降法和随机梯度下降法的一个折衷方案称为小批量梯度下降法(mini-batch gradient decent)。核心思想是选取全部训练样本的一个子集,计算方向梯度∇𝐶𝑥。具体而 言,我们从全体训练样本中,随机选择 m 个样本X1,𝑋2,𝑋3,…,𝑋𝑛组成一个小批量样本。当 m=1 时,小批量梯度下降等价于随机梯度下降。假设小批量样本满足一定数量,通过大数 定律,可以预期∇𝐶𝑥近似等于∇𝐶,即:

image

如果把梯度下降比喻成人口普查,随机梯度下降和小批量梯度下降就是人口抽查,普查的 成本总是很高,时间很长。虽然抽查并不一定全面而完美,存在统计上的波动,但是实际 上也没有必要完美,因为我们实际上关心的是在某个方向来移动减少损失函数,而这个方 向偏离一点它下降最快的方向也无妨,只是我们需要多移动几步(多迭代几次)罢了。如 图表 3 所示,左图的梯度下降法给出了最快的下山路径;而右图的随机梯度下降法每一步 并不完美,但是只要迭代次数足够多,最终也能够曲折地到达最小值的位置,并且每一步 的计算速度远远快于梯度下降。

测试流程

广义线性模型构建

如图表 4 所示,广义线性模型的构建方法包含下列步骤:

1. 数据获取:
a) 股票池:全 A 股,剔除 ST股票,剔除每个截面期下一交易日停牌的股票,剔除 上市 3 个月以内的股票。每只股票视作一个样本。 b) 回溯区间:2007-01-31 至 2017-05-31。
2. 特征和标签提取:每个自然月的最后一个交易日,计算之前报告里的 70 个因子暴露 度,作为样本的原始特征;计算下一整个自然月的个股超额收益(以沪深 300 指数为 基准) ,作为样本的标签。因子池如图表 5 所示。
3. 特征预处理:
a) 中位数去极值:设第 T 期某因子在所有个股上的暴露度序列为𝐷𝑖,𝐷𝑀为该序列 中位数,𝐷𝑀1为序列|𝐷𝑖 − 𝐷𝑀|的中位数,则将序列𝐷𝑖中所有大于𝐷𝑀 + 5𝐷𝑀1的数 重设为𝐷𝑀 + 5𝐷𝑀1,将序列𝐷𝑖中所有小于𝐷𝑀 − 5𝐷𝑀1的数重设为𝐷𝑀 − 5𝐷𝑀1;
b) 缺失值处理:得到新的因子暴露度序列后,将因子暴露度缺失的地方设为中信一 级行业相同个股的平均值。
c) 行业市值中性化:将填充缺失值后的因子暴露度对行业哑变量和取对数后的市值 做线性回归,取残差作为新的因子暴露度。
d) 标准化:将中性化处理后的因子暴露度序列减去其现在的均值、除以其标准差, 得到一个新的近似服从N(0,1)分布的序列。
e) 主成分分析:对 70 个标准化处理后的因子暴露度进行主成分分析,得到 70 个 维度转换后的新特征。
4. 训练集合成:以 T月月末为例,T-12 至 T-1 月的特征和标签作为训练样本。
a) 回归模型:对于线性回归、岭回归、Lasso 回归和弹性网络模型,直接将 12 个 月的样本合并成为训练集。
b) 分类模型:对于逻辑回归和随机梯度下降(下称 SGD)模型,在每个月末截面 期,选取下月收益排名前 30%的股票作为正例(𝑦 = 1),后 30%的股票作为负 例(𝑦 = 0)。将 12 个月的样本合并成为训练集。
5. 模型滚动训练:分别使用线性回归、岭回归、Lasso 回归、弹性网络、逻辑回归和 SGD 模型拟合训练集。对于 SGD模型,一组测试以 hinge 函数作为损失函数,作 L2 正则 化,迭代 10000 次,该方法等价于线性支持向量机;另一组测试以 modified Huber 函数作为损失函数,作 L2 正则化,迭代 10000 次。共计 7 种广义线性模型,如图表 6 所示。
6. 合成单因子:模型拟合完成后,以 T月月末截面期所有样本预处理后的特征作为模型 的输入,得到每个样本的预测值𝑦 ̂,将预测值视作合成后的因子。
7. 单因子回测:使用合成后的因子进行单因子分层回测。回测方法和之前的单因子测试 报告相同,具体步骤参考下一小节。
8. 模型评价:我们以分层回测的结果作为模型评价指标。对于回归问题,我们将给出训 练集和测试集的 IC 值;对于分类问题,我们将给出训练集和测试集的正确率。


分层模型回测

依照因子值对股票进行打分,构建投资组合回测,是最直观的衡量指标优劣的手段。一般 测试模型构建方法如下:

  1. 股票池、回溯区间都与回归法相同。
  2. 换仓期:在每个自然月最后一个交易日核算因子值,在下个自然月首个交易日按当日 收盘价换仓。
  3. 数据处理方法:不进行任何加工,因子值为空的股票不参与分层。
  4. 分层方法:在每个一级行业内部对所有个股按因子大小进行排序,每个行业内均分成 N个分层组合。如图表 7 所示,黄色方块代表各行业内个股初始权重,可以相等也可 以不等(我们直接取相等权重进行测试),分层具体操作方法为 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)相同,也即行业中性。
  5. 评价方法:回测年化收益率、夏普比率、信息比率、最大回撤、胜率等。

Uploading: image.png…

模型测试结果与参数选择

线性回归模型分层回测分析

广义线性模型最终在每个月底可以产生对全部个股下期收益的预测值,也可以将广义线性 模型看作一个因子合成模型,即在每个月底将因子池中所有因子合成为一个“因子”。接 下来,我们对该模型合成的这个“因子”(即个股下期收益预测值)进行分层回测,从各 方面考察该模型的效果。这里的分层测试逻辑和华泰金工前期单因子测试系列报告保持一 致。

分层测试详细展示图表包括:

1. 分五层组合回测绩效分析表(20070131~20170531)。其中组合 1~组合 5 为按该因 子从小到大排序构造的行业中性的分层组合。基准组合为行业中性的等权组合,具体 来说就是将组合 1~组合 5 合并,一级行业内部个股等权配置,行业权重按当期沪深 300 行业权重配置。多空组合是在假设所有个股可以卖空的基础上,每月调仓时买入 组合 1,卖空组合5。回测模型在每个自然月最后一个交易日核算因子值,在下个自 然月首个交易日按当日收盘价调仓(分层组合构建法等更多细节参见上一章“分层模 型回测”小节)。 2. 分五层组合回测净值图。按前面说明的回测方法计算组合 1~组合 5、基准组合的净 值,与沪深 300、中证 500 净值对比作图。 3. 分五层组合回测,用组合 1~组合 5 的净值除以基准组合净值的示意图。可以更清晰 地展示各层组合在不同时期的效果。
4. 组合 1 相对沪深 300 月超额收益分布直方图。该直方图以[-0.5%,0.5%]为中心区间, 向正负无穷方向保持组距为 1%延伸,在正负两个方向上均延伸到最后一个频数不为 零的组为止(即维持组距一致,组数是根据样本情况自适应调整的)。
5. 分五层时的多空组合收益图。再重复一下,多空组合是买入组合 1、卖空组合 5(月 度调仓)的一个资产组合。多空组合收益率是由组合 1 的净值除以组合 5 的净值近似 核算的。
6. 分十层组合回测时,各层组合在不同年份间的收益率及排名表。每个单元格的内容为 在指定年度某层组合的收益率(均为整年收益率),以及某层组合在全部十层组合中的 收益率排名。最后一列是分层组合在 2007~2017 的排名的均值。
7. 不同市值区间分层组合回测绩效指标对比图(分十层)。我们将全市场股票按市值排名 前 1/3,1/3~2/3,后 1/3 分成三个大类,在这三类股票中分别进行分层测试,基准组 合构成方法同前面所述(注意每个大类对应的基准组合并不相同)。
8. 不同行业间分层组合回测绩效分析表(分五层)。我们在不同一级行业内部都做了分层 测试,基准组合为各行业内该因子非空值的个股等权组合(注意每个行业对应的基准 组合并不相同)。

image

上图展示了每一期训练集和测试集的 IC 值随时间的变化情况。我们发现训练集 IC 值稳定 在 0.15 左右,测试集 IC 值波动较大,在个别月份甚至出现负值,平均值为 0.1。

上图中我们展示了线性回归模型训练集每期因子拟合权重,每一行代表一个因子,每一列 代表一个截面。图中使用的是三色刻度,红色越深表示正值越大,绿色越深表示负值越小, 纯白色位于两色中间加以区隔,代表 0附近的值。涉及的回测期为 20070131~20170531, 由于该模型为月频模型,故总共有 125 列。所有因子池中因子都先经过单因子测试确定其 对下期收益的整体预测方向是正向还是负向(方法详见华泰金工单因子测试系列报告), 展示在图表 5 的最后一列。我们预先将所有因子都乘以它的“因子方向值”(+1 或-1), 再去进行线性回归,模拟出的每期因子拟合权重如上所示。我们发现,该模型中反转、换 手率等交易类型因子权重普遍更大,而估值、成长等基本面类型因子权重较低。

更进一步地,我们还在每个截面上,将模型对全部个股下期收益的预测值(如果将模型视 为因子合成模型的话,即指合成后的“因子”)与因子池中各个因子值之间计算 Spearman 相关系数,查看模型预测值与各个因子值之间“真实的”相关情况,如下图所示。我们发 现,从真实相关情况来看,预测值更是与反转、波动率、换手率、技术等交易类型因子关 联性较为紧密,与基本面类型因子关联性较弱。

利用线性回归模型构建选股策略

根据以上测试结果,我们已经较为详细地了解了线性回归模型的特性和绩效,那下一个问 题随之而来——应该如何确定参数和其它细节从而构建一个成功的选股策略呢?首先,我 们要确定是否需要构建一个行业中性的选股策略?如果构建行业中性选股策略,那每个行 业应大致入选多少只股票?如果构建非行业中性选股策略,那投资组合中又应该包含多少 只股票?针对这些问题,我们做了参数选择分析图表。下表中行业中性策略为行业内部个 股等权、行业间按基准指数配比;非行业中性策略为全部个股等权。全部策略均为月频。

观察上表可知,对于线性回归模型结合沪深 300 行业中性选股策略来说,随着每个行业入 选个股数目增多,年化收益率、信息比率和 Calmar比率基本都在下降;对于线性回归模 型结合中证 500 行业中性选股策略来说,随着每个行业入选个股数目增多,年化收益率在 下降,信息比率却在上升,Calmar比率先升后降,最优每个行业入选个股数目在 14 个左 右;对于线性回归模型不控制行业中性选股策略来说(我们用中证 500 指数作为基准进行 比较),随着入选个股总数目增多,年化收益率在下降,信息比率在上升,Calmar 比率大 体上也是先升后降,最优个股数目区间大致在 75~125 左右。

总体来说,线性回归模型本身已具备不错的选股能力。训练集 IC 值稳定在 0.15 左右,测 试集 IC 值波动较大,在个别月份甚至出现负值,平均值为 0.1。以此构建的选股策略,在 沪深 300 行业中性基准下,年化超额收益为 20%~30%,信息比率为 1.6~2.0;在中证 500行业中性基准下,年化超额收益为 16%~24%,信息比率为 2.5~3.2;在不控制行业中性 条件下,年化超额收益为 19%~26%,信息比率为 2.2~3.1。

我们有选择性地展示三个策略的月度超额收益图:

image

线性回归模型参数敏感性分析

训练集长度


线性回归模型中,我们将滚动训练集的长度设为 12 个月。我们同时测试了 6 个月、18 个 月、24 个月和 36 个月的训练集长度,结果如图表 24 和 25 所示。从年化超额收益和信息 比率来看,回测效果最佳的训练集长度为 12~24 个月。图表 25 中的统一对照组为默认设 置下的线性回归模型(下文同)。

主成分分析

线性回归模型中,我们对特征进行主成分分析(PCA),提取全部 70 个成分(即累积方差 贡献率 100%)作为新的特征。我们同时测试了提取前 41 个主成分(平均累积方差贡献 率 95%)、前 34 个主成分(平均累积方差贡献率 90%)、前 23 个主成分(平均累积方差 贡献率 80%)和不做 PCA 的预处理方法,结果如图表 26 和 27 所示。

从年化超额收益和信息比率来看,选取的主成分越多,回测表现越好。由于线性回归的计 算开销不大,可以考虑选取所有主成分,保留数据中的全部信息。另外我们也发现做 PCA 和不做 PCA 的区别仅在于模型系数不同,最终预测的收益值有细微差异,但是每一期各 样本预测收益的相对大小排序几乎完全相同,因此模型回测的表现也完全一致。


训练集样本量

线性回归模型中,我们选取T-12 到 T-1 期中每一期的全部样本组成训练集,相当于取收 益率排名前后 50%的样本。我们同时测试了只取最具代表性的部分样本的情况,分别选取 前后 40%、30%、20%和 10%考察回测效果,结果如图表 28 和 29 所示。从年化超额收 益和信息比率来看,我们发现选取全部样本在沪深 300 行业中性基准下的选股表现最好, 而选取前后 20%样本在中证 500 行业中性基准下的选股表现最好。


正则化方法比较

我们比较了岭回归,Lasso 回归和弹性网络三种不同的正则化方法。三种方法均包含惩罚 系数λ这一自由参数,我们对λ从 1e-6 至 1e4 以 10 倍为间隔进行遍历,选取测试集 IC 值最高的λ作为最终选定的参数。回测结果如下图所示。总体来看,正则化模型的表现和 不带正则化的线性回归模型不相上下,引入正则化并没有明显提升选股的效果。

逻辑回归和随机梯度下降法比较

我们比较了逻辑回归,SGD + hinge 损失(等价于线性支持向量机)和 SGD + modified Huber三种分类器。三种方法均包含的自由参数为 L2 正则化惩罚系数λ,SGD还包含迭 代次数这一自由参数。我们固定 SGD迭代次数为 10000 次,对λ从 1e-6 至 1e6 以 10倍 为间隔进行遍历,选取测试集 IC 值最高并且取值合理的λ作为最终选定的参数。三种分 类方法的回测结果如下图所示。

可以发现,三种分类器对训练集的平均正确率在 58.5%左右,对测试集的平均正确率在 55.7%左右。从年化超额收益和信息比率来看,三种分类器均优于传统的线性回归,超额 收益最大回撤也小于线性回归模型。三者之中又以 SGD + hinge 损失模型表现最佳,以中 证 500 作为行业中性基准,每个行业选 10~15 只个股的策略,信息比率和 Calmar 比率均 在 4 左右,超额收益最大回撤在 5%左右。

利用随机梯度下降法 + hinge 损失模型构建选股策略

观察以上参数敏感性测试表格可以发现,SGD(随机梯度下降法)结合 hinge 损失模型(等 价于线性支持向量机)的选股效果最佳,我们同样选择展示三种细节设置下,选股策略的 月度超额收益图:

image

总结和展望

以上我们从最简单的线性回归模型出发,对岭回归、Lasso 回归、弹性网络、逻辑回归和 随机梯度下降法(结合某种损失函数)等广义线性模型进行了系统的测试,并且考察了部 分模型参数的敏感性,初步得到以下几个结论:

  1. 线性回归模型本身已具备不错的选股能力。训练集 IC 值稳定在 0.15 左右,测试集 IC 值波动较大,在个别月份甚至出现负值,平均值为 0.1。以此构建的选股策略,在沪深 300 行业中性基准下,年化超额收益为 20%~30%,信息比率为 1.6~2.0;在中证 500 行业中 性基准下,年化超额收益为 16%~24%,信息比率为 2.5~3.2;在不控制行业中性条件下, 年化超额收益为 19%~26%,信息比率为 2.2~3.1。

  2. 线性回归模型中,滚动训练集长度为 12~24 个月时回测效果较好;主成分分析保留的 成分越多,回测效果越好;选取全部样本在沪深 300 行业中性基准下表现最好,选取前后 排名 20%的样本在中证 500 行业中性基准下表现最好。

  3. 正则化对选股效果没有明显的提升作用。岭回归、Lasso 回归和弹性网络的表现和线性 回归类似。我们猜测有两个可能的原因。首先,样本的所有特征都是已被证明有效的因子, 因此我们的特征不具备稀疏性。以 Lasso 回归为代表的 L1 正则化适用于从海量特征中选 出少数有效的特征,因而我们面对的问题不符合 Lasso 的应用场景。其次,由于预处理过程中做了去极值、标准化和主成分分析,在降低因子共线性的同时减少了极端样本的出现 概率,因而进一步削弱了正则化的价值。

  4. 将回归问题转换为分类问题,能够显著提升模型表现。逻辑回归、SGD结合 hinge 损 失函数、SGD结合 modified Huber 损失函数这三个分类器的回测效果均优于传统的线性 模型。三者之中又以 SGD + hinge 损失模型表现最佳,以中证 500 作为行业中性基准, 每个行业选 10~15 只个股的策略,信息比率和 Calmar 比率均在 4 左右,超额收益最大回 撤在 5%左右。我们猜测,三种分类器优于线性回归模型的可能原因,在于对原始收益率 进行二值化处理,分成正例和反例后,尽管损失了部分信息,但同时消除了收益率信息中 包含的大量噪音,使得模型能够更准确地捕捉数据中蕴含的规律。同时,hinge 和 modified Huber这两个损失函数对噪音点不敏感,进一步提升了模型的健壮性和泛化能力。

通过以上的测试和讨论,我们初步理解了广义线性模型应用于多因子选股的一些规律。同 时也引申出更多的问题。例如:

  1. 在岭回归、Lasso、弹性网络、逻辑回归和 SGD的调参过程中,我们对正则化惩罚系 数以 10 倍为跨度作了粗略的遍历。如果在更精细的尺度下进行参数寻优,模型的表现能 否有进一步提升?

  2. 对于本篇报告中回测效果最好的 SGD模型,除了 hinge 和 modified Huber 损失函数外, 还存在其它损失函数的选择。另外,在随机梯度下降的过程中,学习速率𝜂和迭代次数都 是很重要的参数。以上这些参数应如何选取,值得我们进行深入地探索。

  3. 机器学习真正碾压传统统计学习方法的地方,在于它强大的处理海量的、非线性数据的 能力。核支持向量机、随机森林、神经网络等非线性方法是否在多因子选股上也有出色的 表现,我们将在后续的报告中予以探索,敬请期待。

风险提示:广义线性模型是历史经验的总结,存在失效的可能。