多因子模型系列4-验证Fama French三因子分解的有效性

Fama-French三因素模型(一)

本文将介绍著名经济学家尤金 法码与其Fama-French 三因素模型,并利用三因素模型对多因子打分模型进行因子收益率分解。

尤金·法玛(Eugene F. Fama),著名经济学家、金融经济学领域的思想家,芝加哥经济学派代表人物之一、芝加哥大学教授,2013年诺贝尔经济学奖得主。

1990年代初,法玛与麻省理工学院的肯尼斯·弗伦奇(Kenneth French)教授合作,检验了几种可选择的财务数据能够提高股票回报与经济活动的预测度。他们在宏观经济层面上检验这些数据,同时又在公司水平上检验,例如股利的产生;又在股票回报与商业波动中检验他们的相互关系。除了考虑股票价格相对指数的波动外,他们还考虑了公司的规模以及市净率分类等因素,构建了包含市场因子、规模因子和价值因子的三因素模型。三因素模型的提出的确解释了CAPM模型不能解释的“异常”问题;三因素模型还可用来测度基金的业绩,以考察基金经理的投资能力。

模型认为,一个投资组合(包括单个股票)的超额回报率可由它对三个因子的暴露来解释,这三个因子是:市场资产组合($R_m − R_f$)、市值因子($SMB$)、账面市值比因子($HML$)。这个多因子均衡定价模型可以表示为:

$$E(R_{i}) – R_f = β(E(R_m) – R_f)+ sSMB+ hHMI$$

其中,

  • $R_f$表示无风险收益率;
  • $R_m$为市场收益率;
  • $R_i$为投资组合收益率
  • $SMB$为市值因子收益率
  • $HMI$为账面市值比因子收益率

1、理论假设

在探讨Fama—French三因子模型的应用时,是以“有限理性”理论假设为基础。并在此基础上得出若干基本假定:

(1) 存在着大量投资者;

(2)所有投资者都在同一证券持有期计划自己的投资资产组合;

(3)投资者投资范围仅限于公开金融市场上交易的资产;

(4)不存在证券交易费用(佣金和服务费用等)及税赋;

(5)投资者们对于证券回报率的均值、方差及协方差具有相同的期望值;

(6)所有投资者对证券的评价和经济局势的看法都一致。

2、统计假设

从模型的表达式可以看出,FF模型属于多元回归模型。其基本假设为:

(1)$(R_m − R_f)、SMB、HML$与随机误差项$u$不相关;

(2)零均值假定:$E(u) = 0$;

(3)同方差假定,即$u$的方差为一常量:$Var(u) = \sigma ^2$;

(4)无自相关假定:$cov(u_i,u_j)=0,i!=j$;

(5)解释变量之间不存在线性相关关系。即两个解释变量之间无确切的线性关系;

(6)假定随机误差项$u$服从均值为零,方差为$\sigma^2$正态分布,即$u-N(0,\sigma^2)$。

因子收益率的计算

In [1]:
import pandas as pd 
import numpy as np
import matplotlib.pyplot as plt
In [2]:
Factor_booktoshare_high=rqportal.portfolio(1643340) #高账面市值比
Factor_booktoshare_low=rqportal.portfolio(1643347)# 低账面市值比
In [3]:
Factor_market_cap_small=rqportal.portfolio(1643385)
Factor_market_cap_big=rqportal.portfolio(1643384)
In [4]:
#账面市值比因子收益率
HML=Factor_booktoshare_high.daily_returns.values-Factor_booktoshare_low.daily_returns.values
In [5]:
#市值因子收益率
SMB=Factor_market_cap_small.daily_returns.values-Factor_market_cap_big.daily_returns.values
In [6]:
#市场因子收益率
RM=Factor_market_cap_small.benchmark_daily_returns.values
In [22]:
plt.figure(figsize=[20,8])
plt.plot(np.cumprod(HML+1))
plt.plot(np.cumprod(SMB+1))
plt.plot(np.cumprod(RM+1))
plt.legend(['HML_return_curve','SMB_return_curve','RM_return_curve'])
Out[22]:
<matplotlib.legend.Legend at 0x7f7b7d145fd0>

三因子相关性热力图:

In [48]:
import seaborn as sns

cov_matrix=np.cov(X.T)

