金工基础

您所在的位置:网站首页 置信度alpha 金工基础

金工基础

2023-04-10 23:56| 来源: 网络整理| 查看: 265

之前分享了Fama-Macbeth回归的基础知识(详见:《走进论文中的Fama-Macbeth回归》),本文尝试用Python实现Fama-Macbeth回归

多因子模型研究的核心问题是股票的收益率期望在截面上为什么会有差异。对于一个多因子模型,要看它的各因子能否很好地解释收益率期望,需要关注估计误差检验

Fama和Macbeth在1973年提出Fama-MacBeth回归,目的是检验资本资产定价模型(Capital Asset Pricing Model,简称CAPM)。在计量经济学领域中,它也是一个两步截面回归检验方法。利用回归分析,很容易得到参数 \alpha 、 \beta 和 \lambda 的估计值以及相应的标准误。有了准确的估计值和标准误,才能评价因子是否有效。例如,可以计算出因子收益率 \lambda 的置信区间,从而判断这个因子是否有风险溢价。\,

由于残差 \alpha 在截面上和在时间序列上存在相关性,在计算标准误的时候需要进行相应的处理。标准误即「样本均值的标准误差」(Standard Error for the Sample Mean),用以衡量样本均值和总体均值之间的差距,是推断统计中的一个重要概念。通过Fama-MacBeth回归,可以得到 T 个参数的样本估计:\hat{\lambda}=\frac{1}{T}\sum\limits_{t=1}^T\hat{\lambda}_t\\ \hat{\alpha}_i=\frac{1}{T}\sum\limits_{t=1}^T\hat{\alpha}_{it}\\根据样本估计,很容易得到参数的标准误,如下:\sigma^2(\hat{\lambda})=\frac{1}{T^2}\sum\limits_{t=1}^T(\hat{\lambda}_t-\hat{\lambda})^2\\ \sigma^2(\hat{\alpha}_i)=\frac{1}{T^2}\sum\limits_{t=1}^T(\hat{\alpha}_{it}-\hat{\alpha}_{i})^2\\

Fama-MacBeth回归可以巧妙地剔除残差在截面上的相关性对标准误的影响,通常用以解释股票预期收益率的截面差异。然而,Fama-MacBeth回归无法处理残差在时间序列上的相关性。因此,在使用Fama-MacBeth回归得到标准误后需要进一步修正,一般采用Newey-West调整。

Fama和Macbeth(1973)在第一步时间序列回归中采用了滚动窗口回归,可以得到时变的因子载荷。如果用全部样本来估计 \beta_i ,则所有 T 期都会得到相同的 \beta_i (尽管这个结果与传统截面回归得到的估计值相同,但在处理残差的截面相关性上仍有优势)[1]。

本文使用linearmodels库中的FamaMacBeth函数实现Fama-MacBeth回归。注意,上文中我们提到Fama-MacBeth回归是一个两步回归法,但Python中FamaMacBeth函数实现的是Fama-MacBeth回归中第二步截面回归。至于截面回归中用到的因子载荷,需要自行另求。

#%% 导入包 from linearmodels import FamaMacBeth as fm # fm回归 from statsmodels.regression.rolling import RollingOLS # 滚动窗口回归 #%% 获取数据(略) # ret_rf:存放各股票各期收益率的DataFrame # factors:存放各因子各期值的DataFrame # factornames:存放因子名称的list #%% 第一步:时间序列回归 # 进行滚动窗口回归 for stockcode,stockret in ret_rf.groupby('SecuCode'): mod_ts = RollingOLS(stockret.ret,sm.add_constant(factors),window=24).fit(cov_type='HAC',use_t=True) res_ts[stockcode] = mod_ts.params # 获取因子载荷序列 betas = pd.concat({k: pd.DataFrame(v) for k, v in res_ts.items()},axis=0,names=['SecuCode']) # 所有的参数估计值 loadings = betas.drop('const',axis=1) # 去掉常数项 #%% 第二步:截面回归 # 构造回归数据 temp = ret_rf.set_index('SecuCode',append=True).swaplevel() # 交换索引并排序 temp = temp.groupby('SecuCode').shift(1) # 用因子预测下期收益率 fmdata = pd.merge(temp.dropna().reset_index(),loadings.reset_index(),on=['SecuCode','TradingDay']) fmdata = fmdata.set_index('SecuCode').set_index('TradingDay',append=True).dropna() # 注意回归的面板数据为两重索引,一级索引为股票代码,二级索引为交易日期 fmdata = fmdata.sort_index() # 对索引进行排序 # 进行Fama-Macbeth回归 mod_fm = fm(fmdata['ret'],sm.add_constant(fmdata[factornames])) res_fm = mod_fm.fit(cov_type='kernel',debiased=False) print(res_fm.summary) # 输出回归结果

实现过程中需要注意以下两点:

1、在使用函数FamaMacBeth.fit(cov_type='unadjusted',debiased=True,bandwidth=None,kernel=None时,需要注意参数的取值:

参数cov_type表示是否调整协方差,取值如下:unadjusted:默认值,表示不调整;kernel:表示用Newey-West方法进行调整。参数debiased表示是否调整自由度,即分母用n还是n-1:True:默认值,表示调整;False:表示不调整。 参数bandwitdh表示窗宽,即当cov_type=kernel时,需要补充的Newey-West调整中的滞后阶数 L :None:默认值,不设置时程序会通过算法自动生成最优的;某个值:根据Newey and West(1994)的方法计算出参数值 L=4\times (\frac{T}{100})^\frac{2}{9} 。

2、在构建用于Fama-MacBeth回归的面板数据时,需要用到多重索引,且注意一级索引为股票代码,二级索引为交易日期。

参考^石川,《股票多因子模型的回归检验》,20180731。 https://zhuanlan.zhihu.com/p/40984029


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3