因子投资方法论
第 1 章立起了核心公式 $\E[R_i^e] = \alpha_i + \boldsymbol{\beta}_i^{\top}\boldsymbol{\lambda}$,本章回答"怎么算、怎么验":怎么把抽象的因子变成一个可交易的组合并算出 $\boldsymbol{\lambda}$,怎么估计 $\boldsymbol{\beta}$,怎么用统计检验判断 $\alpha$ 是运气还是真本事。排序法、Fama–MacBeth 回归、Newey–West 标准误、GRS 检验、GMM——这些名字几乎出现在每一篇实证资产定价论文里。读完本章,你手里就有了读懂并复现这些论文的整套统计武器。
2.1投资组合排序法
先回到一个第 1 章遗留的问题。因子的定义是"驱动众多资产共同运动的系统性风险来源",这个定义很抽象:估值水平是因子、GDP 也可以是因子,但"价值因子这个月赚了多少"到底怎么算?答案是给抽象的因子找一个实体载体——一个专门为它构建的投资组合,用组合的收益率代表因子的收益率。
为某个因子量身定做的组合:它的涨跌只跟这个因子有关,跟别的因子和个股噪声都尽量无关,于是它每期的收益率就可以当作"这个因子本期的收益率"。
严格地说,因子模拟组合要满足两个条件:条件一,只在目标因子上有大于零的暴露,在其他所有因子上的暴露为零;条件二,在满足条件一的所有组合中,它的特质性风险(idiosyncratic risk)最小。
条件一保证"纯":如果组合还暴露于别的因子,它的收益率就是几个因子收益的混合,无法归因。条件二保证"准":组合收益率中除了因子还有个股自身的随机扰动 $\varepsilon$,扰动占比越高,用它衡量因子收益的误差就越大,所以要在合格的组合里挑噪声最小的那个。
一个假想市场里有因子 A、B 和四只股票(数字为编造的示意):
| 对因子 A 的暴露 | 对因子 B 的暴露 | 特质性风险 | |
|---|---|---|---|
| 股票一 | +1.0 | +1.0 | 20% |
| 股票二 | +1.0 | +1.0 | 25% |
| 股票三 | +1.0 | −1.0 | 40% |
| 股票四 | +1.0 | −1.0 | 20% |
想构建因子 A 的模拟组合。等权买入股票一、二是错的:它们对 B 的暴露也是 +1,组合收益混入了因子 B。等权买入股票一、三或者股票一、四都能让 B 的暴露对消(+1 与 −1 相抵),满足条件一;再按条件二挑特质风险更小的搭配——股票四的特质风险低于股票三——最终答案是等权配置股票一和股票四。
排序法:绕开"先有鸡还是先有蛋"
上面的构建有一个前提:已知每只股票在每个因子上的暴露。但暴露 $\beta$ 通常要靠"股票收益对因子收益回归"来估计——也就是说,算 $\beta$ 需要先有因子收益率,而算因子收益率又需要先有 $\beta$。这就是一个"先有鸡还是先有蛋"的死结。投资组合排序法(portfolio sort)的价值就在于用一个巧妙的近似绕开它。
不去算精确的暴露,而是相信"某个指标高的股票,对相应因子的暴露也高":按指标把股票排序分组,买入最高的一组、卖空最低的一组,用这个多空组合的收益代表因子收益。
把用来排序的指标称为排序变量(sort variable)。核心思想只有一句话:用排序变量取值的高低代替因子暴露的高低。注意它没有假设"变量取值 = 因子暴露",也没有假设二者满足任何函数关系,只假设二者单调相关。以账面市值比(book-to-market ratio,BM,市净率的倒数)为例:只需相信高 BM 股票对价值因子的暴露更高即可。
这也解释了排序法的适用边界:它只适用于风格因子(style factor)——由财务或量价数据构建、每只股票都有对应指标的因子(估值、市值、盈利、低波动……)。像 GDP 这样的宏观经济因子,个股层面找不到对应的排序变量,就得改用 2.2 节的回归方法。
排序法的操作分三步(以 BM 构建价值因子为例):
- 排序:确定股票池,把所有股票按 BM 在截面上从高到低排序。若变量与收益负相关(如波动率),则按惯例从低到高排。
- 分组:按分位数分成 $L$ 组(惯例 $L=10$,即十分位)。做多排名最高的一组、做空最低的一组,且多空两头金额相等(资金中性),得到价差组合(spread portfolio)。组内个股常用市值加权或等权。这个价差组合就是排序法版本的因子模拟组合,它的收益率就是因子收益率。
- 定期更新:股票的 BM 会变,需按月或按年再平衡(rebalance),重复前两步;两次再平衡之间记录组合收益,时间上串起来就得到因子收益率序列 $\{\lambda_t\}$。
排序检验(一):因子预期收益率的 t 检验
有了 $\{\lambda_t\}$,第一件事是检验"这个因子长期到底赚不赚钱"。原假设 $H_0$ 是因子预期收益为零——即这个因子不被定价,多空收益只是噪声。检验用的是最基础的单样本 t 检验:
原书用 2000—2019 年 A 股数据对 BM 做了十分位排序(市值加权、每月再平衡):价值因子月均收益约 0.9%,t 值约 1.85——只能在 0.1 的显著性水平下拒绝原假设,按 0.05 的标准则不算显著。这个例子顺带演示了一个事实:一个方向正确、量级可观的因子,完全可能因为波动太大而"差一口气"过不了显著性检验。
排序检验(二):单调性
好因子除了多空收益显著,还应满足:$L$ 个分组的平均收益随分组序号单调变化——如果只有最高、最低两组表现极端而中间乱序,多空收益很可能是尾部几只股票的巧合。单调性用秩相关系数(rank correlation coefficient)度量,最常用 Spearman 秩相关系数:
下图用模拟数据演示排序检验在看什么。拖动滑杆改变"因子真实强度 $\lambda$"(数据生成时埋入的每月真实溢价),观察两件事:十个分位组合平均收益的单调梯子是否成形,以及多空价差组合的收益与 t 值如何变化。$\lambda$ 很小时,即使因子真实存在,20 年的样本也未必能让 t 过 2——统计检验的功效是有限的。
多重排序:控制第二个变量
单变量排序有一个天然缺陷:它控制不了其他因子。假想高 BM 股票恰好都是大市值股,那么按 BM 构建的价差组合无形中也做多了大市值、做空了小市值——它的收益是价值和规模两个因子的混合。补救办法是同时用两个(或三个)变量排序,统称多重排序法,其中最重要的是双重排序。
两个变量各排各的、互不干涉,然后取交集分格子:像在地图上分别画经线和纬线,格子由两组线共同切出来。
按变量 $X_1$ 分 $L_1$ 组、按 $X_2$ 独立分 $L_2$ 组(各用自己的全市场分位数作为分界),两两取交集得 $L_1\times L_2$ 个组合 $P_{ij}$(下标 $i$ 为 $X_1$ 分组、$j$ 为 $X_2$ 分组)。两个变量地位完全对称,可以同时为两个变量各构建一个因子。
把求和重排一下,可以得到完全等价的"先做差、再平均"形式:
独立排序的格子可能"贫富不均"。若 $X_1$、$X_2$ 截面相关性很高,股票会挤在对角线格子里,"高 $X_1$ 低 $X_2$"这类反对角格子可能只剩几只股票甚至为空,因子收益被少数异常值绑架。实操自查方法很朴素:数一数每个格子的股票数,格格充足才放心。这也是为什么人们通常不拿高度相关的两个变量做独立双重排序。
先按第一个变量分组,再在每个组内部按第二个变量细分:第二个变量的"高低"是相对同组邻居而言的,不是相对全市场。
先按 $X_1$ 分 $L_1$ 组;在每组内部再按 $X_2$(用组内分位数)分 $L_2$ 组。由于分界线是组内算的,每个格子的股票数天然均衡,不会出现空格子。代价是两个变量地位不对称:$X_1$ 只是控制变量,检验的是"控制 $X_1$ 之后 $X_2$ 还有没有增量信息",因此只应围绕第二排序变量 $X_2$ 构建因子;给第一排序变量构建因子的含义是模糊的(Bali 等人对此有专门讨论)。
条件排序下计算 $X_2$ 因子收益率有两种做法。第一种沿用式 (2.6)/(2.8):各格子先算收益、多空各 $L_1$ 个格子等权平均再相减。第二种是"并集法"——先把股票挑出来合并成两个大组合,再整体加权:
分组数的惯例。研究异象时常用 5×5 或 10×10;研究因子时最常见的是市值 + 另一变量的 2×3 独立双重排序——市值分大小两组、另一变量按 30%/40%/30% 分高中低三组,交集出 6 个组合。这套做法源自 Fama and French(1993)构建 SMB 与 HML 因子,作为多因子模型的开山之作,它的每个细节都被后人沿用成了行规(第 4 章详述)。近年也有三重排序(triple sorting):如 Hou 等人的 q 因子模型用市值、投资、盈利三个维度排序,动机是盈利和投资效应在小盘股中更强,需要同时控制市值。
因子命名约定
同一个因子在文献里常有三种名字,以 BM 为例:按构建方式叫 HML(High-Minus-Low,做多高 BM、做空低 BM),按变量叫 BM 因子,按风格叫价值因子。FF 式命名的好处是名字自带方向信息——HML、RMW(Robust-Minus-Weak,盈利因子)表示变量与收益正相关,SMB(Small-Minus-Big,规模因子)表示负相关;坏处是因子一多就不够用、也不直观。本手册与原书一致,采用风格命名:用 BM 构建的叫价值因子、用 ROE 构建的叫盈利因子。理由有二:绝大多数研究对象是风格因子,风格名传达的信息最清楚;业界常用多个指标合成同一风格(如 BM 与盈利市值比 EP 合成价值),用单一变量命名会以偏概全。
- 因子模拟组合 = 只暴露于目标因子(纯)+ 特质风险最小(准);它的收益率就是因子收益率。
- 排序法用"变量高低"代替"暴露高低",绕开了"先有 β 还是先有 λ"的死结,但只适用于风格因子。
- 检验两件事:多空收益的 t 检验($t=\hat{\lambda}\sqrt{T}/\mathrm{std}$)与分组收益的单调性(Spearman 秩相关)。
- 单变量排序控制不了其他因子;双重排序中,独立排序对称但格子可能失衡,条件排序均衡但只能检验第二变量。
- 研究因子的行规是市值 + 变量的 2×3 独立排序(FF 1993 遗产);本书按风格给因子命名。
2.2多因子模型的回归检验
排序法解决了"造因子"的问题,本节解决"验模型"的问题——这是全章的核心。回顾第 1 章式 (1.3),多因子模型断言资产的预期超额收益完全由暴露决定:
无论用哪种回归方法,检验都是同样的三步:(1)估计每个资产的暴露 $\boldsymbol{\beta}_i$;(2)估计截面关系(得到 $\boldsymbol{\lambda}$ 和 $\alpha_i$);(3)检验——联合检验 $N$ 个 $\alpha_i$ 是否为零,以及逐个检验因子溢价 $\lambda_k$ 是否显著。三种方法(时序回归、截面回归、Fama–MacBeth 回归)的区别只在第(2)步怎么做。
时序回归:Black–Jensen–Scholes
当因子收益率序列已知时——风格因子用排序法就能算出 $\boldsymbol{\lambda}_t$——最直接的办法是把它当作解释变量,对每个资产做一次时序回归。这套做法由 Black、Jensen 和 Scholes 在 1972 年检验 CAPM 时首创:
时序回归隐含的截面直线有一个漂亮的几何特征。以单因子为例:$\beta=0$ 的资产预期收益为 0;把因子组合自己放到截面上,它对自身的暴露是 1、平均收益是 $\bar{\lambda}$。所以这条直线必然穿过 $(0,0)$ 和 $(1,\bar{\lambda})$ 两点——它由这两个点钉死,完全不理会其他资产落在哪里,所有资产的 $\hat{\alpha}_i$ 只是各自到这条线的竖直距离。这是它与截面回归最本质的区别:截面回归的直线是靠最小化所有资产 $\alpha$ 的平方和拟合出来的。
估计完了要检验"$N$ 个 $\alpha_i$ 联合是否为零"。若 $\varepsilon_{i,t}$ 无自相关、无异方差且服从 IID 正态,Gibbons、Ross 和 Shanken(1989)给出了精确的有限样本检验,即大名鼎鼎的 GRS 检验:
GRS 是有限样本下的精确检验(不是大样本近似),且检验效力高,这是它统治学术界三十多年的原因;代价是依赖正态假设,且要求 $T$ 大于 $N+K$。当残差存在相关性或异方差时,可改用 GMM(2.7 节)。至于每个因子的溢价 $\lambda_k$,因子收益率序列已知,直接按 2.1.2 节做 t 检验即可。
两步截面回归
时序回归的前提"因子收益率已知"对宏观经济因子(GDP、CPI、利率)不成立——没法做多 GDP。截面回归(cross-sectional regression)不需要这个前提,它分两步走,故又称两步回归估计(two-pass regression estimate)。
第一步(时序):用因子的取值序列 $\boldsymbol{f}_t$ 作解释变量,对每个资产估计暴露:
第二步(截面):把 $N$ 个资产的时序平均收益 $\bar{R}_i^e$ 对 $\hat{\boldsymbol{\beta}}_i$ 做一次截面回归:
标准误方面,Cochrane(2005)在"因子与残差独立、各自 IID"的假设下给出了 $\hat{\boldsymbol{\lambda}}$ 与 $\hat{\boldsymbol{\alpha}}$ 的协方差矩阵(式 2.22–2.23):
$$ \Var(\hat{\boldsymbol{\lambda}}) = \frac{1}{T}\Big[ (\boldsymbol{\beta}^{\top}\boldsymbol{\beta})^{-1}\boldsymbol{\beta}^{\top}\boldsymbol{\Sigma}\,\boldsymbol{\beta}(\boldsymbol{\beta}^{\top}\boldsymbol{\beta})^{-1} + \boldsymbol{\Sigma}_f \Big], \qquad \Cov(\hat{\boldsymbol{\alpha}}) = \frac{1}{T}\,\boldsymbol{M}\,\boldsymbol{\Sigma}\,\boldsymbol{M}^{\top}, $$其中 $\boldsymbol{\Sigma}=\Cov(\boldsymbol{\varepsilon}_t)$、$\boldsymbol{\Sigma}_f=\Cov(\boldsymbol{f}_t)$、$\boldsymbol{M} = \boldsymbol{I}_N - \boldsymbol{\beta}(\boldsymbol{\beta}^{\top}\boldsymbol{\beta})^{-1}\boldsymbol{\beta}^{\top}$ 是投影残差矩阵;实际使用时以样本量代替总体量。有了 $\Cov(\hat{\boldsymbol{\alpha}})$ 就可以构建联合检验 $\hat{\boldsymbol{\alpha}}^{\top}\Cov(\hat{\boldsymbol{\alpha}})^{+}\hat{\boldsymbol{\alpha}} \sim \chi^2_{N-K}$(上标 $+$ 表示伪逆——$\Cov(\hat{\boldsymbol{\alpha}})$ 秩亏,自由度也因此是 $N-K$ 而非 $N$)。
第二步回归的"自变量"其实是第一步的估计值,自带误差;用带误差的尺子量东西,量出来的结果会系统性偏差,报出的把握(标准误)也会虚高。
$\hat{\boldsymbol{\beta}}_i$ 是估计值而非真值,这类解释变量称为生成回归变量(generated regressors),带来计量经济学中经典的变量误差(errors-in-variables,EIV)问题:$\hat{\boldsymbol{\lambda}}$ 的估计有偏(经典 EIV 中趋向于把系数往零压),且忽略这层误差会低估标准误。Shanken(1992)修正的做法是给 $\Var(\hat{\boldsymbol{\lambda}})$ 中来自残差的第一项乘上放大系数 $\big(1+\boldsymbol{\lambda}^{\top}\boldsymbol{\Sigma}_f^{-1}\boldsymbol{\lambda}\big)$——因子信噪比越高,修正越小。此外,$\alpha_i$ 在截面上相关会让 OLS 标准误严重低估,可改用 GLS:$\hat{\boldsymbol{\lambda}}_{GLS} = (\boldsymbol{\beta}^{\top}\boldsymbol{\Sigma}^{-1}\boldsymbol{\beta})^{-1}\boldsymbol{\beta}^{\top}\boldsymbol{\Sigma}^{-1}\bar{\boldsymbol{R}}^e$——按"噪声小的资产多说话"重新加权。
截面回归的赠品:纯因子组合
截面 OLS 的解 $\hat{\boldsymbol{\lambda}} = (\boldsymbol{\beta}^{\top}\boldsymbol{\beta})^{-1}\boldsymbol{\beta}^{\top}\bar{\boldsymbol{R}}^e$ 里藏着一个非常重要的副产品。把前面那块矩阵单独拎出来:
时序 vs 截面:同一条直线的两种画法
对风格因子来说两种方法都可用,差异可以浓缩成一张对照:时序回归的截面直线被 $(0,0)$ 和 $(1,\bar{\lambda})$ 两点钉死,因子溢价就是排序组合收益的时序均值;截面回归的直线以最小化全体 $\hat{\alpha}_i^2$ 为目标、同时利用所有资产的信息,因子溢价是纯因子组合的收益。两者给出的 $\hat{\lambda}$ 一般不相等。一个实用技巧:把两种方法同时跑一遍,如果时序回归的直线斜率为正、截面回归的斜率却为负(各资产平均收益与 β 整体呈负相关,只有因子组合自己在高处),说明这个因子"只富了自己、没富截面",多半有问题,需要进一步排查。
Fama–MacBeth 回归
不做"一次"截面回归,而是每个月都做一次,得到 T 个因子收益率估计;把这 T 个数当作 T 个独立样本,用它们的均值和波动来做检验。
第一步与两步截面回归完全相同:时序回归估计 $\hat{\boldsymbol{\beta}}_i$。第二步不同:不是把收益先做时间平均再回归一次,而是在每一期 $t$ 都做一次截面回归——$T$ 期就是 $T$ 次回归。原文为检验 CAPM 而生,却因其巧妙的标准误处理成为计量经济学被引最多的论文之一;Petersen(2009)统计,面板数据研究中约三分之一仍在使用它。
Fama–MacBeth 还有一个实践上极受欢迎的性质:它不要求 $\hat{\boldsymbol{\beta}}_i$ 全程不变。原文就用滚动窗口估计暴露——第 $t$ 期的截面回归使用截至 $t-1$ 期数据估出的 $\hat{\boldsymbol{\beta}}_{i,t-1}$:
"Fama–MacBeth 修正了所有标准误问题"——不对。它只解决截面相关:把每期截面压缩成一个 $\hat{\lambda}_t$,资产之间怎么相关都无所谓。但它对两件事无能为力:(1)时序相关——若 $\hat{\lambda}_{t}$ 序列自身有自相关,$\mathrm{std}/\sqrt{T}$ 会低估标准误,需要再叠加 Newey–West 调整(2.4 节);(2)EIV——第二步用的仍是估计出来的 $\hat{\boldsymbol{\beta}}$,仍需 Shanken 修正。好在股票收益的时序相关通常很弱、截面相关很强,所以它在实务里"药效对症"。
下图展示 Fama–MacBeth 的"手感":逐期截面回归得到的 $\hat{\lambda}_t$ 是一条剧烈波动的序列(单期几乎没有信息量),检验的对象是它的均值能否从噪声里浮出来——累计均值曲线随 $T$ 增大逐渐稳定到真实溢价附近。
三种回归方法对比
| 时序回归 | 两步截面回归 | Fama–MacBeth 回归 | |
|---|---|---|---|
| 因子收益率序列 | 必须已知(排序法构建) | 不需要,任何因子取值序列即可 | 不需要 |
| β 从哪来 | 与 λ、α 同一回归给出 | 第一步时序回归 | 第一步时序回归(可滚动、可用特征代替) |
| λ 从哪来 | 因子收益率的时序均值 | 一次截面回归("先均值、再估计") | 逐期截面回归再取均值("先估计、再均值") |
| α 从哪来 | 时序回归截距 | 截面回归残差 | 逐期截面残差的时序均值 |
| 截面直线怎么定 | 被 $(0,0)$、$(1,\bar{\lambda})$ 钉死 | 最小化全体 α 平方和,用尽所有资产信息 | |
| 截面相关 | GRS 通过 $\hat{\boldsymbol{\Sigma}}$ 处理 | OLS 标准误被低估,需 GLS | 天然免疫(核心卖点) |
| 时序相关 | 假设无(否则需 GMM) | 假设无 | 无能为力,需叠加 Newey–West |
| EIV 问题 | 不存在(β 非生成变量) | 存在,Shanken 修正 | 存在,Shanken 修正 / 工具变量(2.3 节) |
| 联合检验 α | GRS(有限样本 F 检验) | $\chi^2_{N-K}$ | $\chi^2_{N-K}$ |
两点研究心得。其一,所有模型都是"不完美"的:只要往左侧塞进足够多的资产,任何多因子模型的联合检验都会被拒绝。所以实证中不用个股(一定拒绝)而用"打包"的投资组合做测试资产,且评价模型看的是因子背后的逻辑,不是统计上的完美。其二,这些方法在很大程度上殊途同归:当 $\hat{\boldsymbol{\beta}}$ 全程不变时,Fama–MacBeth 的点估计与两步截面回归完全一致(差别只在标准误)。比较不同方法的结果、理解差异从何而来,才是学它们的最大价值。
- 检验多因子模型三步走:估 β → 估截面关系(λ、α)→ 检验(α 联合为零 + λ 逐个显著)。
- 时序回归要求因子收益率已知,截距即 α,配 GRS 有限样本检验;截面直线过 $(0,0)$ 与 $(1,\bar{\lambda})$。
- 两步截面回归适用于任何因子;第二步的 β 是生成回归变量 → EIV → Shanken 修正;截面相关 → GLS。
- 截面回归附赠纯因子组合 $\boldsymbol{\Omega}=(\boldsymbol{\beta}^{\top}\boldsymbol{\beta})^{-1}\boldsymbol{\beta}^{\top}$:对自身因子暴露为 1、对其他因子为 0。
- Fama–MacBeth = 逐期截面回归 + 把 $\hat{\lambda}_t$ 当独立样本:天然处理截面相关,但处理不了时序相关和 EIV。
2.3因子暴露和因子收益率
上一节留下一个未深究的环节:Fama–MacBeth 第二步的解释变量 $\hat{\boldsymbol{\beta}}$ 到底应该从哪来?传统答案是"第一步时序回归",但它是生成回归变量,EIV 问题挥之不去。Fama 和 MacBeth 当年的缓解办法是不用个股、改用按 β 分组的投资组合做资产——个股 β 的估计误差在组合层面互相抵消。此后"用组合做测试资产"成了主流。但 Roll 等人(Jegadeesh et al. 2019)对此不买账:把个股打包成组合是一种降维,会抹掉大量截面特征;若待检验的因子恰好与这些组合正交,检验就永远发现不了它的溢价。他们主张回到个股,并给出两条对付 EIV 的新路:工具变量,以及干脆用公司特征当暴露。
路线一:工具变量
把第 $t$ 期含截距的截面回归写成矩阵形式。令 $\boldsymbol{Z}_t \equiv [\boldsymbol{1}_N,\ \hat{\boldsymbol{\beta}}_t]$($N\times(K{+}1)$),$\boldsymbol{\zeta}_t \equiv [\gamma_t, \lambda_{1t}, \dots, \lambda_{Kt}]^{\top}$,则式 (2.47) 堆叠为:
路线二:直接用公司特征
更"颠覆"的做法是砍掉第一步时序回归:把公司特征(firm characteristic)标准化后直接当作因子暴露。比如价值因子,不再回归求 β,而是直接用每只股票的 BM(标准化后)作为它对价值因子的暴露。Jegadeesh 等人在美股上做了一场"对决"实验:把时序回归 β 和公司特征同时放进 Fama–MacBeth 回归,结果是只有公司特征作为暴露的因子被定价了——特征暴露的规模、价值因子 t 值高度显著(绝对值约 4),而时序 β 暴露的因子 t 值全线跌破 2。无论用 OLS 还是 IV 估计量,结论都一样。
为什么"β 打不过特征"?两个角度:(1)日频收益噪声大,时序回归估出的 β 本身不稳定,逐期截面回归时它表现得近乎随机变量,难以载住稳定溢价;(2)真实暴露谁也没见过,β 和特征都只是它的代理变量,实证上(含原书作者在 A 股的验证)当期特征比最新的时序 β 更能预测下期收益——特征可能就是更好的代理。深层机制仍是开放问题。
两类模型的对偶
沿着这两条路,学术界把多因子模型分成了两大家族,而它们恰好是一对"对偶":一个把因子收益率当已知、解β;另一个把暴露当已知、解因子收益率。
| 时序多因子模型(学术传统,FF 1993 一脉) | 截面多因子模型(Barra 型,业界主流) | |
|---|---|---|
| 因子收益率 | 排序法构建组合,收益率可观测 | 逐期截面回归估计出来(纯因子组合收益) |
| 因子暴露 | 时序回归估计出来 | 公司特征标准化后直接给定 |
| 已知 / 待估 | 已知 $\lambda_t$,估 $\beta$ | 已知 $\beta$(=特征),估 $\lambda_t$ |
| 典型代表 | FF3、FF5、q-factor 等七大学术模型(第 4 章) | Barra CNE 系列风险模型(第 7 章) |
那么两类模型谁更能解释预期收益的截面差异?Fama and French(2020)亲自下场回答——结论有点"打脸"自家 27 年的传统:截面模型胜出,其定价误差整体上更接近零;且暴露要用时变的公司特征(把特征在时序上取平均反而变差)。他们还测试了一个"四不像":用截面回归的因子收益率、再回头做时序回归估 β——效果与传统时序模型相仿、仍不如截面模型。这说明截面模型的优势是"纯因子组合的收益率更干净"与"时变特征是更好的暴露代理"两者缺一不可。本书第 3 章按学术惯例用排序法检验因子,第 4 章则用特征暴露 + Fama–MacBeth 检验,正好让你把两类方法各练一遍。
- EIV 的三种对策:打包成组合(传统)、工具变量(奇偶月分拆估 β)、干脆用公司特征当暴露。
- 实证赛果:特征暴露的因子被定价、时序 β 暴露的因子不被定价(美股与 A 股均如此)。
- 两类模型对偶:时序模型"知 λ 估 β",Barra 截面模型"知 β(特征)估 λ"。
- FF(2020):截面模型解释力更强,条件是用时变特征;这与业界 Barra 的做法殊途同归。
2.4异象检验
过去三十年,学者们在美股"挖"出了数百个异象。Hou 等人(2020)花大力气复现了 452 个已发表的异象,结果令人尴尬:绝大多数拿不出多因子模型解释不了的显著 α(第 6 章会细说这场"复现危机")。正因为假异象遍地,检验方法本身才格外重要——本节先讲怎么检验,再讲检验中最容易踩的计量坑:异方差与自相关。
时序回归检验 α
异象组合的构造套路与因子如出一辙:选一个财务或量价指标作异象变量(anomaly variable)→ 排序法构建多空组合、得到异象收益率序列 → 检验这串收益能否被多因子模型解释。近年的趋势是用复合变量(多个指标合成打分)构造异象,如 Asness 等人的质量异象(quality minus junk)、Piotroski 和 So 的预期差异象:金融学含义更强,但变量越多越容易过拟合,这是一体两面。
计量经济学问题:异方差与自相关
暂时跳出多因子模型,看一般的线性回归。经典 OLS 的标准误公式建立在"扰动独立、同方差"之上;金融数据两条都常常不满足。把这两种"病"统一写进模型:
White 估计量与 Newey–West 估计量
估计夹心的原料只有两样:解释变量 $\boldsymbol{X}$ 和 OLS 残差 $\hat{\varepsilon}_t$。只有异方差、没有自相关时,夹心只剩"同期"项,White(1980)给出了渐进相合的估计:
要把自相关也纳进来,直觉上似乎把所有跨期项 $\hat{\varepsilon}_t\hat{\varepsilon}_s \boldsymbol{x}_t\boldsymbol{x}_s^{\top}$ 全加进去就行(式 2.62 的思路)。但这样做是错的:$T^2$ 项求和只除以 $T$,结果可能不收敛;即便收敛,加总出的矩阵也可能不正定——协方差矩阵不正定显然荒谬。Newey 和 West(1987)的解法是截断加权:
$J$ 怎么选?Newey 和 West(1994)给出常用的自动规则(式 2.65):$J = \big\lfloor 4\,(T/100)^{2/9} \big\rfloor$,其中 $\lfloor\cdot\rfloor$ 为向下取整——月度数据 240 期对应 $J=4$,600 期对应 $J=5$。
检验中最常见的特例是对单一收益率序列的均值做 Newey–West 调整(比如排序法得到的因子收益率 $\{\lambda_t\}$)。技巧是把"求均值"看成一次退化的回归:被解释变量为 $\lambda_t$、解释变量只有常数 1,回归系数恰是样本均值,残差恰是离差:
下图把这件事做成实验:对一条月均 0.5%、波动 3% 的 AR(1) 收益序列(600 个月),拖动自相关系数 $\rho$,对比朴素标准误、Newey–West 标准误和理论真值 $\sqrt{\frac{\sigma^2}{T}\cdot\frac{1+\rho}{1-\rho}}$。$\rho$ 越大,朴素公式错得越离谱;NW 大幅纠偏(高 $\rho$ 时因截断仍略有低估)。
"我的因子 t 值 2.5,稳了"——先问一句:标准误做过 Newey–West 调整吗?若收益序列一阶自相关达 0.4,朴素 t 值大约被吹大 $\sqrt{(1+0.4)/(1-0.4)} \approx 1.5$ 倍,"t=2.5"的真实水平可能只有 1.6。反过来的错误同样常见:对几乎无自相关的序列堆一个巨大的 $J$,白白增加估计噪声。$J$ 按式 (2.65) 的规则取即可。
截面回归检验异象
时序回归检验的是"异象组合的收益能否被因子收益解释";换一个角度,异象存在等价于异象变量能预测下期收益。这就回到了 Fama–MacBeth 的主场:把异象变量和多因子模型的因子变量(即构建因子用的公司特征)一起放进逐期截面回归,个股超额收益作被解释变量。异象变量的逐期回归系数 $\hat{\lambda}_t^{a}$ 串成序列后,检验其均值是否显著——标准误用式 (2.67) 做 NW 调整。若在控制了因子变量后异象变量的溢价仍显著,则认定它是多因子模型解释不了的异象。相比排序法"只能控制一两个变量、且把信息压缩成分组",截面回归可以同时控制任意多个变量、保留变量的连续取值,这是它检验异象的独特优势。
- 时序回归检验异象:$R_t^A$ 对因子收益率回归,看截距 $\alpha$ 的 t 值(自由度 $T-K-1$)。
- 异方差和自相关不弄脏 OLS 系数,只弄脏标准误;修正的靶子是三明治公式的夹心 $\boldsymbol{Q}$。
- White 管异方差($\hat{\boldsymbol{\Gamma}}_0$);Newey–West 加上截断加权的自相关项 $\sum w_j(\hat{\boldsymbol{\Gamma}}_j+\hat{\boldsymbol{\Gamma}}_j^{\top})$,Bartlett 权重保证半正定。
- 单序列均值的 NW 方差 $=\big[\hat{\gamma}_0 + 2\sum w_j \hat{\gamma}_j\big]/T$;正自相关时朴素 t 值被虚增。
- Fama–MacBeth + 控制变量 = 截面视角的异象检验:控制其他变量后异象变量是否仍预测收益。
2.5多因子模型比较
模型都不完美,但有些模型有用——那么两个模型摆在面前,怎么科学地比出高下?记住一条主线:"两个目标、两个切入点、多种方法"。两个目标(Barillas–Shanken):模型能否解释同一组测试资产(test assets);模型能否解释对方的因子(互相检验)。两个切入点:把 $N$ 个定价误差联合检验(GRS、均值–方差张成),还是逐个检验后汇总(α 检验)。方法本身不挑被解释对象——测试资产和别家因子都能当靶子。
GRS 检验:夏普比率视角
GRS 统计量在 2.2.1 节已给出(式 2.16),照公式算就行,但那串矩阵运算看不出检验的"灵魂"。它还有一个漂亮得多的等价形式:
几何图景:在(波动率, 超额收益)平面上,假设存在无风险利率且可无限借贷,有效前沿是从原点(超额收益坐标下)出发、与风险资产最小方差前沿相切的切线,斜率即切点组合的夏普比率。GRS 画两条切线——只用 $K$ 个因子的、用全部 $N+K$ 个资产的——检验第二条是否显著更陡。它只比切点,不关心前沿的其他部分。
GRS 拒绝了原假设,并不告诉你哪个资产惹的祸——联合检验只对"整体"发言。想定位罪魁,要回到逐资产的 α 检验。另外注意它的适用条件:残差 IID 正态、且 $T$ 必须大于 $N+K$(想用几百个组合当测试资产,就得有更长的样本)。
应用示例:Liu、Stambaugh 和 Yuan(2019)用 GRS 让中国版三因子模型与 FF 三因子在 A 股上互相检验——结果中国版三因子能解释 FF 因子,反之不行,故前者更适合 A 股(第 4 章详述)。
均值–方差张成检验
K 个因子按各种比例混搭,能画出一条"最优可达"的收益–风险边界;问:新加 N 个资产后,这条边界有没有实质性外扩?没有,就说这 N 个资产被原来的 K 个因子"张成"了——它们是多余的。
对每个目标预期收益,都存在方差最小的组合;把它们连成曲线就是最小方差前沿(minimum-variance frontier),由 $K$ 个因子"张成"(spanned)。张成检验比较"$K$ 个因子的前沿"与"$N+K$ 个资产的前沿"是否重合。与 GRS 最大的不同:它不假设无风险利率存在,因此不能只比一个切点,而要比整条前沿——由两基金分离定理(前沿上任意两点即可生成整条前沿),比较两个特殊组合就够了。
应用示例:Han 等人(2016)提出综合多时间尺度信息的趋势因子后,用张成检验证明短期反转、中期动量、长期反转三个传统因子无法张成它——加入趋势因子后前沿显著外扩,新因子有增量价值。
几何对比:GRS vs 张成检验
| GRS 检验 | 均值–方差张成检验 | |
|---|---|---|
| 无风险利率 | 假设存在且可无限借贷 | 不假设存在,适用面更广 |
| 几何对象 | 两条切线:只比切点组合的夏普比率 | 两条前沿:比全局最小方差组合 + 切点型组合两处 |
| 原假设 | $\boldsymbol{\alpha}=\boldsymbol{0}_N$($N$ 个约束) | $\boldsymbol{\alpha}=\boldsymbol{0}_N$ 且 $\boldsymbol{\delta}=\boldsymbol{0}_N$($2N$ 个约束) |
| 分布 | 有限样本精确 $F_{N,T-N-K}$ | 渐进 $\chi^2_{2N}$(有限样本形式见 Kan–Zhou) |
| 直觉一句话 | 新资产能否推高最大夏普比率 | 新资产能否让整条前沿外扩 |
α 检验:逐个击破再汇总
联合检验把 $N$ 个 α 捆在一起审;α 检验反其道而行:对每个测试资产单独做时序回归(式 2.50),得到 $\hat{\alpha}_i$ 及其 NW 调整后的 t 值,然后取绝对值的平均——$\mathrm{avg}|\hat{\alpha}_i|$ 和 $\mathrm{avg}|t_i|$——作为模型的"平均定价误差"记分牌。取绝对值是因为只关心偏离零的幅度、不关心方向。两个指标越低,模型越好。它的优点是简单、能定位具体是哪些资产没被解释;缺点是忽略了 α 之间的相关性、没有严格的联合分布。所以实证论文的标准操作是 GRS + α 检验搭配上阵(Hou 等 2015、FF 2020 皆如此),第 4 章的实证也会两个一起用。
贝叶斯方法:换一套哲学
频率派检验问"若 $\boldsymbol{\alpha}=\boldsymbol{0}$,数据有多反常";贝叶斯方法直接问"给定数据,哪个模型更可能是真的"。Barillas 和 Shanken(2018)把它引入模型比较:对参数 $\boldsymbol{\beta}$、$\boldsymbol{\Sigma}$ 设非正常先验(improper prior),$\boldsymbol{\alpha}$ 在原假设下为零、备择下服从 $N(\boldsymbol{0}, \tau\boldsymbol{\Sigma})$,然后计算各模型的边际似然:
这套方法也有争议。Chib 等人(2020)在 Journal of Finance 发文(标题就是在 Barillas–Shanken 的标题前加个 On,火药味十足)指出:使用非正常先验时,边际似然里含有任意常数,只有当各候选模型的先验分布、常数与参数空间完全可比时,边际似然之比才有意义,而 Barillas–Shanken 的设定不满足,须按他们的修正先验重做。贝叶斯比较模型的思想很有生命力,但具体实施尚在论战中,本手册点到为止。
- 比较模型的主线:两个目标(解释测试资产 / 解释对方因子)× 两个切入点(联合 / 逐个)。
- GRS = "加入新资产能否显著推高最大夏普比率",有限样本精确 F 检验,但只看切点、需无风险利率假设。
- 张成检验 = "新资产能否让前沿外扩",$H_0:\boldsymbol{\alpha}=\boldsymbol{0},\ \boldsymbol{\delta}=\boldsymbol{0}$($2N$ 约束),不需要无风险利率。
- α 检验用 $\mathrm{avg}|\hat{\alpha}|$、$\mathrm{avg}|t|$ 逐个记账,与 GRS 互补搭配。
- 贝叶斯方法用边际似然给模型排座次,自带简约惩罚,但先验设定仍有争议。
2.6因子正交化
业界构建多因子模型时几乎必做一步"正交化"。动机先讲经济学的:两个因子"正交"意味着它们代表不同的收益驱动力。反例是用市盈率和市净率各造一个价值因子——两个指标高度相关,两个价差组合几乎是同一个组合,模型看着有两个因子,其实只解释了收益里同一块"价值"成分。因子相似与否,体现为资产对它们的暴露在截面上的相关性;正交化就是把这种相关性压掉。
再讲统计的:用 Fama–MacBeth 截面回归求因子收益率时,暴露(解释变量)之间高度相关会让回归系数的标准误爆炸——这就是多重共线性。要理解为什么,得从回归的运行机制看起。考虑一般模型 $\boldsymbol{y}=\boldsymbol{X}\boldsymbol{b}+\boldsymbol{\varepsilon}$,其 OLS 解 $\hat{\boldsymbol{b}}=(\boldsymbol{X}^{\top}\boldsymbol{X})^{-1}\boldsymbol{X}^{\top}\boldsymbol{y}$(式 2.84)里坐着 $\boldsymbol{X}^{\top}\boldsymbol{X}$——解释变量两两之间的内积矩阵。相关性正是从这里渗进每个系数的。
基石:一元回归
回归的几何意义:投影
Gram–Schmidt 正交化与 FWL 定理
既然正交的世界如此美好,那就动手把变量改造成正交的。做法是连续正交化:按任意顺序处理解释变量,每个变量都对"前面已处理好的正交向量"回归,只留残差:
回到因子投资:Fama–MacBeth 截面回归里的 $\hat{b}_K$ 就是因子 $K$ 的收益率。暴露高度相关的两个因子,各自的"独有信息" $\boldsymbol{z}$ 都很短,因子收益率估计都极不稳定。所以业界宁可先动手改造因子:Barra 中国模型中,非线性市值因子就是对市值因子正交化后的残差。顺带一提两个实用细节:(1)不必为每个系数各跑一遍正交化——按一个顺序正交化到底后,可以从 $\hat{b}_K$ 出发倒序递推出全部系数(从 $\boldsymbol{y}$ 中减去 $\hat{b}_K \boldsymbol{x}_K$,则 $\boldsymbol{x}_{K-1}$ 成了"最后一个",以此类推);(2)正交化的顺序有经济含义——排在前面的变量保留全部原始信息,排在后面的只剩残差,所以业界惯例是把逻辑上更"根本"的因子(如市值)放前面,让衍生因子对它正交。
"正交化会改变模型的解释力"——不会。正交化只是对解释变量做可逆的线性变换,变量组张成的子空间不变,拟合值、残差、$R^2$ 全都不变;变的只是系数的归属:共同信息记到谁头上,取决于谁排在前面。因此汇报正交化因子的收益率时,必须同时说明正交化顺序,否则数字没法解读。
- 正交化的经济动机:让每个因子代表一种独立的驱动力;统计动机:压住共线性导致的标准误爆炸。
- OLS 的几何本质是垂直投影,残差与解释变量正交;变量正交时多元回归退化为一堆一元回归。
- Gram–Schmidt 连续正交化 + FWL:任何变量的多元回归系数 = 它被其余变量正交化后的残差对 $\boldsymbol{y}$ 的一元回归系数。
- $\Var(\hat{b}_K)=\sigma^2/\lVert\boldsymbol{z}_K\rVert^2$:残差越短(共线性越强),估计越不稳。
- 正交化不改变模型整体解释力,只重新分配系数——顺序即话语权。
2.7广义矩估计
前面的方法各有各的假设:GRS 要正态、截面回归要 IID、Fama–MacBeth 怕时序相关。有没有一个框架,假设最少、什么模型都能检验?有——Hansen(1982)的广义矩估计(Generalized Method of Moments,GMM)。它当年是为检验基于消费的资产定价模型(CCAPM)而生的:CCAPM 里消费与收益率的关系是非线性的,传统回归束手无策;GMM 则完全不挑模型的函数形式。Hansen 因此与 Fama、Shiller 分享了 2013 年诺贝尔经济学奖。Cochrane 说过,学 GMM 最大的障碍只是符号多;把符号拆开,它的数学核心其实就一件事——算样本均值的方差。所以先从这件小事说起。
地基:样本均值的方差
随机变量 $u_t$ 的样本均值 $\bar{u}=\frac{1}{T}\sum_t u_t$ 本身也是随机变量:换一段历史,它就换一个值。它晃动多大?由方差的展开式(式 2.100):$\Var(\bar{u}) = \frac{1}{T^2}\sum_{t}\sum_{s}\Cov(u_t, u_s)$。若 $u_t$ 独立同分布,交叉项全灭,得到统计课上最著名的结果 $\mathrm{s.e.}(\bar{u})=\sigma/\sqrt{T}$(式 2.102)。金融数据不独立,就要保留自协方差项:
GMM 三部曲
GMM 框架永远分三步:提出模型(写成矩条件)→ 连接数据(样本矩替换总体矩、估参数)→ 检验模型(算方差、做检验)。
有效性与 J 检验
为什么说 GMM 统一了前面的一切
回头看本章走过的路,几乎每个方法都是 GMM 的特例:
| 前文方法 | 对应的 GMM 设定 |
|---|---|
| 因子收益率 t 检验(2.1 节) | 单个矩条件 $\E[\lambda_t - \lambda]=0$,$n=p=1$;$S$ 只取 $\gamma_0$ 即朴素标准误 |
| Newey–West 调整(2.4 节) | 同上,但 $S$ 用截断加权和估计——NW 估计量本来就是 $S$ 的估计器 |
| 时序回归 + OLS 标准误(2.2.1 节) | 矩条件 $\E[\varepsilon_{i,t}]=0,\ \E[\varepsilon_{i,t}\boldsymbol{\lambda}_t]=\boldsymbol{0}$(OLS 正规方程即矩条件);残差 IID 时塌缩为课本公式 |
| GRS 检验(2.2.1 节) | 上一行再加正态假设后的有限样本精化;放松假设则由 J 检验接管 |
| 截面回归 / Shanken 修正(2.2.2 节) | 把第一步、第二步的矩条件同时写进 $\boldsymbol{f}$,EIV 的误差传播被公式 (2.115) 自动记账——Shanken 修正是其特例 |
| Fama–MacBeth(2.2.4 节) | 逐期截面正规方程作为矩条件;FM 标准误对应特定的 $\boldsymbol{a}$ 与只取 $\gamma_0$ 的 $S$ |
这就是"统一"的含义:各方法的差异,不过是矩条件选哪些、$\boldsymbol{S}$ 怎么估、$\boldsymbol{a}$/$\boldsymbol{W}$ 怎么选的差异。想放松哪条假设,就在对应的部件上换零件,不必换整个框架。
不应成为黑箱
"把矩条件塞进软件、选 $\boldsymbol{W}=\boldsymbol{S}^{-1}$、报告 J 值"——这套流水线最危险。$\boldsymbol{W}=\boldsymbol{S}^{-1}$ 的"有效"是给定这组矩的统计有效,它会为了压低参数方差而给"噪声小但业务上无关紧要"的矩很高话语权;而矩的取舍本身才是经济学问题。市场上有无数资产、能写出无数矩条件,一味追求统计有效性等于让统计软件替你决定研究什么。
Hansen 框架的真正强大之处恰恰是允许你从业务出发选 $\boldsymbol{a}$。原书举的例子:用市场组合、无风险资产、HML、SMB 四个资产检验 CCAPM($n=4$ 个矩、$p=2$ 个参数)。与其让四个矩加权和稀泥,不如手工指定 $\boldsymbol{a}$:让市场与无风险资产的矩条件精确成立(用它们定参数),把 HML 和 SMB 留作检验——此时 J 检验(自由度 $4-2=2$)问的正是"CCAPM 能否解释价值和规模溢价"这个真正要紧的问题。GMM 是趁手的兵器,不是自动驾驶。
- GMM 的数学核心 = 样本均值的方差 $\Var(\bar{u})\to S/T$ + delta 方法;$S$ 是全部自协方差之和,NW 估计量就是它的样本版。
- 三部曲:矩条件 $\E[\boldsymbol{f}(\boldsymbol{x}_t,\boldsymbol{b}_0)]=\boldsymbol{0}$ → 样本矩 $\boldsymbol{g}_T$ 估参数($\boldsymbol{a}\boldsymbol{g}_T=\boldsymbol{0}$ 或 min $\boldsymbol{g}_T^{\top}\boldsymbol{W}\boldsymbol{g}_T$)→ 方差与 J 检验。
- $\boldsymbol{W}=\boldsymbol{S}^{-1}$ 统计上最优(噪声大的矩少信),J 统计量 $\sim\chi^2_{n-p}$ 检验剩余矩。
- 本章各方法都是 GMM 特例;差别只在矩条件、$S$ 的估计与权重的选择。
- 矩的选择是经济学问题:从业务出发定 $\boldsymbol{a}$,别让 GMM 变成黑箱。
2.8研究方法建议
方法都在手了,最后按研究对象把"学术界惯例套餐"整理成三张清单,第 3~5 章的 A 股实证将严格照此执行:
| 研究对象 | 惯例流程 |
|---|---|
| 异象 | ① 排序法构建异象组合(先单变量;常与市值做条件双重排序以排除小市值干扰);② 时序回归对选定多因子模型求 α,Newey–West 调整后做 t 检验(2.4.1–2.4.3 节);③ Fama–MacBeth 回归加入常见控制变量,验证异象变量对收益率的预测力是否幸存(2.4.4 节)。 |
| 因子 | ① 金融学逻辑先行——没有故事的变量不配进候选池(风险补偿或错误定价,二选一说清楚);② 排序法构建因子组合,检验收益率显著性(NW 调整);③ Fama–MacBeth 回归检验因子溢价(2.3 节:暴露可用公司特征)。 |
| 多因子模型 | ① 用已发表异象作测试资产,GRS 检验联合定价误差;② 与已有模型互相检验:同组测试资产用 GRS + α 检验,因子互为测试资产用 GRS + 均值–方差张成检验(2.5 节);③ 贝叶斯方法可作补充证据。 |
最后重复两句贯穿全章的提醒:统计显著只是入场券,不是终点——大样本下任何模型都会被拒绝,方法给出的是证据的强度,结论还要靠经济学逻辑撑腰;标准误比点估计更容易骗人——看到 t 值先问三个问题:截面相关处理了吗(FM / GLS),时序相关处理了吗(NW),生成回归变量修正了吗(Shanken / IV)。带着这两句话,就可以进入第 3 章,对主流因子逐一动手实证了。
本章练习
练习刻意有难度:做完前三题,等于亲手实现了本章三件主力武器。代码题请准备 Python 环境(numpy,练习 2.3 另需 scipy),先自己写,再看提示,最后对答案。
下面的代码生成一个两因子世界:200 只股票、240 个月,真实月度溢价分别为 0.6% 和 0.3%,定价误差全为零。请不用任何回归库(只用 numpy 线性代数)实现完整的 Fama–MacBeth 流程:
- 第一步:对每只股票做带截距的时序回归,估出暴露矩阵 beta_hat(提示:把 240×200 的收益率矩阵一次性回归,不要写 200 次循环);
- 第二步:在每个月 t,用 beta_hat(加截距列)对当月截面收益做 OLS,得到 240 组逐期估计;
- 对每个因子:报告 λ 的均值、标准误(std/√T)和 t 值,并与真值比较;同时报告截距项的均值与 t 值——它应当不显著,为什么?
import numpy as np
rng = np.random.default_rng(0)
N, K, T = 200, 2, 240
beta = rng.uniform(-1, 2, (N, K)) # 真实暴露
lam_true = np.array([0.006, 0.003]) # 真实月度溢价
chol = np.diag([0.04, 0.03]) # 因子月波动 4%、3%
f = lam_true + rng.standard_normal((T, K)) @ chol.T # 因子收益率序列
eps = 0.05 * rng.standard_normal((T, N)) # 特质波动 5%
R = f @ beta.T + eps # T x N,alpha 恒为 0
提示
第一步矩阵化:设 F 为在 f 左侧拼一列 1 的 T×(K+1) 矩阵,则全部股票的回归系数是 lstsq(F, R),取第 2 行起即为暴露的转置。第二步同理:X = [1, beta_hat] 是 N×(K+1),每个月解一次 lstsq(X, R[t])。标准误直接对逐期估计序列用 std(ddof=1)/sqrt(T)。
参考答案
import numpy as np
rng = np.random.default_rng(0)
N, K, T = 200, 2, 240
beta = rng.uniform(-1, 2, (N, K))
lam_true = np.array([0.006, 0.003])
chol = np.diag([0.04, 0.03])
f = lam_true + rng.standard_normal((T, K)) @ chol.T
eps = 0.05 * rng.standard_normal((T, N))
R = f @ beta.T + eps
# ---- 第一步:时序回归估计暴露(一次算完全部股票)----
F = np.column_stack([np.ones(T), f]) # T x (K+1)
coef = np.linalg.lstsq(F, R, rcond=None)[0] # (K+1) x N
beta_hat = coef[1:].T # N x K
# ---- 第二步:逐期截面回归(带截距)----
X = np.column_stack([np.ones(N), beta_hat]) # N x (K+1)
lam_t = np.zeros((T, K + 1))
for t in range(T):
lam_t[t] = np.linalg.lstsq(X, R[t], rcond=None)[0]
# ---- 汇总与检验 ----
lam_hat = lam_t.mean(axis=0)
se = lam_t.std(axis=0, ddof=1) / np.sqrt(T)
t_stat = lam_hat / se
print(f"截距 gamma: {lam_hat[0]:.4%} t = {t_stat[0]:.2f} (应不显著)")
for k in range(K):
print(f"因子{k+1}: lambda = {lam_hat[k+1]:.4%} se = {se[k+1]:.4%}"
f" t = {t_stat[k+1]:.2f} 真值 = {lam_true[k]:.2%}")
典型结果:两个因子的 λ 估计都落在真值一两个标准误之内,t 值双双徘徊在显著性边缘(本组种子下约 2.1 与 1.9)。理论量级可以心算:第二个因子月溢价 0.3%、波动 3%,单位信噪比 0.1/月,240 个月对应 t 约 $0.1\times\sqrt{240}\approx 1.5$——真实存在的因子也完全可能检验不显著。截距项聚拢在零附近:数据生成时没有埋 α,而且第二步加了截距,任何整体性的偏移都会被它吸走而不会冒充因子溢价。若把第一步的 beta_hat 换成真实 beta 重跑,会发现 λ 的 t 值略升——差额就是 EIV 问题的代价。
用下面的函数生成月均 0.5%、波动 4%、一阶自相关 ρ=0.6 的 AR(1) 收益序列(T=600)。请:
- 按式 (2.66)–(2.67) 手写单序列均值的 Newey–West 标准误:S = γ̂0 + 2·Σ w_j·γ̂j,w_j = 1 − j/(J+1),J 按式 (2.65) 的规则取;对比朴素标准误 std/√T 与理论真值 sqrt(σ²(1+ρ)/((1−ρ)T));
- 做一个 size 实验:令真实均值为 0,重复模拟 2000 次,分别统计"朴素 t 检验"和"NW t 检验"在 5% 名义水平下的实际拒绝率。朴素检验错得有多离谱?NW 完全治好了吗?
import numpy as np
def simulate(rng, T, mu, rho, sig):
z = rng.standard_normal(T)
e = np.empty(T)
e[0] = sig * z[0]
c = sig * np.sqrt(1 - rho ** 2) # 保证无条件方差恒为 sig^2
for t in range(1, T):
e[t] = rho * e[t - 1] + c * z[t]
return mu + e
提示
γ̂j 用去均值序列 u 计算:u[j:] @ u[:-j] / T(注意除以 T 而不是 T−j,这是 NW 原文的约定,也顺便压小高阶项)。J = floor(4·(T/100)^(2/9)),T=600 时 J=5。理论真值来自 AR(1) 的自协方差 γj = σ²ρ^j 求和。
参考答案
import numpy as np
def simulate(rng, T, mu, rho, sig):
z = rng.standard_normal(T)
e = np.empty(T)
e[0] = sig * z[0]
c = sig * np.sqrt(1 - rho ** 2)
for t in range(1, T):
e[t] = rho * e[t - 1] + c * z[t]
return mu + e
def nw_se(x):
T = len(x)
J = int(np.floor(4 * (T / 100) ** (2 / 9)))
u = x - x.mean()
S = u @ u / T # gamma_0
for j in range(1, J + 1):
gam = u[j:] @ u[:-j] / T
S += 2 * (1 - j / (J + 1)) * gam # Bartlett 权重
return np.sqrt(max(S, 0.0) / T)
rng = np.random.default_rng(1)
T, mu, rho, sig = 600, 0.005, 0.6, 0.04
# ---- (1) 单次对比 ----
x = simulate(rng, T, mu, rho, sig)
se_naive = x.std(ddof=1) / np.sqrt(T)
se_true = np.sqrt(sig ** 2 * (1 + rho) / (1 - rho) / T)
print(f"朴素 se = {se_naive:.5f} NW se = {nw_se(x):.5f} 理论 = {se_true:.5f}")
# ---- (2) size 实验:真实均值为 0 ----
M, rej_naive, rej_nw = 2000, 0, 0
for m in range(M):
x = simulate(rng, T, 0.0, rho, sig)
se_n = x.std(ddof=1) / np.sqrt(T)
rej_naive += abs(x.mean() / se_n) > 1.96
rej_nw += abs(x.mean() / nw_se(x)) > 1.96
print(f"朴素检验拒绝率: {rej_naive / M:.1%} NW 检验拒绝率: {rej_nw / M:.1%}"
f" (名义水平 5%)")
典型结果:ρ=0.6 时理论标准误约为朴素值的 $\sqrt{(1+0.6)/(1-0.6)}=2$ 倍。size 实验中朴素检验的实际拒绝率高达三成以上(本组种子下约 35%)——每三个"纯噪声因子"就有一个被它盖章显著;NW 把拒绝率压回 12% 左右,大幅纠偏但并未完全治愈:截断在 J=5 会漏掉 $\rho^6$ 以后的尾巴,且各阶 $\hat{\gamma}_j$ 本身有估计噪声。这就是为什么强自相关数据(如重叠区间收益)还需要更长的 J 或其他核函数。
按式 (2.16) 实现 GRS 统计量(N=10 个资产、K=3 个因子、T=240 个月),然后用模拟验证这个检验"没有冤枉好人":
- 写函数 grs_stat(R, F):对每个资产做时序回归取截距 α̂,残差协方差用 MLE(除以 T),因子均值与协方差同样除以 T,按公式组装统计量;
- 在"α 全为零"的世界里模拟 1000 次,统计 GRS 超过 F 分布 95% 分位数的频率——应接近 5%(检验的 size 正确);
- 给第一个资产注入每月 0.4% 的真 α 再模拟 1000 次,看拒绝率(检验的功效)。
提示
把截距并入回归:X = [1, F],系数矩阵第一行即全部 α̂。二次型用 alpha @ np.linalg.solve(Sigma, alpha) 比显式求逆更稳。临界值 scipy.stats.f.ppf(0.95, N, T-N-K)。注意式 (2.16) 的两个协方差矩阵都用除以 T 的 MLE 版本,配的才是精确 F 分布。
参考答案
import numpy as np
from scipy import stats
rng = np.random.default_rng(2)
N, K, T, M = 10, 3, 240, 1000
def grs_stat(R, F):
T, N = R.shape
K = F.shape[1]
X = np.column_stack([np.ones(T), F])
B = np.linalg.lstsq(X, R, rcond=None)[0] # (K+1) x N
alpha = B[0] # 截距行 = alpha 向量
resid = R - X @ B
Sigma = resid.T @ resid / T # MLE 残差协方差
fbar = F.mean(axis=0)
Fc = F - fbar
Sf = Fc.T @ Fc / T # MLE 因子协方差
quad = alpha @ np.linalg.solve(Sigma, alpha)
denom = 1 + fbar @ np.linalg.solve(Sf, fbar)
return (T - N - K) / N * quad / denom
crit = stats.f.ppf(0.95, N, T - N - K)
# 无 scipy 时的替代:crit = np.quantile(rng.f(N, T - N - K, size=200000), 0.95)
beta = rng.uniform(0, 1.5, (N, K))
def run(alpha_inject):
rej = 0
for m in range(M):
F = 0.004 + 0.03 * rng.standard_normal((T, K))
eps = 0.02 * rng.standard_normal((T, N))
R = F @ beta.T + eps
R[:, 0] += alpha_inject # 给资产 1 注入真 alpha
rej += grs_stat(R, F) > crit
return rej / M
print(f"size (alpha=0): 拒绝率 = {run(0.0):.1%} (理论 5%)")
print(f"power (alpha=0.4%/月): 拒绝率 = {run(0.004):.1%}")
典型结果:α 全零时拒绝率非常接近 5%——GRS 的 F 分布是有限样本精确的,只要残差确实 IID 正态,240 个月的样本它也不会"冤枉好人";这正是它优于 χ² 大样本近似的地方。注入单个资产每月 0.4% 的 α 后,拒绝率升到五成上下(残差 2% 波动下该资产单独的 t 约 $0.004/0.02\times\sqrt{240}\approx 3.1$,但联合检验要同时"养活" $N=10$ 个自由度,功效被摊薄)。可以再试 0.2%/月,体会功效如何随 α 缩小而衰减——检验拒绝不了不等于模型是对的,可能只是样本不够长、或 α 藏在联合检验够不着的角落。
设截面上两个排序变量 $X_1$、$X_2$,均分 $L_1=L_2=2$ 组(按中位数)。(1)证明:当 $X_1$ 与 $X_2$ 在截面上独立时,独立双重排序与条件双重排序(先 $X_1$ 后 $X_2$)给出的分组在大样本下一致,且四个格子的股票数趋于相等。(2)构造一个具体的反例(给出至少 8 只股票的取值),使两种排序把同一只股票分进不同的格子。(3)说明条件排序下"高 $X_2$"标签的真实含义,并解释它与 2.6 节因子正交化的联系。
参考答案
(1) 记 $m_2$ 为 $X_2$ 的全样本中位数、$m_2^{(g)}$ 为 $X_1$ 组 $g$ 内的 $X_2$ 中位数。独立排序按 $X_2 \gtrless m_2$ 贴标签,条件排序按 $X_2 \gtrless m_2^{(g)}$ 贴标签,两者一致当且仅当各组内中位数与全样本中位数一致。若 $X_1 \perp X_2$,则 $X_2$ 在每个 $X_1$ 组内的分布与无条件分布相同,$m_2^{(g)} \to m_2$(大样本),标签一致;且格子概率 $P(X_1 \gtrless m_1,\ X_2 \gtrless m_2) = \frac{1}{2}\cdot\frac{1}{2}$,四格均衡。
(2) 取 8 只股票,$X_1 = 1,2,\dots,8$,且 $X_2 = X_1$(完全正相关的极端情形最清楚)。全样本 $X_2$ 中位数介于 4 与 5 之间。独立排序:低 $X_1$ 组($X_1\le 4$)的股票 $X_2$ 也全部低于中位数,于是"低 $X_1$ 高 $X_2$"与"高 $X_1$ 低 $X_2$"两个格子是空的。条件排序:在低 $X_1$ 组内部按组内中位数(2 与 3 之间)再分,股票 3、4 被贴上"高 $X_2$"标签——而独立排序把它们贴成"低 $X_2$"。同一只股票(如股票 3)在两种方案下进了不同格子。注意条件排序下,低 $X_1$ 组的"高 $X_2$"($X_2=3,4$)在绝对水平上低于高 $X_1$ 组的"低 $X_2$"($X_2=5,6$)——标签只在组内可比。
(3) 条件排序的"高 $X_2$"意思是"相对同 $X_1$ 水平的同伴而言 $X_2$ 高",即它排的实际上是 $X_2$ 中不能被 $X_1$ 解释的残差成分。这正是正交化:把 $X_2$ 对 $X_1$(非参数地)投影,只保留残差信息再排序。所以说条件双重排序是排序世界里的 Gram–Schmidt——第一排序变量扮演 $\boldsymbol{z}_0$,第二排序变量被它正交化后才参与定价检验;也因此第一变量只是控制变量,围绕它构建因子没有清晰含义。两种排序何时不同的一般判据:只要 $X_2$ 的组内分位数与全样本分位数有差异(即 $X_1$ 与 $X_2$ 相依),两种方案就会对边界附近的股票给出不同标签,相关性越强、分歧越大,直至独立排序出现空格子而条件排序永不会。
考虑二元回归 $\boldsymbol{y} = b_1 \boldsymbol{x}_1 + b_2 \boldsymbol{x}_2 + \boldsymbol{\varepsilon}$($\boldsymbol{x}_1, \boldsymbol{x}_2$ 不正交)。令 $\boldsymbol{z}_2 = \boldsymbol{x}_2 - \dfrac{\langle \boldsymbol{x}_1, \boldsymbol{x}_2 \rangle}{\langle \boldsymbol{x}_1, \boldsymbol{x}_1 \rangle} \boldsymbol{x}_1$ 为 $\boldsymbol{x}_2$ 对 $\boldsymbol{x}_1$ 正交化后的残差。请从 OLS 正规方程出发证明:多元回归的 $\hat{b}_2$ 恰好等于 $\dfrac{\langle \boldsymbol{z}_2, \boldsymbol{y} \rangle}{\langle \boldsymbol{z}_2, \boldsymbol{z}_2 \rangle}$。再用投影矩阵语言把结论推广到"任意多个控制变量"的情形。
提示
正规方程就是"残差与每个解释变量正交"(式 2.87)的两条分量。从第一条解出 $\hat{b}_1$(含 $\hat{b}_2$ 的表达式),代入第二条,整理出 $\hat{b}_2$ 的分子分母,再识别出它们分别是 $\langle \boldsymbol{z}_2,\boldsymbol{y}\rangle$ 与 $\langle \boldsymbol{z}_2,\boldsymbol{z}_2\rangle$。推广时使用 $\boldsymbol{M}_1 = \boldsymbol{I} - \boldsymbol{X}_1(\boldsymbol{X}_1^{\top}\boldsymbol{X}_1)^{-1}\boldsymbol{X}_1^{\top}$ 的对称幂等性质。
参考答案
二元情形。正规方程为 $\langle \boldsymbol{x}_1,\, \boldsymbol{y} - \hat{b}_1\boldsymbol{x}_1 - \hat{b}_2\boldsymbol{x}_2 \rangle = 0$ 与 $\langle \boldsymbol{x}_2,\, \boldsymbol{y} - \hat{b}_1\boldsymbol{x}_1 - \hat{b}_2\boldsymbol{x}_2 \rangle = 0$。由第一条:
$$ \hat{b}_1 = \frac{\langle \boldsymbol{x}_1, \boldsymbol{y} \rangle - \hat{b}_2 \langle \boldsymbol{x}_1, \boldsymbol{x}_2 \rangle}{\langle \boldsymbol{x}_1, \boldsymbol{x}_1 \rangle}. $$代入第二条并整理:
$$ \underbrace{\langle \boldsymbol{x}_2, \boldsymbol{y} \rangle - \frac{\langle \boldsymbol{x}_1, \boldsymbol{x}_2 \rangle}{\langle \boldsymbol{x}_1, \boldsymbol{x}_1 \rangle} \langle \boldsymbol{x}_1, \boldsymbol{y} \rangle}_{=\ \langle \boldsymbol{z}_2,\, \boldsymbol{y} \rangle} \;=\; \hat{b}_2 \underbrace{\left[ \langle \boldsymbol{x}_2, \boldsymbol{x}_2 \rangle - \frac{\langle \boldsymbol{x}_1, \boldsymbol{x}_2 \rangle^2}{\langle \boldsymbol{x}_1, \boldsymbol{x}_1 \rangle} \right]}_{=\ \langle \boldsymbol{z}_2,\, \boldsymbol{z}_2 \rangle}. $$花括号的识别:把 $\boldsymbol{z}_2$ 的定义代入 $\langle \boldsymbol{z}_2, \boldsymbol{y} \rangle$ 与 $\langle \boldsymbol{z}_2, \boldsymbol{z}_2 \rangle$ 展开即可核对(后者展开有三项,其中交叉项与投影项合并)。于是 $\hat{b}_2 = \langle \boldsymbol{z}_2, \boldsymbol{y} \rangle / \langle \boldsymbol{z}_2, \boldsymbol{z}_2 \rangle$,证毕。
一般情形。设 $\boldsymbol{y} = \boldsymbol{X}_1 \boldsymbol{b}_1 + b_2 \boldsymbol{x}_2 + \boldsymbol{\varepsilon}$,$\boldsymbol{X}_1$ 为任意一组控制变量。定义湮灭矩阵 $\boldsymbol{M}_1 = \boldsymbol{I} - \boldsymbol{X}_1 (\boldsymbol{X}_1^{\top}\boldsymbol{X}_1)^{-1} \boldsymbol{X}_1^{\top}$(对称、幂等:$\boldsymbol{M}_1^{\top}=\boldsymbol{M}_1=\boldsymbol{M}_1^2$)。分块正规方程消元后得分块回归公式:
$$ \hat{b}_2 = \big( \boldsymbol{x}_2^{\top} \boldsymbol{M}_1 \boldsymbol{x}_2 \big)^{-1} \boldsymbol{x}_2^{\top} \boldsymbol{M}_1 \boldsymbol{y} = \frac{\langle \boldsymbol{M}_1\boldsymbol{x}_2,\ \boldsymbol{y} \rangle}{\langle \boldsymbol{M}_1\boldsymbol{x}_2,\ \boldsymbol{M}_1\boldsymbol{x}_2 \rangle}, $$其中第二个等号用了 $\boldsymbol{x}_2^{\top}\boldsymbol{M}_1 = (\boldsymbol{M}_1\boldsymbol{x}_2)^{\top}$ 与 $\boldsymbol{M}_1 = \boldsymbol{M}_1^{\top}\boldsymbol{M}_1$。而 $\boldsymbol{M}_1\boldsymbol{x}_2$ 正是 $\boldsymbol{x}_2$ 对全部控制变量回归后的残差——即连续正交化到最后一步的 $\boldsymbol{z}_K$。这就是 Frisch–Waugh–Lovell 定理:多元回归中任何变量的系数,等于"该变量被其余变量正交化后的残差"对 $\boldsymbol{y}$ 的一元回归系数(且对 $\boldsymbol{y}$ 是否也先正交化不敏感,因为 $\boldsymbol{M}_1$ 幂等)。它同时给出式 (2.94):$\Var(\hat{b}_2) = \sigma^2 / \lVert \boldsymbol{M}_1\boldsymbol{x}_2 \rVert^2$——共线性越强、残差越短、方差越大。
用公式论证以下两点,并给出一个会让 FM 标准误明显失真的现实场景与补救方案:(1)个股残差在同一期内任意相关,都不会使 FM 的标准误 $\mathrm{std}(\hat{\lambda}_t)/\sqrt{T}$ 失效;(2)一旦 $\hat{\lambda}_t$ 序列存在时序自相关,这个标准误就是错的,且通常错在低估。
参考答案
(1) 截面相关为何免疫。第 $t$ 期截面 OLS 给出 $\hat{\boldsymbol{\lambda}}_t = (\boldsymbol{X}^{\top}\boldsymbol{X})^{-1}\boldsymbol{X}^{\top}\boldsymbol{R}_t^e$——它是当期 $N$ 个资产收益的线性组合,把整个截面压缩成一个 $K{+}1$ 维统计量。资产之间无论怎样相关,其全部效果都体现在这个线性组合的取值波动里:$\Var(\hat{\boldsymbol{\lambda}}_t)$ 自动包含了 $\boldsymbol{R}_t^e$ 协方差矩阵的所有非对角元素。而 FM 的标准误不是从"残差独立"的截面公式推的,而是直接把 $\{\hat{\lambda}_{k,t}\}_{t=1}^{T}$ 当作 $T$ 次抽样、用其样本方差估计——样本方差量的就是这个"已折叠了截面相关"的总波动,不需要知道相关结构是什么。这就是"先估计、再均值"的全部妙处:把不可估的 $N\times N$ 截面相关问题,替换成可估的一维时序波动问题。
(2) 时序相关为何致命。$\Var(\hat{\lambda}) = \Var\big(\frac{1}{T}\sum_t \hat{\lambda}_t\big) = \frac{1}{T^2}\sum_t \sum_s \Cov(\hat{\lambda}_t, \hat{\lambda}_s)$。FM 用 $\mathrm{std}^2(\hat{\lambda}_t)/T$ 估它,等于只保留 $t=s$ 的对角项、默认全部跨期协方差为零。若 $\hat{\lambda}_t$ 有自相关 $\gamma_j \ne 0$,真实方差是 $\frac{1}{T}\big[\gamma_0 + 2\sum_{j\ge 1}(1-\frac{j}{T})\gamma_j\big]$(式 2.104);金融数据中 $\gamma_j$ 多为正,于是 FM 标准误系统性低估、t 值虚增。FM 框架内没有任何一步能"看到"跨期信息——每期回归都是独立进行的,均值和标准差的计算也不涉及排序信息——所以它对时序相关无能为力,这不是实现细节问题,是方法结构使然。
现实场景与补救。典型翻车场景:用重叠区间收益做被解释变量(如每月滚动计算未来 12 个月收益)——相邻两期的 $\hat{\lambda}_t$ 共享 11 个月的数据,自相关逼近 11/12,朴素 FM 标准误可低估至真实值的几分之一;动量/反转类因子收益自身的正自相关也是常见来源。补救:对 $\{\hat{\lambda}_t\}$ 序列按式 (2.66)–(2.67) 做 Newey–West 调整(把"求均值"当作对常数 1 的回归),重叠 $h$ 期时滞后阶数至少取到 $h$;或者干脆避免重叠区间设计。实践口诀:FM 负责截面,NW 负责时序,两个都要有。