plt.figure(figsize=[10,5])
sns.heatmap(np.corrcoef(X.T),xticklabels=['HML','SMB','RM'],yticklabels=['HML','SMB','RM'])
/srv/env/lib64/python3.4/site-packages/matplotlib/font_manager.py:1297: UserWarning: findfont: Font family ['sans-serif'] not found. Falling back to DejaVu Sans
  (prop.get_family(), self.defaultFamily[fontext]))
Out[48]:
<matplotlib.axes._subplots.AxesSubplot at 0x7f7b7b749550>

多因子打分模型回顾

  • 股票池:沪深300
  • 打分规则:个股在每个因子上的排名求算术平均(因子等权重)
  • 股票选取:得分排名最高的10只
  • 调仓频率:月度
In [12]:
#获取多因子模型收益率
MultiFactor=rqportal.portfolio(1604099).daily_returns.values
In [13]:
len(HML)==len(SMB)==len(RM)==len(MultiFactor)
Out[13]:
True
In [24]:
#回归分析
import statsmodels.api as sm
In [25]:
X=np.column_stack((HML,SMB,RM))
y=MultiFactor
In [26]:
X1 = sm.add_constant(X)
In [27]:
model = sm.OLS(y, X1)
results = model.fit()
In [28]:
results.summary()
Out[28]:
OLS Regression Results
Dep. Variable:yR-squared:0.867
Model:OLSAdj. R-squared:0.867
Method:Least SquaresF-statistic:3170.
Date:Fri, 12 May 2017Prob (F-statistic):0.00
Time:13:07:10Log-Likelihood:5439.8
No. Observations:1458AIC:-1.087e+04
Df Residuals:1454BIC:-1.085e+04
Df Model:3
Covariance Type:nonrobust
coefstd errtP>|t|[95.0% Conf. Int.]
const0.00040.0002.8300.0050.000 0.001
x10.13530.0187.6770.0000.101 0.170
x20.33830.01424.2600.0000.311 0.366
x30.88510.01090.9030.0000.866 0.904
Omnibus:142.737Durbin-Watson:1.913
Prob(Omnibus):0.000Jarque-Bera (JB):393.667
Skew:0.522Prob(JB):3.28e-86
Kurtosis:5.322Cond. No.133.

可以看到,回归系数在统计上(95%置信度)都不为0

In [29]:
paras=results.params
In [30]:
y_predic=np.dot(X1,paras)
In [31]:
plt.figure(figsize=[20,8])
plt.plot(np.cumprod(y_predic+1))
plt.plot(np.cumprod(y+1))
plt.legend(['y_predicted','y_true'])
Out[31]:
<matplotlib.legend.Legend at 0x7f7b7d051f98>

此次分享到此为止,后续会基于三因子模型进行风险分解与评估,甚至将三因子模型扩展到五因子模型,敬请期待!

残差风险计算

由前文可知存在如下分解:$$E(R_{i}) – R_f = β(E(R_m) – R_f)+ sSMB+ hHMI$$

与之对应的回归式为:$$r_i=\alpha +\beta r_{mi}+s smb_i+h hmi_i+u_i$$

波动率分解:$$\sigma_r^2=cov(\beta r_{mi}+s smb_i+h hmi_i+u_i,\beta r_{mi}+s smb_i+h hmi_i+u_i)$$
$$\sigma_r^2=cov(\beta r_{mi}+s smb_i+h hmi_i,\beta r_{mi}+s smb_i+h hmi_i)+\sigma_u^2$$

我们主要关注残差风险(不可解释的风险来源),即$\frac{\sigma_u}{\sigma_r}$

In [50]:
print(u'残差风险占比为%f'%(np.std(y_predic-y)/np.std(y)))
残差风险占比为0.364165

多因子模型系列目录

1.多因子模型系列1-数据预处理之离群值处理
2. 多因子模型系列2-多因子模型的步骤梳理
3. 多因子模型系列3-Fama Franch三因子及其拓展五因子模型
当前阅读> 4. 多因子模型系列4-验证Fama French三因子分解的有效性
5. 多因子模型系列5-套利定价模型的应用
6. 多因子模型系列6-沪深300指数的风格因子暴露度分析
7. 多因子模型系列7-多因子模型水平测试题试答
8. 多因子模型系列8-基于组合权重优化的风格中性多因子选股策略框架
9. 多因子模型系列9-阿里巴巴与101个alpha
10. 多因子模型系列10-因子分析
11. 多因子模型系列11-绩效分析之Brinson模型