量化交易中文教材

第 14 章 多回归元预测与大数据

学习目标

读完本章,你应当能够:

  1. 区分预测问题与因果问题:预测看样本外均方预测误差(MSPE),系数不需要、通常也没有因果解释。
  2. 写出 MSPE 的分解,解释为什么预测变量很多时 OLS 的 MSPE 约为 \((1+k/n)\sigma_u^2\),以及收缩估计量如何以偏差换方差。
  3. 用分样本和 m 折交叉验证估计 MSPE、选择调节参数,并理解为什么调参后还需要一个从未使用的预留测试集。
  4. 掌握岭回归、Lasso、主成分回归的定义、单变量闭式解(比例收缩、软阈值)、适用场景和实现细节(标准化、样本外变换)。
  5. 把这套方法用于横截面收益预测与多因子合成,知道它与回测防过拟合、风险模型、协方差收缩的联系。

读前导读

这一章在解决什么问题

前面十几章一直在问「X 变一下,Y 会因此变多少」,这是因果问题,所以要担心遗漏变量、内生性、工具变量。本章换了一个问题:不管因果,只要把下一个观测猜准。这正是多因子选股每天在做的事:手上有几百个因子,想合成一个分数去预测下月收益,没人要求「市净率系数」有经济含义,只要求样本外的预测误差小。

你在 CFA 二级学过多元回归,知道加变量会提高 \(R^2\),也知道调整 \(R^2\) 会惩罚变量个数。本章把这个直觉讲透:变量越多,OLS 在样本内越好看,在样本外越差,差多少有一个简单公式 \((1+k/n)\)。解决办法是故意让估计「有偏」——把系数往 0 拉——用一点偏差换掉一大块方差。这和你熟悉的 Ledoit–Wolf 协方差收缩、Black–Litterman 把预期收益拉向均衡收益,是同一个思想。

本章介绍三种做法:岭回归(所有系数按比例缩小)、Lasso(小系数直接砍成 0,相当于自动选因子)、主成分回归(先把几百个高度相关的因子压缩成几个「风格」,再回归)。收缩多少由交叉验证决定,最后还要用一份从没碰过的数据做终审——这就是回测里「最终样本外」的来历。

需要先想起来的数学

  • 偏差–方差分解:任何估计量的均方误差 \(\text{MSE}=\text{方差}+\text{偏差}^2\)。例:真值 2,估计量期望 1.5、方差 0.1,则 \(\text{MSE}=0.1+0.5^2=0.35\)。本章的一切都是在这个等式上做取舍。见 第 00 册第 07 章 概率中的分析工具。
  • 求最小值:令导数为 0:岭和 Lasso 都是「最小化一个函数」。单变量时对 \(b\) 求导、令其为 0 就得到闭式解。Lasso 的 \(|b|\) 在 0 处不可导,所以要分 \(b>0\)、\(b<0\)、\(b=0\) 三种情况讨论。见 第 00 册第 02 章 导数与泰勒展开。
  • 矩阵求逆与 \(X^\top X\):OLS 的矩阵解是 \(\hat\beta=(X^\top X)^{-1}X^\top Y\)。\(X\) 是 \(n\times k\) 的数据矩阵,\(X^\top X\) 是 \(k\times k\) 的「交叉乘积矩阵」,标准化后除以 \(n\) 就是相关矩阵。\(k>n\) 时它不可逆,OLS 算不出来。见 第 00 册第 06 章 线性代数速成。
  • 特征值与特征向量:对称矩阵 \(A\) 若满足 \(Av=\lambda v\),\(v\) 是特征向量、\(\lambda\) 是特征值。对相关矩阵而言,特征向量是数据云的「主轴方向」,特征值是沿该方向的方差。例:\(\begin{pmatrix}1&0.7\\0.7&1\end{pmatrix}\) 的特征值是 1.7 和 0.3,对应方向 \((1,1)/\sqrt2\) 和 \((1,-1)/\sqrt2\)。主成分就是这些方向。同见第 06 章。
  • 带约束的最大化:主成分要在「权重平方和为 1」的约束下让方差最大,这是拉格朗日乘子法的典型用法,解出来恰好是特征向量。见 第 00 册第 05 章 多元微积分与优化。

记号提醒:\(\|\hat\beta\|^2=\sum_j\hat\beta_j^2\) 是向量长度的平方;\(\cong\) 读作「近似等于」;上标 \(oos\) 表示 out-of-sample(样本外)。

怎么读这一章

核心必读是 14.2(尤其 14.2.3–14.2.6 的 MSPE 分解、\((1+k/n)\)、交叉验证)、14.3、14.4.1–14.4.2 和 14.6.1。这几节讲清了「为什么要收缩」和「怎么评估才不自欺」。14.2.5 的 James–Stein 第一次读只需记住结论:同时估计三个以上参数时,统一向 0 拉一点总是划算的。14.5 主成分如果线性代数生疏,先读 14.5.2 的两变量例子,把 14.5.3 当作结论接受。14.1 和 14.7 是背景,可快速浏览。最后的「量化实战」值得细读,尤其是防前视偏差的四条。


14.0 本章要解决的问题

第 4 章提出过两个问题。学区督学想知道降低师生比能否提高成绩,这是因果问题,第 4–13 章都在处理它。一位父亲想知道哪所学校学生成绩最好,这是预测问题。

统计预测的流程是:用数据估计一个预测模型,再用于未参与估计的样本外(out-of-sample)观测。目标是样本外预测准确。预测问题中没有「感兴趣的回归元」和「控制变量」之分,只有预测变量(predictors)和被预测变量。

预测变量不多时,只要满足附录 6.4 的预测用最小二乘假设(本册第 06 章 6.10 节),OLS 就表现良好。现代数据往往有大量预测变量,有时接近甚至超过观测数。这时 OLS 过拟合(overfit),样本外预测很差。本章介绍的一类方法统称收缩估计量(shrinkage estimators):它们有偏,系数没有因果解释,但用一点偏差换来方差的大幅下降,从而提高样本外精度。

本章的应用是用学校与社区特征预测加州 3932 所小学的五年级平均成绩:一半(1966 所)用于估计,另一半留作测试;主要用 817 个预测变量,14.6 节扩展到 2065 个。量化读者可以随时把「学校」换成「股票」、把「成绩」换成「下月收益」、把「学校特征」换成「因子暴露」,本章每一步都能直接对应到横截面收益预测。

本章处理的是截面数据,预测的是总体中未进入估计样本的成员。对未来的预测(forecast)用时间序列,放在第 15a、15b 章。


14.1 什么是「大数据」

数据「大」可以指观测多、预测变量相对观测数多,或两者兼有;也可以指文本、图像这类非标准数据。机器学习(machine learning)、数据科学(data science)处理的是同一类问题,本书统称大数据(big data)。大数据带来五类应用:

  1. 预测变量数 \(k\) 相对 \(n\) 很大的预测(本章重点)。预测变量可能本来就多,也可能来自原始变量的非线性函数:几十个原始变量加上平方、立方、两两交互,就迅速膨胀到成百上千。
  2. 分类(categorization):第 11 章的贷款拒绝 logit/probit 可以重新表述为「可能被拒/可能被批」的二分类。
  3. 多重假设检验:从许多处理中找出哪些有效。F 检验只回答「是否全为零」,不适合回答「哪些不为零」。
  4. 非标准数据:关键是把文本、图像转为数值,再用高维方法(见 14.7 节的文本专栏)。
  5. 模式识别:人脸识别、机器翻译等,用深度学习(deep learning)这种高度非线性、用海量观测训练的模型。

原书列举的经济学应用中有一条:在高频资产价格数据库中寻找模式,用于计算机交易算法。本章方法本质上都是线性回归针对大数据的扩展。


14.2 多预测变量问题与 OLS

