halo 的技术博客

返回

上一篇我们讲了 q 因子模型怎么「拆掉 HML、直接用投资和盈利重写资产定价」。但 Fama 和 French 自己比谁都先意识到三因子的洞——他们 2015 年发了 “A Five-Factor Asset Pricing Model”,正面回应:「HML 不够用,我们加两个因子」。

这就是 FF5:在 MKT / SMB / HML 基础上,加 RMW(盈利能力因子)和 CMA(投资因子)。

一、FF3 的两个洞:盈利异常与投资异常#

Fama-French 三因子能解释大部分截面,但两类异象它一直吞不下:

  • 盈利能力异常:高盈利(高 ROE / 高营业盈利 OP)的公司,未来回报系统性偏高。HML 用的是账面市值比,和盈利能力只有弱相关,解释不了这条。
  • 投资异常:保守投资(低总资产增长)的公司,未来回报系统性偏高。同样,HML 捕捉不到「公司花不花钱」这件事。

这两个洞不是边角案例——它们是 1990s 以来被反复验证的「主流异象」。FF3 的解释力在 2000 年后明显下滑,根子就在这。

Fama 和 French 的应对思路很「Fama-French」:不推翻框架,往里加因子。既然盈利和投资是两个独立定价维度,就把它们做成因子,和 HML 并列。

二、五因子拆解:每个因子管什么#

因子构造捕捉的异象
MKT市场超额收益系统性风险
SMB小盘减大盘(2×3 规模×账面)规模效应
HML高 B/M 减低 B/M价值效应
RMW高 OP 减低 OP(Robust-minus-Weak)盈利能力异常
CMA低投资减低投资(Conservative-minus-Aggressive)投资异常

RMW 用营业盈利 OP = 营业利润 / 账面权益排序;CMA 用投资 = 总资产年度增长排序。两者都采用经典的 2×3 双重排序(先按规模分 2 组,再按目标变量分 3 组),保证因子中性于规模。

三、同构面板:与 q 文章用同一套数据#

为了和上一篇 q 因子模型直接可比,本文用完全相同的合成面板(同样的随机种子、同样的特征生成、同样的收益机制)。区别只在「怎么把特征做成因子、怎么检验模型」:

收益机制里「盈利正、投资负」,恰好是 RMW 与 CMA 要捕捉的方向——所以 FF5 应当比 FF3 更干净地吸收这两条信号。

四、2×3 双重排序:把因子造出来#

因子不是凭空来的,是按 Fama-French 标准流程从个股收益里「提纯」的:

注意 CMA 的定义方向:取「低投资组合 − 高投资组」,所以保守投资为正。这和上一篇 q 模型的 IA 信号(投资为负)恰好是同一枚硬币的两面——q 模型说「投资越高回报越低」,FF5 的 CMA 把它翻转成正向因子。两文同构,一目了然。

五、十分位:RMW 与 CMA 都单调#

