量化交易中文教材

第 17d 章 动态因子模型与主成分预测

学习目标

读完本章,你应当能够:

  1. 解释为什么预测变量很多时 OLS 不可行,以及动态因子模型(DFM)如何用少数不可观测的共同因子概括大量序列的共同运动。
  2. 写出 DFM 的观测方程与因子 VAR,区分共同成分与特质成分,陈述 DFM 的关键假设。
  3. 用主成分估计因子,并用碎石图与 Bai–Ng 信息准则选择因子个数。
  4. 理解「因子不可识别」:为什么不应给主成分硬套经济解释,而这对预测并无影响。
  5. 用迭代法和直接法做基于因子的预测,知道实时/样本外预测必须沿用估计样本的标准化参数与主成分权重。
  6. 读懂原书 131 个美国宏观序列的应用,并从「样本内显著、样本外失效」的期限利差例子中吸取教训。

读前导读

这一章在解决什么问题。 你手上有一百多个宏观指标,想预测下季度 GDP。全部塞进回归,系数比观测还多,OLS 会把噪声当信号,样本外一塌糊涂。本章的办法你其实已经见过:CFA 讲多因子模型时,把几千只股票的协方差写成「因子载荷 × 因子协方差 × 载荷转置 + 特质方差」,这就是 Barra 一类风险模型的骨架。动态因子模型(DFM)把同一结构搬到宏观数据上:一百多个指标的共同涨跌,背后只有少数几个看不见的驱动力。先用主成分把这几个驱动力「提炼」出来,再拿它们做预测,待估系数从上百个降到几个。

和风险模型相比,本章多了三件事:因子本身随时间演化(服从 VAR,所以叫「动态」);要回答「到底取几个因子」;以及在回测里怎样不偷看未来。最后一点对量化工作最直接,值得反复读。

