FRM模型十五:净值归因之Fama_French三因子模型

文章目录

    • 一、起源
    • 二、构建因子
    • 三、投资组合的净值归因
      • 1. 市场因子
      • 2. 规模因子
      • 3.价值因子
      • 4. 基于净值的归因方法
    • 三、代码实现

一、起源

在多因子模型推出之前,CAPM模型被视为资产定价的第一标准。随着市场不断发展,发现了越来越多CAPM模型无法解释的现象,包括盈利市值比效应、小市值效应等等。但这些单一异象并未动摇CAPM模型的地位,直到Fama-French三因子模型出现,拉开多因子模型的序幕。Fama三因子模型在CAPM的基础上加入了价值和规模两个因子,提出了三因子模型。
E ( r i ) = r f + β i , M K T E ( r m − r f ) + β i , S M B E ( S M B ) + β i , H M L E ( H M L ) E(r_{i})=r_{f}+\beta_{i,MKT}E(r_m-r_f)+\beta_{i,SMB}E(SMB)+\beta_{i,HML}E(HML) E(ri)=rf+βi,MKTE(rmrf)+βi,SMBE(SMB)+βi,HMLE(HML)

其中 E ( R i ) E(R_{i}) E(Ri)表示股票第i期的预期收益率, r f r_{f} rf是无风险收益率,为市场组合预期收益率, E ( S M B ) E(SMB) E(SMB) E ( H M L ) E(HML) E(HML)分别为规模因子(SMB)以及价值因子(HML)的预期收益率, β i , M K T \beta_{i,MKT} βi,MKT β i , S M B \beta_{i,SMB} βi,SMB β i , H M L \beta_{i,HML} βi,HML是个股在因子上的暴露。

通俗版解释:若该模型成立,那么个股的超额收益就能通过这三个因子预测出来,在选股时,只需要找到对应因子最大的股票,即可认为是“优质股”.

二、构建因子

选择BM和市值两个指标,进行独立双重排序。先按照市值将股票分为大市值组合小市值组,再按照BM的30%分位数和70%分位数分组,共6组,分别记为:S/H、S/M、S/L、B/H、B/M、B/L。再将每组的股票收益率按照市值加权得到6个投资组合,构建两个因子。

S M B = S H + S M + S L 3 − B H + B M + B L 3 SMB=\frac{SH+SM+SL}{3}-\frac{BH+BM+BL}{3} SMB=3SH+SM+SL3BH+BM+BL

H M L = S H + B H 2 − S L + B L 2 HML=\frac{SH+BH}{2}-\frac{SL+BL}{2} HML=2SH+BH2SL+BL

分析SMB和HML表达式可以看出,SMB是用三个小市值组合减去三个大市值组合,HML是用两个高BM组合减去两个低BM组合。

三、投资组合的净值归因

1. 市场因子

市场因子收益率为市场指数区间收益率减去同期的无风险收益率。

2. 规模因子

多头:对全 A 股市场的股票按照市值排序,取市值较小的 50%的股票等权重配置构成小盘风格组合。

空头:对全 A 股市场的股票按照市值排序,取市值较大的 50%的股票等权重配置构成大盘风格组合。

3.价值因子

多头:对全 A 股市场的股票按照市净率 PB(MRQ)和市值进行双重排序,选取市净率 PB(MRQ)较低的 30%的股票。根据市值中位数对该股票池分割,构成小市值低估值和大市值低估值组合。两个组合内部股票等权重配置,并且两个组合之间也等权重配置构成低估值组合。

空头:对全 A 股市场的股票按照市净率 PB(MRQ)和市值进行双重排序,选取市净率 PB(MRQ)较高的 30%的股票。根据市值中位数对该股票池分割,构成小市值高估值和大市值高估值组合。两个组合内部股票等权重配置,并且两个组合之间也等权配置重构成高估值组合。

4. 基于净值的归因方法

需提前确定的参数:

  1. 评估时间段:1M、3M、1Y、3Y、5Y
  2. 无风险收益率:一年定存利率、一年期国债收益率等
  3. 市场指数:沪深300指数、上证综指等

基于净值的多因子模型通过使用因子收益的时间序列对组合收益的时间序列进行线性回归运算,将组合的收益和风险分解在各因子上:
R p t − R F t = α + ∑ i = 0 n β i F i t + ϵ t R_{pt}-RF_{t}=\alpha+\sum_{i=0}^{n}\beta_{i}F_{it}+\epsilon_{t} RptRFt=α+i=0nβiFit+ϵt

