Python量化交易06——Fama-French三因子模型(Rmt,SMB,HML)

news2025/1/11 17:11:47

  参考书目:深入浅出Python量化交易实战


 本次带来的是著名的获得了诺贝尔奖的三因子模型。

因子模型介绍

Fama和French从可以解释股票收益率的众多因素中提取出了三个重要的影响因子,即市场风险溢酬因子、市值因子和账面市值比因子B/M Ratio,仿照CAPM模型用这三个因子建立起来一个线性模型来解释股票的收益率,这就是著名的三因子模型(Fama and French Three Factor Model,简称FF3)。

三因子模型中的3个因子均为投资组合的收益率:
市场风险溢酬因子(Rmt)对应了(市场投资组合的收益率减去无风险利率);

市值因子(SMB)对应了做多市值较小的公司与做空市值较大的公司的投资组合带来的收益率;

账面市值比因子(HML)对应的是做多高BM公司、做空低BM公司的投资组合带来的收益率。

三因子模型的形式为:

其中SMB(Small Minus Big)为市值因子,也就是小公司比大公司高出的收益率,HML(High Minus Low)代表账面市值比因子,用高B/M比股票减去低B/M比股票的收益率得到;b_{i}  s_{i}  h_{i} 分别为投资组合(或单只股票)的收益率对三个因子的敏感系数。

实证模型上常用:

来做回归检验,公式中\alpha _{i}就是我们通常说的超额收益率。在进行实证研究时,投资组合(或个股)收益率Rit、无风险利率 Rft、市场投资组合Rmt、市值因子SMBt和账面市值比因子组合HMLt都是已知的,通过线性回归拟合最小化残差平方和我们可以得到参数\alpha _{i},b_{i} , s_{i}  ,h_{i} 的估计值,检验超额收益及三个因子的系数是否显著地异于0,也就是检验三个因子是否能够届时收益率。

这里的\alpha _{i} 和\beta _{i} 就是我们平时买基金看到的阿尔法和贝塔值,说起来很神秘,其实就是一个回归的截距和系数。整体的三因子模型,说白了就是三元线性回归,最小二乘就能求解的那种。

三因子四因子五因子,就是用3个X,4个X,5个X进行回归。变量X分别是

FF三因子:SMB HML MKT
Carhart四因子:SMB HML MKT UMD
FF五因子:SMB HML MKT RMW CMA


因子数据获取

知道了因子模型的真实面目后,那么这些X怎么来?

一般大型数据公司都会计算好了,直接用就行。我这里找了一个央财的金融院的因子模型的数据,有安装日期,也有周,月,年的数据。本文使用的日期性数据。

链接:五因子数据的更新(2022年10月份数据)-中央财经大学金融学院 (cufe.edu.cn)

唯一的缺点是,只更新到22年10月...没有很及时更新,后续更新可以继续关注央财金融院官网。


数据读取

先导入常用的包

import baostock as bs
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.rcParams ['font.sans-serif'] ='SimHei'               #显示中文
plt.rcParams ['axes.unicode_minus']=False               #显示负号

读取因子数据,选取需要的三因子:

factors = pd.read_csv('fivefactor_daily.csv', index_col = 'trddy',parse_dates=['trddy'])
factors = factors[['mkt_rf','rf','smb','hml']].copy()
three_factors = factors['2021-11-01':'2022-11-1']
three_factors.head()

变量名称说明:
trdyr trdwk trdmn trddy [交易日期]
mkt_rf [市场风险因子]
smb [规模风险因子]
hml [账面市值比风险因子]

这里选取了2021年11月到2022年11月的数据。

利用证券宝获取需要分析的股票收盘价数据,这里选择使用中国平安作为样例,同样也是时间为2021年11月到2022年11月的数据。

lg = bs.login()
# 获取沪深A股601318的历史K线数据
rs_result = bs.query_history_k_data_plus("sh.601318",  fields="date,open,high,low,close,volume",   
                        start_date='2021-11-01',   end_date='2022-11-1',  
                        frequency="d",  adjustflag="3")
df_result = rs_result.get_data()
bs.logout()
df_result=df_result.set_index('date')
df_result=df_result.astype('float64')
df_result.head()

查看一下数据的长度

len(three_factors),len(df_result)

是一样长的,一年大概244个交易日。


收益率计算分析

#计算对数收益率,画图查看

