famafrench三因子模型数据,fama三因子模型步骤stata
大家好,今天我给大家带来一篇关于金融模型的python应用文章。在这篇文章里,我会介绍熊猫和statsmodels.api,也会介绍Fama-French三因素模型的理论知识。
目录Fama-French三因子模型理论知识模型介绍三因子构造方法理论假设统计假设Python实现第一部分:导入数据第二部分:计算三因子第三部分:拟合回归总结相关文章获取代码Fama-French三因子模型理论知识模型介绍
Fama和French 1992研究了决定美国股票市场不同股票收益差异的因素,发现股票市场的贝塔值不能解释不同股票收益的差异,而上市公司的市值、市净率和市盈率可以解释股票收益的差异。Famand French认为,上述超额收益是对CAPM中未能反映的风险因素的补偿。
模型表达式为:
Rit代表资产回报率,rf代表无风险回报;Rit-rf是超额市场收益率;SMBt代表市值比例因子,HMLt代表市净率因子,1i、2i和3i分别是Rit-rf、SMBt和HMLt的系数,是剩余项,i是截距项。
首先根据上市公司市值对三个因素进行排序,分为两组,标记为S和B,S和B分别表示为小规模股票和大规模股票。然后根据上市公司年末账面市值比,按照33%、33%、33%的比例,记为L、M、H,分别为低值、中值、高值;最后可以得到股票交叉组合,通过加权平均(以总市值为权重)计算出它们的月收益率{SL,SM,SH,BL,BM,BH}。
市值规模因子(SMB)可以从上述六种组合的月收益率数据中构建。具体计算公式如下:
该方法得到的市值比例因子反映了市值小的投资组合与市值大的投资组合之间收益率的差异,排除了市净率因子带来的影响。
同样,市净率因子保证了解释变量只考虑市净率的影响,反映高市净率组合与低市净率组合的收益率差异。
假设在讨论Fama—French三因素模型的应用时,是基于“有限理性”的理论假设。在此基础上,得出一些基本假设:
(一)投资者数量众多;
(2)所有投资者在同一证券持有期内规划其投资组合;
(3)投资者的投资范围仅限于在公开金融市场交易的资产;
(4)不存在证券交易费用(佣金、服务费等。)和税收;
(5)投资者对证券收益率的均值、方差和协方差具有相同的期望值;
(6)所有投资者对证券和经济形势的看法一致。
根据统计,从模型的表达式可以看出,FF模型属于多元回归模型。它的基本假设是:
(1) (rmrf),SMB和HML与随机误差项u无关;
(2)零均值假设:e(I)=0;
(3)方差相同假设,即的方差为常数:var(I)=S2;
(4)无自相关假设:CoV ( i, j)=0,Ij;
(5)解释变量之间不存在线性相关。即两个解释变量之间没有确切的线性关系;
(6)假设随机误差项服从均值为零,方差为s 2正态分布,即 i ~ n (0,S2)。
Python从瑞思数据库中实现这一案例数据,选取2019年创业板所有股票作为样本。
第一部分:导入数据panda为PD data=pd.read _ csv (f: \ \微信官方账号\ \ python \ \[案例]数据分析- Fama-French三因素模型\ \ GEM数据。csv ,header=0)
第二部分:计算三要素首先,我们需要计算每一天的三要素。在此之前,我们需要提取每个交易日的日期。
读取数据中的“日期”列并进行重复数据删除:
date=data[ date ]date . drop _ duplicates(keep= first ,inplace=True)
参数描述:
data . drop _ duplicates(subset=[ A , B],keep=first ,inplace=True)
1.代码中subset对应的值是列名,表示只考虑这两列,对这两列中对应值相同的行进行重复数据删除。subset=None的默认值表示考虑所有列;
2.keep=first 表示保留第一次出现的重复行,这是默认值。keep的另外两个值是‘last’和False,分别表示保留最后一个重复行和删除所有重复行;
3.inplace=True表示直接删除原始数据帧上的重复项,而默认值False表示生成副本。
接下来,我们使用循环语句依次提取每一天的所有股票数据,并进行计算(这里以 2019/1/3 为例,这里不显示循环代码,但可以在完整代码中查看)
提取‘2019/1/3’的数据,即data1:
data=data . reset _ index(drop=True)data1=data[data[ date ]==date[1]]
描述:
在循环语句中,drop=True必须添加到代码中。reset_index(drop=True),否则会报错。因为当。reset_index()重置索引,将插入列“index”或“level_0”。如果其中一个/(两个都已经被占用了),那么它就会报错。所以您需要使用“drop”选项,它将删除同名的现有索引,并用新的重置索引替换它。
问题:
在这两个代码中,如果没有 data=data . reset _ index(drop=true)代码,那么第二个代码会报错,具体原因我也不知道。希望上帝能给我一些建议!
然后依次按市值和市净率排序,先按市值分成两组,再按每组中的市净率分成三组:高中和低中。
按市值排序,即数据2:
data2=data1.sort_values(市场价值)
参数描述:
Sort _ values (by=“”,轴=0,升序=false) # sort
1.by是要排序的列的标签名;
2.axis是要排序的轴,0代表行,1代表列;
3.升序表示排序方式,真表示升序,假表示降序。
按市值分组,并按账面市值比升序排序:
data 2 _ big=data 2[0:round(len(data 2)/2)]。sort_values(by=BM ,axis=0,ascending=True)data 2 _ small=data 2[round(len(data 2)/2):len(data 2)]。sort_values(by=BM ,axis=0,ascending=True)
按账面市值比分组:
data 2 _ big _ low=data 2 _ big[0:round(len(data 2 _ big)/6)]data 2 _ big _ medium=data 2 _ big[round(len(data 2 _ big)/6):round(len(data 2 _ big)/3)]data 2 _ big _ high=data 2 _ big[round(len(data 2 _ big)/3):len(data 2 _ big)]data 2 _ small _ low=data 2 _ small[0:round(len(data 2 _ small)/6)]2 _ medium=data 2
R_market=sum(data1[收益率]*data1[市值])/sum(data1[市值])SL=sum(data2_small_low[收益率]*data2_small_low[市值])/sum(data2_small_low[市值])SM=sum(data2_small_medium[收益率]*data2_small_medium[市值])/sum(data2_small_medium[市值]) SH
最后,我们创建一个用于存储三个因子的数组“TF ”,并将每天计算的三个因子存储在其中:
TF=pd。DataFrame(columns=[date , R_market , SMB , HML])new=pd。DataFrame([[date[1],R_market,SMB,HML]],columns=[date , R_market , SMB , HML])TF=TF.append(new,ignore_index=True)
问题:
看过我以前文章的朋友一定发现,用。append()在以前的文章中没有赋值,但是在这种情况下,如果没有赋值,就会出现错误。这个还是有疑问的。
将上述步骤与循环语句整合,就可以计算出每一天的三个因子,这里不显示代码,可以在完整的代码中查看。
第三部分:拟合回归:首先选择要回归的股票或者从创业板中选择的投资组合(投资组合需要自己计算每日的投资组合收益率,这里选择 300001 进行显示):
代码=数据[数据[代码]==300001]
根据Fama-French三因素模型,整理出我们需要的自变量和因变量。
组织回归数据:
TF_hg=pd。DataFrame(columns=[date , R_market , SMB , HML ])for code _ date in code[ date ]:choose=TF[TF[ date ]==code _ date]TF _ Hg=TF _ Hg . append(choose,ignore _ index=True)TF _ Hg[ return ]=code[ yields ]-code[无风险利率]
然后,我们可以导入回归所需的库:
将numpy导入为NP导入统计模型。API为sm最后,我们把自变量和因变量分别赋给X和Y,然后建模:
X=NP . column _ stack((TF _ Hg[ R _ market ],TF_hg[SMB],TF _ Hg[ HML ]))y=TF _ Hg[ return ]X=sm . add _ constant(X)model=sm。OLS(y,X)。fit()打印(model.summary())
描述:
1.在的参数中。OLS(),要求数据类型为 numpy.ndaray ,所以我们需要加载numpy库。我们之前的数组都是‘data frame’,不能直接使用;
2.fit()是对模型中的所有参数进行整理。如果不添加这句话,summary()和params()就无法调用。
最后,我们将介绍两个常用的函数,——summary()和params(),以便提取所需的内容。
Summary()是型号信息的汇总,如上图所示;
Params()是自变量系数:
model.params[x1]
通过总结Fama-French三因素模型的案例,我们知道了熊猫在数据处理方面的强大,以及在statsmodels.api中多元回归的使用,但是对一些参数有疑问,希望上帝告诉我们。
另外,Fama-French三因素模型是第一次接触,对一些理论知识的理解可能还不够透彻。如有误解,欢迎留言指出。
相关文章《特质波动率》使用Python计算特质波动率。
以下是我个人的微信官方账号。本文数据及完整代码可在微信官方账号回复“Fama-French三因子模型”获取。谢谢你的支持。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。