需要先想起来的数学。

  • 矩阵乘法与转置。\(\boldsymbol\Lambda\) 是 \(N\times r\) 的载荷矩阵(每行一只「资产」、每列一个因子),\(\mathbf F_t\) 是 \(r\times1\) 的因子向量,\(\boldsymbol\Lambda\mathbf F_t\) 就是 \(N\) 个序列各自的共同成分。例:\(N=2,r=1\),载荷 \((0.5,2)'\),因子取 3,共同成分是 \((1.5,6)'\)。见 第 00 册第 06 章 线性代数速成。
  • 协方差矩阵的运算规则。若 \(\mathbf y=\mathbf B\mathbf x\),则 \(\mathrm{cov}(\mathbf y)=\mathbf B\,\mathrm{cov}(\mathbf x)\,\mathbf B'\)。这就是组合方差 \(w'\Sigma w\) 的矩阵版:把 \(\mathbf B\) 换成一行权重 \(w'\) 即得。
  • 特征值与特征向量。对协方差(相关)矩阵 \(\mathbf S\),满足 \(\mathbf S\mathbf v=\lambda\mathbf v\) 的方向 \(\mathbf v\) 叫特征向量,\(\lambda\) 是沿这个方向的方差。主成分就是把数据投影到最大的几个特征向量上,第 \(j\) 个特征值占特征值总和的比例就是第 \(j\) 个主成分「解释的方差比例」。见 第 00 册第 06 章。
  • 秩与可逆矩阵。\(\boldsymbol\Lambda\,\mathrm{cov}(\mathbf F)\,\boldsymbol\Lambda'\) 是 \(N\times N\) 矩阵,但只由 \(r\) 个因子生成,所以秩(独立的列数)至多为 \(r\),叫「低秩」。可逆矩阵 \(\mathbf R\) 满足 \(\mathbf R\mathbf R^{-1}=\mathbf I\),在因子不可识别那节会用到。
  • 对数与 \(\ln\)。Bai–Ng 准则里的 \(\ln\) 是自然对数;\(\ln(\text{残差方差})\) 每下降 0.01,约等于残差方差下降 1%。见 第 00 册第 04 章 级数与收敛。

怎么读这一章。 核心必读是 17.6.2(模型)、17.6.3(估计)、17.6.4(不可识别)、17.6.6(预测与实时细节)。17.6.5 的信息准则第一次只需记住「残差越小越好、因子越多罚得越重、取最小者」,惩罚项的推理可以跳过。17.6.8 的应用重点看表 17.3 后的三点结论,尤其是期限利差的教训。量化实战部分的「回测工程」与「符号不稳定」两段务必读。建议顺序:先读 17.6.2 末尾的协方差分解,把它和你熟悉的风险模型对上号,再读其余部分。


17.6.0 本章的前提与定位

本章以第 14.5 节的主成分分析为前提:主成分是标准化变量的线性组合,第 \(j\) 个主成分在与前 \(j-1\) 个不相关的约束下方差最大,权重是样本协方差(相关)矩阵的特征向量。主成分的矩阵推导在本册 19c 章(原书附录 19.7)。

第 06 册(Tsay)第 09 章从金融数据角度讲主成分与因子模型(统计因子模型、宏观因子模型、基本面因子模型),侧重收益的协方差结构;本章侧重计量视角:因子模型作为预测工具,以及估计、选择因子个数、样本外使用时的统计细节。


17.6 用动态因子模型与主成分进行多预测变量预测

17.6.1 动机

发达经济体的统计机构定期发布成百上千个宏观时间序列:国民收入与生产账户(消费、投资、进出口、政府支出)、各类价格与工资通胀、分行业产出、住房等特定市场、利率与资产价格等。每一个都可能改进预测。但第 14 章已经说明:预测变量很多,甚至多于时间序列观测数时,OLS 的样本外表现很差。

本节的办法是用数据集的少数几个主成分代替全部序列,大幅减少待估系数。框架是动态因子模型(dynamic factor model,DFM):大量序列的共同运动来自少数不可观测变量,即动态因子;因子用主成分估计。DFM 不是唯一出路,另一条路是大 VAR 加收缩估计(包括贝叶斯 VAR,见 Kilian & Lütkepohl 2017)。

17.6.2 动态因子模型

发达经济体的一个核心经验规律是:宏观变量之间普遍共同运动。经济某一部分强劲时,其他部分往往也强劲。数年尺度上的共同波动就是商业周期;月度、季度的短期波动和十年级的长期增长率上也存在共同运动。宏观理论把这些共同运动归因于少数驱动力:生产率、货币政策、财政政策、需求或偏好的变化。

DFM 的设定是:少数 \(r\) 个共同因子驱动大量 \(N\) 个序列的共同运动。因子被视为不可观测,这承认我们并不知道全部波动来源;即使知道,有些也难以直接测量(比如技术进步)。数学上分两部分。

(1) 观测方程:每个可观测变量 \(X_{it}\) 与 \(r\) 个因子线性相关,

\[X_{it}=\Lambda_{i0}+\Lambda_{i1}F_{1t}+\cdots+\Lambda_{ir}F_{rt}+u_{it},\quad i=1,\dots,N.\tag{17.32}\]
\(\Lambda_{i1},\dots,\Lambda_{ir}\) 是未知系数,称为因子载荷(factor loadings);\(u_{it}\) 是均值为 0 的误差,代表 \(X_{it}\) 特有的(非跨变量共同的)遗漏影响和测量误差。

(2) 因子服从 VAR。为记号方便写成 VAR(1),可以加更多滞后:

\[F_{jt}=A_{j1}F_{1,t-1}+A_{j2}F_{2,t-1}+\cdots+A_{jr}F_{r,t-1}+\eta_{jt},\quad j=1,\dots,r.\tag{17.33}\]
这就是 Key Concept 17.1 的两变量 VAR 推广到 \(r\) 个因子(17a 章)。(17.33) 没有截距,因子均值为 0。

白话解释:两条方程分工明确。(17.32) 是「横截面」的:在同一时刻 \(t\),每个指标 \(X_{it}\) 对因子的暴露是 \(\Lambda_{i1},\dots,\Lambda_{ir}\),就像每只股票对市场、规模、价值因子各有 beta。(17.33) 是「时间序列」的:因子今天的值取决于它们昨天的值加上新冲击 \(\eta_t\),所以因子有惯性,这正是能拿来预测的原因。若因子是白噪声(\(A=0\)),DFM 仍能压缩数据,但对预测就帮不上忙了。 下标读法:\(\Lambda_{ij}\) 的 \(i\) 是第几个序列、\(j\) 是第几个因子;\(A_{jk}\) 表示第 \(k\) 个因子的上期值对第 \(j\) 个因子本期值的影响。

假设:\(u_{it}\) 跨序列不相关,且与因子 VAR 的误差不相关,即对所有 \(k\),\(E(u_{it}u_{j,t+k})=0\ (i\ne j)\),\(E(u_{it}\eta_{j,t+k})=0\)。于是所有跨序列的共同运动都归于共同因子。

两个成分:

  • 共同成分(common component):\(X_{it}\) 中由因子解释的部分 \(\Lambda_{i1}F_{1t}+\cdots+\Lambda_{ir}F_{rt}\);
  • 特质成分(idiosyncratic component):因子不能解释的部分 \(u_{it}\)。它一般可能序列相关,这会影响预测的做法(见 17.6.5)。

原书脚注指出,(17.32)(17.33) 是 DFM 的「静态形式」,最便于用主成分估计;其他形式和估计方法见 Stock & Watson(2016)。

用矩阵写,(17.32) 就是 \(\mathbf X_t=\boldsymbol\Lambda_0+\boldsymbol\Lambda\mathbf F_t+\mathbf u_t\)。于是 \(\mathbf X_t\) 的协方差矩阵分解为

\[\mathrm{cov}(\mathbf X_t)=\boldsymbol\Lambda\,\mathrm{cov}(\mathbf F_t)\,\boldsymbol\Lambda'+\mathrm{cov}(\mathbf u_t),\]
第一项秩为 \(r\)(低秩),第二项是对角阵。熟悉风险模型的读者会认出:这正是多因子风险模型 \(\boldsymbol\Sigma=\mathbf B\boldsymbol\Sigma_F\mathbf B'+\mathbf D\) 的结构。

推导拆解:从 \(\mathbf X_t=\boldsymbol\Lambda_0+\boldsymbol\Lambda\mathbf F_t+\mathbf u_t\) 出发。 第一步,常数 \(\boldsymbol\Lambda_0\) 不影响协方差,去掉。 第二步,两个随机向量之和的协方差 \(=\mathrm{cov}(\boldsymbol\Lambda\mathbf F_t)+\mathrm{cov}(\mathbf u_t)+\) 两个交叉项;假设 \(u\) 与因子不相关(因子由 \(\eta\) 累积而成,而 \(u\) 与 \(\eta\) 不相关),交叉项为 0。 第三步,用规则 \(\mathrm{cov}(\mathbf B\mathbf x)=\mathbf B\,\mathrm{cov}(\mathbf x)\mathbf B'\),得 \(\mathrm{cov}(\boldsymbol\Lambda\mathbf F_t)=\boldsymbol\Lambda\,\mathrm{cov}(\mathbf F_t)\boldsymbol\Lambda'\)。 第四步,\(u_{it}\) 跨序列不相关,所以 \(\mathrm{cov}(\mathbf u_t)\) 只有对角线非零。 参数个数的对比很说明问题:\(N=131\) 时,一般协方差矩阵有 \(131\times132/2=8646\) 个参数;\(r=4\) 的因子结构只需约 \(131\times4+131+10=665\) 个(载荷、特质方差、因子协方差)。

17.6.3 DFM 的估计

DFM 用少数因子代替大量序列,从而解决预测变量过多的问题。如果因子可观测,载荷 \(\Lambda\) 和 VAR 系数 \(A\) 都能用 OLS 估计。难点在于因子不可观测。解决办法是:用 \(N\) 个 \(X\) 的主成分估计因子,再把估计的因子当作数据。步骤:

  1. 用样本内均值和标准差把每个 \(X\) 标准化(第 14.5 节);
  2. 对标准化后的 \(X\) 计算主成分,前 \(r\) 个主成分 \(PC_1,\dots,PC_r\) 就是因子估计 \(\hat F_{1t},\dots,\hat F_{rt}\);
  3. 把 \(\hat F\) 当作数据,用 OLS 估计 \(\Lambda\) 与 \(A\)。

为什么主成分能估计因子?直觉是:\(N\) 很大时,特质成分彼此不相关,在线性组合中相互抵消(大数定律在截面上起作用),剩下的只有共同成分。原书指出,若因子模型假设正确,当 \(N\) 和 \(T\) 都很大时,主成分是因子的一致估计;用主成分做预测与用(假如可观测的)真实因子做预测效果相同。

金融直觉:这和「分散化消除非系统风险」是同一个道理。一个等权组合持有 \(N\) 只股票,特质风险的方差按 \(1/N\) 递减,最后只剩系统性(因子)风险。主成分也是 \(N\) 个序列的加权组合,权重摊在许多序列上,每个序列的特质成分 \(u_{it}\) 被「分散掉」,组合里剩下的就是因子。所以 \(N\) 必须大:只有 15 个指标时,特质噪声分散不干净,主成分对因子的估计就会偏离(练习 8 的 (b) 正是在检验这一点)。 「一致估计」(consistent)的意思是:样本越来越大时,估计值以越来越高的概率落在真值附近。这里要求 \(N\) 和 \(T\) 同时变大。

17.6.4 因子不可识别:不要硬解释主成分

一个常见误区是:把第一主成分解释为「总体经济活动」,把第二主成分解释为「通胀」,等等。这一般没有依据。

原因是因子只能在线性变换的意义下识别。对任意可逆的 \(r\times r\) 矩阵 \(\mathbf R\),有 \(\boldsymbol\Lambda\mathbf F_t=(\boldsymbol\Lambda\mathbf R^{-1})(\mathbf R\mathbf F_t)\):把因子换成 \(\mathbf R\mathbf F_t\)、载荷换成 \(\boldsymbol\Lambda\mathbf R^{-1}\),观测数据完全一样。所以没有额外假设时,因子本身不可识别,可识别的是共同成分,不是因子。主成分只是挑了一种特定的「旋转」(各成分不相关、按方差排序),没有理由认为这种旋转恰好对应某个经济变量。

但对预测而言,这无关紧要:用因子或其任何可逆线性组合作为回归元,得到的拟合值和预测完全相同。原书的类比是:OLS 中「截距 + male 虚拟变量」与「截距 + female 虚拟变量」给出相同的预测,只是系数的含义不同。本章示例会用数值验证这一点。

推导拆解:为什么拟合值不变?设回归 \(Y_{t+1}=\mathbf b'\mathbf F_t+e\),用旋转后的因子 \(\mathbf G_t=\mathbf R\mathbf F_t\) 回归,系数记作 \(\mathbf c\)。 任何 \(\mathbf b'\mathbf F_t\) 都能写成 \((\mathbf b'\mathbf R^{-1})(\mathbf R\mathbf F_t)=\mathbf c'\mathbf G_t\),只要取 \(\mathbf c'=\mathbf b'\mathbf R^{-1}\);反过来也一样。两组回归元能表示的线性组合完全相同,OLS 在同一集合里找使残差平方和最小的那一个,自然找到同一组拟合值,只是系数按 \(\mathbf R^{-1}\) 换了算。 一个 \(r=1\) 的小例子:把因子乘以 \(-2\)(\(R=-2\)),回归系数就变成原来的 \(-1/2\),预测值一分不差。这也解释了实战中「主成分符号会翻转」为什么无害于预测、却有害于把单个主成分当信号。

17.6.5 因子个数的确定

第 14 章在截面数据上用留 \(m\) 份交叉验证(leave-\(m\)-out CV)选择主成分个数。时间序列中这有两个问题:(a) 观测不独立,被留出的子样本与估计样本不独立;(b) 即使留出一段连续子样本,滞后结构还会额外损失观测。因此 DFM 中常用两种工具:

碎石图(scree plot)。与截面情形相同(第 14.5 节):按序号画出每个主成分解释的方差比例(边际 \(R^2\)),找「拐点」。

信息准则。结构与 AR 的 (15.23)、VAR 的 (17.4) 类似:对增加因子带来的残差平方和下降施加惩罚。Bai & Ng(2002)提出、模拟中表现良好的准则为

\[IC(r)=\ln\left\{\frac1{NT}\sum_{i=1}^N\sum_{t=1}^T\left[X_{it}-(\hat\Lambda_{i0}+\hat\Lambda_{i1}\hat F_{1t}+\cdots+\hat\Lambda_{ir}\hat F_{rt})\right]^2\right\}+r\left(\frac{N+T}{NT}\right)\ln[\min(N,T)].\tag{17.34}\]
\(\hat\Lambda\) 是以前 \(r\) 个主成分为回归元、对每个 \(X_i\) 做 OLS 的估计。第二项是惩罚,与 \(r\) 成正比,比例常数取决于 \(N\) 和 \(T\)。\(N=T\) 时,惩罚化简为 \(r\cdot\frac{2}{T}\ln T\),即 BIC 惩罚 \(\ln T/T\) 的 2 倍。在候选 \(r\) 中选使 \(IC(r)\) 最小者。

白话解释:(17.34) 第一项是「所有序列、所有时期的平均残差平方」再取对数,衡量用 \(r\) 个因子还原原数据还差多少;加一个因子,这一项一定下降(多一个回归元,残差不会变大)。第二项是罚款,每多一个因子罚一份。只有当加因子带来的拟合改进超过罚款时,才值得加。 推导拆解(\(N=T\) 的化简):代入 \(N=T\),\(\frac{N+T}{NT}=\frac{2T}{T^2}=\frac2T\),\(\min(N,T)=T\),于是每个因子的罚款为 \(\frac2T\ln T\)。 用示例输出读一遍:\(IC(3)=-0.472\),\(IC(4)=-0.640\),下降 0.168,远大于罚款 \(\frac{360}{28800}\ln120\approx0.060\),所以加第 4 个;\(IC(5)=-0.612\) 反而回升,说明第 5 个因子带来的对数残差下降不到 0.03,抵不上罚款。

惩罚为什么同时依赖 \(N\) 和 \(T\)?因为因子估计误差同时来自两个维度:\(T\) 有限导致载荷估计有误差,\(N\) 有限导致特质成分在截面上抵消不干净。只有 \(N,T\) 都趋于无穷时,惩罚趋于 0 且慢于估计误差消失的速度,准则才能一致地选出真实因子个数。

17.6.6 用估计的因子做预测

两种做法,平行于 17a 章的迭代法与直接法。共同起点是把 (17.32) 扩展为 ADL 形式。由于特质成分 \(u_{it}\) 一般序列相关,它的过去值有助于预测 \(u_{it}\),进而预测 \(X_{it}\);按导出式 (16.21) 的同一论证,\(X_{it}\) 的滞后值也可能是有用的预测变量:

\[X_{it}=\Lambda_{i0}+\Lambda_{i1}F_{1t}+\cdots+\Lambda_{ir}F_{rt}+\beta_1X_{i,t-1}+\cdots+\beta_pX_{i,t-p}+u_{it}.\tag{17.35}\]
右边含当期因子,在 \(t-1\) 期未知,不能直接当作预测变量。

迭代法:先用估计的因子 VAR 预测下一期因子,再代入:

\[\hat X_{i,T+1|T}=\hat\Lambda_{i0}+\hat\Lambda_{i1}\hat F_{1,T+1|T}+\cdots+\hat\Lambda_{ir}\hat F_{r,T+1|T}+\hat\beta_1X_{iT}+\cdots+\hat\beta_pX_{i,T-p+1}.\tag{17.36}\]
\(\hat\Lambda,\hat\beta\) 以 \(\hat F\) 和 \(X\) 的滞后为回归元估计;\(\hat F_{\cdot,T+1|T}\) 来自因子 VAR 的一步预测。\(h>1\) 时,用因子和 \(X_i\) 组成的 VAR 迭代。

直接法(基于 Key Concept 17.3):\(h\) 步直接预测回归为

\[X_{it}=\delta_0+\delta_1\hat F_{1,t-h}+\cdots+\delta_r\hat F_{r,t-h}+\delta_{r+1}X_{i,t-h}+\cdots+\delta_{r+p}X_{i,t-h-p+1}+u_{it}.\tag{17.37}\]
每个步长 \(h\) 一个回归、一组系数,OLS 估计后直接预测。别忘了 17a 章的提醒:\(h>1\) 时误差重叠,推断要用 HAC 标准误。

白话解释:两种方法的差别在于「谁来负责往前推」。迭代法先预测因子本身,再用观测方程翻译成 \(X\) 的预测,\(h\) 步要把 VAR 连续推 \(h\) 次,模型设错时误差会层层累积。直接法跳过因子预测,直接让回归告诉你「\(h\) 期前的因子值」与「今天的 \(X\)」之间是什么关系,每个 \(h\) 单独估一次,对模型设定不那么敏感,但每个回归只用上了一部分动态信息。 注意 (17.37) 右边全是 \(t-h\) 期及更早的量,站在 \(T\) 期把 \(t\) 换成 \(T+h\),右边恰好都是已知数,这就是它能直接用于预测的原因。

实时预测的关键细节。实践中通常用截至某日的数据估计系数,然后冻结,用于之后的实时预测。用于实时预测的最后几期因子不在估计样本中。原书(附录 14.5)强调:由于系数是用样本内主成分估计的,构造样本外期的主成分时,必须使用与估计样本相同的主成分权重,以及相同的标准化均值和标准差。如果样本外重新标准化或重新算特征向量,得到的「因子」与估计系数时用的不是同一个东西,预测就会出错;如果反过来用全样本统计量去标准化估计样本,又会把未来信息带进过去,形成前视偏差。

金融直觉:可以把「均值、标准差、主成分权重」理解为一套冻结的「因子组合配方」。系数是在这套配方下估出来的,好比你按某版 Barra 模型估了 alpha 对因子暴露的回归,之后就必须继续按同一版因子定义算暴露。换一版配方,因子「名字」虽相同,实际是另一个组合,旧系数自然对不上。反过来,用全样本均值做标准化,相当于 2005 年就用了 2017 年才知道的平均增长率,属于典型的前视偏差,回测会好看,实盘复现不出来。

17.6.7 DFM 的其他用途

  • 构造经济指数。有大量同类序列时,用单因子模型,第一主成分就是概括所有变量共同运动的指数,常用于由多个经济活动指标编制同步经济指数(coincident economic index)。
  • 现时预测(nowcasting)。经济数据发布有滞后(本月就业变化下月才公布),「预测」当前值称为 nowcasting。技术难点在于数据在月内陆续发布,模型须能随时纳入新到的数据;DFM 很适合,但需要处理缺失观测(超出本书范围,第 06 册第 11a 章的状态空间与 Kalman 滤波是标准工具)。纽约联储就用 DFM 每周更新 GDP 的 nowcast。

17.6.8 应用:131 个美国季度宏观序列

数据。131 个美国季度宏观序列,1960:Q1–2017:Q4(原书附录 17.1,来自圣路易斯联储 FRED 数据库),涵盖经济活动、工资和价格通胀、利率、住房和石油市场等。处理步骤:

  1. 先变换消除随机趋势:通常取增长率(如 GDP)或一阶差分(如利率);
  2. 减样本均值、除以样本标准差,完成标准化;
  3. 有多个汇总层级时(GDP = 各组成部分之和,总就业 = 各部门就业之和),汇总序列与其组成部分完全共线、不提供额外信息,因此从估计因子的数据集中剔除。

表 17.2 列出各类别用于因子估计的序列数:

类别 序列数 类别 序列数
国民收入与生产账户 13 生产率与劳动收入 5
工业生产 8 利率 10
就业与失业 30 货币与信贷 6
订单、存货与销售 6 国际 8
新屋开工与许可 6 资产价格、财富、家庭资产负债表 10
价格 22 其他 2
石油市场 5
合计 131

附录 17.1 列出了 NIPA 中用于估计因子的变量:三类个人消费(耐用品、非耐用品、服务),四类私人投资(非住宅建筑、非住宅知识产权、非住宅设备、住宅建筑),联邦政府支出与收入,州与地方政府消费,出口,进口,均为实际值,多数通过季度增长率或一阶差分去除随机趋势。

碎石图(原书图 17.4)。前 30 个主成分中,第一主成分解释总方差的 20%,第二个解释 9%,前四个合计 39%。前两个因子显然重要,第三、第四个之后边际 \(R^2\) 有明显下降,但下降一直持续到第十个因子才趋于平稳,单凭目测难以确定。Bai–Ng 准则在 \(r=4\) 处取最小,落在碎石图的合理范围内,于是采用 \(r=4\)。

共同成分(原书图 17.5)。图中画出 GDP、就业、油价、S&P 500 收益的四季度增长率(\(t\) 到 \(t+4\) 的对数近似百分比增长)及其四因子共同成分。GDP 和就业是汇总量,不在估计因子的数据集中;油价和股票收益在 131 个序列中。结论令人印象深刻:仅用 131 个宏观变量的前 4 个主成分,共同成分就捕捉了这些序列的大量变动,甚至 S&P 500 四季度收益的很大部分也被解释了。

要正确理解最后一点:这不意味着股票收益可以预测,而是说股票收益受同期总体经济活动的强烈影响。共同成分用的是同期因子,而同期因子在预测时是未知的。

预测比较(原书表 17.3)。直接预测 \(h=1,4,8\) 期的累计 GDP 增长(年化),因变量为 \((400/h)\ln(GDP_t/GDP_{t-h})\);例如 \(h=4\) 时它是 \(t,t-1,t-2,t-3\) 四个季度年化增长率的平均。三个模型:直接 AR(2);加期限利差的 ADL(2,2);四个因子加 GDP 两阶滞后。样本内期从 1981:Q1 到 2002:Q4 之前 \(h\) 期,伪样本外期 2002:Q4–2017:Q4,指标为 \(RMSFE_{POOS}\)(式 15.22),所有回归含截距。

预测变量 \(h=1\) \(h=4\) \(h=8\)
\(GDPGR_{t-h},GDPGR_{t-h-1}\) 2.25 1.91 1.74
再加 \(TSpread_{t-h},TSpread_{t-h-1}\) 2.29 1.94 1.77
\(GDPGR\) 两阶滞后 + \(\hat F_{1,t-h},\dots,\hat F_{4,t-h}\) 2.14 1.40 1.48

三点结论:

  1. RMSFE 随步长增加而下降。这看似反常,原因是季度 GDP 有大量暂时性测量误差,按一两年平均后被平滑掉(参见图 15.1b 中季度 GDP 增长的「噪声」)。

  2. 期限利差在样本外帮了倒忙。各步长下,加入期限利差的预测都比 AR(2) 差。这与样本内的证据看似矛盾:在 \(h=1\) 的估计样本(1981:Q1–2002:Q3)中,利差两阶滞后系数为零的 F 检验在 1% 水平显著。说明样本内估计的利差系数不能刻画样本外期的关系,即这个关系不稳定。现实原因是:2008 年起美联储引入管理长短期利率的新货币政策工具(如资产购买),改变了利差与经济活动的关系。

    白话解释:F 检验回答的是「在这段样本里,系数是否为零」,它默认整段样本只有一个真系数,并不保证这个系数在未来不变。样本外 RMSFE 回答的是「拿这段样本的系数去预测未来,准不准」。前者显著、后者变差,最常见的解释就是系数变了。对量化研究者而言,这相当于一个在 1981–2002 年回测年化很漂亮的因子,在 QE 之后失效:t 值描述的是历史,不是承诺。

  3. 因子预测在所有步长都最好。细看可以发现,改进主要来自金融危机后的衰退和复苏初期:许多宏观变量强烈的负向共同运动指向深度衰退,AR 预测没有捕捉到。而在 2005 年前后和 2013 年之后的平静期,AR(2) 直接预测反而略好于因子预测。


17.7 结论与延伸阅读

第 17 章(本册 17a–17d)把时间序列回归扩展到多变量、多步长、非平稳与条件异方差,以及大数据环境。原书推荐的延伸阅读:经济预测入门 Diebold(2017)、Enders(2009);时间序列计量高级教材 Hamilton(1994)、Hayashi(2000);VAR 高级 Kilian & Lütkepohl(2017);DFM 综述 Stock & Watson(2016)。

原书第 17 章总结:

  1. VAR 对 \(k\) 个变量建模,每个变量依赖自身及其他 \(k-1\) 个序列的滞后;各变量的预测基于相同信息,相互一致。
  2. 两期及以上的预测可以通过迭代一步模型(AR、VAR)或估计多期回归得到。
  3. 共享共同随机趋势的序列协整:\(Y_t,X_t\) 为 I(1) 而 \(Y_t-\theta X_t\) 为 I(0)。误差修正项可帮助预测 \(\Delta Y_t\) 和/或 \(\Delta X_t\);VECM 是加入滞后误差修正项的 \(\Delta Y,\Delta X\) 的 VAR。
  4. 波动率聚集在经济尤其是金融序列中很常见;已实现波动率是用滚动均方根估计的时变波动率。
  5. ARCH 把回归误差的条件方差表示为近期误差平方的函数,GARCH 再加入滞后的条件方差。两者都能给出宽度依赖近期残差波动的预测区间。
  6. 大量序列的共同运动有时可由前几个主成分概括,并用于预测,框架是 DFM。

专栏:2011 年与 2013 年诺贝尔奖

  • 2011 年,Thomas Sargent 与 Christopher Sims,表彰宏观因果的实证研究。Sargent 强调对未来的预期在区分因果中的作用。Sims 提出结构 VAR,关键洞见是:VAR 的预测误差 \(\mathbf u_t\) 来自冲击经济的未预见「冲击」,其中许多有明确来源(OPEC 油价冲击、美联储利率冲击、国会税收冲击);把 VAR 误差分解为各类冲击,就能估计它们对 VAR 变量的动态因果效应。分解方法总有争议,但 SVAR 已是估计宏观动态因果效应的标准工具。
  • 2013 年,Eugene Fama、Lars Peter Hansen、Robert Shiller,表彰资产价格的实证分析。原书第 15 章专栏「Can You Beat the Market?」和第 16 章的橙汁期货专栏部分受到 Fama 的有效市场(不可预测性)和 Shiller 的非理性繁荣(无法解释的过度波动)思想的启发。Hansen 发展了广义矩方法(GMM),用来检验资产收益是否符合期望效用理论:投资者应使投资的边际成本(今天放弃消费的效用)等于边际收益(明天由投资回报支撑的消费带来的效用提升)。由于边际效用难以测量、收益不确定、且该命题应对所有资产成立,直接检验很困难,GMM 解决了这个问题,并广泛用于金融之外。GMM 的理论见本册 19b 章。

量化实战

1. 本章内容在量化中的用途

统计风险模型。 对股票收益矩阵做主成分,前几个主成分就是统计因子,\(\boldsymbol\Sigma\approx\hat{\boldsymbol\Lambda}\hat{\boldsymbol\Sigma}_F\hat{\boldsymbol\Lambda}'+\hat{\mathbf D}\) 给出低秩加对角的协方差估计,比样本协方差稳定得多,是组合优化的核心输入(第 11 册)。Bai–Ng 准则可用来确定统计因子个数。

宏观因子与资产配置。 用几十上百个宏观、金融指标的主成分构造增长、通胀、金融条件等宏观因子,或 nowcast 当季经济状态,再输入资产配置模型。原书的结论提醒:宏观因子对资产收益的解释主要是同期的,用于预测时要非常谨慎。

收益率曲线主成分。 各期限利率的前三个主成分通常对应水平、斜率、曲率。但本章的「不可识别」原则提醒:这种解释来自数据结构的经验规律,而非主成分本身的数学含义。

回测工程:样本外必须沿用样本内的标准化参数与权重。 这是本章对系统实现最直接的要求。滚动估计时,每个时点只能用截至当时的数据计算均值、标准差和特征向量,然后用它们变换当期数据;绝不能用全样本统计量做标准化,也不能在样本外期重新计算主成分后套用旧系数。

「样本内显著、样本外失效」的经典案例。 期限利差在 1981–2002 年样本内 1% 显著,样本外反而拉低预测精度,原因是政策体制变化。量化研究中,任何依赖宏观传导机制的信号都要面对结构断点的风险:做伪样本外检验,按体制分段评估,并且不要只看全样本的 t 值。

主成分符号与顺序的不稳定。 由于因子只在旋转意义下识别,滚动估计的主成分可能符号翻转、相邻两个交换顺序。直接用某个主成分作交易信号时,需要做符号对齐(例如与上期载荷的内积为正)或改用对旋转不变的量(共同成分、拟合值)。

2. 示例:模拟 DFM,选因子个数,伪样本外预测,验证不可识别性

模拟 \(N=120\) 个序列、\(T=240\) 期,4 个因子服从 VAR(1),特质成分各自 AR(1)。目标变量 \(y_{t+1}\) 依赖当期的因子。

import numpy as np
import statsmodels.api as sm

rng = np.random.default_rng(11)
N, T, r = 120, 240, 4
A = np.diag([0.8, 0.6, 0.5, 0.3])                 # 因子 VAR(1)
F = np.zeros((T, r))
for t in range(1, T):
    F[t] = A @ F[t-1] + rng.standard_normal(r)
Lam = rng.standard_normal((N, r))
idio = np.zeros((T, N))                            # 特质成分:各自 AR(1),跨序列不相关
rho = rng.uniform(0, 0.5, N)
for t in range(1, T):
    idio[t] = rho * idio[t-1] + rng.standard_normal(N) * rng.uniform(0.8, 1.5, N) * 1.5
X = F @ Lam.T + idio
# 目标:下一期的"宏观增长" y_{t+1} 依赖当期因子
y = np.r_[np.nan, F[:-1] @ np.array([0.8, -0.5, 0.3, 0.0])] + rng.standard_normal(T)

def pca_factors(Xin, k, mean=None, sd=None, W=None):
    """在估计样本上标准化并求特征向量;样本外复用同一组 mean/sd/W"""
    if mean is None:
        mean, sd = Xin.mean(0), Xin.std(0, ddof=1)
        Z = (Xin - mean) / sd
        evals, evecs = np.linalg.eigh(Z.T @ Z)
        order = np.argsort(evals)[::-1]
        W, evals = evecs[:, order], evals[order]
        return Z @ W[:, :k], mean, sd, W, evals
    return ((Xin - mean) / sd) @ W[:, :k]

# Bai-Ng IC_p2 选因子个数
Z = (X - X.mean(0)) / X.std(0, ddof=1)
_, _, _, W, ev = pca_factors(X, 1)
print("前 6 个主成分解释的方差比例:", np.round(ev[:6] / ev.sum(), 3))
ic = []
for k in range(1, 11):
    Fh = Z @ W[:, :k]
    resid = Z - Fh @ np.linalg.lstsq(Fh, Z, rcond=None)[0]
    ic.append(np.log((resid ** 2).mean()) + k * (N + T) / (N * T) * np.log(min(N, T)))
print("Bai-Ng IC(r), r=1..10:", np.round(ic, 3), " -> 选 r =", int(np.argmin(ic)) + 1)

# 伪样本外:前 160 期估计,之后滚动做一步直接预测(每期重估,只用当时可得数据)
start = 160
err_ar, err_f = [], []
for t in range(start, T - 1):
    Xin = X[:t + 1]
    Fh, m, s, Wt, _ = pca_factors(Xin, 4)
    # 直接预测回归: y_{s+1} 对 Fhat_s 与 y_s
    yy = y[2:t + 1]
    Xf = sm.add_constant(np.c_[Fh[1:t], y[1:t]])
    Xa = sm.add_constant(y[1:t])
    bf = sm.OLS(yy, Xf).fit().params
    ba = sm.OLS(yy, Xa).fit().params
    x_now = np.r_[1, Fh[t], y[t]]
    err_f.append(y[t + 1] - x_now @ bf)
    err_ar.append(y[t + 1] - np.r_[1, y[t]] @ ba)
print(f"伪样本外 RMSFE: AR(1) = {np.sqrt(np.mean(np.square(err_ar))):.3f}, "
      f"4 因子 + y 滞后 = {np.sqrt(np.mean(np.square(err_f))):.3f}")

# 因子不可识别:旋转后的因子给出相同拟合
Fh = Z @ W[:, :4]
R = np.linalg.qr(rng.standard_normal((4, 4)))[0] @ np.diag([2, 1, 0.5, 3])
yy, Xa = y[2:], sm.add_constant(Fh[1:-1])
Xb = sm.add_constant(Fh[1:-1] @ R)
print("原因子 vs 线性变换后因子 的拟合值最大差异:",
      np.abs(sm.OLS(yy, Xa).fit().fittedvalues - sm.OLS(yy, Xb).fit().fittedvalues).max().round(12))

输出:

前 6 个主成分解释的方差比例: [0.228 0.128 0.12  0.107 0.013 0.012]
Bai-Ng IC(r), r=1..10: [-0.203 -0.325 -0.472 -0.64  -0.612 -0.583 -0.555 -0.526 -0.497 -0.468]  -> 选 r = 4
伪样本外 RMSFE: AR(1) = 1.705, 4 因子 + y 滞后 = 1.131
原因子 vs 线性变换后因子 的拟合值最大差异: 0.0

解读:

  • 碎石图在第 4 个之后断崖式下降(0.107 → 0.013),Bai–Ng 准则在 \(r=4\) 处最小,正确选出真实因子数。真实数据中拐点往往没这么清楚,原书的 131 序列就是例子。
  • 伪样本外 RMSFE:因子预测 1.13,AR(1) 1.71,提升明显,因为目标变量确实由因子驱动。循环中每个时点只用截至 \(t\) 的数据做标准化和特征分解,这是正确的实时做法。
  • 把 4 个因子乘以任意可逆矩阵 \(\mathbf R\),回归拟合值完全不变(差异为 0),这就是「因子不可识别但预测不受影响」。

这段代码里,样本外的「当期」因子 Fh[t] 与系数在同一次估计中产生,口径自然一致。如果改为「每季度重估一次、季度内冻结系数」,季度内的新观测就必须用冻结时的 m, s, Wt 去变换(即 pca_factors(x_new, 4, m, s, Wt)),这正是 17.6.6 节强调的要求。


本章小结

当预测变量成百上千时,OLS 的估计误差会吞掉预测力。动态因子模型假定大量序列的共同运动由少数 \(r\) 个不可观测因子驱动:\(X_{it}\) 等于载荷乘因子的共同成分加上跨序列不相关的特质成分,因子本身服从 VAR。因子用标准化数据的主成分估计,\(N,T\) 都大时一致;因子个数用碎石图和 Bai–Ng 信息准则确定。因子只在旋转意义下可识别,不应硬解释单个主成分,但这不影响预测。预测时可用因子 VAR 迭代,也可做直接 \(h\) 步回归;实时预测必须沿用估计样本的标准化参数和主成分权重。原书 131 个宏观序列的应用中,4 个因子的直接预测在所有步长上都优于 AR 和含期限利差的 ADL,而期限利差样本内显著、样本外失效,是结构不稳定的典型教训。

概念 公式 / 要点
观测方程 \(X_{it}=\Lambda_{i0}+\sum_{j=1}^r\Lambda_{ij}F_{jt}+u_{it}\)
因子 VAR \(\mathbf F_t=\mathbf A\mathbf F_{t-1}+\boldsymbol\eta_t\)
关键假设 \(u_{it}\) 跨序列不相关、与 \(\eta\) 不相关 → 共同运动全归因子
协方差结构 \(\mathrm{cov}(\mathbf X)=\boldsymbol\Lambda\boldsymbol\Sigma_F\boldsymbol\Lambda'+\mathbf D\)
估计 样本内标准化 → 前 \(r\) 个主成分 = \(\hat F\) → OLS
Bai–Ng 准则 \(\ln\hat\sigma^2(r)+r\frac{N+T}{NT}\ln\min(N,T)\)
不可识别 \(\boldsymbol\Lambda\mathbf F=(\boldsymbol\Lambda\mathbf R^{-1})(\mathbf R\mathbf F)\);可识别的是共同成分
直接预测 \(X_{it}\) 对 \(\hat F_{t-h}\) 与 \(X_{i,t-h},\dots\) 回归
样本外 沿用估计样本的均值、标准差和特征向量

练习

基础

  1. 宏观学家想用 1970–2017 年季度数据预测 GDP、消费、投资、政府购买、出口、进口、短期利率、长期利率、通胀共 9 个变量,该不该估一个 VAR?(原书复习题 17.1) 答案要点:不宜。参数太多;GDP 与其组成部分几乎完全共线。可用小 VAR、因子模型或收缩方法。
  2. 区分共同成分与特质成分。为什么原书说 GDP 增长的共同成分能解释它的大部分变动,而 GDP 并不在估计因子的数据集中? 提示:共同成分是因子的线性组合;GDP 由其组成部分加总而来,组成部分在数据集中。
  3. \(N=T=200\) 时,Bai–Ng 惩罚项每增加一个因子增加多少?与 BIC 惩罚 \(\ln T/T\) 比较。 答案要点:\(\frac{400}{40000}\ln200\approx0.053\),是 \(\ln200/200\approx0.026\) 的 2 倍。
  4. 为什么原书说图 17.5 中 S&P 500 收益被共同成分大量解释,并不意味着股票收益可以预测? 提示:共同成分用的是同期因子。
  5. 某研究员用 2000–2020 全样本的均值和标准差标准化 100 个指标,再在 2000–2010 上估计因子回归,在 2011–2020 上评估预测。指出问题。 提示:前视偏差,样本外的信息进入了估计样本的标准化。

进阶

  1. 证明:若 \(\mathbf R\) 是可逆 \(r\times r\) 矩阵,\(Y\) 对 \((1,\hat{\mathbf F}_t)\) 与对 \((1,\mathbf R\hat{\mathbf F}_t)\) 的 OLS 拟合值相同。 提示:两组回归元张成同一列空间,投影矩阵 \(\mathbf P_X\) 相同(19a 章)。
  2. 推导 Bai–Ng 惩罚在 \(N=T\) 时化简为 \(2\ln T/T\)(每个因子)。若 \(N=10T\),惩罚如何变化?这说明了什么? 提示:\(N=10T\) 时为 \(\frac{11}{10T}\ln T\);截面维度大时惩罚主要由 \(T\) 决定。
  3. 用示例代码做两个实验:(a) 把特质成分的标准差放大 3 倍,看 Bai–Ng 选出的 \(r\) 和伪样本外 RMSFE 如何变化;(b) 把 \(N\) 从 120 降到 15,重复。 提示:信噪比降低或 \(N\) 太小时,后面的弱因子难以被识别,主成分对因子的估计变差。
  4. 在示例中加入结构断点:从 \(t=200\) 起把目标变量对因子的系数变为 \((0,0.5,-0.3,0.8)\)。比较伪样本外 RMSFE 在断点前后的表现,并联系原书期限利差的例子讨论。 提示:断点后预测明显变差,滚动窗口比扩展窗口恢复得快。
  5. 写出把 DFM 用作股票统计风险模型的完整步骤(数据、标准化、选因子数、协方差估计、样本外更新),并指出与宏观预测用途的两点不同。 提示:风险模型关心同期协方差,不需要预测因子;收益序列平稳,通常不必差分;特质方差要单独估计并进入 \(\mathbf D\)。

原书推荐习题:复习题 17.1;第 14 章关于主成分的习题(配合 19c 章附录 19.7 的推导)。


原书对照

本章内容 原书章节 PDF 页码
动机、DFM、估计、不可识别、因子个数、用估计因子预测、其他用途(式 17.32–17.37) 17.6 p.672–677
应用:美国宏观数据(表 17.2、17.3,图 17.4、17.5) 17.6 p.677–681
专栏:时间序列计量经济学的诺贝尔奖得主 17.6 后 p.681–682
结论与小结 17.7 p.683
复习题与习题 第 17 章末 p.684–688
附录 17.1 美国季度宏观数据集 附录 17.1 p.687–688
风险模型、主成分符号对齐(本教材补充) — —

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