4. 因子模型入门:单因子模型、多因子模型、Fama-French三因子模型

聊到市场中性策略,就绕不开因子模型。说白了,因子模型就是帮我们拆解收益来源的工具。你想想看,一只股票涨了,到底是因为大盘涨了?还是因为它本身便宜?还是因为小盘股最近在风口上?因子模型就是用来回答这些问题的。

我个人习惯把因子模型看作是「收益的X光机」。它能穿透价格波动的表象,看到背后到底是什么力量在驱动。今天我们就从最简单的单因子模型开始,一步步深入到经典的三因子模型。

因子模型知识体系 因子模型 单因子模型 多因子模型 Fama-French三因子 CAPM 市场因子 因子选择 风险暴露 市场因子 规模因子 价值因子

4.1 单因子模型:一切从CAPM开始

单因子模型最经典的例子就是CAPM(资本资产定价模型)。它的核心思想很简单:一只股票的预期收益,只跟一个因子有关——市场组合的收益。

公式长这样:

E(Ri) = Rf + βi × (E(Rm) - Rf)

其中:

  • E(Ri):股票i的预期收益
  • Rf:无风险利率(比如国债收益率)
  • βi:股票i对市场因子的敏感度
  • E(Rm) - Rf:市场风险溢价

说白了,CAPM告诉我们:你承担的风险越大,预期收益就应该越高。但这个「风险」特指系统性风险,也就是市场风险。那些公司特有的风险,比如管理层变动、产品召回,CAPM认为可以通过分散投资消除掉,所以市场不会为这些风险买单。

💡 我的经验: 刚入行时我特别喜欢用CAPM算预期收益,觉得它简洁又优雅。后来发现,现实中的股票收益远不止市场因子能解释。比如2017年A股的白马股行情,很多低β的股票反而涨得比高β的好。这说明单因子模型确实太「单薄」了。

4.2 多因子模型:给收益拆解加几个维度

既然一个因子不够用,那就加因子。多因子模型的核心思想是:股票的收益受多个共同因子驱动。

一般形式是:

Ri = αi + βi1 × F1 + βi2 × F2 + ... + βik × Fk + εi

其中:

  • F1, F2, ..., Fk:各个因子(比如市场、规模、价值、动量等)
  • βi1, βi2, ..., βik:股票i对各因子的暴露度
  • αi:超额收益(也就是因子解释不了的部分)
  • εi:残差项(随机扰动)

多因子模型的好处是,你可以根据策略需求选择不同的因子组合。比如做市场中性策略,我们通常会选一些能解释大部分收益的因子,然后通过对冲掉这些因子的暴露,把纯粹的α剥离出来。

🔑 关键点: 多因子模型不是因子越多越好。因子之间可能存在多重共线性,而且过多的因子会导致过拟合。我个人习惯先选3-5个核心因子,再根据回测结果逐步调整。

4.3 Fama-French三因子模型:业界标杆

1993年,Fama和French在CAPM的基础上加了两个因子,搞出了三因子模型。这可以说是量化金融领域最有影响力的模型之一。

三因子模型长这样:

E(Ri) - Rf = βi × (E(Rm) - Rf) + si × SMB + hi × HML

三个因子分别是:

因子 全称 含义
市场因子 Rm - Rf 市场组合收益减去无风险利率
规模因子 (SMB) Small Minus Big 小盘股收益减去大盘股收益
价值因子 (HML) High Minus Low 高账面市值比股票收益减去低账面市值比股票收益

为什么加这两个因子?Fama和French发现,历史上小盘股长期跑赢大盘股,价值股长期跑赢成长股。这两个现象无法用CAPM解释,所以它们被当作独立的因子加入模型。

⚠️ 避坑指南: 我曾经在A股市场直接套用美股的三因子模型,结果回测效果很差。后来发现,A股的规模效应和价值效应跟美股不完全一样。比如A股的小盘股效应更明显,但价值因子在特定时期会失效。所以,用因子模型一定要结合市场环境做调整,不能生搬硬套。

4.4 用Python实现三因子模型

光说不练假把式。我们来看看怎么用Python跑一个三因子回归。这里我用的是statsmodels库,做OLS回归。

import pandas as pd
import numpy as np
import statsmodels.api as sm

# 假设我们有股票收益数据和三个因子数据
# df 包含: 'stock_return', 'market_factor', 'smb', 'hml'

# 准备自变量和因变量
X = df[['market_factor', 'smb', 'hml']]
y = df['stock_return'] - df['rf']  # 超额收益

# 加截距项(α)
X = sm.add_constant(X)

# 跑回归
model = sm.OLS(y, X).fit()

# 输出结果
print(model.summary())

# 提取关键参数
alpha = model.params['const']
beta_mkt = model.params['market_factor']
beta_smb = model.params['smb']
beta_hml = model.params['hml']

print(f"α = {alpha:.4f}")
print(f"市场因子暴露 = {beta_mkt:.4f}")
print(f"规模因子暴露 = {beta_smb:.4f}")
print(f"价值因子暴露 = {beta_hml:.4f}")

跑完回归后,你会得到每个因子的系数(暴露度)和α。α就是因子模型解释不了的那部分收益——如果α显著为正,说明你的选股能力不错;如果α接近零,说明收益基本被因子解释了。

💡 实用技巧: 做市场中性策略时,我们通常会把组合的因子暴露度调整到接近零。比如如果组合对规模因子有正的暴露(偏小盘股),就做空小盘股期货或ETF来对冲。这样剩下的就是纯粹的α收益。

4.5 因子模型的实战应用

因子模型在量化投资中主要有三个用途:

  1. 收益归因:搞清楚收益到底来自哪里。是选股能力强(α),还是运气好踩中了某个因子风口?
  2. 风险控制:通过控制因子暴露来管理风险。比如你不想承担小盘股风险,就把SMB的暴露调到零。
  3. 策略构建:根据因子预期来构建组合。比如你预测价值因子未来会走强,就多配一些高HML暴露的股票。

我记得有一次帮一个私募做策略诊断,他们的产品年化收益15%,看起来不错。但用三因子模型一拆解,发现α只有2%,剩下13%全是小盘股和价值因子的贡献。后来市场风格切换,这两个因子同时回撤,产品净值直接跌了20%。这就是不重视因子暴露分析的后果。

嗯,因子模型入门就聊到这里。它不是一个完美的工具,但绝对是量化投资中不可或缺的基础。你想想看,没有因子模型,你怎么知道你的收益到底是能力还是运气?


专注资料整理