Python金融分析(六):多因子模型简介

引言

正如在CAPM介绍中所提到的,CAPM虽然简单易用,但是存在许多局限性。而单因子模型,可以作为更加复杂的模型的扩展基础。接下来,我们重点介绍Fama-French三因子模型、Fama-French-Carhart四因子模型以及Fama-French五因子模型。在这些多因子模型的基础上,我们可以发现,通过添加我们认为有用的其他因子,我们可以定制自己的多因子模型。此外,我们还会简单讨论一下夏普比率、特雷诺比率和詹森指数等指标。

Fama-French三因子模型

基本介绍

作为CAPM的改进模型,Fama-French三因子模型的提出是基于美国股市历史回报率的实证结果,旨在解释影响股票市场平均回报率的风险溢价因素。

所谓的三因子模型,实际上就是一个三元一次方程。Fama和French(1992)观察发现市值较小、市净率比较低的两类公司更有可能取得优于市场水平的平均回报率。由此三因子模型通过引入二个新的解释变量:市净率、公司规模,与CAPM中的市场指数一同估计股票的回报水平,即:

r=Rf+β(RmRf)+bsSMB+bvHML+α(1)r = R_f + \beta(R_m-R_f) + b_s\cdot{SMB} + b_v\cdot{HML} + \alpha \tag{1}

其中,

  • SMB – 公司规模变量(Small [market capitalization] Minus Big),指由市值小的公司组成的投资组合回报与市值大的公司组成的投资组合回报之差;
  • HML – 市净率溢价(High [book-to-market ratio] Minus Low),账面市值比(市净率的倒数)较高的的公司组成的投资组合回报与比值较低的公司投资组合回报之差;
  • 其余变量与CAPM模型含义相同。

具体而言,首先需要对公司进行分组,按照市值(大、小)和账面市值比(高、中、低)两个维度分为六组:SH、BH、SM、BM、SL和BL。那么,

  • 对于规模因子(SMB),

SMB=SL+SM+SH3BL+BM+BH3(2)SMB = \frac{SL+SM+SH}{3} - \frac{BL+BM+BH}{3} \tag{2}

  • 对于价值因子(HML),

HML=BH+SH2BL+SL2(3)HML= \frac{BH+SH}{2} - \frac{BL+SL}{2} \tag{3}

此外,在计算市场超额收益率RmRfR_m-R_f时,采用所有在美国注册成立并纽约证券交易所,美国证券交易所或纳斯达克上市的所有公司(它们在证券价格研究中心(Center for Research of Security Prices, CRSP)数据库中的股票代码为10或11),按照其市值作为权重对其在tt月初的收益率减去当期的1月国债利率。

toa-heftiba-274947-unsplash

计算示例

前面,我们介绍开放数据源的时候提到了Kenneth R. French的数据库,其中就有Fama-French模型的各项数据,我们可以从以下网址下载:

http://mba.tuck.dartmouth.edu/pages/faculty/ken.french/data_library.html

1
%matplotlib inline
1
2
3
4
5
6
7
8
9
10
11
12
from scipy import stats
import numpy as np
import pandas as pd

import matplotlib as mpl
import matplotlib.pyplot as plt
import pandas_datareader.data as pddata
import altair as alt
import statsmodels.api as sm

plt.style.use('ggplot')
mpl.rcParams['figure.figsize']= [15, 9]
1
2
3
4
filename = 'data/F-F_Research_Data_Factors.CSV'
ff_factors = pd.read_csv(filename, index_col=0, skiprows=3)
ff_factors.index = pd.to_datetime(ff_factors.index, format='%Y%m')
ff_factors.head()
Mkt-RF SMB HML RF
1926-07-01 2.96 -2.30 -2.87 0.22
1926-08-01 2.64 -1.40 4.19 0.25
1926-09-01 0.36 -1.32 0.01 0.23
1926-10-01 -3.24 0.04 0.51 0.32
1926-11-01 2.53 -0.20 -0.35 0.31
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
ticker = 'AAPL'
beg_date = '2014-01-01'
end_date = '2018-12-31'

p = pddata.DataReader(ticker, data_source='yahoo',
start=beg_date, end=end_date,
retry_count=3, pause=0.1,
session=None, access_key=None)
log_ret = np.log(p['Adj Close']/p.shift(1)['Adj Close']).dropna()
ret = (np.exp(log_ret.resample('M').sum())-1)*100

# Merge data to be used
table = ff_factors['2014':'2018']
table.loc[:, 'RET'] = ret.values
table.head()

# OLS Regression
y = table.RET
x = table[['Mkt-RF', 'SMB', 'HML', 'RF']]
x = sm.add_constant(x)
results = sm.OLS(y,x).fit()
print(results.summary())
                            OLS Regression Results                            