14.2.1 数据:817 个预测变量从哪里来

38 个主变量(免费午餐比例、英语学习者比例、教师教龄、生均支出、收入中位数、师生比、族裔构成、各类支出与收入等),加上它们的平方 38 个、立方 38 个、两两交互 \(38\times37/2=703\) 个,合计 \(k=817\)。这样构造的动机是第 8 章发现成绩与师生比的关系是非线性的,而且依赖英语学习者比例。

14.2.2 均方预测误差与神谕预测

\[\text{MSPE}=E\big[(Y^{oos}-\hat Y(X^{oos}))^2\big], \tag{14.1}\]

\((X^{oos},Y^{oos})\) 是样本外观测,\(\hat Y(x)\) 是预测函数。平方损失让大误差权重很大,适合「小误差无所谓,大误差损害可信度」的场景。

使 MSPE 最小的预测是条件均值 \(E(Y^{oos}\mid X^{oos})\),称为神谕预测(oracle prediction)。它不可行(我们不知道条件均值),但它是评价一切可行预测的基准。MSPE 有两个来源:即使知道条件均值,仍有不可预测的部分 \(Y^{oos}-E(Y^{oos}\mid X^{oos})\);估计参数又带来额外误差。

预测用第一条最小二乘假设:样本外观测与估计样本来自同一总体分布。这样 \(E(Y\mid X)\) 对样本内外都是神谕预测。加州学校的模型可以推广到加州其他学校,对欧洲学校就没那么有信心。这是一个外部有效性假设,本章始终假定它成立。对量化而言,它对应「下个月的截面与过去的截面同分布」——这在市场体制变化时并不成立,第 15b 章(结构突变)会讨论时间维度上的对应问题。

14.2.3 标准化预测回归模型

把每个预测变量标准化 \(X_{ji}=(X^*_{ji}-\mu_{X^*_j})/\sigma_{X^*_j}\),被预测变量去均值 \(Y_i=Y_i^*-\mu_{Y^*}\),得到无截距的模型

\[Y_i=\beta_1X_{1i}+\beta_2X_{2i}+\cdots+\beta_kX_{ki}+u_i. \tag{14.2}\]

所有系数单位相同:\(\beta_j\) 是 \(X^*_j\) 相差一个标准差、其他预测变量不变时预测值之差。采用预测解释:\(E(Y\mid X)=\sum_j\beta_jX_j\),\(E(u\mid X)=0\)。模型对系数线性,但可通过平方、交互项对原始变量非线性。

样本外预测为 \(\hat Y(X^{oos})=\sum_j\hat\beta_jX_j^{oos}\),预测误差为 \(u^{oos}-\sum_j(\hat\beta_j-\beta_j)X^{oos}_j\)。由于 \(u^{oos}\) 与估计数据独立、与 \(X^{oos}\) 不相关,

\[\text{MSPE}=\sigma_u^2+E\Big[\big((\hat\beta_1-\beta_1)X_1^{oos}+\cdots+(\hat\beta_k-\beta_k)X_k^{oos}\big)^2\Big]. \tag{14.3}\]

第一项是神谕预测的误差方差,无论如何都去不掉;第二项是「必须估计系数」的代价,等于估计带来的预测方差加上预测偏差的平方。选择估计量,就是让第二项尽量小;预测变量多时,这意味着在系数的偏差与方差之间权衡。

推导拆解:(14.3) 是怎么来的。

  1. 真实值 \(Y^{oos}=\sum_j\beta_jX_j^{oos}+u^{oos}\),预测值 \(\hat Y=\sum_j\hat\beta_jX_j^{oos}\),相减得误差 \(=u^{oos}-\sum_j(\hat\beta_j-\beta_j)X_j^{oos}\)。记后一项为 \(D\)。
  2. 平方后取期望:\(E[(u^{oos}-D)^2]=E[(u^{oos})^2]-2E[u^{oos}D]+E[D^2]\)。
  3. 交叉项为 0:\(\hat\beta\) 只依赖估计样本,与新观测的 \(u^{oos}\) 独立;\(E(u^{oos}\mid X^{oos})=0\)。所以 \(E[u^{oos}D]=0\)。
  4. 剩下 \(\sigma_u^2+E[D^2]\),就是 (14.3)。

第二项还能再拆成「方差 + 偏差平方」:若 \(\hat\beta\) 无偏(OLS),只剩方差;若有偏(岭、Lasso),偏差平方会进来,但方差可能小得多。

14.2.4 OLS 的 MSPE

在同方差误差下,

\[\text{MSPE}_{OLS}\cong\Big(1+\frac kn\Big)\sigma_u^2. \tag{14.4}\]

\(k=1\) 的推导(原书附录 14.2):\(\hat Y(x)=\hat\beta x\),(14.3) 第二项为 \(E[(\hat\beta-\beta)X^{oos}]^2=E(\hat\beta-\beta)^2E(X^{oos})^2\),因为 \(\hat\beta\) 与 \(X^{oos}\) 独立;标准化使 \(E(X^{oos})^2=1\);OLS 无偏,\(E(\hat\beta-\beta)^2=\text{var}(\hat\beta)=\sigma_u^2/(n\sigma_X^2)=\sigma_u^2/n\)。所以 \(\text{MSPE}\approx(1+1/n)\sigma_u^2\)。一般 \(k\) 的矩阵推导见原书附录 19.7,直观上每个系数各贡献 \(\sigma_u^2/n\)。

含义:用 OLS 估计 \(k\) 个系数,使 MSPE 相对神谕放大 \((1+k/n)\) 倍。只用 38 个主变量时 \(k/n=38/1966\approx0.02\),损失 2%;用 817 个时 \(k/n\approx0.40\),恶化约 40%。OLS 是无偏的,这个膨胀完全来自方差。

金融直觉:\(k/n\) 就是「每个参数平均分到多少观测」的倒数。用 60 个月的数据估 30 个因子的权重,\(k/n=0.5\),按 (14.4) 样本外误差至少放大 50%,按下面的精确式会更糟。量化里「参数个数 / 有效样本」这个比值是判断过拟合风险的第一个指标。还要注意,月度收益的 \(\sigma_u^2\) 本来就占了总方差的 95% 以上,可预测部分只有几个百分点,所以哪怕 \(k/n=0.05\) 带来的 5% 放大,也足以吃掉全部预测力。

补充说明:(14.4) 是 \(k/n\) 较小时的近似。当预测变量是独立正态时,精确结果是 \(\sigma_u^2[1+k/(n-k-1)]\),\(k/n\) 较大时比 \(1+k/n\) 大得多,\(k\to n\) 时趋于无穷。本章代码第 1 部分用模拟验证了这一点:\(k/n=0.8\) 时 MSPE 约为 \(5\sigma_u^2\),而不是 \(1.8\sigma_u^2\)。结论只会更强:\(k/n\) 大时 OLS 的预测非常糟糕。

14.2.5 收缩原理与 James–Stein 估计量

高斯–马尔可夫定理说 OLS 在线性无偏估计量中方差最小,并不排除有偏估计量的 MSE 更低。1960 年代前后的重要概念突破是:允许有偏,只要方差降得足够多,MSPE 就能低于 OLS。

收缩原理(principle of shrinkage):把 OLS 估计向某个数(通常是 0)收缩,引入偏差、降低方差;若方差的下降超过偏差平方的增加,均方误差就低于 OLS。

James–Stein 估计量(James & Stein 1961):回归元互不相关时,\(\tilde\beta^{JS}=c\hat\beta\),\(c<1\) 且依赖数据。标准形式(误差方差已知且标准化为 1 时)是

\[\tilde\beta^{JS}=\Big(1-\frac{k-2}{\|\hat\beta\|^2}\Big)\hat\beta .\]

