量化投资基础(三)之Fama-French 三因子模型(2)

点赞、关注,养成良好习惯
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) RiRf=βi(RmRf)

也就是说,股票的期望收益只与市场的 系统风险 有关。

但是,Banz(1981)的论文发现,股票的收益还与其 市场价值 有关。在随后的一系列研究中,账面市值比(BE/ME)、市盈率倒数(E/P)等一系列指标都被发现可以解释股票价格的变动,也就是说,股票价格与一系列的 非系统风险 因素有关。

FamaFrench(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} RmtRft 为市场风险,其中 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} RitRft=αi+bi(RmtRft)+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=PktQkt
      • 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=PktQkt
      • 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=KMktRkt/KMkt
      • 同理可得: 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
    • (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)

从整个过程来看,SMBHML 的计算稍稍有些复杂,在接下来的例子中,通过数据库平台(tushare)读取所有标的的基础数据,并利用这些基础数据根据上述公式计算对应的三因子特征数据集,最后利用得到的三因子数据集选取个股建立对应的三因子回归模型。

3. 三因子模型之Python实现-2

  • 数据源:利用基础数据(ts_daily_basic.csv)计算得到三因子数据集
    • 注1:基础数据可以从数据库平台下载得到(比如tushare),可能需要一定积分级别的会员才可以免费下载基础数据!
    • 注2:用户需要至少300积分才可以调取pro.daily_basic()下载基础数据!
# 导入包
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     # 负号显示

通过tushare数据库平台在线读取基础数据集,并保存下来!

省略代码详见资源包!
  • 说明:在线读取平台基础数据集的代码资源包中已给出,但接下来是读取通过在线读取基础数据集后保存下来的数据集!

本地读取数据集:‘ts_daily_basic.csv’

# 读取基础数据集:'ts_daily_basic.csv'
# 基础数据的在线读取会在附录中介绍!这里是保存到本地的基础数据集!
df_daily_basic = pd.read_csv('datas/ts_daily_basic.csv',index_col='trade_date')
df_daily_basic.index = pd.to_datetime(df_daily_basic.index,format='%Y%m%d')
df_daily_basic.head(3)
  • 定义因子函数----cal_smb_hml()
    • ‘circ_mv’ — ‘SB’:S + B
    • ‘pb’ — ‘BM’ — ‘HML’:H + M + L
    • ‘pct_chg’
自己定义的因子函数代码详见资源包!
  • 说明:利用自己定义的因子函数和上述的基础数据集计算得到三因子数据集,并保存到本地。接下来是通过读取保存下来的三因子数据集。

本地读取数据集:‘df_three_factor_model.csv’

# 读取数据集:'df_three_factor_model.csv'
# 因为利用定义的cal_smb_hml函数计算三因子数据集比较费时间,这里直接读取保存下来的三因子数据集!
df_tfm = pd.read_csv('datas\df_three_factor_model.csv',index_col='trade_date')
df_tfm.index = pd.to_datetime(df_tfm.index)
df_tfm.head(3)

通过tushare数据库平台在线读取个股数据集,并保存下来!

代码详见资源包!

本地读取个股数据集:‘df_stocks.csv’

# 读取数据集:'df_stocks.csv'
# 这里直接读取保存下来的个股数据集!
df_stock = pd.read_csv('datas\df_stocks.csv',index_col='trade_date')
df_stock.index = pd.to_datetime(df_stock.index)
df_stock.head(3)
# 贵州茅台三因子模型配对图
plt.figure(figsize=(8,6))

plt.subplot(2,2,1)
plt.scatter(df.maotai,df.hs300)       # 风险溢酬因子--hs300_RF
plt.xticks([])  
plt.title(" 贵州茅台 VS hs300",fontsize=12)

plt.subplot(2,2,2)
plt.scatter(df.maotai,df.SMB)         # 市值因子--SMB
# plt.xticks([])  
plt.title("贵州茅台 VS SMB",fontsize=12)

