点赞、关注,养成良好习惯
Life is short, U need Python
量化投资基础系列,不断更新中
1. 前言
Sharp(1964),Lintner(1965),Black(1972)的资本资产定价模型(Capital asset pricing model, CAPM)认为,股票的收益只与整个股票市场的 系统风险 有线性关系,即
R i − R f = β i ( R m − R f ) R_i-R_f=\beta_i(R_m-R_f) Ri−Rf=βi(Rm−Rf)
也就是说,股票的期望收益只与市场的 系统风险 有关。
但是,Banz(1981)的论文发现,股票的收益还与其 市场价值 有关。在随后的一系列研究中,账面市值比(BE/ME)、市盈率倒数(E/P)等一系列指标都被发现可以解释股票价格的变动,也就是说,股票价格与一系列的 非系统风险 因素有关。
Fama 和 French(1992)对美国股票市场决定不同股票回报率差异因素的研究发现,股票市场的 β \beta β 值不能解释不同股票回报率的差异,而上市公司的 市值、账面市值比、市盈率 可以解释股票回报率的差异。
2. Fama-French 三因子基本思想
Fama 和 French 于1992年和1993年对美国股票市场中股票收益率的决定因素进行了全面性的研究分析,发现单独使用 Beta 或者分别与 市值、P/E比、杠杆比(率)、B/M比 结合在一起来解释股票收益率时,Beta 的解释能力很弱。
市值、P/E比、杠杆比(率)、B/M比 各因子单独用来解释收益率时,每个因子的解释能力都很强;当把这些因子组合起来时,市值、B/M比 会弱化
杠杆比(率) 和 P/E比 的解释能力。
因此,Fama 和 French 从可以解释股票收益率的众多因素中提取出3个重要的影响因子(特征工程),即 市场风险溢酬因子、市值因子 和 账面市值比因子,仿照 CAPM模型 用这3个因子建立起线性模型来解释股票的收益率,这就是著名的 Fama-French三因子模型 (Fama-French Three Factor Model ) 。
三因子模型中的 3 个因子均为投资组合的 收益率
:市场风险溢酬因子 对应的是 市场投资组合的收益率
,市值因子 对应的 做多市值较小公司、做空市值较大公司的投资组合之收益率
,账面市值比因子 对应的是 做多高 B/M 比公司、做空低 B/M 比公司的投资组合之收益率
。三因子模型的具体形式如下:
E
(
R
i
t
)
−
R
f
t
=
b
i
[
E
(
R
m
t
)
−
R
f
t
]
+
s
i
E
(
S
M
B
t
)
+
h
i
E
(
H
M
L
t
)
E(R_{it}) - R_{ft} = b_i[E(R_{mt}) - R_{ft}] + s_{i}E(SMB_t) + h_{i}E(HML_t)
E(Rit)−Rft=bi[E(Rmt)−Rft]+siE(SMBt)+hiE(HMLt)
-
R m t − R f t R_{mt}-R_{ft} Rmt−Rft 为市场风险,其中 R m t R_{mt} Rmt 是市场收益率, R f t R_{ft} Rft 是无风险收益率(比如,利率或国债收益率等);
-
SMB(Small Minus Big)代表市值因子,也就是小公司比大公司高出的收益率;
-
HML(High Minus Low)代表账面市值比因子,用高 B/M 比股票收益率减去低 B/M 比公司的收益率得到;
-
b i b_i bi、 s i s_i si 和 h i h_i hi 分别为投资组合(或单只股票)的收益率对3个因子的敏感系数。
事实上,常用如下公式:
R
i
t
−
R
f
t
=
α
i
+
b
i
(
R
m
t
−
R
f
t
)
+
s
i
S
M
B
t
+
h
i
H
M
L
t
+
ϵ
i
t
R_{it} - R_{ft} = \alpha_{i} + b_{i}(R_{mt} - R_{ft}) + s_{i}SMB_t + h_{i}HML_t + \epsilon_{it}
Rit−Rft=αi+bi(Rmt−Rft)+siSMBt+hiHMLt+ϵit
-
R i t R_{it} Rit 和 R m t R_{mt} Rmt的数值获取
- 市场组合收益率 R m t R_{mt} Rmt 直接从数据库获取;
- 若研究对象为个体,则 R i t R_{it} Rit 直接从数据库获取;
- 若研究对象为投资组合,则 R i t R_{it} Rit 需要由个股收益的加权平均计算:
- 等比例加权平均(Equal Weighted Average)
- 市值比例加权平均(Value Weighted Average)
-
R f t R_{ft} Rft的数值获取
- 中国人民银行公布的利率
- 可以参考政府债券的利率
-
S M B t SMB_t SMBt 和 H M L t HML_t HMLt 的计算
-
(1) S M B t SMB_t SMBt 对应的是
做多
市值较小
公司、做空
市值较大
公司的投资组合之收益率;- 市值即公司股票的市值(Size),等于股票价格 P P P 乘以流通股数 Q Q Q
- 上市公司 k k k 在 t t t 时刻的市值即为 M E k t = P k t ∗ Q k t ME_{kt} = P_{kt} * Q_{kt} MEkt=Pkt∗Qkt
- 将 M E k t ME_{kt} MEkt 从小到大排序,找出中位数,低于中位数者为 S m a l l Small Small 组(S),高于中位数者为 B i g Big Big 组(B)
-
(2) H M L t HML_t HMLt 对应的是
做多高
B/M 比公司、做空低
B/M 比公司的投资组合之收益率;- 上市公司 k k k 在 t t t 时刻的 B / M R a t i o k t = B E k t / M E k t B/M Ratio_{kt}=BE_{kt}/ME_{kt} B/MRatiokt=BEkt/MEkt
- B E k t BE_{kt} BEkt 为公司 k k k 在 t t t 时刻的账面价值(Book Common Equity):可以从财务报表数据库得
- M E k t ME_{kt} MEkt 为上市公司 k k k 在 t t t 时刻的市值即为 M E k t = P k t ∗ Q k t ME_{kt} = P_{kt} * Q_{kt} MEkt=Pkt∗Qkt
- 将 B / M R a t i o k t B/M Ratio_{kt} B/MRatiokt 从小到大排序,前30%者为 L o w Low Low 组(L),后30%者为 H i g h High High 组(H),中间40%者为 M e d i u m Medium Medium 组(M)
-
(3) 根据 M E k t ME_{kt} MEkt 和 B / M R a t i o k t B/M Ratio_{kt} B/MRatiokt 的划分可以得到六组投资组合:S/L、S/H、S/M;B/L、B/H、B/M;
-
(4) 利用加权平均的方法计算每组的平均收益率,具体做法如下:
-
B
/
M
B/M
B/M 组由
K
K
K 个公司组成,
t
t
t 时点时每个公司的市值分别为
M
1
t
,
.
.
.
,
M
K
t
M_{1t},...,M_{Kt}
M1t,...,MKt,各公司股票收益为
R
1
t
,
.
.
.
,
R
K
t
R_{1t},...,R_{Kt}
R1t,...,RKt,则
B
/
M
B/M
B/M 组的收益率为:
B M t = M 1 t ∑ K M k t R 1 t + M 2 t ∑ K M k t R 2 t + ⋯ + M K t ∑ K M k t R K t = ∑ K M k t R k t / ∑ K M k t \begin{aligned} B M_{t} &=\frac{M_{1 t}}{\sum_{K} M_{k t}} R_{1 t}+\frac{M_{2 t}}{\sum_{K} M_{k t}} R_{2 t}+\cdots+\frac{M_{K t}}{\sum_{K} M_{k t}} R_{K t} \\ &=\sum_{K} M_{k t} R_{k t} / \sum_{K} M_{k t} \end{aligned} BMt=∑KMktM1tR1t+∑KMktM2tR2t+⋯+∑KMktMKtRKt=K∑MktRkt/K∑Mkt - 同理可得: B H t B H_{t} BHt、 B L t B L_{t} BLt、 S M t S M_{t} SMt、 S H t S H_{t} SHt、 S L t S L_{t} SLt;
-
B
/
M
B/M
B/M 组由
K
K
K 个公司组成,
t
t
t 时点时每个公司的市值分别为
M
1
t
,
.
.
.
,
M
K
t
M_{1t},...,M_{Kt}
M1t,...,MKt,各公司股票收益为
R
1
t
,
.
.
.
,
R
K
t
R_{1t},...,R_{Kt}
R1t,...,RKt,则
B
/
M
B/M
B/M 组的收益率为:
-
(5) 根据 Fama 和 French(1993)的设定:
S M B t = 1 3 ( S L t + S M t + S H t ) − 1 3 ( B L t + B M t + B H t ) H M L t = 1 2 ( S L t + B L t ) − 1 2 ( S H t + B H t ) \begin{array}{l} S M B_{t}=\frac{1}{3}\left(S L_{t}+S M_{t}+S H_{t}\right)-\frac{1}{3}\left(B L_{t}+B M_{t}+B H_{t}\right) \\ H M L_{t}=\frac{1}{2}\left(S L_{t}+B L_{t}\right)-\frac{1}{2}\left(S H_{t}+B H_{t}\right) \end{array} SMBt=31(SLt+SMt+SHt)−31(BLt+BMt+BHt)HMLt=21(SLt+BLt)−21(SHt+BHt)
-
从整个过程来看,SMB 和 HML 的计算稍稍有些复杂,因此现在一些数据库厂商会计算好这三个因子提供给使用者,在接下来的例子中,为了重点突出三因子模型的实证应用,就不把重点放在计算因子上,直接应用下载好的数据(实现-1)。
- 因子数据库(U.S.):http://mba.tuck.dartmouth.edu/pages/faculty/ken.french/data_library.html
3. 三因子模型之Python实现-1
- 数据源:下载因子数据(China_F-F_3_Factors_daily.txt) + 个股(stock_data.txt)
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['simhei']
plt.rcParams['axes.unicode_minus'] = False
个股数据集:‘stock_data.txt’
# 读取股票数据集:'stock_data.txt'
stock = pd.read_csv('datas\\stock_data.txt',sep='\t',index_col='Trddt').iloc[:,:11]
stock.head(2)
- 提取个股:华夏银行(600015)
# 获取华夏银行股票(600015)数据
HXBank = stock[stock.Stkcd==600015]
HXBank.head(2)
# 华夏银行收益率时序图
HXRet.plot()
plt.title("图1 华夏银行收益率时序图")
plt.show()
- 接下来,读取三因子模型中的市场投资组合风险溢酬因子、市值因子(SMB),账面市值比因子(HML)数据,该数据包含以下几种:
- 股票市场类型编码(MarkettypeID),其中P9710代表综合A、B股和创业板市场;
- 交易日期(TradingDate );
- 市场投资组合风险溢酬因子(RiskPremium )、市值因子(SMB)、账面市值比因子(HML)。
- RiskPremiuml、SMBl、HMLl 中投资组合收益率是将个股收益率用
流通市值
加权平均计算得到。- RiskPremium2、SMB2、HML2 中投资组合收益率是将个股收益率用
总市值
加权平均计算得到。
中国三因子数据集:‘China_F-F_3_Factors_daily.txt’
中国三因子数据集不易免费获取,建议选取美国三因子数据集(详见F-F因子数据库官网);当然对应的个股也必须选取美国上市的标的!
# 获取中国三因子数据资料:'China_F-F_3_Factors_daily.txt'
ThreeFactors = pd.read_csv('datas\China_F-F_3_Factors_daily.txt',sep='\t', index_col='TradingDate')
ThreeFactors.head(3)
省略代码详见资源包!
# 华夏银行三因子模型配对图
plt.figure(figsize=(8,4))
plt.subplot(2,2,1)
plt.scatter(df.HXRet,df.RiskPremium2) # 风险溢酬因子--RiskPremium2
plt.xticks([])
plt.title("图2.1 华夏银行 VS RiskPremium2",fontsize=12)
plt.subplot(2,2,2)
plt.scatter(df.HXRet,df.SMB2) # 市值因子--SMB2
# plt.xticks([])
plt.title("图2.2 华夏银行 VS SMB2",fontsize=12)
plt.subplot(2,2,3)
plt.scatter(df.HXRet,df.HML2) # 账面市值比因子--HML2
plt.title("图2.3 华夏银行 VS HML2",fontsize=12)
plt.show()
- 接下来,将华夏银行的股票收益率与三个因子变量建立多元回归模型。
- 从下面的回归结果来看,华夏银行2014年1月至2015年4月股票的收益率对三因子模型中的市场投资组合风险溢酬因子、账面市值比因子是敏感的,也就是说这两个因子可以部分解释华夏银行的收益率变动,而市值因子的系数不显著地异于0,解释能力不够强。
含常数项情形下
省略代码详见资源包!
于是,三因子模型的回归方程(含常数项)为:
H X R e t t = 0.000313 + 1.04592 R i s k P r e m i n u m 2 t + 0.189923 S M B 2 t + 0.565870 H M L 2 t HXRet_t = 0.000313 + 1.04592RiskPreminum2_t + 0.189923SMB2_t + 0.565870HML2_t HXRett=0.000313+1.04592RiskPreminum2t+0.189923SMB2t+0.565870HML2t
不含常数项情形下
省略代码详见资源包!
于是,三因子模型的回归方程(不含常数项)为:
H X R e t t = 1.050747 R i s k P r e m i n u m 2 t + 0.191308 S M B 2 t + 0.562967 H M L 2 t HXRet_t = 1.050747RiskPreminum2_t + 0.191308SMB2_t + 0.562967HML2_t HXRett=1.050747RiskPreminum2t+0.191308SMB2t+0.562967HML2t
4. 三因子模型的评价
- 以含常数项的模型(1)为例!
4.1 评价(一)
- 利用全样本建立回归模型,并利用模型拟合全样本数据!
省略代码详见资源包!
4.2 评价(二)
- 在建模时,一般把数据分成两组,即历史建模数据(训练集)和未来预测数据(测试集)
省略代码详见资源包!
5. 小结
- 本案例主要利用数据库提供的中国三因子数据集,并选取中国上市股票数据建立对应的三因子模型,并给出了对应的评价检验,发现效果还是不错的!
- 如果读者获取中国三因子数据集比较困难,建议选取F-F官网三因子数据集(可以免费下载的),并选取美国上市股票建立相应的三因子模型即可!
- 接下来,将会在量化投资基础(三)之Fama-French 三因子模型(2)中利用中国股市标的基础数据集通过三因子公式计算对应的三因子数据集,然后选取中国股市中的标的建立三因子回归模型。这里需要提醒的是在数据库平台提取基础数据集是需要更高级别的权限的!
6. 参考资料
- 蔡立耑. 量化投资以Python为工具[M]. 北京:电子工业出版社,2017.
- PyQuant. 量化投资基础[M]. 北京:科学出版社,2024.
7. 资源包下载
- 链接:https://pan.baidu.com/s/1L6x1KVK_hA17enEXO0o1Dw
- 提取码:1234
- 写作不易,切勿白剽
- 点赞关注,最大鼓励
- 持续更新,未完待续…