day_return = np.log(df_result['close'] /df_result['close'].shift(1))
day_return.dropna(inplace = True)
day_return.name = 'Return'
day_return.plot(figsize=(7,3))
plt.title('中国平安日收益率')
plt.show()

 将因子数据和每日的对数收益率合并

zgpa_threefactor = pd.merge(three_factors, day_return,left_index=True, right_index=True)
zgpa_threefactor.head()

画散点图进行分析

sns.pairplot(zgpa_threefactor[['mkt_rf','smb','hml','Return']])

 

 可以看到收益率和其他三个因子其相关性可能没有那么明显呈现线性关系。

 计算相关系数,画热力图

 sns.heatmap(zgpa_threefactor[['mkt_rf','smb','hml','Return']].corr(),annot=True,square=True)

 相关性都一般,收益率和Rmt这个因子相关性较大一点。


回归模型

import statsmodels.api as sm
result = sm.OLS(zgpa_threefactor['Return'], sm.add_constant(zgpa_threefactor.loc[:,['mkt_rf','smb','hml']])).fit()
result.summary()

 可以看到除了截距,其他三个因子的系数都是显著的。

返回系数列表

list(result.params)

带入模型 

可以得到最终计算的模型结果为:

Ri-0.000041=-0.0007+0.8099mkt_rf-0.5288SMB+0.7271hml


其他指标计算 

评价一个投资收益有很多指标,其中总收益率,最大回测率,夏普比率,信息比率是常用的四个指标,其计算公式分别为:

策略收益:也就是总收益率,这是最基础的指标,金融中我们也叫单期简单收益率,衡量回测期间策略收益率的。简单说就是期末资产额减去起始资产额再除以起始资产额,这里用了资产意思就是包括现金和持有的股票的价值。

 最大回撤:最大回撤率是一个衡量策略风险的重要指标,越小越好

 夏普比率:表示每承受一单位总风险,会产生多少的超额报酬,肯定是越大越好。夏普比率是在资本资产定价模型进一步发展得来的。

 信息比率:衡量单位超额风险带来的超额收益。信息比率越大,说明该策略单位跟踪误差所获得的超额收益越高,因此,信息比率较大的策略的表现要优于信息比率较低的基准。合理的投资目标应该是在承担适度风险下,尽可能追求高信息比率。

代码为:

def sum_return_ratio(price_list):
    '''实际总收益率'''
    price_list=price_list.to_numpy()
    return (price_list[-1]-price_list[0])/price_list[0]
def MaxDrawdown(price_list):
    '''最大回撤率'''
    i = np.argmax((np.maximum.accumulate(price_list) - price_list) / np.maximum.accumulate(price_list))  # 结束位置
    if i == 0:
        return 0
    j = np.argmax(price_list[:i])  # 开始位置
    return (price_list[j] - price_list[i]) / (price_list[j])
def sharpe_ratio(price_list,rf=0.000041):
    '''夏普比率'''
    #公式 夏普率 = (回报率均值 - 无风险率) / 回报率的标准差
    # pct_change()是pandas里面的自带的计算每日增长率的函数
    daily_return = price_list.pct_change()
    return daily_return.mean()-rf/ daily_return.std()
def Information_Ratio(price_list,rf=0.000041):
    '''信息比率'''
    chaoer=sum_return_ratio(price_list)-((1+rf)**365-1)
    return chaoer/np.std(price_list.pct_change()-rf)

计算上述的中国平安的相应的四个指标为:

sum_return_ratio(df_result['close']),MaxDrawdown(df_result['close']),sharpe_ratio(df_result['close']),Information_Ratio(df_result['close'],rf=0.000041)


多公司对比 

将上述流程推广为更加一般的形式,定义一个函数,输入证券代码和开始结束日期,就能自动计算出这些因子的bata系数和这些指标:

def deal(stock='sh.601318',start_date='2021-11-01',end_date='2022-11-1'):
    lg = bs.login()
    rs_result = bs.query_history_k_data_plus(stock,  fields="date,close", start_date=start_date,end_date=end_date, frequency="d", adjustflag="3")
    df_result = rs_result.get_data()
    df_result=df_result.set_index('date')
    df_result=df_result.astype('float64')
    bs.logout()
    three_factors = factors[start_date:end_date]
    assert len(three_factors)==len(df_result), "数量长度不一样" 
    
    day_return = np.log(df_result['close'] /df_result['close'].shift(1))
    day_return.dropna(inplace = True)
    day_return.name = 'Return'
    zgpa_threefactor = pd.merge(three_factors, day_return,left_index=True, right_index=True)
    result = sm.OLS(zgpa_threefactor['Return'], sm.add_constant(zgpa_threefactor.loc[:,['mkt_rf','smb','hml']])).fit()
    betas=result.params
    实际总收益率=sum_return_ratio(df_result['close'])
    最大回测率=MaxDrawdown(df_result['close'])
    夏普比率=sharpe_ratio(df_result['close'])
    信息比率=Information_Ratio(df_result['close'])
    return pd.DataFrame({'阿尔法':betas[0],'贝塔':betas[1],'市值因子SMB':betas[2],'账面市值因子HML':betas[3],
                        '实际总收益率':实际总收益率,'最大回测率':最大回测率,'夏普比率':夏普比率,'信息比率':信息比率},index=[stock])

