4、因子暴露度计算(二):基于横截面回归的因子暴露度估计方法(Fama-MacBeth两步法)
在上一节中,我们讨论了基于时间序列回归的因子暴露度估计。然而,当面对多个资产、多个因子且需要处理截面相关性时,Fama-MacBeth(1973)提出的两步法成为了业界标准。该方法通过先进行时间序列回归,再进行横截面回归,有效分离了因子暴露度与因子溢价,并提供了稳健的标准误估计。
4.1 Fama-MacBeth两步法的核心思想
Fama-MacBeth方法的核心在于将因子暴露度(Beta)与因子预期收益率(Lambda)的估计过程解耦。其基本假设是:资产的预期超额收益率由其对系统性因子的暴露度线性决定。
核心公式:
E[R_i] = λ₀ + β_{i1}λ₁ + β_{i2}λ₂ + ... + β_{iK}λ_K
其中,β_{ik} 是资产 i 对因子 k 的暴露度(由第一步估计),λ_k 是因子 k 的溢价(由第二步估计)。
两步法的流程可以概括为:
- 第一步(时间序列回归): 对每个资产 i,将其收益率对因子收益率进行时间序列回归,估计出该资产的因子暴露度向量
β_i。 - 第二步(横截面回归): 在每个时间点 t,将所有资产的收益率对第一步估计出的暴露度
β_i进行横截面回归,得到该时间点的因子溢价估计值λ_t。 - 最终估计: 对第二步中所有时间点的
λ_t取时间序列平均,得到最终的因子溢价估计;其标准误由λ_t的时间序列标准差给出。
4.2 第一步:时间序列回归的细节
在第一步中,我们使用滚动窗口或扩展窗口对每个资产单独进行时间序列回归。窗口长度的选择至关重要:
| 窗口类型 | 描述 | 适用场景 | 注意事项 |
|---|---|---|---|
| 滚动窗口 | 固定长度 L(如 60 个月),每次向前滚动一期 | 因子暴露度随时间变化较快 | 窗口过短导致估计噪声大;过长则反应迟钝 |
| 扩展窗口 | 从起始点开始,每期增加一个观测值 | 因子暴露度相对稳定,希望利用更多历史信息 | 早期估计可能不稳定,后期标准误变小 |
| 指数加权窗口 | 对近期观测值赋予更高权重,衰减因子 λ | 暴露度渐变,且希望平滑处理 | 需要调优衰减参数 λ |
实践建议: 对于月度频率的因子模型,常用的滚动窗口长度为 36 个月或 60 个月。窗口长度应至少大于因子个数 K,以保证回归的自由度。建议在构建训练集时,将窗口长度作为一个超参数进行交叉验证。
4.3 第二步:横截面回归的机制
第二步在每个时间点 t 独立运行一次横截面回归。假设我们有 N 个资产和 K 个因子,回归模型为:
R_{i,t} = λ_{0,t} + β_{i1,t-1}λ_{1,t} + β_{i2,t-1}λ_{2,t} + ... + β_{iK,t-1}λ_{K,t} + η_{i,t}
其中:
- R_{i,t}:资产 i 在时间 t 的收益率
- β_{ik,t-1}:第一步估计出的资产 i 对因子 k 的暴露度(使用 t-1 时刻及之前的数据)
- λ_{k,t}:因子 k 在时间 t 的溢价(待估计)
- λ_{0,t}:零-beta收益率(截距项)
- η_{i,t}:横截面回归的残差
对每个 t 执行 OLS 回归后,我们得到一组因子溢价估计值 λ̂_t = (λ̂_{0,t}, λ̂_{1,t}, ..., λ̂_{K,t})。最终的因子溢价估计为:
λ̂_k = (1/T) * Σ_{t=1}^{T} λ̂_{k,t}
标准误:se(λ̂_k) = sqrt( (1/T) * Var(λ̂_{k,t}) )
这种标准误估计方法自动处理了横截面残差的相关性,因为最终估计只依赖于 λ̂_t 的时间序列变异性。
4.4 关键假设与常见陷阱
重要警告: Fama-MacBeth 方法依赖于几个关键假设,违反这些假设会导致估计偏差。
- 假设1:因子暴露度在第二步窗口内稳定。 如果第一步估计出的 β 在第二步的横截面回归期间发生剧烈变化,则第二步的估计会产生误差。解决方案:使用更短的滚动窗口或允许 β 时变。
- 假设2:横截面回归中不存在完全共线性。 如果某些资产的 β 高度相关,会导致 λ 的估计不稳定。解决方案:在回归前检查 β 矩阵的条件数,或使用正则化方法(如岭回归)。
- 假设3:因子溢价是时变的。 Fama-MacBeth 允许 λ 随时间变化,但最终估计的是其均值。如果 λ 存在明显的趋势或结构性突变,直接取平均可能掩盖重要信息。
- 假设4:EIV(Errors-in-Variables)问题。 第一步估计的 β 包含测量误差,这会导致第二步的 λ 估计产生衰减偏差(attenuation bias)。解决方案:使用分组排序法(portfolio sorting)或贝叶斯收缩估计。
4.5 与时间序列回归方法的对比
| 对比维度 | 时间序列回归(单资产) | Fama-MacBeth 两步法 |
|---|---|---|
| 估计目标 | 单个资产的因子暴露度 β | 因子溢价 λ(市场定价) |
| 数据维度 | 每个资产独立,T 个时间点 | 第一步:T×N;第二步:N×T 横截面 |
| 标准误 | Newey-West 或 White 异方差一致 | 时间序列标准差(自动处理截面相关) |
| 对截面相关的处理 | 忽略(假设残差独立) | 通过两步法自然处理 |
| 对 EIV 的敏感性 | 不涉及(因子收益率已知) | 高(β 估计误差会传递) |
| 计算复杂度 | 低(N 次 OLS) | 中等(N 次 OLS + T 次 OLS) |
4.6 在训练集构建中的实践要点
当我们将 Fama-MacBeth 方法应用于机器学习训练集构建时,需要特别注意以下几点:
- 避免未来信息泄露: 第一步估计 β 时,只能使用 t-1 时刻及之前的数据。第二步回归时,使用 t 时刻的收益率。整个流程必须严格按时间顺序执行。
- 特征对齐: 将第一步估计出的 β 作为第二步的特征,但 β 本身也是估计值。在训练机器学习模型时,可以将 β 的估计标准误也作为特征输入,以反映估计的不确定性。
- 滚动重估计: 在训练集的时间跨度内,需要定期(如每月)重新执行第一步的时间序列回归,以更新 β 矩阵。这会产生一个动态的 β 序列,作为后续模型的输入特征。
- 正则化选项: 当资产数量 N 小于时间窗口长度 T 时,OLS 可行。但当 N 很大或因子间存在多重共线性时,考虑在第二步中使用岭回归或 LASSO 进行正则化。
训练集构建示例(伪代码):
# 伪代码:Fama-MacBeth 特征工程
for t in range(window_size, T):
# 第一步:时间序列回归,估计 β
beta_matrix = []
for i in range(N):
y = returns[i, t-window_size:t] # 资产 i 的历史收益率
X = factors[t-window_size:t, :] # 因子收益率
beta_i = OLS(y, X).coef
beta_matrix.append(beta_i)
# 第二步:横截面回归,估计 λ_t
y_cross = returns[:, t] # 所有资产在 t 时刻的收益率
X_cross = beta_matrix # 第一步估计的 β
lambda_t = OLS(y_cross, X_cross).coef
# 存储特征和标签
features[t] = beta_matrix.flatten() # 或构造更复杂的特征
labels[t] = lambda_t # 因子溢价作为标签
通过上述流程,我们可以将 Fama-MacBeth 方法无缝集成到机器学习训练集的构建中,既保留了因子暴露度的经济含义,又为模型提供了具有时间序列结构的特征和标签。