从CAPM到Carhart:多因子模型演进与A股实战计算指南 1. 从CAPM到Carhart多因子模型演进史我第一次接触CAPM模型是在2013年做量化策略回测时当时发现这个市场风险溢价模型解释A股收益就像用渔网捞沙子——总有些收益漏网。直到后来系统学习了Fama-French三因子和Carhart四因子模型才真正理解现代金融学如何用多维度因子捕捉股票收益来源。市场就像个多面体CAPM模型只看到了市场风险这一个面。1993年Fama和French提出的三因子模型则像给这个多面体新增了两个观察角度市值效应SMB小盘股长期跑赢大盘股账面市值比效应HML低估值股票表现优于高估值股票而Carhart在1997年加入的动量因子UMD则像是给模型装上了趋势追踪雷达。这个演进过程就像手机摄像头的升级——从单摄到三摄再到四摄能捕捉的市场特征越来越丰富。2. Fama-French三因子实战指南2.1 数据准备A股特色处理在A股计算三因子有几个坑我踩过多次ST股票过滤需要用pd.merge()将ST名单与行情数据关联特别注意处理ST日期区间上市满一年通过datetime.timedelta(365)计算上市满一年时点财务数据对齐A股的财报披露有滞后性建议使用年报数据时统一延后4个月# 典型的数据清洗代码示例 def clean_a_stock(data): # 过滤ST股 non_st data[~data[code].isin(st_list)] # 过滤上市不满一年 non_st non_st[non_st[list_date] pd.to_datetime(2012-01-01)] # 计算BM比率倒数处理 non_st[BM] 1 / non_st[pb] return non_st2.2 因子计算分步拆解2.2.1 SMB因子构建市值因子计算要注意每年5月末按市值中位数分组使用流通市值加权而非等权A股的小盘股效应在2015年后明显减弱# 市值分组示例 def size_group(df): df[size_group] np.where(df[mkt_cap] df[mkt_cap].median(), B, S) return df # 按月计算市值加权收益 size_ret data.groupby([month,size_group]).apply( lambda x: np.sum(x[ret]*x[mkt_cap])/np.sum(x[mkt_cap]))2.2.2 HML因子构建账面市值比因子要注意财务数据使用t-1期年报极端值处理我通常剔除BM最高和最低1%A股的HML因子在牛市中经常失效3. Carhart四因子进阶实战3.1 动量因子(UMD)的中国特色在A股计算动量因子时发现最佳形成期6-12个月美股常用11个月排除最近月避免反转效应干扰行业中性化A股动量常伴随行业轮动# 动量因子计算 def calc_momentum(price, lookback11, skip_month1): ret price.pct_change(lookback).shift(skip_month) return ret.rank(pctTrue) # 标准化处理3.2 四因子回归检验使用statsmodels进行回归时建议先对因子做标准化处理检查VIF值防止多重共线性采用Newey-West调整标准误import statsmodels.api as sm # 因子回归示例 X factors[[MKT,SMB,HML,UMD]] X sm.add_constant(X) model sm.OLS(stock_ret, X).fit(cov_typeHAC, cov_kwds{maxlags:3}) print(model.summary())4. A股实证结果解读4.1 三因子有效性检验基于2010-2020年全A股数据SMB因子年化收益4.2%但2017年后失效HML因子年化收益6.8%波动率较大市场因子解释力最强Adj.R²约65%注意A股的小市值效应在注册制推行后显著减弱建议在策略中降低SMB因子权重4.2 四因子增强效果加入UMD因子后模型解释力提升约8%组合回撤减少15-20%但动量因子在2018年熊市出现负alpha5. 常见问题解决方案问题1财务数据与行情数据频率不一致解决方案使用pd.merge_asof()按最近日期匹配问题2因子收益率波动大解决方案采用3个月移动平均平滑问题3行业干扰严重解决方案先做行业中性化处理# 行业中性化示例 def industry_neutral(df): for industry in df[industry].unique(): industry_mean df[df[industry]industry][factor].mean() df.loc[df[industry]industry, factor] - industry_mean return df在实盘应用中我发现多因子模型最实用的场景是组合绩效归因风格暴露监控阿尔法因子挖掘最近两年在A股市场单纯的多因子选股效果有所下降需要结合行业轮动和宏观因子进行动态调整。就像开车不能只看后视镜量化模型也需要持续进化和迭代。