真实 \(\beta\) 很小时收缩更好并不奇怪;惊人之处在于:误差正态时,只要 \(k\ge3\),无论真实 \(\beta\) 是多少,James–Stein 的总 MSE 都低于 OLS。这是岭回归、Lasso 等一整族收缩估计量的思想源头。

白话解释:公式里的收缩系数 \(1-(k-2)/\|\hat\beta\|^2\) 是「看数据决定拉多少」。如果估出来的系数整体很大(\(\|\hat\beta\|^2\) 远大于 \(k\)),说明信号强,收缩系数接近 1,几乎不动;如果整体很小、和纯噪声差不多大(纯噪声时 \(\|\hat\beta\|^2\approx k\)),收缩系数接近 \(2/k\),大幅拉向 0。

要注意「总 MSE」三个字:James–Stein 保证的是 \(k\) 个系数误差平方加总更小,不保证每一个系数都更准。某个真值特别大的系数可能被拉得过头。这和组合分散化很像:不保证每只股票都赚,只保证整体风险更低。系数可能被拉过 0 变号时,实务上用「正部」版本,把收缩系数截在 0 以上(本章代码第 2 部分就是这么做的)。

一个最简单的感受方式(原书习题 14.5–14.6):\(Y\) 的均值 \(\mu=2\)、方差 25,用 \(n=10\) 个观测预测一个新观测。用样本均值 \(\bar Y\) 预测,MSPE \(=25(1+1/10)=27.5\)。改用 \(\bar Y/2\):方差降到 \(25/40=0.625\),偏差 \(-1\),MSPE \(=25+0.625+1=26.6\),更好;但若 \(\mu=10\),偏差 \(-5\),MSPE \(=25+0.625+25=50.6\),糟得多。收缩是否有利取决于未知的真值——这正是要用数据(交叉验证)来决定收缩强度的原因。

14.2.6 估计 MSPE:分样本与 m 折交叉验证

分样本估计:数据分成估计子样本和测试子样本,用前者估计系数 \(\tilde\beta\),在后者的 \(n_{test}\) 个观测上计算

\[\widehat{\text{MSPE}}_{split\text{-}sample}=\frac1{n_{test}}\sum_{\text{test}}(Y_i-\hat Y_i)^2. \tag{14.5}\]

它不对称地使用数据。交换两个子样本的角色可以得到两个估计,推广到 \(m\) 个子样本就是交叉验证。

Key Concept 14.1 m 折交叉验证(m-fold cross validation)

  1. 把样本随机分成 \(m\) 个大小近似相等的子集;
  2. 用子集 \(2,\dots,m\) 合并估计 \(\tilde\beta\);
  3. 用 \(\tilde\beta\) 计算子集 1 的预测值与预测误差;
  4. 以子集 1 为测试样本,按 (14.5) 得 \(\widehat{\text{MSPE}}_1\);
  5. 依次留出子集 \(2,3,\dots,m\),重复 2–4;
  6. 加权平均:
\[\widehat{\text{MSPE}}_{m\text{-fold CV}}=\frac1m\sum_{i=1}^m\Big(\frac{n_i}{n/m}\Big)\widehat{\text{MSPE}}_i. \tag{14.6}\]

\(m\) 的选择:\(m\) 越大,每次估计用的观测越多,越接近用全样本估计;极端是留一法(leave-one-out),但要估计 \(n\) 次,计算量大。本章取 \(m=10\)(每次用 90% 的数据)作为折中。交叉验证不依赖估计方法,甚至适用于只能写成算法、没有参数的模型,因此在大数据实证中无处不在。

时间序列的提醒:随机分折依赖观测间独立。收益数据有时间依赖、市场状态会变,随机打乱会把未来信息带进训练集。截面收益预测通常按时间分块,或用第 15a 章 15.5 节的伪样本外(滚动、扩展窗口)方法评估。


14.3 岭回归

14.3.1 定义

岭回归最小化惩罚残差平方和(penalized sum of squared residuals):

\[S^{Ridge}(b;\lambda_{Ridge})=\sum_{i=1}^n(Y_i-b_1X_{1i}-\cdots-b_kX_{ki})^2+\lambda_{Ridge}\sum_{j=1}^kb_j^2. \tag{14.7}\]

\(\lambda_{Ridge}\ge0\) 是岭收缩参数,第二项是惩罚项(penalty term),惩罚大系数。\(\lambda=0\) 时就是 OLS,\(\lambda\) 越大收缩越强。因为用的是标准化回归元,系数单位相同,可以对所有系数用同一个 \(\lambda\)。

单回归元的闭式解(原书附录 14.3):一阶条件给出

\[\hat\beta^{Ridge}=\frac{\sum_iX_iY_i}{\sum_iX_i^2+\lambda_{Ridge}}=\Big(1+\lambda_{Ridge}\Big/\sum_iX_i^2\Big)^{-1}\hat\beta .\]

回归元互不相关时,每个系数都按同样的方式收缩:

\[\hat\beta_j^{Ridge}=\Bigg(\frac1{1+\lambda_{Ridge}/\sum_{i}X_{ji}^2}\Bigg)\hat\beta_j. \tag{14.8}\]

这是对 OLS 的按比例收缩,与 James–Stein 类似。回归元相关时,个别岭系数可能大于 OLS,但整体向 0 收缩。一般情形的矩阵形式是 \(\hat\beta^{Ridge}=(X^\top X+\lambda I)^{-1}X^\top Y\)(原书附录 19.7)。由于 \(X^\top X+\lambda I\) 在 \(\lambda>0\) 时总是可逆,即使 \(k>n\)(完全多重共线)岭估计仍可计算,而 OLS 不行。