def decile_ls(sig):
    dec_ret = np.zeros((10, T))
    for t in range(T):
        order = np.argsort(sig[:, t]); ranks = np.empty(N); ranks[order] = np.arange(N)
        d = np.clip(ranks // (N // 10), 0, 9)
        for k in range(10):
            sel = (d == k); dec_ret[k, t] = ret[sel, t + 1].mean()
    return dec_ret, dec_ret[-1, :] - dec_ret[0, :]

dec_op,  ls_op  = decile_ls(PROF_z)   # RMW 代理: D10(强盈利) - D1(弱盈利)
dec_cma, ls_cma = decile_ls(-INV_z)   # CMA 代理: D10(保守) - D1(激进)
aop, vop, sop = perf(ls_op)    # RMW L-S: 年化 21.4% / Sharpe 5.51
acm, vcm, scm = perf(ls_cma)   # CMA L-S: 年化 21.3% / Sharpe 4.86
ahm, vhm, shm = perf(hml)      # HML L-S: 年化 5.1%  / Sharpe 2.36
python

盈利能力 RMW 十分位(D1=最弱 → D10=最强)与投资 CMA 十分位(D1=最激进 → D10=最保守):两条都干净单调

实测:RMW 从 D1 单调到 D10,多空年化 21.4%、Sharpe 5.51CMA 从 D1(最激进投资)单调到 D10(最保守),多空年化 21.3%、Sharpe 4.86。两条楼梯都笔直——证明盈利与投资确实是独立、稳定的定价维度。

六、三因子累计净值:RMW / CMA / HML 同图#

把 RMW、CMA、HML 三个多空累计净值放一起,直观看 FF5 新增两因子的分量:

cum_op = np.cumprod(1 + ls_op)
cum_cm = np.cumprod(1 + ls_cma)
cum_hm = np.cumprod(1 + hml)
python

RMW / CMA / HML 多空累计净值:2015 新增的 RMW 与 CMA 显著为正,向上斜率明显陡于 HML

关键观察:RMW 与 CMA 的向上斜率明显陡于 HML。这说明在合成面板的机制里,盈利与投资带来的截面收益,比经典价值(HML)更强劲、更干净。这也呼应了实盘里 2010s 的「质量(盈利)因子牛市」——高盈利公司那十年跑赢了传统价值一大截。

七、R² 与 |alpha|:FF5 比 FF3 多消化了多少#

用 18 个测试组合(2×3 规模×账面、规模×盈利、规模×投资)分别跑 FF3 与 FF5 时序回归:

X_ff3 = np.vstack([np.ones(T), MKT, smb, hml]).T
X_ff5 = np.vstack([np.ones(T), MKT, smb, hml, rmw, cma]).T
# 对每个组合 OLS, 取 R² 与 |alpha|
r2_ff3_m = 0.973  ; r2_ff5_m = 0.977
absa_ff3_m = 0.0025 ; absa_ff5_m = 0.0007
python

18 测试组合平均 R² 与平均 |alpha|:FF5 的 R² 更高、|alpha| 大幅更低

FF5 平均 R²(0.977)高于 FF3(0.973),平均 |alpha| 从 0.0025 暴跌到 0.0007——新增的 RMW/CMA 把原本 FF3 解释不了的那部分截面异常,大部分收进了因子里。

八、GRS 检验:模型好坏的硬指标#

光看 R² 和平均 |alpha| 还不够,要做一个联合检验——GRS 检验(Gibbons-Ross-Shanken),原假设是所有测试组合的 alpha 同时为 0:

F^=TNKN1+μ^fΣ^f1μ^f1α^Σ^res1α^\hat{F} = \frac{T - N - K}{N} \cdot \frac{1 + \hat{\mu}_f' \hat{\Sigma}_f^{-1} \hat{\mu}_f}{}^{-1} \cdot \hat{\alpha}' \hat{\Sigma}_{res}^{-1} \hat{\alpha}

F 统计量越大,越拒绝「alpha 全为 0」,即模型越差。

def grs_test(alphas, resid, factors, K):
    Np, Tt = resid.shape
    fcov = np.cov(factors, rowvar=False) + 1e-10 * np.eye(K)
    fmu = factors.mean(0)
    inv_f = np.linalg.inv(fcov)
    g = 1 + fmu @ inv_f @ fmu
    rcov = np.cov(resid) + 1e-10 * np.eye(Np)
    rinv = np.linalg.inv(rcov)
    aSa = alphas @ rinv @ alphas
    F = (Tt - Np - K) / Np * (1 / g) * aSa
    return F

grs_ff3 = grs_test(alphas3, resid3, X_ff3[:, 1:], 3)   # 55.21
grs_ff5 = grs_test(alphas5, resid5, X_ff5[:, 1:], 5)   # 0.65
python

18 组合 alpha:FF3(灰) → FF5(红) 普遍大幅收缩;GRS F 统计量 55.21 → 0.65

GRS F 统计量从 FF3 的 55.21 暴跌到 FF5 的 0.65。这个数字的下降,是「RMW/CMA 补上了 FF3 的洞」最直接的统计证据——FF3 下 18 个组合有显著联合 alpha(模型被拒绝),FF5 下联合 alpha 几乎消失(模型站得住)。

九、六类真实陷阱(实战必看)#

  1. 合成 Sharpe 虚高:面板信号系数 0.005 是演示设定,实盘 RMW/CMA 多空 Sharpe 通常 0.4–1.2,不是 5.5。本文数字证明方向正确,不证明收益真实。
  2. GRS F 暴跌可能是「过拟合因子」:FF5 比 FF3 多 2 个因子、多了 2 个自由度,R² 天然会升、alpha 天然会降。GRS 下降部分来自「因子更多」而非「因子更好」——要用样本外或滚窗 GRS 验证,不能只看样本内。
  3. RMW 与 CMA 高度共线于 HML:真实数据里盈利、投资、账面市值比三者纠缠,FF5 经常出现「HML 在五因子里变得不显著」的现象(Fama-French 2015 原文就发现 HML 在五因子中常不显著)。这不是 bug,是「HML 被 RMW/CMA 吸收」的直接体现。
  4. 2×3 排序的 micro-cap 污染:SMB/HML 的小盘组里混着大量流动性极差、退市风险高的微盘股,因子收益里掺了「流动性溢价 + 幸存者偏差」。实盘直接复制 FF 因子会踩这个坑。
  5. 因子的周期性:RMW(质量)在熊市防御性强、牛市跑输;CMA 在价值修复期强、在成长泡沫期弱。FF5 不是全天候模型,要配合 regime 判断。
  6. 中美市场异象结构不同:FF5 在美国用账面/盈利,A 股由于会计口径、退市机制、散户结构差异,直接套 RMW/CMA 常失效;A 股更有效的盈利代理常是「扣非 ROE + 经营现金流」而非 OP。

十、小结:FF5 与 q 模型,殊途同归#

把两篇文章放一起看,会得到一个很有意思的结论:

  • q 模型:说 HML 是冗余的,直接拆掉,用 ME / IA / ROE 三因子(加 MKT 成四因子)重写。
  • FF5:说 HML 要保留,但补上 RMW / CMA,变成五因子。

两派的经济内核完全一致——截面收益由「公司盈利能力」和「投资激进程度」驱动。q 模型把它写成「拆 HML」,FF5 把它写成「加因子」。实战上,FF5 的好处是「不抛弃已被广泛接受的 HML 语言、机构接受度高」;q 模型的好处是「理论更干净、因子更少、共线性更低」。

对你做策略的意义是:不管用哪套语言,盈利与投资都是你必须显式建模的维度。只盯着 B/M 做价值,等于在 2015 年之后故意蒙住一只眼睛。


代码与图表均由自包含 Python(numpy/scipy)真实计算,随机种子固定为 20260717,与「Q 因子模型」一文共用同一合成面板,可完整复现。所有统计数字(含 GRS F 统计量)来自文中脚本输出。

Fama-French 五因子实战拆解:把规模价值再加盈利与投资
https://blog.halo26812.eu.org/blog/fama-french-five-factor
Author halo
Published at 2026年7月17日
版权声明 CC BY-NC-SA 4.0
Comment seems to stuck. Try to refresh?✨