量化投资基础(三)之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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/800796.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【异常解决】Unable to start embedded Tomcat Nacos 启动报错

Unable to start embedded Tomcat Nacos 启动报错解决方案 一、背景描述二、原因分析三、解决方案 一、背景描述 Windows 本地启动 Nacos(2.2.0) 服务,控制台报错 Unable to start embedded Tomcat。 报错信息:Unable to start …

解决UniGUI中动态创建控件时,控件不按序显示的问题。

这两天遇到一个问题:我在UNIGUI中多批次动态创建控件,但是这些控件在显示时并没有按我想要的顺序排列。比如动态创建UnimContainerPanel面板,这个面板上放一些其它控件用于显示数据。在手机中从上到下按顺序显示出来,当第一批次时…

LabVIEW工业设备姿态监测系统

开发了一种基于LabVIEW的工业设备姿态监测系统,针对现有监测设备在适应性和反应时间上的不足,采用了LabVIEW软件和STM32微控制器,通过高精度姿态传感器实现了对设备姿态的快速准确监测,大大提高了工业作业的安全与效率。 项目背景…

Unable to obtain driver using Selenium Manager: Selenium Manager failed解决方案

大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学的…

jmeter-beanshell学习10-字符串补齐位数

每天都遇到新问题,今天又一个场景,一个字符串,如果不足11位,则左边补0,补够11位。 先要获取字符串长度,然后计算差多少位,补齐。今天又发现一个Object类型,这个类型有点厉害&#x…

【持续集成_05课_Linux部署SonarQube及结合开发项目部署】

一、Linux下安装SonarQube 1、安装sonarQube 前置条件:sonarQube不能使用root账号进行启动,所以需要创建普通用户及 其用户组 1)创建组 2)添加用户、组名、密码 3)CMD上传qube文件-不能传到home路径下哦 4&#xff09…

探索Nuxt.js的useFetch:高效数据获取与处理指南

title: 探索Nuxt.js的useFetch:高效数据获取与处理指南 date: 2024/7/15 updated: 2024/7/15 author: cmdragon excerpt: 摘要:“探索Nuxt.js的useFetch:高效数据获取与处理指南”详述了Nuxt.js中useFetch函数的使用,包括基本用…

【前端4】表单 编辑模式、只读模式:HTML的`readonly`、el-input的v-if=“isEdit“

【前端】表单 编辑模式、只读模式 写在最前面一、什么是编辑模式与只读模式&#xff1f;应用场景编辑模式只读模式 二、编辑模式的实现例子只读模式的实现动态切换模式使用HTML的readonly属性使用Vue.js的v-if指令 三、前后端交互 <template>代码块两个字段独立是否直接与…

bash: ip: command not found

输入&#xff1a; ip addr 报错&#xff1a; bash: ip: command not found 报错解释&#xff1a; 这个错误表明在Docker容器中尝试执行ip addr命令时&#xff0c;找不到ip命令。这通常意味着iproute2包没有在容器的Linux发行版中安装或者没有正确地设置在容器的环境变量PA…

HackQuest介绍 web3 学习平台

HackQuest 官网地址&#xff1a; https://www.hackquest.io/zh HackQuest是一个专注于Web3技术教育的在线学习平台&#xff0c;旨在帮助全球开发者掌握区块链、加密货币和去中心化应用&#xff08;DApps&#xff09;领域的最新技能。该平台汇聚了超过14000名活跃开发者&#…

PyMongo Sort 操作:提升你的数据查询效率

&#x1f49d;&#x1f49d;&#x1f49d;欢迎莅临我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

通过Bugly上报的日志查找崩溃闪退原因

第一步&#xff0c;解析堆栈信息 在bugly上收集到的信息是这样的 0x000000010542e46c 0x0000000104db4000 6792300 OS应用发生崩溃时&#xff0c;系统会生成一份崩溃日志&#xff0c;这份日志中包含了崩溃时的堆栈信息&#xff0c;但这些堆栈信息并非直接指向源代码&#x…

1143 多少个Fibonacci数

首先&#xff0c;我们需要生成一个Fibonacci数列&#xff0c;直到其值超过10^100。由于Fibonacci数列的性质&#xff0c;我们知道这个数列的长度不会超过500。 然后&#xff0c;对于每一对输入的a和b&#xff0c;我们在生成的Fibonacci数列中查找在a和b之间的数的个数。这可以…

JVM 内存介绍

本文主要介绍&#xff1a; JVM 内存分哪几个区&#xff0c;每个区的作用是什么 备注: 橙色:堆 和 方法区 &#xff0c;属于jvm公有部分,可以进行调优 灰色:java栈,本地方法栈和计数器 属于jvm的私有部分,不可进行调优 一个对象从创建到被回收的过程是怎样的? Personpnew Perso…

SpringBoot系列:通过AOP+注解优雅实现操作日志记录

文章目录 前言一、简介1.1 操作日志在企业应用中的重要性1.2 使用AOP和注解实现操作日志记录的好处 二、开发环境三、准备工作3.1 创建操作日志记录表3.2 创建系统日志实体类 四、代码实现4.1 创建业务枚举类4.2 创建日志注解4.3 创建操作状态枚举类4.4 创建IP工具类4.5 创建切…

jvm常用密令、jvm性能优化、jvm性能检测、Java jstat密令使用、Java自带工具、Java jmap使用

1.jps是Java虚拟机的进程状态工具&#xff0c;用于列出正在运行的Java进程 jps命令的使用&#xff1a;cmd打开直接jps 1.1不带参数&#xff1a; jps 默认情况下&#xff0c;列出所有正在运行的 Java 进程的进程 ID 和主类名。 1.2 -l&#xff1a;显示完整的主类名或 JAR 文件…

增值税进项税额转出6大知识点柯桥学会计会计实操做账手把手教学

什么情况下需要进项转出&#xff1f; 转多少&#xff1f; 怎么填报&#xff1f; 小编梳理了一些 关于增值税进项税额转出的常见问题 快来学习吧&#xff01; 哪些情况下进项税额不得从销项税额中抵扣&#xff1f; 1.用于简易计税方法计税项目、免征增值税项目、集体福利或…

ARM 虚拟机FVP环境搭建

ARM Fixed Virtual Platforms (FVPs) 是由 ARM 提供的一系列虚拟化硬件模拟器&#xff0c;用于在物理硬件可用之前开发和测试软件。FVP 模型非常适用于软件开发、验证和性能分析&#xff0c;涵盖了从裸机到操作系统和复杂 SoC 系统的各种应用。 这里以Cortex-M55为例&#xff0…

springcloud使用微服务的搭建

微服务的搭建 1.配置对应信息 Springboot 、springcloud、springcloud alibaba对应关系 https://github.com/alibaba/spring-cloud-alibaba/wiki/%E7%89%88%E6%9C%AC%E8%AF%B4%E6%98%8E 2.pom.xml的配置 2.1 总项目pom.xml引入依赖 <parent><groupId>org.sprin…

Linux【文件权限的理解】

1. linux的发展史 首先在学习linux之间&#xff0c;我们要问自己几个问题&#xff0c;linux从哪里来&#xff0c;为什么会出现&#xff0c;它的出现代表着什么。 linux的前身unix Multics 和 UNIX 的起源&#xff1a; Multics 是一个由通用电器公司、贝尔实验室和麻省理工学院…