==============================================================================
Dep. Variable:                    RET   R-squared:                       0.362
Model:                            OLS   Adj. R-squared:                  0.315
Method:                 Least Squares   F-statistic:                     7.791
Date:                Mon, 25 Mar 2019   Prob (F-statistic):           4.76e-05
Time:                        17:59:49   Log-Likelihood:                -192.47
No. Observations:                  60   AIC:                             394.9
Df Residuals:                      55   BIC:                             405.4
Df Model:                           4                                         
Covariance Type:            nonrobust                                         
==============================================================================
                 coef    std err          t      P>|t|      [0.025      0.975]
------------------------------------------------------------------------------
const          1.0238      1.068      0.958      0.342      -1.117       3.164
Mkt-RF         1.1928      0.261      4.564      0.000       0.669       1.717
SMB           -0.3372      0.328     -1.028      0.309      -0.995       0.320
HML           -0.8684      0.343     -2.535      0.014      -1.555      -0.182
RF            -8.3076     14.012     -0.593      0.556     -36.389      19.774
==============================================================================
Omnibus:                        7.749   Durbin-Watson:                   2.341
Prob(Omnibus):                  0.021   Jarque-Bera (JB):                7.272
Skew:                          -0.657   Prob(JB):                       0.0264
Kurtosis:                       4.087   Cond. No.                         59.9
==============================================================================

Warnings:
[1] Standard Errors assume that the covariance matrix of the errors is correctly specified.
1
2
table.plot()
plt.show()

output_11_0

Fama-French三因子模型扩展

Carhart四因子模型

1993年,Jegadeesh和Titman提出了一个有利可图的动量交易策略:买入赢家并卖出输家。基本假设是在短时间内,例如6个月,赢家将继续作为赢家,而输家将保持为失败者。例如,我们可以根据过去6个月的累计总回报对失败者进行分类。假设我们是在1965年1月。首先估计过去6个月的总回报。然后根据他们从最高到最低的总回报将它们分成10个投资组合。顶部(底部)10%被标记为赢家(输家)。实证研究证明了该策略的有效性。

基于这一结果,Carhart将动量(momentum)作为第四个因子添加到Fama-French三因子模型中:

r=Rf+β(RmktRf)+βSMBSMB+βHMLHML+βMOMMOM+ε(4)r = R_f + \beta(R_{mkt}-R_f) + \beta_{SMB}SMB +\\ \beta_{HML}HML + \beta_{MOM}MOM + \varepsilon \tag{4}

其中,MOMMOM就是动量因子。

关于“动量因子”,理论上并没有严格意义的解释。但是,其实简单想一想,似乎也是合理的。所谓动量因子,反映的是股票在短时间内保持上涨或者下跌的趋势。这个东西其实可以从多方面来理解:

  • 股票价格一定程度上是公司经营情况的反映,基本面的好坏不会在短时间内翻转(利好信息如果被瞬间消化甚至过度反应那就另当别论了);
  • 价格波动的一部分因素是由事件驱动的,从动态系统的角度来看,价格对事件的响应需要过渡过程,股票的交易受到盘子、时间、资金等多方面的约束,因此需要时间来消化;
  • 从行为经济学的角度分析,“追涨杀跌”的行为是投资者信心的反映,而人的观点/信心不会突变。

Fama-French五因子模型

有三因子模型珠玉在前,又有四因子模型更进一步,2015年Fama-French更推陈出新,提出了所谓的“五因子”模型:

Ri=Rf+αi+β(RmktRf)+siSMB+hiHML+riRMW+ciCMA+εi(5)R_i = R_f + \alpha_i + \beta(R_{mkt}-R_f) +\\ s_iSMB+h_iHML+r_iRMW+c_iCMA+\varepsilon_i \tag{5}

其中,RMWRMW是高/低盈利股票投资组合的汇报查,CMACMA是低/高再投资比例公司股票投资组合的汇报查,分别描述了公司的盈利水平风险(保守性)和投资水平风险(侵略性),如果五个因子能够完全解释预期收益的所有变化,那么αi\alpha_i应为0。

由于四因子模型和五因子模型的参数估计也是采用多元线性回归的方法,此处不再赘述。

Quotefancy-1517679-3840x2160

衡量指标

为了比较不同投资组合或者个股的投资表现,我们需要有一个衡量指标。由于投资需要在风险和收益之间寻求一个均衡,所以脱离一个谈另一个都是耍流氓,这也是为什么需要“经过风险调整的回报率”,常用的指标包括:

  • 夏普比率(Sharpe ratio);
  • 特雷诺比率(Treynor ratio);
  • 索提诺比率(Sortino ratio);
  • 詹森指数(Jensen’s alpha)。

夏普比率