其中 R p t R_{pt} Rpt为组合在t时间段的收益率, R F t RF_t RFt为t时间段的无风险收益率, F i t F_{it} Fit为因子i在t时间段的收益率。 β i \beta_{i} βi为待拟合的系数。 α \alpha α为待拟合的截距项。 ϵ t \epsilon_{t} ϵt为t时间的残差项。

三、代码实现

本代码基于wind数据提供的API,需先下载WIND并开通API权限。

from WindPy import w
import pandas as pd
import statsmodels.api as sm# 连接Wind的API接口
w.start() # 默认命令超时时间为120秒,如需设置超时时间可以加入waitTime参数,例如waitTime=60,即设置命令超时时间为60秒
w.isconnected() # 判断WindPy是否已经登录成功# 构建因子
def fama_three_factor(startDate, endDate, rfree_code, index_code, fund_code):# 基金数据fund = w.wsd(fund_code, fields=['return_m'], beginTime=startDate, endTime=endDate, usedf=True, Period='M')[1]# 市场因子free_data = w.wsd(rfree_code, fields=['close'], beginTime=startDate, endTime=endDate, usedf=True, Period='M',Fill='Previous')[1]index = w.wsd(index_code, fields=['pct_chg'], beginTime=startDate, endTime=endDate, usedf=True, Period='M')[1]df = pd.merge(free_data, index, on=free_data.index, left_index=True)df['MKT'] = df['PCT_CHG'] - df['CLOSE']df['y'] = fund['RETURN_M'] - df['CLOSE']# 规模因子SMB_list = []HML_list = []date = df.index.tolist()# 遍历每个交易日市值大小for i in date:stock_list = w.wset("sectorconstituent", date=i, windcode=index_code, usedf=True)[1]stock = stock_list['wind_code'].tolist()          # 获取指数成分股# 获取当前时点下,全部成分股收益率、市值returns1 = w.wss(stock, fields=['ev'], annualized=0, tradeDate=i, usedf=True)[1]returns2 = w.wss(stock, fields=['pb_mrq'], annualized=0, tradeDate=i, usedf=True)[1]returns = pd.merge(returns1, returns2, on=returns1.index,left_index=True,right_index=True)# 按照市值排序returns.sort_values(by=['EV'], ascending=True, inplace=True)# 取前50%作为Slist,取后50%作为BlistSlist = returns.head(int(len(returns) * 0.5)).index.tolist()Blist = returns.tail(int(len(returns) * 0.5)).index.tolist()# 计算SMBSmall = w.wsd(Slist, "pct_chg", i, i, "Period=M", usedf=True)[1]Big = w.wsd(Blist, "pct_chg", i, i, "Period=M", usedf=True)[1]SMB = Small.mean() - Big.mean()SMB_list.append(SMB.values[0])# 取选取市净率PB(MRQ)较低的30%的股票,市值中位数对该股票池分割returns.sort_values(by=['PB_MRQ'], ascending=True, inplace=True)# 取PB低的30%和PB高的30%Lowlist = returns.head(int(len(returns) * 0.3))Highlist = returns.tail(int(len(returns) * 0.3))# 按照市值继续分割:小市值低估值、大市值低估值Lowlist.sort_values(by=['EV'], ascending=True, inplace=True)Low_small_list = Lowlist.head(int(len(Lowlist) * 0.5)).index.tolist()Low_big_list = Lowlist.tail(int(len(Lowlist) * 0.5)).index.tolist()Highlist.sort_values(by=['EV'], ascending=True, inplace=True)High_small_list = Highlist.head(int(len(Highlist) * 0.5)).index.tolist()High_big_list = Highlist.tail(int(len(Highlist) * 0.5)).index.tolist()# 计算HMLHigh_small = w.wsd(High_small_list, "pct_chg", i, i, "Period=M", usedf=True)[1]High_big = w.wsd(High_big_list, "pct_chg", i, i, "Period=M", usedf=True)[1]Low_small = w.wsd(Low_small_list, "pct_chg", i, i, "Period=M", usedf=True)[1]Low_big = w.wsd(Low_big_list, "pct_chg", i, i, "Period=M", usedf=True)[1]HML = (High_small.mean() + High_big.mean())/2 - (Low_small.mean() + Low_big.mean())/2HML_list.append(HML.values[0])# 将规模因子合并至原数据集df['SMB'] = SMB_listdf['HML'] = HML_listdf = df[['y', 'MKT', 'SMB', 'HML']]return df# 计算beta
def cal_beta(df):# 添加常数项作为截距x = df[['MKT', 'SMB', 'HML']]y = df['y']X_with_intercept = sm.add_constant(x)# 构建模型并估计参数model = sm.OLS(y, X_with_intercept)results = model.fit().params# 输出贡献度print("市场因子贡献度%.4f" % (results['MKT']))print("规模因子贡献度%.4f" % (results['SMB']))print("价值因子贡献度%.4f" % (results['HML']))return results['MKT'], results['SMB'], results['HML']# 输入参数:开始时间、结束时间、无风险利率标准、市场指数、基金指数
startDate = '2023-01-01'
endDate = '2023-12-30'
rfree_code = "SHIBOR1M.IR"
index_code = "000300.SH"
fund_code = "167702.OF"
df = fama_three_factor(startDate, endDate, rfree_code, index_code, fund_code)
beta_MKT, beta_SMB, beta_HML = cal_beta(df)

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

超详细的Scrapy框架的基本使用教程

Scrapy的介绍 scrapy的工作流程(重点!!!) 如下图所示: 爬虫: 负责向引擎提供要爬取网页的URL,引擎会把这个URL封装成request对象并传递给调度器,把引擎传递过来的resp…

安卓app软件开发的费用

我们公司总结的开发价格根据安卓APP,苹果APP行业的报价,开发的APP软件费用主要受到两个方面的影响。安卓和苹果APP软件应用的复杂性,第二个是定制开发的APP软件,开发成本和人员的投入成本,以下就是不同的报价费用是怎么…

面试经典150题【51-60】

文章目录 面试经典150题【51-60】71.简化路径155.最小栈150.逆波兰表达式求值224.基本计算器141.环形链表2.两数相加21.合并两个有序链表138.随机链表的复制19.删除链表的倒数第N个节点82.删除链表中的重复元素II 面试经典150题【51-60】 71.简化路径 先用split(“/”)分开。然…

四平方和 刷题笔记

/* 四平方和 直接暴力搜索 可能会超时 使用二分辅助搜索 先枚举出 c*cd*d并存入数组 用式子算出 a*ab*b还剩下多少查找sum数组里面是否存在符合条件的数 查找方式使用二分搜索 当逼近答案后 检查一下是否为所需的数 如果是 直接输出 */ #include <cstring> #includ…

rabbitmq基础(1)

1、背景 能实现消息队列的框架软件有很多&#xff0c;kafka、rabbitmq、RocketMq、activeMq、Redis&#xff08;非专业&#xff09;&#xff0c;各有各的特点和优缺点。但是之前的公司数据需求规模并非很大&#xff0c;所以采用rabbitmq作为消息队列。 2、rabbitMq的基础架构…

C++面试宝典【配文档,全方面学习】

原word文档[链接: https://pan.baidu.com/s/1CKnm7vHDmHSDskAgxgZgKA?pwdr4wv 提取码: r4wv 复制这段内容后打开百度网盘手机App&#xff0c;操作更方便哦 --来自百度网盘超级会员v5的分享] 一、C / C基础 1、简述C的内存分区&#xff1f; 一个C、C程序的内存分区主要有5个…

使用html网页播放多个视频的几种方法

前言 因为项目测试需要&#xff0c;我需要可以快速知道自己推流的多路视频流质量&#xff0c;于是我想到可以使用html网页来播放视频&#xff0c;实现效果极其简单&#xff0c;方法有好几种&#xff0c;以下是几种记录&#xff1a; 注意&#xff1a;测试过&#xff0c;VLC需要使…

Ubuntu18.04运行ORB-SLAM3

ORB-SLAM3复现(ubuntu18) 文章目录 ORB-SLAM3复现(ubuntu18)1 坐标系与外参Intrinsic parameters2 内参Intrinsic parameters2.1 相机内参① 针孔模型Pinhole② KannalaBrandt8模型③ Rectified相机 2.2 IMU内参 3 VI标定—外参3.1 Visual calibration3.2 Inertial calibration…

STM32类别概述、下载程序及启动过程分析

STM32类别概述、下载程序及启动过程分析 STM32类别STM32下载程序STM32启动过程分析 STM32类别 STM32 目前总共有 5 大类&#xff0c;18 个系列 结合 STM32F1 的芯片来说&#xff0c;其 CMSIS 应用程序的简单结构框图&#xff0c;不包括实时操作系统和 中间设备等组件&#xf…

find函数-秒了道题

秒了 笑死 还是规规矩矩做吧 string类的find()函数用于在字符串中查找字符或子串&#xff0c;返回第一个匹配的位置。 class Solution { public:int strStr(string haystack, string needle) {return haystack.find(needle);} };

深入理解操作系统Operator System(1)

目录 OS概念 设计OS的目的 OS定位 操作系统对下的结构层次示意图 理解操作系统的"管理"❗❗ "管理"被管理者的数据 怎么获取被管理者的数据 获取被管理者什么"数据" 数据过多&先描述再组织❗ C/C中的体现 解释OS对硬件的"管…

RabbitMQ(控制台模拟收发消息与数据隔离)

1.RabbitMQ架构图 publisher&#xff1a;生产者&#xff0c;也就是发送消息的一方 consumer&#xff1a;消费者&#xff0c;也就是消费消息的一方 queue&#xff1a;队列&#xff0c;存储消息。生产者投递的消息会暂存在消息队列中&#xff0c;等待消费者处理 exchange&…

深度解析速卖通商品详情API:Python实战与高级技术探讨

速卖通商品详情API接口实战&#xff1a;Python代码示例 一、准备工作 在开始之前&#xff0c;请确保你已经完成了以下步骤&#xff1a; 在速卖通开放平台注册账号并创建应用&#xff0c;获取API密钥。阅读速卖通商品详情API接口的文档&#xff0c;了解接口的使用方法和参数要…

什么是物联网?物联网如何工作?

物联网到底是什么&#xff1f; 物联网(Internet of Things&#xff0c;IoT)的概念最早于1999年被提出&#xff0c;官方解释为“万物相连的互联网”&#xff0c;是在互联网基础上延伸和扩展&#xff0c;将各种信息传感设备与网络结合起来而形成的一个巨大网络&#xff0c;可以实…

[SpringCloud] OpenFeign核心架构原理 (一)

Feign的本质: 动态代理 七大核心组件 Feign底层是基于JDK动态代理来的, Feign.builder()最终构造的是一个代理对象, Feign在构建对象的时候会解析方法上的注解和参数, 获取Http请求需要用到基本参数以及和这些参数和方法参数的对应关系。然后发送Http请求, 获取响应, 再根据响…

Python Web开发记录 Day6:MySQL(关系型数据库)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 六、MySQL1、MySQL-概述和引入①MySQL是什么&am…

liunx安装jdk、redis、nginx

jdk安装 下载jdk,解压。 sudo tar -zxvf /usr/local/jdk-8u321-linux-x64.tar.gz -C /usr/local/ 在/etc/profile文件中的&#xff0c;我们只需要编辑一下&#xff0c;在文件的最后加上java变量的有关配置&#xff08;其他内容不要动&#xff09;。 export JAVA_HOME/usr/l…

docker部署aria2-pro

前言 我平时有一些下载视频和一些资源文件的需求&#xff0c;有时候需要离线下载&#xff0c;也要速度比较快的方式 之前我是用家里的玩客云绝育之后不再写盘当下载机用的&#xff0c;但是限制很多 我发现了aria2 这个下载器非常适合我&#xff0c;而有个大佬又在原来的基础…

10 OpenCV 形态学的应用

文章目录 算子形态学提取直线示例 算子 adaptiveThreshold 二值化算子 adaptiveThreshold(src, dstNone,maxValue, adaptiveMethod, thresholdType, blockSize, C, ) /* *src&#xff1a;灰度化的图片 *dst&#xff1a;输出图像&#xff0c;可选 *maxValue&#xff1a;满足条件…

C#中对象的相等性与同一性的判断方法总结

C#对象的相等性与同一性 1. 概述与准备1.1 概述1.2 准备 2. Equals(Object)2.1 功能&#xff1a;2.2 实例&#xff1a;2.3 扩展&#xff1a;2.4 重写此方法 3. Equals(Object, Object)3.1 功能3.2 实例 4. ReferenceEquals(Object, Object)4.1 功能4.2 使用场景&#xff1a;4.3…