plt.subplot(2,2,3)
plt.scatter(df.maotai,df.HML)        # 账面市值比因子--HML
plt.title("贵州茅台 VS HML",fontsize=12)

plt.show()

在这里插入图片描述

  • 接下来,将贵州茅台的股票收益率与三个因子变量建立多元回归模型。
    • 从下面的回归结果来看,贵州茅台2014年1月至2015年4月股票的收益率对三因子模型中的市场投资组合风险溢酬因子、账面市值比因子是敏感的,也就是说这两个因子可以部分解释华夏银行的收益率变动,而市值因子的系数不显著地异于0,解释能力不够强。

含常数项情形下

省略代码详见资源包!

于是,贵州茅台的三因子模型的回归方程(含常数项)为:

m a o t a i t = − 0.001760 + 0.888614 ⋅ h s 30 0 t − 1.146224 ⋅ S M B t − 0.907565 ⋅ H M L t maotai_t = -0.001760 + 0.888614 \cdot hs300_t - 1.146224 \cdot SMB_t - 0.907565 \cdot HML_t maotait=0.001760+0.888614hs300t1.146224SMBt0.907565HMLt

不含常数项情形下

省略代码详见资源包!

于是,三因子模型的回归方程(不含常数项)为:

m a o t a i t = 0.884739 ⋅ h s 30 0 t − 1.121371 ⋅ S M B t − 0.794392 ⋅ H M L t maotai_t = 0.884739 \cdot hs300_t - 1.121371 \cdot SMB_t - 0.794392 \cdot HML_t maotait=0.884739hs300t1.121371SMBt0.794392HMLt

4. 三因子模型的评价

  • 以含常数项的模型(1)为例!

4.1 评价(一)

  • 利用全样本建立回归模型,并利用模型拟合全样本数据!
省略代码详见资源包!

在这里插入图片描述

4.2 评价(二)

  • 在建模时,一般把数据分成两组,即历史建模数据(训练集)和未来预测数据(测试集)
省略代码详见资源包!

在这里插入图片描述

5. 小结

  • 本案例主要利用中国股市标的基础数据集通过三因子公式计算对应的三因子数据集,然后选取中国股市中的标的建立三因子回归模型,并给出了两种评价结果。这里需要提醒的是在数据库平台提取基础数据集是需要更高级别的权限的!

6. 参考资料

  • 蔡立耑. 量化投资以Python为工具[M]. 北京:电子工业出版社,2017.
  • PyQuant. 量化投资基础[M]. 北京:科学出版社,2024.

7. 资源包下载

  • 链接:https://pan.baidu.com/s/1AXoFwAoxitwEunwAQZ5bZw
  • 提取码:1234

  • 写作不易,切勿白剽
  • 点赞关注,最大鼓励
  • 持续更新,未完待续…

相关推荐

  1. TensorFlow 量化投资分析

    2024-07-16 12:36:04       37 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-16 12:36:04       67 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-16 12:36:04       72 阅读
  3. 在Django里面运行非项目文件

    2024-07-16 12:36:04       58 阅读
  4. Python语言-面向对象

    2024-07-16 12:36:04       69 阅读

热门阅读

  1. 运行时动态调整 Pod 的 CPU 及 Memory 资源

    2024-07-16 12:36:04       27 阅读
  2. Python面经

    2024-07-16 12:36:04       24 阅读
  3. Etcd-v3.4.27集群部署

    2024-07-16 12:36:04       22 阅读
  4. 大语言模型的原理

    2024-07-16 12:36:04       24 阅读
  5. Android 底部导航栏实现

    2024-07-16 12:36:04       18 阅读
  6. Spark核心技术架构

    2024-07-16 12:36:04       21 阅读
  7. actual combat 33 —— Vue实战遇到的问题

    2024-07-16 12:36:04       22 阅读
  8. MATLAB切片

    2024-07-16 12:36:04       19 阅读
  9. Codeforces Round 958 (Div. 2)[部分题解ABC]

    2024-07-16 12:36:04       27 阅读
  10. 大根堆的实现和堆排序

    2024-07-16 12:36:04       20 阅读