Sharpe=E(RRf)δ=E(RRf)var(RRf)(6)Sharpe = \frac{E(R-R_f)}{\delta}=\frac{E(R-R_f)}{var(R-R_f)} \tag{6}

其中,RR为投资组合的回报率,RfR_f为无风险利率,δ\delta为投资组合的标准差,反映的是该投资组合的全部风险。

由于夏普比率是以全部风险作为调整,因此当投资者将其大部分资金投资于某个投资组合时,那么他就会比较关心该组合的全部风险,因此也就会将标准差作为对风险的适宜衡量指标,这时适宜的衡量指标就应该是夏普指数。

特雷诺比率

CAPM将个股的风险分为两部分:系统性风险(市场风险)和非系统性风险(特殊风险)。其中系统性风险由Beta系数表征,非系统性风险为Alpha。由于系统性风险可以通过优化投资组合加以控制,因此投资者在考虑投资组合中的个股时会更加关心其系统风险。因此,类似夏普比率,我们可以得到通过系统风险调整的收益率,即特雷诺比率:

Treynor=E(RRf)β(7)Treynor = \frac{E(R-R_f)}{\beta} \tag{7}

由于特雷诺比率以系统风险作为调整,因此当投资者关注其投资组合中的一部分的风险调整回报率时,使用特雷诺比率较为适宜。

索提诺比率

针对夏普比率采用标准差进行调整的一个批评是,它对两个方向上的变动(上行和下行)的考虑是均等的,然而在实际当中,下行所带来的刺激比同等程度的上行来得更为强烈,所以在衡量风险时,应当更加关注下行风险。

夏普比率的另一个问题是,对于分子,我们是用平均回报减去无风险利率;然而,对于分母而言,计算收益率标准差用的是收益率的均值,而与无风险利率无关,造成了不一致(回想标准差的定义,减去的是均值)

为了克服这两个问题,索提诺比率采用了下偏标准差(Lower Partial Standard Deviation, LPSD)。假设,我们有nn个收益率和1个无风险利率,其中mm个收益率小于无风险利率,那么:

LPSD=Σi=1m(RiRf)2m1Sortino=E(RRf)LPSD\begin{aligned} LPSD &= \frac{\Sigma^m_{i=1}{(R_i-R_f)}^2}{m-1}\\ Sortino &= \frac{E(R-R_f)}{LPSD} \end{aligned}

詹森指数

詹森指数,也称为詹森阿尔法,用来确定来自某一证券或投资组合超过理论预期收益的超额收益,反映了基金经理主动投资的能力。詹森指数实际上就是CAPM中实际收益与期望收益的残差,也就是收益中CAPM无法解释的部分:

αJ=Ri[Rf+βi(RmktRf)](8)\alpha_J = R_i - [R_f + \beta_i \cdot (R_mkt - R_f)] \tag{8}

特雷诺指数是通过除法剔除β\beta的影响,而詹森指数是通过减法来实现,因此可以认为是经过风险调整的。实际上,如果根据有效市场的假说,α\alpha的均值应当为0,即有效市场情况下,基金经理跟个猴子没啥区别。但是无论如何,詹森指数仍然被广泛用于评价基金经理的表现等,说明其存在有一定的合理性,也暗示市场并非有效(至少不是强有效)。

小结

这篇文章里没有什么代码,主要是些概念性的东西。关于多因子模型,拟合效果的好坏和因子的选取息息相关,显然因子并非越多越好看,那么 该如何选择因子呢?

除了因子的选取以外,还要考虑,实际的经济金融系统存在着非线性、时变、惯性、迟延、动态等多种特性,简单的线性模型可能只是一种无可奈何的近似,又该如何设计模型呢?

此外,如果不同时期的模型适用性不同,造成这种现象的原因是什么,又该如何切换模型呢?

关于衡量指标,可以发现几种指标的构建思路是一致的: 设计对风险鲁棒的观测量。这时候需要考虑的是,我们关心的是何种风险?在对风险鲁棒的同时能否准确一致地反映收益?此外,不同指标适用的情况又如何?

突然想到的是,如果是搞金融的人对外吹逼用,还需要做到的就是高端大气上档次与通俗易懂好理解之间的平衡。

参考文献

  1. http://mba.tuck.dartmouth.edu/pages/faculty/ken.french/data_library.html
  2. https://en.wikipedia.org/wiki/Fama–French_three-factor_model
  3. https://www.researchgate.net/profile/Myurathan_Kajendran/post/How_to_get_the_average_monthly_percent_excess_returns_for_portfolios_formed/attachment/59d6244a6cda7b8083a1f845/AS%3A377610031910917%401467040655756/download/A+five-factor+asset+pricing+model.pdf
  4. https://www.investopedia.com/terms/s/sortinoratio.asp