用Python拆解Fama-French三因子模型:从金融术语到可执行代码的实战指南
当量化投资遇上Python,那些看似高深的金融模型突然变得触手可及。今天我们要做的,就是把诺贝尔奖级别的Fama-French三因子模型(FF3)从学术论文中解放出来,变成你Jupyter Notebook里可运行、可修改、可扩展的活代码。这不是一篇充满数学公式的理论文章,而是一份"所见即所得"的实战手册——我们会用中国A股市场真实数据,一步步演示如何用Python实现这个经典模型。
1. 破除神秘感:三因子模型本质就是多元线性回归
很多量化新手第一次接触FF3模型时,会被各种专业术语吓到:市场风险溢酬因子(Rmt)、市值因子(SMB)、账面市值比因子(HML)、阿尔法、贝塔...但实际上,这些听起来高大上的概念,本质上就是统计学中最基础的多重线性回归。
模型本质拆解:
- 阿尔法(α):回归方程的截距项,衡量无法被因子解释的超额收益
- 贝塔(β):各因子对应的回归系数,反映股票收益对该因子的敏感度
- 三因子:就是三个自变量X₁(Rmt)、X₂(SMB)、X₃(HML)
用Python代码表示,模型其实就是:
python复制from statsmodels.formula.api import ols
model = ols("股票收益 ~ Rmt + SMB + HML", data=df).fit()
1.1 因子经济含义的Python式理解
让我们用更"程序员友好"的方式理解这三个因子:
| 因子 | 金融定义 | Python类比 | 经济意义 |
|---|---|---|---|
| Rmt | 市场组合超额收益 | 大盘指数收益率 - 无风险利率 | 系统风险暴露 |
| SMB | 小市值股票组合收益 - 大市值组合收益 | df[small_cap].mean() - df[large_cap].mean() | 规模效应溢价 |
| HML | 高账面市值比组合收益 - 低比值组合收益 | df[high_bm].mean() - df[low_bm].mean() | 价值效应溢价 |
提示:在实际操作中,我们通常直接使用学术机构计算好的因子数据,避免自己构建投资组合的复杂过程。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据准备:获取与处理三因子数据
2.1 因子数据源选择与获取
国内常用的免费因子数据来源包括:
- 中央财经大学金融学院发布的五因子数据
- 国泰安(CSMAR)数据库
- 万得(Wind)金融终端
本文使用央财数据示范,其日频数据包含以下字段:
python复制import pandas as pd
factors = pd.read_csv('fivefactor_daily.csv',
index_col='trddy',
parse_dates=['trddy'])
print(factors.columns)
# 输出示例:
# Index(['mkt_rf', 'rf', 'smb', 'hml', 'rmw', 'cma'], dtype='object')
2.2 股票数据获取与收益率计算
使用baostock获取个股数据并计算对数收益率:
python复制import baostock as bs
import numpy as np
# 登录baostock
lg = bs.login()
# 获取贵州茅台(600519)日线数据
rs = bs.query_history_k_data_plus(
"sh.600519",
fields="date,close",
start_date='2021-01-01',
end_date='2022-12-31',
frequency