我们拿贵州茅台去试试:

deal(stock='sh.600519')

可以返回上面的说的所有指标。

这样就能写循环,计算你所有想计算的股票了。

stocks=['sh.601318','sh.600519','sh.600416','sh.600765','sh.600535','sz.300129','sh.600036','sz.000001']
df_deals=pd.DataFrame()
for s in stocks:
    df_deal=deal(stock=s)
    df_deals=pd.concat([df_deals,df_deal],axis=0)

 计算了上述8家公司

df_deals

可以看到很便捷的算出了所有公司的指标。然后可以比较排序关注的指标进行策略选股了。

(本案例仅用于策略研究,不构成任何投资意见) 

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

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

相关文章

测试用例能带来什么

通过测试用例,我们都能获得些什么呢? 1、测试团队的质量判断。例如,测试用例的覆盖率。我们只需要去把所有的valid的功能bug去做一个分析,用所有在测试用例覆盖范围之外的bug数/总bug数,就可以作为测试用例覆盖率使用。一个良好的…

【css】深入解析CSS (4)网格布局

设置为display: grid的元素成为一个网格容器(grid container)。它的子元素则变成网格元素(grid items)。 1.网格的组成部分: grid-template-columns和grid-template-rows定义了网格轨道 grid-template-columns:1fr 1f…

STM32/51单片机实训day4——RFID工作原理(一)理论

目录 一、RFID的定义 二、RFID的起源和发展 三、RFID的组成 3.1 标签 3.2 读写器 3.3 天线 四、RFID系统分类 4.1 根据标签的供电方式 4.2 根据工作频率 五、RFID系统工作原理 5.1 读写器 5.2 标签 5.3 中间件 内 容:能够读取RFID卡S50的ID——编程…

如何利用 xUnit 框架对测试用例进行维护?

1、xUnit 是什么 先看 Wikipedia 上的解释: xUnit 是一系列测试框架的统称,最开始来源于一个叫做 Smalltalk 的 SUnit 框架,现在各种面向对象的语言,如 Java、Python 的鼻祖就是 Smalltalk,后来这些语言都借助了 Suni…

Win10 开机突然蓝屏错误代码0xc0000001安全模式也进不了,不用重装系统怎么修复?(已解决)

环境: Win 10专业版 HP480G7 问题描述: Win10 开机突然蓝屏错误代码0xc0000001,前一天好好的,F8安全模式也进不了,不用重装系统怎么修复? 解决方案: 方法一 1.重启F8进入里面的安全模式(本案例进不了) 方法二 (解决本案例) 1.使用系统安装U盘,需提前做好…

力扣(LeetCode)220. 存在重复元素 III(C++)

滑动窗口有序集合 维护滑动窗口&#xff0c;向右扩大右窗口&#xff0c;新数加入有序集合&#xff0c;题目要求abs(nums[i] - nums[j]) < t &#xff0c;找两数之差的绝对值小于t&#xff0c;相当于在窗口里找大小尽可能接近的两个数&#xff0c;固定其中一个数(新数)&…

进程优先级环境变量进程地址空间

目录 一、进程优先级 1、概念 2、查看 3、其他概念 二、环境变量 1、基本概念 2、常见环境变量 3、查看环境变量的方法 4、和环境变量相关的命令 5、环境变量的组织方式 6、通过系统调用获取或设置环境变量 三、程序地址空间 一、进程优先级 1、概念 cpu资源分配的…

C++优先队列:priority_queue(即时排序队列)

今天我们来讲一下C中对于排序很好的用的东西&#xff1a;优先队列&#xff1a;priority_queue 既然是队列那么先要包含头文件#include <queue>, 它和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队 优先队列具有队列的所有特性&am…

数据结构---二叉树的各种遍历算法

