1. 先搞清楚这个数据包到底能帮你解决什么问题
如果你正在做A股市场的实证研究,尤其是资产定价、因子投资或者公司金融相关的课题,那么Fama-French五因子模型的数据和代码就是你绕不开的工具。这个数据包的核心价值,在于它把最耗时、最容易出错的“数据清洗和因子构建”环节给标准化了。你不用再自己从CSMAR、Wind或者国泰安数据库里一张张表下载、合并、计算市值、账面市值比、盈利、投资这些变量,然后按月份分组、排序、构建投资组合、计算因子收益率。这个过程,自己从头做一遍,没个一两周下不来,而且中间任何一个步骤的公式理解有偏差或者代码有bug,整个结果就全错了。
这个数据包(通常指2000-2025年这个时间范围)直接提供了基于中国A股市场数据计算好的五因子收益率序列(市场风险溢价因子Rm-Rf、市值因子SMB、账面市值比因子HML、盈利因子RMW、投资因子CMA),以及对应的无风险利率。你拿到手的是一个.dta格式的Stata数据集,每一行代表一个月份(或交易日,取决于数据频率),每一列就是一个因子。有了这个,你的研究重心就可以从“怎么把数据算对”转移到“怎么用这些因子去检验我的假设”上。
它最适合两类人:一是赶毕业论文的硕士、博士研究生,时间紧任务重,需要快速进入模型估计和结果分析阶段;二是需要快速复现或检验某个定价现象的学者或分析师。对于新手,它能极大降低入门门槛;对于有经验的研究者,它能提供一个可靠的计算基准,用于交叉验证自己的结果。
2. 拿到数据后,第一件事不是跑回归,而是验证
很多人拿到这类现成的数据,会迫不及待地直接reg。我建议先停一下,花十分钟做几个基础验证。这能帮你避免后续分析建立在错误数据上的风险。
2.1 检查数据的基本结构和完整性
首先,在Stata里打开数据文件(假设文件名为ff5_china.dta)。
use “你的路径/ff5_china.dta”, clear describe看一下describe的输出。重点关注:
- 观测数(obs):这应该等于从2000年1月到2025年12月(或最新月份)的总月份数。如果是日度数据,观测数会非常多。
- 变量(variables):至少应该包含以下核心变量:
date: 日期变量,格式可能是ym(年月)、mdy等。mkt_rf: 市场超额收益率(Rm-Rf)。smb: 市值因子收益率。hml: 账面市值比因子收益率。rmw: 盈利因子收益率。cma: 投资因子收益率。rf: 无风险利率(通常为月度化利率)。
- 存储类型:收益率变量通常是
float或double。
接着,用summarize看一下描述性统计。
summarize mkt_rf smb hml rmw cma rf你要看几个关键点:
- 均值(Mean):
mkt_rf的均值应该为正,但不会特别大(年化大概在6%-10%?)。smb,hml,rmw,cma的均值可正可负,这是由A股市场特定时期的风格决定的。如果某个因子的均值大得离谱(比如月均20%),那数据可能有问题。 - 标准差(Std. Dev.):因子的波动率。市场因子
mkt_rf的波动通常最大。其他因子波动相对较小。 - 最小值(Min)和最大值(Max):这里就能用到热搜词里的“stata最大值最小值命令”了,
summarize已经给出了。你要警惕异常值。比如,某个因子收益率出现了-1(即-100%)或者2(+200%)这样的极端值,这很可能是在计算投资组合收益率时,某个月份某个组合的股票数量极少(甚至只有1只)且该股票涨跌停造成的,属于构造方法需要处理的边界情况。如果数据提供者没有妥善处理,你的回归结果就会受到极端值严重影响。 - 观测数(Obs):确保每个变量的观测数一致,没有缺失值。
2.2 进行简单的逻辑校验和可视化
做完数字检查,再做些逻辑校验。比如,画一下因子的累积收益率曲线,这是非常直观的验证方式。
* 生成一个时间序列标识 gen time = _n tsset time * 计算累积收益率(假设因子收益率为小数形式,如0.01表示1%) gen cum_mkt = (1 + mkt_rf) if time==1 replace cum_mkt = cum_mkt[_n-1] * (1 + mkt_rf) if time>1 gen cum_smb = (1 + smb) if time==1 replace cum_smb = cum_smb[_n-1] * (1 + smb) if time>1 * 画图 line cum_mkt cum_smb time, legend(label(1 “MKT”) label(2 “SMB”))看图时问自己几个问题:曲线是否连续,没有诡异的跳空?累积收益率的趋势是否符合你对A股市场(如2007-2008, 2015, 2020-2021等时期)的粗略认知?SMB因子的累积曲线是否长期向上(表明小盘股溢价)?这些基于常识的判断能帮你过滤掉明显的错误。
2.3 检查因子间的相关性
用pwcorr命令计算一下因子间的相关系数矩阵。
pwcorr mkt_rf smb hml rmw cma, sig star(0.05)Fama-French五因子在设计上希望彼此有一定的独立性。你通常会看到:
smb和hml、rmw、cma的相关性可能不高。hml和rmw、cma之间可能存在一定的相关性,因为都与公司的基本面有关。- 最重要的是,检查有没有因子之间出现高度共线性(例如相关系数大于0.8或小于-0.8)。如果
rmw和cma高度相关,那么在回归中同时放入它们,可能会导致系数估计不准确(标准误膨胀)。这不是数据的错,而是模型本身在A股市场可能存在的现象,但你需要意识到这一点。
做完这三步,你对数据的质量就有了基本把握,可以更放心地用于后续分析。
3. 从单资产检验到投资组合分析:核心实证操作
数据验证无误后,就可以开始真正的实证分析了。这里我按从简单到复杂的顺序,拆解几个最常用的操作。
3.1 基础操作:检验单个股票或投资组合的因子暴露
这是最常见的用法。假设你有一个投资组合的月度收益率序列ret_port,已经和因子数据按日期合并好了。你想看这个组合收益能被五因子解释多少。
* 合并数据(假设你的组合收益率数据在 portfolio.dta 里) merge 1:1 date using “portfolio.dta” keep if _merge == 3 drop _merge * 计算组合的超额收益率 gen excess_ret = ret_port - rf * 运行时间序列回归 reg excess_ret mkt_rf smb hml rmw cma回归结果出来后,重点看:
- 调整R方(Adj R-squared):模型能解释组合收益波动的比例。对于高度分散化的组合(如大盘指数),R方可能很高(>0.9);对于个股或特定行业组合,R方可能较低。
- 各因子系数(Coef.)及其显著性(P>|t|):系数代表了组合对该因子风险的暴露程度。
mkt_rf系数(Beta):接近1表示组合系统风险与市场同步。smb系数为正:组合偏向小盘股。hml系数为正:组合偏向价值股(高账面市值比)。rmw系数为正:组合偏向高盈利公司。cma系数为正:组合偏向低投资(保守)公司。
- 截距项(_cons):这就是Alpha,衡量经过五因子风险调整后的超额收益。如果Alpha显著为正,说明组合有选股能力(在A股市场,主动基金常常以此作为业绩证明)。
3.2 进阶操作:分组检验与亚组分析
热搜词里有“stata如何做亚组分析”,这在因子模型中非常常用。比如,你想检验五因子模型在不同市值分组、不同行业下的解释能力是否相同。
* 假设你有一个变量 `size_group`,将股票分为“大盘”和“小盘”(1/2) * 或者有一个变量 `industry`,表示行业分类 * 方法1:使用 bysort 分组回归 bysort size_group: reg excess_ret mkt_rf smb hml rmw cma * 方法2:使用交互项模型(更灵活,可检验系数差异是否显著) gen mkt_large = mkt_rf * (size_group==1) // 大盘组的市场因子暴露 gen mkt_small = mkt_rf * (size_group==2) // 小盘组的市场因子暴露 * ... 同样为其他因子生成交互项 reg excess_ret mkt_large mkt_small smb_large smb_small hml_large hml_small rmw_large rmw_small cma_large cma_small * 然后通过 test 命令检验对应系数是否相等,例如 test mkt_large = mkt_small注意:做亚组分析时,每个子组的样本量不能太少,否则回归结果不可靠。对于月度数据,时间序列长度(T)至少要有60期(5年)以上。
3.3 批量操作:同时检验多个资产或组合
你可能有几十个甚至上百个测试资产(如所有行业组合、所有个股)。手动一个个回归不现实。这时需要循环。
* 假设你有100个组合的收益率,变量名是 ret1, ret2, ..., ret100 local nport = 100 forvalues i = 1/`nport’ { gen excess_ret`i’ = ret`i’ - rf qui reg excess_ret`i’ mkt_rf smb hml rmw cma * 将关键结果存储起来 est store model`i’ * 或者提取Alpha和t值 matrix b = e(b) matrix se = e(V) scalar alpha`i’ = b[1,6] // 假设截距项是第6个系数 scalar t_alpha`i’ = alpha`i’ / sqrt(se[6,6]) * 将 scalar 存入变量 }批量处理的关键是做好结果的管理和输出。你可以把所有的Alpha、t值、R方存储到新的变量或矩阵中,最后用outreg2或esttab命令输出成一张整洁的表格,用于论文或报告。
4. 避坑指南:从数据到结果的常见问题排查
即使使用现成数据,实证过程中也会踩坑。下面是我总结的几个高频问题及排查思路。
4.1 回归结果不显著或符号与理论相反
- 问题:比如
hml因子系数为负(看起来像成长股溢价),或者所有因子都不显著。 - 排查:
- 检查收益率计算口径:确认你的被解释变量(组合收益)和因子收益率的计算周期是否完全一致?都是月度收益率吗?你的
excess_ret是否准确等于ret_port - rf?rf是否使用了匹配的月度无风险利率。 - 检查数据频率和对齐:确保
date变量格式正确,并且你的组合收益率数据与因子数据在date上完全匹配(使用merge后keep if _merge==3)。一个常见的错误是日期格式不统一导致匹配失败,最终回归使用的观测数远少于预期。 - 检查极端值:重新用
summarize, detail或画散点图(scatter excess_ret mkt_rf)看看有没有极端值。用winsor2命令对主要变量进行1%或5%的缩尾处理,再跑回归看结果是否变化巨大。如果变化大,说明结果受异常值影响严重,需要在论文中说明。 - 理解市场特殊性:在A股,某些因子(如
hml)的效应可能不稳定或阶段性失效。这不一定是数据或代码问题,可能是市场特征。你需要结合样本期内的市场环境(如牛市、熊市、风格切换)来解读。
- 检查收益率计算口径:确认你的被解释变量(组合收益)和因子收益率的计算周期是否完全一致?都是月度收益率吗?你的
4.2 模型R方过低或过高
- 问题:回归调整R方只有0.2,或者高达0.99。
- 排查:
- R方过低(如<0.3):
- 对于个股回归,这很正常。个股收益中 idiosyncratic risk(特质风险)占比很大。
- 对于投资组合,检查组合构建方式。如果是高度分散化的组合(如全市场等权组合),R方应该较高。如果R方低,可能是组合内股票数量太少,或组合收益率数据存在大量噪声(比如计算错误)。
- R方过高(如>0.95):
- 检查是否不小心用市场指数收益率本身去对五因子回归。因为五因子包含
mkt_rf,这会导致近乎完美的共线性,R方虚高。 - 检查被解释变量是否与某个因子高度重合。例如,用一个纯粹按市值构建的小盘股组合去回归,其
smb因子暴露会接近1,其他因子暴露接近0,R方也会很高。
- 检查是否不小心用市场指数收益率本身去对五因子回归。因为五因子包含
- R方过低(如<0.3):
4.3 想做事件研究或更复杂的模型
- 需求:数据是月度的,但我想做日度级别的事件研究。
- 方案:这个2000-2025的五因子数据包通常是月度数据。事件研究一般需要日度或更高频的因子数据。你需要寻找日度的Fama-French因子数据(计算更复杂,数据源要求更高)。如果只有月度数据,却强行用于日度事件研究的市场模型估计,会导致严重的计量问题(参数估计不准)。
- 建议:明确你的研究问题所需的数据频率。如果是长期趋势、资产配置,月度数据足够。如果是短期事件冲击,必须寻找或构建日度因子。
4.4 数据更新与代码复用
- 问题:数据更新到2025年了,但我想扩展到2026年及以后,或者用同样的方法研究其他市场(如港股、美股)。
- 核心:关键在于理解并掌握数据背后的构造代码。现成的
.dta文件是结果,而配套的Stata代码(Do-file)才是“生产资料”。 - 操作:
- 仔细研读提供的Stata代码。它应该清晰地展示了从原始股票数据(代码、日期、收益率、市值、财务指标…)到最终因子收益率的每一步:数据清洗、变量计算、分组、排序、组合收益率计算、因子收益率计算。
- 找到代码中定义数据源路径、时间范围的关键位置。要更新数据,你需要用新的原始数据替换旧数据,并调整时间循环的起止点。
- 如果要应用于其他市场,你需要替换原始数据源(如从CSMAR换成CRSP/Compustat),并确保财务指标的定义(如账面价值、盈利、投资)与Fama-French (2015) 原文或中国学术界的通用做法保持一致。这个过程挑战较大,涉及不同数据库的字段匹配。
5. 从实证结果到论文报告:输出与呈现
跑出结果只是第一步,如何规范地报告在论文或报告中同样重要。
5.1 制作描述性统计表格
这是任何实证论文的第一张表。应包括所有主要变量(因子收益率、你的测试资产收益率等)的均值、标准差、最小值、中位数、最大值、观测数。使用estpost summarize和esttab可以方便地输出为LaTeX或Word格式。
estpost summarize mkt_rf smb hml rmw cma excess_ret esttab using “summary.rtf”, cells(“mean sd min p50 max count”) noobs replace5.2 制作回归结果表格
对于多个模型或分组回归的结果,使用esttab或outreg2进行排版。
* 运行不同模型的回归 reg excess_ret mkt_rf est store model1 reg excess_ret mkt_rf smb hml est store model2 reg excess_ret mkt_rf smb hml rmw cma est store model3 * 使用 esttab 输出 esttab model1 model2 model3 using “reg_results.rtf”, /// b(3) t(3) r2(3) ar2(3) star(* 0.1 ** 0.05 *** 0.01) /// mtitles(“CAPM” “FF-3F” “FF-5F”) replace这张表可以清晰地展示从CAPM到三因子再到五因子,模型的解释力(R方)如何变化,以及新增因子的显著性。
5.3 进行模型比较与检验
- GRS检验:如果你想同时检验多个资产(如25个市值-账面市值比组合)的Alpha是否联合为零,需要使用GRS检验。这需要利用回归残差协方差矩阵,在Stata中可通过编程或调用
grstest等用户命令实现。 - 因子冗余检验:检验新增的因子(如
rmw,cma)是否提供了独立于原有因子(mkt_rf,smb,hml)的信息。可以通过在时间序列回归中,将新因子对老因子做回归,看截距(Alpha)是否显著。
6. 总结:把工具用好,而不是被工具限制
最后,我想强调的是,Fama-French五因子模型数据和代码是一个强大的起点和基准,但不是研究的终点。拿到一个计算好的数据包,能让你快速起步,但更深层次的研究要求你理解每一个数字是怎么来的。
- 对于课程作业或快速原型:直接使用数据包,把精力放在模型应用、结果解读和报告撰写上。
- 对于严肃的学术研究:务必仔细审查配套的构建代码。了解它如何处理退市股票、如何定义财务变量(是t-1年年报数据吗?)、如何分组(按纽交所分位数还是全样本分位数?)、如何计算组合收益率(市值加权还是等权?)。这些细节的不同选择,可能会导致因子收益率出现显著差异,从而影响你的研究结论。
最稳妥的做法是,用这个数据包的结果作为基准,尝试自己从原始数据开始,复现其中一个因子(比如SMB)的构建过程。这个过程会让你对资产定价实证研究有质的理解。当你能清晰地解释为什么这个月SMB因子收益率是负的,或者为什么HML因子在最近五年失效了,你的研究才算真正入门了。