4. Fama-French三因子模型:规模因子(SMB)与价值因子(HML)的构建逻辑、6个投资组合的划分方法、三因子回归实战

聊到多因子模型,Fama-French三因子模型绝对是个绕不开的里程碑。说实话,CAPM虽然漂亮,但在实际应用中,我见过太多它解释不了的收益异象。比如小盘股长期跑赢大盘股,低市净率股票比高市净率的更香——这些CAPM都说不通。

1993年,Fama和French干了一件漂亮事。他们发现,除了市场风险,还有两个因子能显著解释股票收益:一个是规模因子(SMB),一个是价值因子(HML)。嗯,这就是我们今天要啃的硬骨头。

4.1 规模因子(SMB)的构建逻辑

SMB,全称是Small Minus Big。说白了,就是做多小盘股、做空大盘股,看这个组合能带来多少超额收益。

构建步骤其实不复杂,我拆开来讲:

  1. 按市值排序:每年6月底,把所有股票按市值从大到小排。取中位数,大的叫Big(B),小的叫Small(S)。
  2. 分组交叉:这个后面会细讲,先记住SMB是多空组合就行。
  3. 计算收益差:SMB = 小盘股组合收益 - 大盘股组合收益。

核心直觉:小公司风险更高,流动性更差,投资者要求更高的预期收益作为补偿。SMB因子就是捕捉这种“规模溢价”。

我在项目中遇到过一个问题:市值数据要不要用最新值?我个人习惯是用上一年12月底的市值,然后保持到次年6月再更新。为什么?因为6月底是Fama-French的经典做法,能避免前视偏差。

4.2 价值因子(HML)的构建逻辑

HML,High Minus Low。做多高账面市值比(价值股),做空低账面市值比(成长股)。

这里有个关键点:账面市值比(B/M)怎么算?

  • 账面价值:公司财报里的股东权益
  • 市值:股票价格 × 总股本
  • B/M = 账面价值 / 市值

你想想看,B/M高的公司,通常是被市场低估的“便宜货”。HML因子就是赌这些便宜货未来会均值回归。

避坑指南:我曾经用季度数据更新B/M,结果发现回测效果很差。后来才意识到,Fama-French用的是上一年度的账面价值,配合当前市值。这样能保证信息在发布时点之后才被使用。切记,不要用未来数据!

4.3 6个投资组合的划分方法

这是三因子模型最精妙的地方。Fama和French把股票分成6个组合,怎么分的?

两个维度:

  • 规模:大(B)、小(S)——按市值中位数切
  • 价值:高(H)、中(M)、低(L)——按B/M的30%、70%分位点切

交叉一下,就是2×3=6个组合:

规模 \ 价值 低B/M(L) 中B/M(M) 高B/M(H)
小盘(S) S/L S/M S/H
大盘(B) B/L B/M B/H

然后,SMB和HML就从这6个组合里算出来:

  • SMB = (S/L + S/M + S/H)/3 - (B/L + B/M + B/H)/3
  • HML = (S/H + B/H)/2 - (S/L + B/L)/2

为什么要这么麻烦?直接按市值分组不行吗?

嗯,这里要注意:Fama-French想控制其他变量的影响。比如算SMB时,他们用三个价值组的平均,就是为了剔除价值因子的干扰。说白了,就是让SMB纯粹反映规模效应。

重要提醒:分组时一定要用独立排序还是条件排序?Fama-French用的是条件排序——先按规模分两组,再在每个规模组内按B/M分三组。这样能保证每个组合里都有足够多的股票。

4.4 三因子回归实战

好了,因子构建完了,怎么用?跑回归。

模型公式很简单:

R_i - R_f = α + β_mkt × (R_m - R_f) + β_smb × SMB + β_hml × HML + ε

其中:

  • R_i:个股或组合的收益率
  • R_f:无风险利率(通常用1个月国债利率)
  • R_m:市场组合收益率
  • SMB、HML:我们刚构建的因子
  • β_mkt、β_smb、β_hml:因子载荷
  • α:超额收益(如果显著为正,说明模型解释不了)

下面我给一段Python代码示例,用的是statsmodels库:

import pandas as pd
import statsmodels.api as sm

# 假设df包含:excess_ret, mkt_excess, smb, hml
X = df[['mkt_excess', 'smb', 'hml']]
X = sm.add_constant(X)
y = df['excess_ret']

model = sm.OLS(y, X).fit()
print(model.summary())

跑完回归,你会看到三样东西:

  • :模型整体解释力。我见过R²从0.7到0.95不等,取决于你选的股票。
  • 系数显著性:看p值。如果某个因子的p值大于0.05,说明它对这只股票没啥解释力。
  • α:如果α显著为正,恭喜你,找到了模型无法解释的超额收益——这可能就是你的Alpha策略。

实战经验:我曾经用三因子模型分析一只小盘价值股,发现它的SMB载荷高达1.2,HML载荷0.8。这说明这只股票对规模因子和价值因子都非常敏感。后来我把它加入了一个多因子组合,效果确实不错。

4.5 知识体系总览

为了让你更直观地理解本章的核心逻辑,我画了一张流程图:

Fama-French三因子模型构建流程 第一步:数据准备 市值、账面市值比、收益率 第二步:2×3分组 规模:小(S) / 大(B) | 价值:高(H) / 中(M) / 低(L) → 6个组合:S/L, S/M, S/H, B/L, B/M, B/H SMB因子 小盘组合 - 大盘组合 (S/L+S/M+S/H)/3 - (B/L+B/M+B/H)/3 HML因子 价值组合 - 成长组合 (S/H+B/H)/2 - (S/L+B/L)/2 市场因子 市场组合 - 无风险利率 R_m - R_f 第四步:三因子回归 R_i - R_f = α + β₁MKT + β₂SMB + β₃HML + ε

这张图把整个流程串起来了。从数据准备,到分组,再到因子构建,最后跑回归。你跟着这个流程走一遍,基本就掌握了三因子模型的核心。

最后说一句:三因子模型虽然经典,但它不是万能的。我在实际工作中发现,它对某些行业(比如科技股)的解释力就不太够。这时候,你可能需要引入更多因子——比如动量因子、盈利因子。不过那是后面章节的事了。


公众号:蓝海资料掘金营,微信deep3321