&#xff08;一&#xff09;基础知识 如图遍历该树&#xff0c;常见有四种方法&#xff1a; 先根遍历&#xff1a;即先序遍历(Pre-order)&#xff0c;按照根左右的顺序沿一定路径经过路径上所有的结点。在二叉树中&#xff0c;先根后左再右。巧记&#xff1a;根左右。 以标准…

Redis 主从复制实现

1. 前言 今天从实用的角度来分析下 服务器间的主从部署&#xff0c;以及主从复制备份 2. 配置 一个服务器不同的端口代表不同的Redis实例端口6379 表示一台Redis主节点端口6380 表示一台Redis从节点&#xff0c;主节点的端口是6379端口6381 表示一台Redis从节点&#xff0c;主…

Type-challenges:00009-medium-deepReadonly

Implement a generic DeepReadonly<T> which make every parameter of an object - and its sub-objects recursively - readonly. https://github.com/TIMPICKLE/type-challenges/blob/main/questions/00009-medium-deep-readonly/README.md 虽然是medium&#xff0c;但…

图论(2)单源最短路的综合应用

活动 - AcWing 1.acwing1135 从自己家出发摆放其他亲戚&#xff0c;拜访顺序任意。 枚举所有摆放顺序求最小值即可。因此需要每个亲戚家到其他亲戚家的最短路。分别跑出来即可 #include<iostream> #include<algorithm> #include<cstring> #include<que…

pytorch批量计算数据集的均值和方差

from torchvision.transforms import ToTensor#用于把图片转化为张量 import numpy as np#用于将张量转化为数组&#xff0c;进行除法 from torchvision.datasets import ImageFolder#用于导入图片数据集means [0,0,0] std [0,0,0]#初始化均值和方差 transformToTensor()#可将…

UIVM项目验证—数据多通道整形器(MCDF)

1、项目介绍-MCDF MCDF(Multi-Channel Data Formatter)多通道数据整形器将上行多个通道数据存入FIFO&#xff0c;经过Arbiter仲裁&#xff0c;完成指定通道的数据打包&#xff0c;寄存器可以控制各个通道的开关、优先级以及数据包长度。 2、设计描述 CDF设计结构描述如下所示…

红队隧道应用篇之SSH端口转发突破内网(六)

前言 什么是SSH隧道 SSH隧道是使用SSH协议连接两台计算机之间的通道。它使用密钥加密数据传输&#xff0c;并允许计算机之间的安全连接。 通常&#xff0c;SSH隧道用于通过不安全的网络&#xff08;例如互联网&#xff09;连接到远程服务器。隧道提供了一种安全的方法来访问…

我眼中的并发编程

在并发编程中都避不开原子性&#xff0c;可见性&#xff0c;有序性问题。这三个问题都是人们抽象出来&#xff0c;而实际上对应的就是缓存一致性&#xff0c;处理器优化&#xff0c;指令重排序问题。 原子性&#xff1a; 就是一个操作中CPU不可以在中途展厅然后再调度&#xf…

读者写者模型自旋锁(了解)

文章目录读者写者模型&#xff1a;1. 基本理论消费者生产者模型的321原则2. 操作3.理解4. 优先级挂起等待特性的锁 VS 自旋锁线程访问临界资源花费的时间问题&#xff1a;线程如何得知会在临界资源中等待的时间呢&#xff1f;自旋锁的使用读者写者模型&#xff1a; 1. 基本理论…

Python实现FA萤火虫优化算法优化支持向量机回归模型(SVR算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 萤火虫算法&#xff08;Fire-fly algorithm&#xff0c;FA&#xff09;由剑桥大学Yang于2009年提出 , 作…

ModBus协议学习

之前没接触过&#xff0c;记录一下抄的东西。 Modbus 一个工业上常用的通讯协议、一种通讯约定。Modbus协议包括RTU、ASCII、TCP。其中MODBUS-RTU最常用&#xff0c;比较简单&#xff0c;比较容易实现。 先来简单分析一条MODBUS-RTU报文&#xff0c;例如&#xff1a;01 06 0…

Spring Boot 构建多租户SaaS平台核心技术指南

1. 概述 笔者从2014年开始接触SaaS&#xff08;Software as a Service&#xff09;&#xff0c;即多租户&#xff08;或多承租&#xff09;软件应用平台&#xff1b;并一直从事相关领域的架构设计及研发工作。机缘巧合&#xff0c;在笔者本科毕业设计时完成了一个基于SaaS的高…