数据分析 |
您所在的位置:网站首页 › 三因子模型和capm比较 › 数据分析 |
大家好,今天带给大家一篇金融模型方面的python应用文章,在这篇文章中将会给大家介绍pandas和statsmodels.api,此外还会介绍Fama-French三因子模型的理论知识。 目录 Fama-French三因子模型理论知识模型介绍三因子构建方法理论假设统计假设 Python实现第一部分:导入数据第二部分:计算三因子第三部分:拟合回归 总结相关文章获取代码 Fama-French三因子模型理论知识 模型介绍Fama和French 1992年对美国股票市场决定不同股票回报率差异的因素的研究发现,股票的市场的beta值不能解释不同股票回报率的差异,而上市公司的市值、账面市值比、市盈率可以解释股票回报率的差异。Fama and French认为,上述超额收益是对CAPM 中β未能反映的风险因素的补偿。 模型表达式为: 首先先根据上市公司的市值,按照其大小值进行排序并分为两组,记为S、B,S、B分别表示为小市场规模股和大市场规模股。然后再根据年末上市公司账面市值比,按照33%、33%、33%的比例排序,记为L、M、H,L、M、H分别为低价值、中等价值、高价值;最后即可得到股票交叉组合,并通过加权平均(以总市值为权重)计算它们的月收益率{SL,SM,SH,BL,BM,BH}。 在探讨Fama—French三因子模型的应用时,是以“有限理性”理论假设为基础。并在此基础上得出若干基本假定: (1)存在着大量投资者; (2)所有投资者都在同一证券持有期计划自己的投资资产组合; (3)投资者投资范围仅限于公开金融市场上交易的资产; (4)不存在证券交易费用(佣金和服务费用等)及税赋; (5)投资者们对于证券回报率的均值、方差及协方差具有相同的期望值; (6)所有投资者对证券的评价和经济局势的看法都一致。 统计假设从模型的表达式可以看出,FF模型属于多元回归模型。其基本假设为: (1)(Rm − Rf)、SMB、HML与随机误差项u不相关; (2)零均值假定:E(εi)=0; (3)同方差假定,即 的方差为一常量:Var(εi)=S^2; (4)无自相关假定:cov(εi,εj)=0,i≠j; (5)解释变量之间不存在线性相关关系。即两个解释变量之间无确切的线性关系; (6)假定随机误差项 服从均值为零,方差为S2正态分布,即εi~N(0,S^2)。 Python实现本次案例数据来自锐思数据库,选取2019年创业板所有股票作为样本。 第一部分:导入数据 import pandas as pd data = pd.read_csv('F:\\公众号\\python\\【案例】数据分析---Fama-French三因子模型\\创业板数据.csv',header = 0)首先,我们需要计算每一天的三因子,在此之前我们就需要提取每个交易日日期。 读取数据中的‘date’列,并去重: date = data['date'] date.drop_duplicates(keep='first',inplace=True)
接下来我们利用循环语句依次提取每一天中所有股票数据,并进行计算(这里以‘2019/1/3’为例,循环代码就不在此展示,可在完整代码中查看) 提取‘2019/1/3’的数据,即data1: data = data.reset_index(drop=True) data1 = data[data['date'] == date[1]]
紧接着,我们依次按照市值和账面市值比进行排序,先按照市值分为大小两组,再在每组中按照账面市值比分为高中低三组。 按市值排序,即data2: data2 = data1.sort_values('market value')
按市值分组,并按账面市值比进行升序排序: data2_big = data2[0:round(len(data2)/2)].sort_values(by='BM',axis=0,ascending=True) data2_small = data2[round(len(data2)/2):len(data2)].sort_values(by='BM',axis=0,ascending=True)
计算三因子: R_market = sum(data1['yields']*data1['market value'])/sum(data1['market value']) SL = sum(data2_small_low['yields']*data2_small_low['market value'])/sum(data2_small_low['market value']) SM = sum(data2_small_medium['yields']*data2_small_medium['market value'])/sum(data2_small_medium['market value']) SH = sum(data2_small_high['yields']*data2_small_high['market value'])/sum(data2_small_high['market value']) BL = sum(data2_big_low['yields']*data2_big_low['market value'])/sum(data2_big_low['market value']) BM = sum(data2_big_medium['yields']*data2_big_medium['market value'])/sum(data2_big_medium['market value']) BH = sum(data2_big_high['yields']*data2_big_high['market value'])/sum(data2_big_high['market value']) SMB = (SL+SM+SH)/3-(BL+BM+BH)/3 HML = (BH+SH)/2-(BL+SL)/2
将上述步骤用循环语句整合在一起便可计算出每一天的三因子,在这里就不进行代码展示,大家可在完整代码中查看。 首先选择想做回归的股票或者从创业板中挑选而出的投资组合(投资组合需要自行计算每日组合收益率,这里选择‘300001’来进行展示): code = data[data['code'] == 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['risk-free rate']紧接着,我们就可以导入所需的库进行回归了: import numpy as np import statsmodels.api as 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() print(model.summary())
最后再给大家介绍两个常用函数——summary()、params(),以便提取所需内容。 summary()是概括模型信息,上图以进行展示; params()是自变量系数: model.params['x1']通过Fama-French三因子模型的案例,了解到了pandas处理数据方面的强大,以及statsmodels.api中多元回归的使用,但在一些参数方面任存在疑惑,还望大神告之; 此外Fama-French三因子模型是第一次接触,在一些理论知识上的理解可能还不够透彻,如有哪部分理解错误,还望留言指出。 相关文章“特质波动率之谜”(Idiosyncratic Volatility),用Python计算特质波动率 获取代码以下是我的个人公众号,该篇的数据和完整代码可在公众号中回复“Fama-French三因子模型”即可获得,谢谢大家支持。 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |