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%作为Blist
        Slist = returns.head(int(len(returns) * 0.5)).index.tolist()
        Blist = returns.tail(int(len(returns) * 0.5)).index.tolist()

        # 计算SMB
        Small = 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()

        # 计算HML
        High_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())/2
        HML_list.append(HML.values[0])

    # 将规模因子合并至原数据集
    df['SMB'] = SMB_list
    df['HML'] = HML_list
    df = 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)

在这里插入图片描述

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

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

相关文章

Microsoft@ppt@快速掌握核心功能@常用功能培训

文章目录 refs动画动画的用途逐部分显示内容实现问答效果部分地修改页面内容动画效果 常用窗口对象选择窗口👺批量选择对象 如何为重叠的对象高效的命名重命名方式方案1方案2对象重命名原则重命名后如何使用tips 动画窗口👺 幻灯片管理幻灯片母版幻灯片母…

【软件测试】一个扫码支付的二维码怎么测(测试点分析)

目录:导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜) 前言 面试的时候&#…

VS统计代码行数

1.使用查找和替换方式 按CTRLSHIFTF (Find in files),勾上支持正则表达式, 然后输入搜索内容:^:b*[^:b#/].*$ 如图所示: 2.查看查询结果 需要注意:#开头和/开头或者空行都不计入代码量。

javascript操作DOM的方法

目录 1. 弹出框 2. 定时器 3. 导航与URL 4. 浏览器信息 5. 窗口控制 6. 屏幕信息 7. 历史对象 1. 弹出框 警告框(Alert) window.alert(这是一个警告消息); 确认框(Confirm) var isConfirmed window.confirm(您确定要执…

【开源】SpringBoot框架开发用户画像活动推荐系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 兴趣标签模块2.3 活动档案模块2.4 活动报名模块2.5 活动留言模块 三、系统设计3.1 用例设计3.2 业务流程设计3.3 数据流程设计3.4 E-R图设计 四、系统展示五、核心代码5.1 查询兴趣标签5.2 查询活动推荐…

Java学习笔记002——类的修饰符

在Java语言中,类的访问修饰符决定了其它类能够访问该类的方式。类有如下4种访问修饰符,在创建类时用于类的声明: 1、public: 当一个类被声明为public时,它可以从任何其他类中被访问,无论这些类位于哪个包中。通常&am…

一台服务器,最大支持的TCP连接数是多少?

一个服务端进程最大能支持多少条 TCP 连接? 一台服务器最大能支持多少条 TCP 连接? 一、原理 TCP 四元组的信息:源IP、源端口、目标IP、目标端口。 一个服务端进程最大能支持的 TCP 连接个数的计算公式:最大tcp连接数客户端的IP…

随机森林算法

[1] 随机森林是集成学习中的bagging方法.通过有放回的抽样方法训练模型.再通过对输出求均值的方式得出最终结果。其中,回归树将输入样本分配至其子节点,不同子节点对应不同的取值.再通过损失函数将样本进行训练和分配,直至达到叶子结点。回归…

StarRocks实战——特来电StarRocks应用实践

目录 一、为何引入StarRocks 二、主要应用场景 三、封装或扩展 四、集群监控预警 五、总结规划展望 5.1 使用经验分享 5.2 下一步计划 5.2.1 StarRocks集群自动安装 5.2.2 StarRocks集群高可用架构 原文大佬的这篇StarRocks应用实践有借鉴意义,这里摘抄下来…

1、Ajax、get、post、ajax,随机颜色

一、Ajax初始 1、什么是Ajax? 异步的JavaScript和xml 2、xml是什么? 一种标记语言,传输和存储数据----------现在用JSON传输数据 3、Ajax的作用 局部加载 可以使网页异步更新 4、Ajax的原理或者步骤(6步) 创建Ajax对象 if (window.X…

centos 搭建ftp服务器

项目上需要用到ftp文件服务同步,所以在测试环境进行搭建,其中遇到了一些问题,遂记录。 1、安装vsftpd软件包 打开终端并输入以下命令来安装vsftpd yum install vsftpd -y 2、运行vsftpd systemctl start vsftpd 3、测试匿名连接 我这里…

基于springboot+vue的球队训练信息管理系统

博主主页:猫头鹰源码 博主简介:Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战,欢迎高校老师\讲师\同行交流合作 ​主要内容:毕业设计(Javaweb项目|小程序|Pyt…

【OBS】obs-websocket实战技巧,让你更快的了解OBS

▒ 目录 ▒ 🛫 导读开发环境 1️⃣ 修改OBS-web源码2️⃣ 常用api汇总获取输入源类型列表获取输入源列表获取属性列表打开输入源属性设置框获取设置输入源静音状态获取特殊输入源设置(全局音频设备)打开输入源属性设置框 🛬 文章小…

HubSpot出海CRM可以为企业带来哪些好处?

HubSpot出海CRM为企业带来了许多好处,包括但不限于以下几点: 优化客户体验: HubSpot出海CRM提供了个性化的客户关系管理功能,使企业能够根据客户的地理位置、偏好和行为等因素,提供个性化的营销和服务。这有助于提高客…

数位dp 笔记

小技巧1:求区间[X, Y]可以转换为求F(Y) - F(X-1) F(X)表示0~X中满足条件的数字个数 小技巧2:可以用树的形式来看 遍历最高位,每一位分为两种情况:未达到上界和达到上界 如果走到右边最底端需加1 度的数量 求给定区间 [X,Y]中满足下列条件的…

linux系统UDP丢包问题分析思路

Linux系统UDP丢包 最近工作中遇到某个服务器应用程序 UDP 丢包,在排查过程中查阅了很多资料,总结出来这篇文章,供更多人参考。 在开始之前,我们先用一张图解释 linux 系统接收网络报文的过程。  1,首先网络报文通过物…

软件测试--性能测试工具JMeter

软件测试--性能测试工具JMeter 主流性能测试工具1.主流性能测试工具Loadrunner和Jmeter对比 —— 相同点2.主流性能测试工具Loadrunner和Jmeter对比 —— 不同点JMeter基本使用JMeter环境搭建1.安装JDK:2.安装Jmeter:3.注意点:JMeter功能概要1. JMeter文件目录介绍1.1 bin目…

JavaScript的`call`方法:实现函数间的调用!

🤍 前端开发工程师、技术日更博主、已过CET6 🍨 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 🕠 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 🍚 蓝桥云课签约作者、上架课程《Vue.js 和 E…

express+mysql+vue,从零搭建一个商城管理系统10--添加商品

提示:学习express,搭建管理系统 文章目录 前言一、新建models/goods.js二、新建routes/goods.js三、添加goods表四、添加商品总结 前言 需求:主要学习express,所以先写service部分 一、新建models/goods.js models/goods.js con…

亚马逊卖家做市场分析业务可以用静态IP代理完成吗?

亚马逊作为全球最大的电商平台之一,其庞大的销售数据和用户行为数据成为了许多商家和市场研究人员进行市场分析和竞争研究的重要来源。而使用IP代理则能够为亚马逊市场分析带来许多帮助,下面就来一一介绍。静态IP代理可以为市场分析带来哪些帮助&#xf…