推导拆解:单回归元的岭解。

  1. 目标 \(S(b)=\sum_i(Y_i-bX_i)^2+\lambda b^2\)。
  2. 对 \(b\) 求导(链式法则:\((Y_i-bX_i)^2\) 对 \(b\) 的导数是 \(2(Y_i-bX_i)\cdot(-X_i)\)):\(S'(b)=-2\sum_iX_iY_i+2b\sum_iX_i^2+2\lambda b\)。
  3. 令 \(S'(b)=0\):\(b(\sum_iX_i^2+\lambda)=\sum_iX_iY_i\),得 \(\hat\beta^{Ridge}=\sum X_iY_i/(\sum X_i^2+\lambda)\)。
  4. 分子分母同除以 \(\sum X_i^2\),分子变成 OLS 的 \(\hat\beta\),分母变成 \(1+\lambda/\sum X_i^2\)。

标准化后 \(\sum_iX_i^2=n\),所以收缩系数是 \(1/(1+\lambda/n)\)。这说明 \(\lambda\) 的大小要和样本量一起看:学校例子 \(n=1966\)、\(\lambda=2233\),相当于每个系数(在不相关的近似下)大约被缩到一半。

「\(X^\top X+\lambda I\) 总是可逆」的原因:\(X^\top X\) 的特征值都 \(\ge0\),加上 \(\lambda I\) 后每个特征值都抬高 \(\lambda\),全部 \(>0\),矩阵就可逆。这和协方差矩阵「对角线加一点」使之可逆、条件数变好是同一招。

14.3.2 用交叉验证选 \(\lambda\)

一个常见误区:直接对 \(\lambda\) 最小化 \(S^{Ridge}\),会得到 \(\lambda=0\),因为 OLS 的样本内拟合最好。可预测的目标是样本外。正确做法是对一组候选 \(\lambda\),各用 m 折交叉验证估计 MSPE,取最小者。最优值可能为 0(那就说明 OLS 最好),但通常不是。

学校成绩应用(817 个预测变量,1966 个观测,10 折 CV):root MSPE 随 \(\lambda\)(对数刻度)呈 U 形,在 \(\hat\lambda_{Ridge}=2233\) 处最小,root MSPE \(=39.5\);同样数据 OLS 的 root MSPE 为 78.2。收缩带来的方差下降远超偏差。

注意:\(\hat\lambda\) 正是为最小化 CV MSPE 而选的,所以 \(\hat\lambda\) 处的 CV MSPE 不再是 MSPE 的无偏估计(它偏乐观)。14.6 节用另外 1966 个从未使用的观测给出无偏估计。


14.4 Lasso

14.4.1 稀疏模型与 Lasso 的定义

OLS 和岭回归的系数都不会恰好为 0,所有预测变量都参与预测。如果真实条件均值只对 38 个主变量线性,那么 779 个系数为 0。只有少数预测变量系数非零的模型称为稀疏模型(sparse model),此时把许多系数估计为恰好 0 能改进预测。

Lasso(least absolute shrinkage and selection operator)最小化

\[S^{Lasso}(b;\lambda_{Lasso})=\sum_{i=1}^n(Y_i-b_1X_{1i}-\cdots-b_kX_{ki})^2+\lambda_{Lasso}\sum_{j=1}^k|b_j|. \tag{14.9}\]

名字的前半「least absolute shrinkage」指惩罚随系数绝对值增加,后半「selection operator」指它把许多系数估计为 0,从而选出预测变量子集。两种惩罚都可以写成 \(\lambda\sum_j|b_j|^p\):岭回归 \(p=2\)(\(L_2\) 惩罚),Lasso \(p=1\)(\(L_1\) 惩罚)。

14.4.2 为什么会恰好为 0:软阈值

\(k=1\) 的闭式解(原书附录 14.4):Lasso 与 OLS 估计同号。设 \(\hat\beta\ge0\),在 \(b\ge0\) 上最小化 \(\sum_i(Y_i-bX_i)^2+\lambda b\),导数为 \(-2\sum_iX_i(Y_i-bX_i)+\lambda\),内点解令其为 0,否则取边界 0:

\[\hat\beta^{Lasso}=\max\Big(\hat\beta-\tfrac12\lambda_{Lasso}\Big/\sum_iX_i^2,\;0\Big),\quad\hat\beta\ge0; \tag{14.11}\]

\(\hat\beta<0\) 时 \(\hat\beta^{Lasso}=\min(\hat\beta+\frac12\lambda_{Lasso}/\sum_iX_i^2,\,0)\)。这就是软阈值(soft thresholding):先向 0 平移一个固定量,越过 0 就截断为 0。

推导拆解:为什么是「平移再截断」。

  1. 先设 \(b>0\),此时 \(|b|=b\),目标 \(\sum(Y_i-bX_i)^2+\lambda b\) 可导。求导得 \(-2\sum X_iY_i+2b\sum X_i^2+\lambda\)。
  2. 令其为 0:\(b=\big(\sum X_iY_i-\lambda/2\big)/\sum X_i^2=\hat\beta-\tfrac12\lambda/\sum X_i^2\)。
  3. 这个解只有在它确实 \(>0\) 时才合法。如果算出来是负数,说明在 \(b>0\) 区域里目标函数一直在上升,最小点在边界 \(b=0\)。
  4. 两种情况合起来就是 \(\max(\cdot,0)\)。

和岭的关键区别在第 2 步:岭的惩罚 \(\lambda b^2\) 求导后是 \(2\lambda b\),和 \(b\) 成比例,越靠近 0 惩罚力越小,所以永远到不了 0;Lasso 的惩罚 \(\lambda|b|\) 求导后是常数 \(\lambda\),哪怕 \(b\) 已经很小,往 0 推的力也不减,所以能把小系数推到恰好 0。

几何直观(原书图 14.3):OLS 估计远离 0 时(例如 \(\hat\beta=1.0\)),Lasso 把它平移到较小的值(\(0.5\));OLS 估计接近 0 时(\(\hat\beta=0.4\)),SSR 曲线在 0 附近很平,线性惩罚的斜率占主导,最优点被推到恰好 0。

与岭回归的比较:

  • 岭回归按比例收缩,大系数被拉得更多(绝对量),但永远不为 0。
  • Lasso 按固定量平移,大系数相对收缩少,小系数直接归零。
  • 一个数值例(原书习题 14.9–14.10):\(n=1\),\(y_1=2\),\(x_1=1\),OLS 估计为 2。岭估计 \(2/(1+\lambda)\):\(\lambda=1\) 时为 1。Lasso 估计 \(\max(2-\lambda/2,0)\):\(\lambda=1\) 时为 1.5,\(\lambda=5\) 时为 0。

\(k>1\) 时 Lasso 没有闭式解,要用数值优化(坐标下降、LARS 等),各类软件都已内置。收缩参数同样用交叉验证选。

14.4.3 警告:岭与 Lasso 依赖回归元的线性组合方式

在 OLS 中,只要避免完全共线,用原始 \(k\) 个回归元还是它们的任何 \(k\) 个线性组合,拟合和预测完全相同。例如(截距 + 男性哑变量)、(截距 + 女性哑变量)、(男、女哑变量,无截距)三种设定的 OLS 预测完全一样。

岭与 Lasso 不是这样。Lasso 最容易理解:在(截距, 男)的设定中男性系数是男女之差,在(女, 男)的设定中是男性的水平,Lasso 可能在前者中把它剔除、在后者中保留,预测就不同。岭的原因更微妙:不同线性组合之间的相关结构不同。

含义:用岭和 Lasso 时必须认真决定回归元的形式(标准化方式、是否中性化、是否正交化、哑变量的编码)。这个问题对 OLS、主成分法、logit、probit、IV 都不存在。

金融直觉:设想两个高度相关的因子:PB 和 PE。设定 A 直接放入 PB、PE;设定 B 放入「(PB+PE)/2」和「PB−PE」。OLS 下两种设定预测完全一样。Lasso 下,设定 A 可能只留 PB、砍掉 PE;设定 B 可能留下均值、砍掉差值,相当于给两者等权。惩罚项看的是「你写下来的那组系数」,所以你怎么定义因子,就在暗中告诉模型「你认为哪种组合天然应该为 0」。

另一个容易忽略的点:原文把主成分法也列为不受影响,这句要谨慎看待。用全部 \(k\) 个主成分时,PCR 就等于 OLS,当然不受影响;但只保留前 \(p<k\) 个时,主成分是由回归元的相关结构决定的,把回归元换成别的线性组合(或改变标度,比如不标准化)会改变相关矩阵,从而改变主成分和预测。只有正交旋转这类特殊变换才不改变结果。实务上,因子的定义方式对 PCR 同样重要。

14.4.4 学校成绩应用

10 折 CV 在 \(\hat\lambda_{Lasso}=4527\) 处最小,root MSPE \(=39.7\),远低于 OLS 的 78.2,略高于岭的 39.5。Lasso 只在 817 个中的 56 个上估出非零系数,剔除了 93%;保留者中除 4 个外都是主变量之间的交互项。


14.5 主成分

14.5.1 思想

完全共线时可以丢掉一个回归元而不损失信息,因为它能由其他回归元完全重构。那么丢掉与其他回归元高度但非完全相关的变量,信息损失可能也很小。主成分分析(principal components analysis, PCA)利用回归元之间的相关,用少数线性组合尽量保留原始信息;降维后直接用 OLS 估计和预测。

14.5.2 两个变量的主成分

设 \(X_1,X_2\) 已标准化、相关系数 \(\rho\)。第一主成分 \(PC_1=w_1X_1+w_2X_2\) 选择使方差最大的权重,同时约束 \(w_1^2+w_2^2=1\)(否则同比例放大权重可以让方差无限大)。

当 \(\rho>0\) 时,\(\text{var}(w_1X_1+w_2X_2)=w_1^2+w_2^2+2w_1w_2\rho=1+2w_1w_2\rho\),在约束下 \(w_1w_2\) 的最大值在 \(w_1=w_2=1/\sqrt2\) 处取得,所以

\[PC_1=\frac{X_1+X_2}{\sqrt2},\qquad PC_2=\frac{X_1-X_2}{\sqrt2}.\]

推导拆解:为什么 \(w_1=w_2=1/\sqrt2\)。

  1. 标准化后 \(\text{var}(X_1)=\text{var}(X_2)=1\),\(\text{cov}(X_1,X_2)=\rho\),所以 \(\text{var}(w_1X_1+w_2X_2)=w_1^2+w_2^2+2w_1w_2\rho\)。用了组合方差公式,和两资产组合方差同一个式子。
  2. 约束 \(w_1^2+w_2^2=1\) 代入,方差 \(=1+2\rho w_1w_2\)。\(\rho>0\) 时要让 \(w_1w_2\) 最大。
  3. 由 \((w_1-w_2)^2\ge0\) 得 \(w_1w_2\le(w_1^2+w_2^2)/2=1/2\),等号在 \(w_1=w_2\) 时成立,即 \(w_1=w_2=1/\sqrt2\)。
  4. 此时方差 \(=1+\rho\)。\(PC_2\) 取正交方向 \((1,-1)/\sqrt2\),方差 \(=1-\rho\);协方差 \(=\tfrac12[\text{var}(X_1)-\text{var}(X_2)]=0\)。

用组合语言说:\(PC_1\) 是「等权多头」,\(PC_2\) 是「多一空一」的价差组合。两个资产相关性高时,几乎所有波动都在等权多头里,价差组合波动很小——这正是配对交易的出发点。

\(PC_2\) 与 \(PC_1\) 不相关、平方权重和为 1。几何上,\(PC_1\) 是散点云最「长」的方向(45° 线),\(PC_2\) 是最「窄」的方向。方差为 \(\text{var}(PC_1)=1+|\rho|\),\(\text{var}(PC_2)=1-|\rho|\),二者之和为 2,等于 \(\text{var}(X_1)+\text{var}(X_2)\)。

\(PC_1\) 解释的总方差比例为 \((1+|\rho|)/2\)。原书图 14.5 中 \(\rho=0.7\),\(PC_1\) 解释 85%,\(PC_2\) 解释 15%。两个变量时降维意义不大;主成分的价值在于变量多而且相关时,少数几个主成分就能捕获大部分变异。

14.5.3 \(k\) 个变量的主成分

Key Concept 14.2 主成分:主成分是 \(X\) 的线性组合,满足 (i) 权重平方和为 1;(ii) 第一主成分方差最大;(iii) 第二主成分在与第一主成分不相关的约束下方差最大;(iv) 第 \(j\) 个在与前 \(j-1\) 个都不相关的约束下方差最大。

  • 无完全共线时主成分有 \(\min(n,k)\) 个。
  • 主成分的方差之和等于 \(X\) 的方差之和:
\[\sum_{j=1}^{\min(n,k)}\text{var}(PC_j)=\sum_{j=1}^k\text{var}(X_j). \tag{14.10}\]
  • \(\text{var}(PC_j)/\sum_j\text{var}(X_j)\) 是第 \(j\) 个主成分解释的 \(X\) 总方差比例,类似 \(R^2\)。
  • 计算上,主成分权重就是 \(X\) 的样本相关矩阵(已标准化时即协方差矩阵)的特征向量,方差是对应的特征值,按从大到小排列(矩阵分析见第 01 册)。

碎石图(scree plot):横轴为主成分编号 \(j\),纵轴为第 \(j\) 个主成分解释的方差比例。817 变量的学校数据中,第一主成分解释 18%,第二 11%,前 10 个合计 63%,前 40 个合计 92%。前几个之后曲线迅速变平,形如悬崖下滚落到谷底的碎石(scree),这是高度相关数据的典型特征。反过来,如果碎石图很平(原书复习题 14.5),说明变量几乎不相关,前几个主成分没什么用。

14.5.4 主成分回归

用前 \(p\) 个主成分代替原来的 817 个预测变量做 OLS。\(p\) 和岭、Lasso 的收缩参数一样,用 m 折交叉验证选。学校数据中,root MSPE 随 \(p\) 先急降,\(p=5\) 后放缓,\(p=23\) 后基本平坦,在 \(\hat p=46\) 处最小,root MSPE \(=39.7\)。

主成分回归也是一种收缩:它把小特征值方向上的系数全部置零,保留大特征值方向上的 OLS 估计。岭回归则是对所有方向做平滑的收缩,特征值越小的方向收缩越多。两者都在利用「数据变化少的方向上系数估不准」这一事实。

白话解释:为什么「数据变化少的方向上系数估不准」?回忆单变量 OLS:\(\text{var}(\hat\beta)=\sigma_u^2/(n\,\text{var}(X))\),\(X\) 变化越小,斜率越难估准。多变量时,把数据旋转到主成分坐标系,每个方向的「\(\text{var}(X)\)」就是对应的特征值 \(d_j\)。在主成分坐标下,岭回归对第 \(j\) 个方向的 OLS 系数乘以 \(d_j/(d_j+\lambda/n)\)(这里 \(d_j\) 是相关矩阵的特征值):\(d_j\) 大时接近 1,几乎不缩;\(d_j\) 小时接近 0,几乎砍掉。主成分回归则是把这个乘数硬性设为 1(前 \(p\) 个)或 0(其余)。一个是调光旋钮,一个是开关。


14.6 用多预测变量预测学校成绩:样本外评估

14.6.1 评估设计

m 折 MSPE 已经被用来选择 \(\lambda\) 和 \(p\),所以它不再是真正的样本外评价。于是预留另一半 1966 个观测作为预留测试样本(reserved test sample)。以岭回归为例,流程是:

  1. 在 1966 个估计样本上用 10 折 CV 选出 \(\hat\lambda\);
  2. 用 \(\hat\lambda\) 在全部 1966 个估计样本上重新估计系数;
  3. 预测预留测试样本中每个观测。

样本外变换必须使用样本内的统计量(原书附录 14.5)。岭和 Lasso:

\[\hat Y^{*oos}=\bar Y^*+\sum_{j=1}^k\tilde\beta_j\Big(\frac{X_j^{*oos}-\bar X_j^*}{s_{X_j^*}}\Big), \tag{14.12}\]

其中 \(\bar X_j^*\)、\(s_{X_j^*}\)、\(\bar Y^*\) 都来自估计样本。

白话解释:(14.12) 是把「标准化空间里的预测」翻译回原始单位。步骤是:新观测的每个原始特征减去训练集均值、除以训练集标准差,得到标准化值;乘以系数求和得到去均值的预测;再加回训练集的 \(Y\) 均值。三处都必须是训练集统计量。如果用测试集自己的均值标准化,就等于偷看了测试集的整体水平——在时间序列场景下,就是用了未来数据。

主成分回归 \(Y_i=\gamma_1PC_{1i}+\cdots+\gamma_pPC_{pi}+v_i\)(14.13)还多一步:样本外主成分要用样本内估计的权重计算,最后 \(\hat Y^{*oos}=\bar Y^*+\sum_{j=1}^p\hat\gamma_jPC_j^{oos}\)。

14.6.2 结果

表 14.3 样本外表现(root MSPE)

预测变量集 指标 OLS 岭 Lasso 主成分
小(\(k=4\)) 样本内 10 折 CV 53.6 — — —
样本外 52.9 — — —
大(\(k=817\)) 估计的 \(\lambda\) 或 \(p\) — 2233 4527 46
样本内 10 折 CV 78.2 39.5 39.7 39.7
样本外 64.4 38.9 39.1 39.5
超大(\(k=2065\)) 估计的 \(\lambda\) 或 \(p\) — 3362 4221 69
样本内 10 折 CV — 39.2 39.2 39.6
样本外 — 39.0 39.1 39.6

小数据集的 4 个变量是师生比、收入中位数、教师教龄和生均教学支出;超大数据集在 38 个主变量上再加 27 个人口与学校特征,并构造平方、立方与交互,总计 2065 个,超过估计样本的 1966 个,OLS 无法计算。

四个发现:

  1. OLS 在大数据集上的预测比小数据集差得多:回归元很多时,OLS 不但不能利用额外信息,反而更糟。
  2. 多预测变量方法从 4 个变量扩展到 817 个,root MSPE 下降约四分之一;再扩展到 2065 个没有进一步收益。
  3. 样本内 10 折 CV 估计与样本外估计很接近,样本外甚至略小——10 折每次只用 90% 数据估计,而最终模型用全部数据。一般结论:m 折 MSPE 是样本外 MSPE 的良好指引。
  4. 三种方法在本数据中表现相近,岭略优。这不是普遍规律。

表 14.4 部分标准化系数(均无因果解释)

预测变量 \(k=4\) OLS \(k=817\) OLS 岭 Lasso 主成分
师生比 4.51 118.03 0.31 0 0.25
收入中位数 34.46 −21.73 0.38 0 0.30
教师平均教龄 1.00 −79.59 −0.11 0 −0.17
生均教学支出 0.54 −1020.77 0.11 0 0.19
师生比 × 生均支出 −89.79 0.72 2.31 0.84
师生比 × 英语学习者比例 −81.66 −0.87 −5.09 −0.55
免费午餐 × 兼职教师指数 29.42 −0.92 −8.17 −0.95

大数据集上 OLS 的系数巨大且杂乱(生均支出 −1020.77):OLS 靠给某些变量极大的系数去拟合个别观测,这就是过拟合的模样。多预测变量方法的系数都很小。岭与主成分数值相近;Lasso 把 92% 的系数设为 0(包括小数据集的那 4 个变量),保留下来的与岭同号但大得多——这正是「Lasso 对小系数收缩更多、对大系数收缩更少」。

白话解释:这里的「92%」与 14.4.4 节的「剔除了 93%」不一致:56 个非零,即 761/817 ≈ 93.1% 为 0。按 14.4.4 的数字理解即可,差别不影响结论。

表中「\(k=817\) OLS」那一列系数为何这么大?817 个变量中有大量平方、立方、交互项,彼此高度共线。共线时 \(X^\top X\) 接近奇异,求逆会把噪声放大成巨大的、正负相抵的系数——一个变量 +1000、另一个相关变量 −1000,样本内两者几乎抵消,样本外一旦相关结构稍有不同就失控。这和均值–方差优化在高度相关资产上给出大多大空权重是同一个病。

原书图 14.8 的散点图还显示:三种方法的 MSPE 相近,但对单个学校的预测可以相差 15 分以上。总体精度相同不代表个体预测相同——对量化而言,两个 IC 相同的模型可以给出很不同的持仓。


14.7 结论与延伸

预测回归的系数没有因果解释,但这不妨碍预测。三种方法都以偏差换方差,方式不同:

  • Lasso:把许多系数设为 0,适合神谕模型稀疏或近似稀疏时。
  • 主成分回归:适合预测变量(或变量组)高度相关时,少数主成分即可捕获大部分变异。
  • 岭回归:对所有系数平滑收缩,不依赖稀疏或高相关,适合没有先验理由假设稀疏、回归元也不高度相关时。

专栏:文本作为数据。把文本转为数值的经典做法是统计词或短语在每段文本中出现的次数(Mosteller & Wallace 1963,文体计量学的基础)。文本中所有词的集合称为词袋(bag of words),感兴趣的词表称为词典(dictionary)。词频作为预测变量,文本问题就变成回归问题。词典通常很大,预测变量数相对文本数很多,本章方法直接可用;PCA 尤其有用,因为词常成组出现(球赛报道的词和宏观报道的词各成一组)。

原书推荐的延伸阅读包括 James 等《An Introduction to Statistical Learning》(2013),以及用卫星图像预测贫困(Jean et al. 2016)、机器学习用于司法判决(Kleinberg et al. 2018)等应用。


量化实战

本章方法在量化里的位置

横截面收益预测与多因子合成。 每个月用几百上千个候选因子(技术、基本面、分析师、另类数据及其交互)预测下月收益,正是「\(k/n\) 大、信噪比极低」的问题。OLS 合成会严重过拟合;岭回归对应「所有因子都给小权重」,因子高度共线时最稳健;Lasso 对应「因子筛选」,给出可解释的稀疏组合;主成分回归对应「先提取少数风格,再在风格上回归」。实务中常用弹性网(elastic net,\(L_1+L_2\) 惩罚)折中两者。

收益预测的信噪比。 月度个股收益中可预测部分的 \(R^2\) 通常只有百分之几。此时 (14.3) 的第二项(估计误差)与第一项(不可预测噪声)相比很容易就不可忽略,收缩几乎总是必要的。评价指标除 MSPE 外,量化中还常用样本外 \(R^2_{oos}=1-\sum(Y-\hat Y)^2/\sum(Y-\bar Y_{train})^2\) 和 IC(预测值与实际收益的秩相关)。

PCA 与风险模型。 统计风险模型从收益协方差矩阵提取前若干主成分作为风险因子,用碎石图判断因子个数;利率曲线的「水平、斜率、曲率」三因子也是 PCA 结果。

收缩思想贯穿组合构建。 James–Stein 的思想直接对应预期收益估计向截面均值收缩、协方差矩阵向结构化目标收缩(Ledoit–Wolf)。均值–方差优化对输入误差极其敏感,收缩是降低样本外损失的关键。

防止前视偏差与数据窥探。

  • 标准化必须只用训练集的均值和标准差(14.6.1 节);在交叉验证内部也要每折单独标准化(用 Pipeline 实现)。用全样本统计量标准化就是把未来信息泄露进了模型。
  • 调参后的 CV 误差偏乐观,必须有一个从未触碰的预留测试集——对应回测中的「最终样本外」检验。反复在测试集上试模型,测试集就变成了训练集。
  • 金融数据有时间依赖,随机 m 折 CV 要改为按时间分块的 CV,并在训练集与验证集之间留出间隔(purge/embargo),避免标签重叠带来的泄露。
  • 岭与 Lasso 对回归元形式敏感:因子是否做行业与市值中性化、是否截面排序标准化,会改变结果,需要在研究规范中固定下来。

示例:(1+k/n) 的验证、James–Stein,以及 600 个候选因子的收益预测

数据设定:每只股票有 600 个候选特征,它们由 8 个潜在「风格」加独立噪声构成,因而高度相关;下月收益依赖 2 个潜在风格和 5 个具体特征,再加上大得多的噪声。训练集 1000 只股票,测试集另取 1000 只。

import numpy as np
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression, RidgeCV, LassoCV
from sklearn.decomposition import PCA
from sklearn.model_selection import KFold, GridSearchCV, cross_val_score
from scipy.stats import spearmanr

rng = np.random.default_rng(14)

# ---- 1. 验证 MSPE_OLS ≈ (1 + k/n) σ_u^2 ----
n, sig = 500, 1.0
for k in [10, 100, 200, 400]:
    mspe = []
    for rep in range(200):
        X = rng.standard_normal((n, k)); b = rng.normal(0, 0.1, k)
        y = X @ b + sig*rng.standard_normal(n)
        bh = np.linalg.lstsq(X, y, rcond=None)[0]
        Xo = rng.standard_normal((2000, k))
        yo = Xo @ b + sig*rng.standard_normal(2000)
        mspe.append(np.mean((yo - Xo @ bh)**2))
    print(f"k/n = {k/n:.2f}:  模拟 MSPE = {np.mean(mspe):.3f}   1+k/n = {1+k/n:.3f}"
          f"   1+k/(n-k-1) = {1+k/(n-k-1):.3f}")

# ---- 2. James–Stein:k 个均值同时估计,向 0 收缩 ----
k, reps = 10, 20000
theta = rng.normal(0, 1, k)                  # 固定的一组真值
Z = theta + rng.standard_normal((reps, k))   # 每行是一次观测,方差 1
c = np.clip(1 - (k-2)/np.sum(Z**2, axis=1, keepdims=True), 0, None)  # 正部 JS
print(f"\nJames–Stein: MSE(原估计) = {np.mean(np.sum((Z-theta)**2,1)):.2f},"
      f"  MSE(JS) = {np.mean(np.sum((c*Z-theta)**2,1)):.2f}")

# ---- 3. 截面收益预测:600 个高度相关的候选因子 ----
n_tr, n_te, k, n_lat = 1000, 1000, 600, 8
def make(nobs):
    F = rng.standard_normal((nobs, n_lat))                    # 8 个潜在风格
    L = rng_load                                              # 因子载荷(固定)
    Xr = F @ L + 0.8*rng.standard_normal((nobs, k))           # 600 个特征 = 潜在风格 + 噪声
    signal = 0.25*F[:, 0] - 0.15*F[:, 1] + Xr[:, :5] @ np.array([.06, -.05, .04, .04, -.03])
    ret = signal + 1.0*rng.standard_normal(nobs)              # 下月收益(标准化单位)
    return Xr, ret, signal
rng_load = rng.normal(0, 1, (n_lat, k)) / np.sqrt(n_lat)
Xtr, ytr, _ = make(n_tr)
Xte, yte, ste = make(n_te)
print(f"\n神谕 root MSPE(只剩噪声)≈ {np.sqrt(np.mean((yte-ste)**2)):.3f};"
      f"  用均值预测 = {np.sqrt(np.mean((yte-ytr.mean())**2)):.3f}")

cv = KFold(10, shuffle=True, random_state=0)
lams = np.logspace(0, 5, 40)
models = {
    "OLS":   make_pipeline(StandardScaler(), LinearRegression()),
    "岭":    make_pipeline(StandardScaler(), RidgeCV(alphas=lams, cv=cv)),
    "Lasso": make_pipeline(StandardScaler(), LassoCV(cv=cv, alphas=60, max_iter=5000,
                                                     random_state=0)),
    "主成分": GridSearchCV(make_pipeline(StandardScaler(), PCA(), LinearRegression()),
                         {"pca__n_components": [1, 2, 4, 6, 8, 10, 15, 20, 30, 50, 80]},
                         cv=cv, scoring="neg_mean_squared_error"),
}
for name, m in models.items():
    m.fit(Xtr, ytr)
    pred = m.predict(Xte)
    rmspe = np.sqrt(np.mean((yte - pred)**2))
    r2oos = 1 - np.sum((yte-pred)**2) / np.sum((yte-ytr.mean())**2)
    ic = spearmanr(pred, yte)[0]
    extra = ""
    if name == "岭":
        extra = f"λ = {m[-1].alpha_:.0f}"
    if name == "Lasso":
        lam = 2*n_tr*m[-1].alpha_                   # 换算成 (14.9) 中的 λ
        extra = f"λ = {lam:.1f}, 非零系数 {np.sum(m[-1].coef_ != 0)}/{k}"
    if name == "主成分":
        extra = f"p = {m.best_params_['pca__n_components']}"
    print(f"{name:6s} 样本外 root MSPE = {rmspe:.3f}  R2_oos = {r2oos:6.3f}"
          f"  IC = {ic:.3f}  {extra}")

# 10 折 CV 的 root MSPE(样本内估计)对比:以岭为例
ridge_best = make_pipeline(StandardScaler(),
                           RidgeCV(alphas=[models['岭'][-1].alpha_]))
cvm = -cross_val_score(ridge_best, Xtr, ytr, cv=cv, scoring="neg_mean_squared_error")
print(f"岭:10 折 CV root MSPE = {np.sqrt(cvm.mean()):.3f}(调参后略乐观)")

# ---- 4. 碎石图:主成分解释的方差比例 ----
pca_scree = PCA().fit(StandardScaler().fit_transform(Xtr))
cum = np.cumsum(pca_scree.explained_variance_ratio_)
print(f"\n碎石图:PC1 解释 {pca_scree.explained_variance_ratio_[0]:.1%},"
      f"前 8 个累计 {cum[7]:.1%},前 20 个累计 {cum[19]:.1%}")

关键输出:

k/n = 0.02:  模拟 MSPE = 1.022   1+k/n = 1.020   1+k/(n-k-1) = 1.020
k/n = 0.20:  模拟 MSPE = 1.245   1+k/n = 1.200   1+k/(n-k-1) = 1.251
k/n = 0.40:  模拟 MSPE = 1.661   1+k/n = 1.400   1+k/(n-k-1) = 1.669
k/n = 0.80:  模拟 MSPE = 4.964   1+k/n = 1.800   1+k/(n-k-1) = 5.040

James–Stein: MSE(原估计) = 10.01,  MSE(JS) = 5.97

神谕 root MSPE(只剩噪声)≈ 1.021;  用均值预测 = 1.071
OLS    样本外 root MSPE = 1.603  R2_oos = -1.240  IC = 0.104  
岭      样本外 root MSPE = 1.029  R2_oos =  0.077  IC = 0.279  λ = 9427
Lasso  样本外 root MSPE = 1.031  R2_oos =  0.073  IC = 0.274  λ = 108.9, 非零系数 29/600
主成分    样本外 root MSPE = 1.030  R2_oos =  0.075  IC = 0.284  p = 8
岭:10 折 CV root MSPE = 1.015(调参后略乐观)

碎石图:PC1 解释 9.2%,前 8 个累计 58.9%,前 20 个累计 61.6%

读结果:

  • 第 1 部分:\(k/n\) 小时 (14.4) 很准;\(k/n\) 大时真实膨胀远超 \(1+k/n\),与 \(1+k/(n-k-1)\) 吻合。
  • 第 2 部分:同时估计 10 个均值,向 0 收缩使总 MSE 从 10.0 降到 6.0,尽管真值并不为 0。
  • 第 3 部分:\(k/n=0.6\) 时 OLS 的样本外 \(R^2\) 为 −124%,比「用训练集均值预测」还差得多;IC 0.10 说明它仍抓住了一点信号,但被噪声淹没。三种收缩方法的 root MSPE 都接近神谕值 1.021,样本外 \(R^2\) 约 7.5%、IC 约 0.28。这里信号来自少数潜在风格,碎石图在第 8 个主成分后陡然变平,CV 选出 \(p=8\) 正好对上;Lasso 只保留 29 个特征。
  • 10 折 CV 的 root MSPE(1.015)略低于真实样本外值(1.029),这是调参带来的乐观偏差,和原书 14.6 节的提醒一致。
  • 实现细节:StandardScaler 放在 Pipeline 里,CV 每一折都只用训练折的均值和标准差;sklearn 的 Ridge 的 alpha 就是 (14.7) 的 \(\lambda\),Lasso 的目标函数多了 \(1/(2n)\) 因子,所以 (14.9) 中的 \(\lambda=2n\cdot\alpha\)。

本章小结

预测的目标是对未参与估计的样本外观测做出准确预测,衡量标准是 MSPE,预测模型的系数不需要因果解释,但需要样本外与样本内同分布。MSPE 等于神谕预测误差方差加上估计误差(方差 + 偏差平方);OLS 无偏,但其 MSPE 约为 \((1+k/n)\sigma_u^2\),预测变量多时很差。收缩估计量以偏差换方差,James–Stein 证明了 \(k\ge3\) 时收缩对任何真值都有利。MSPE 用分样本或 m 折交叉验证估计;调参后的 CV 误差偏乐观,需要预留测试集。岭回归(\(L_2\) 惩罚)按比例收缩、能处理 \(k>n\);Lasso(\(L_1\) 惩罚)做软阈值、产生稀疏解;主成分回归利用预测变量的高相关降维。岭与 Lasso 对回归元的线性组合方式敏感。所有标准化与主成分权重都必须用样本内统计量计算。在 817 个预测变量的学校数据上,三种方法的样本外 root MSPE 约 39,而 OLS 为 64.4。

概念 公式 / 要点
MSPE \(E[(Y^{oos}-\hat Y(X^{oos}))^2]\);神谕预测 \(E(Y\mid X)\)
MSPE 分解 \(\sigma_u^2+E[(\sum_j(\hat\beta_j-\beta_j)X_j^{oos})^2]\)
OLS 的 MSPE \(\approx(1+k/n)\sigma_u^2\)(\(k/n\) 小时)
James–Stein \((1-(k-2)/\Vert \hat\beta\Vert ^2)\hat\beta\),\(k\ge3\) 时一致优于 OLS
m 折 CV \(\frac1m\sum_i(n_i/(n/m))\widehat{\text{MSPE}}_i\)
岭回归 \(\min\ SSR+\lambda\sum b_j^2\);\(\hat\beta^{R}=(X^\top X+\lambda I)^{-1}X^\top Y\);不相关时 \(\hat\beta_j/(1+\lambda/\sum X_{ji}^2)\)
Lasso \(\min\ SSR+\lambda\sum\vert b_j\vert \);\(k=1\) 时 \(\text{sign}(\hat\beta)\max(\vert \hat\beta\vert -\frac{\lambda}{2\sum X_i^2},0)\)
主成分 相关矩阵的特征向量;两变量 \(PC_{1,2}=(X_1\pm X_2)/\sqrt2\),方差 \(1\pm\vert \rho\vert \)
样本外预测 \(\hat Y^{*oos}=\bar Y^*+\sum_j\tilde\beta_j(X_j^{*oos}-\bar X_j^*)/s_{X_j^*}\),统计量全部来自样本内
方法选择 稀疏用 Lasso,高相关用 PCR,两者都不明显用岭

练习

基础

  1. (原书习题 14.5)\(Y\) 的均值 \(\mu=2\)、方差 25。(a) 神谕预测是什么?其 MSPE 是多少?(b) 用 \(n=10\) 个独立观测的样本均值预测一个新观测,MSPE 是多少? 答案要点:(a) 预测 \(\mu\),MSPE \(=25\);(b) \(Y-\bar Y=(Y-\mu)-(\bar Y-\mu)\),两项独立,MSPE \(=25+25/10=27.5\)。
  2. (原书习题 14.6–14.7)接上题,改用 \(\bar Y/2\) 预测。分别在 \(\mu=2\) 和 \(\mu=10\) 时计算 MSPE;再说明为什么用 \(\bar Y-1\) 预测必然更差。 答案要点:\(\mu=2\) 时 \(25+0.625+1=26.6<27.5\);\(\mu=10\) 时 \(25+0.625+25=50.6\)。\(\bar Y-1\) 只加偏差而不减方差。
  3. (原书习题 14.9–14.10)\(n=1\),\(y_1=2\),\(x_1=1\)。求 \(\lambda_{Ridge}=0.5,1,3\) 时的岭估计与 \(\lambda_{Lasso}=0.5,1,5\) 时的 Lasso 估计。 答案要点:岭 \(2/(1+\lambda)\):1.33、1、0.5;Lasso \(\max(2-\lambda/2,0)\):1.75、1.5、0。
  4. (原书复习题 14.1)成绩对减价午餐比例回归,系数显著、\(R^2\) 很高。能否据此得到「减价午餐的因果效应」?能否用来预测? 答案要点:不能作因果解释(遗漏变量,如家庭收入);可以用于预测,只要样本外与样本内同分布。
  5. (原书习题 14.1 改编)标准化回归 \(\widehat{TestScore}=-48.7\,RPM+8.7\,TExp\),样本内 TestScore 均值 750.1;RPM 均值 0.60、标准差 0.28;TExp 均值 13.2、标准差 3.8。预测 \(RPM=0.52\)、\(TExp=11.1\) 的学校。 答案要点:标准化后 \(RPM=(0.52-0.60)/0.28=-0.286\),\(TExp=(11.1-13.2)/3.8=-0.553\);预测 \(=750.1+(-48.7)(-0.286)+8.7(-0.553)\approx750.1+13.9-4.8=759.2\)。

进阶

  1. (原书习题 14.11)设 \(X_1,X_2\) 标准化,相关系数 \(\rho>0\)。证明 \(PC_1=(X_1+X_2)/\sqrt2\),\(\text{cov}(PC_1,PC_2)=0\),\(\text{var}(PC_{1,2})=1\pm\rho\)。 提示:在 \(w_1^2+w_2^2=1\) 下最大化 \(1+2w_1w_2\rho\);\(w_1w_2\le(w_1^2+w_2^2)/2\)。
  2. (原书习题 14.12)固定效应面板 \(Y_{jt}=\alpha_j+u_{jt}\),每个实体 \(T\) 期。证明用 \(\bar Y_j\) 预测下一期的 MSPE \(=\sigma_u^2(1+1/T)\),并说明这是 (14.4) 精确成立的例子(\(k\) 个实体,\(n=kT\))。 提示:\(k/n=1/T\)。
  3. (原书习题 14.3)为什么回归标准误 SER 会低估样本外 root MSPE?大约差多少? 答案要点:SER 是样本内拟合误差,没有包含系数估计误差(而且 OLS 正是为了让样本内残差小而选系数);样本外约为 \(\text{SER}\times\sqrt{1+k/n}\)。
  4. 在本章代码第 3 部分,把训练集缩小到 300 只股票(\(k/n=2\))。OLS 还能用吗?三种收缩方法的表现如何变化? 提示:\(k>n\) 时 OLS 解不唯一(LinearRegression 返回最小范数解),预测极差;收缩方法仍可用,但离神谕更远。
  5. 修改本章代码,把「用全部 2000 只股票(含测试集)的均值和标准差标准化」与正确做法比较。在这个模拟里差别大吗?在什么样的真实数据里差别会很大? 提示:独立同分布的模拟里差别很小;真实面板中特征分布随时间漂移(例如估值整体抬升),用含未来数据的统计量标准化会带来前视偏差。

原书推荐习题:14.5、14.6、14.7(均值预测中的 MSPE 分解与收缩的偏差–方差权衡);14.9、14.10(单点手算岭与 Lasso);14.11(两变量 PCA);14.12(\((1+k/n)\) 精确成立的例子);14.1(标准化与还原,防止实现错误);实证题 E14.1(完整走一遍 OLS/岭/Lasso/PCA + CV + 样本外评估,可直接改造成因子预测练习)。


原书对照

本章内容 原书章节 PDF 页码
章引言 第 14 章开篇 p.515–516
什么是大数据 14.1 p.516–517
MSPE、神谕预测、标准化模型、\((1+k/n)\)、James–Stein、交叉验证 14.2 p.517–524
岭回归 14.3 p.525–528
Lasso 14.4 p.528–532
主成分、碎石图、主成分回归 14.5 p.532–537
学校成绩的样本外评估(表 14.2–14.4) 14.6 p.537–543
结论、文本作为数据专栏 14.7 p.543–545
复习题、习题与实证题 第 14 章末 p.546–551
数据说明;\(k=1\) 时 (14.4)、岭、Lasso 的推导;样本外预测步骤 附录 14.1–14.5 p.552–554

注:原书页码 = PDF 页码 − 1。