金工笔记FamaFrench三因子

中秋预防白癜风 http://m.39.net/pf/a_5740835.html

本次系列文章将对书目《因子投资-方法与实践》(石川/刘洋溢/连祥斌著)作导读,逐步建立多因子研究框架,并对书中提及的部分前沿论文作翻译与解读。其中部分内容将加入个人的理解。

本期主要解读第四章中的Fama-French三因子模型,并以A股-01至-03的数据作因子收益率看板的复现,源代码置于本文末尾。

往期内容:

金工笔记

《因子投资方法与实践》导读(一)

金工笔记

《因子投资方法与实践》导读(二)

金工笔记

主流因子解读——《因子投资》系列导读(三)

1.背景与因子构造

自FamaandFrench()发表并提出第一个多因子模型以来,学术界对多因子模型的研究经历了近30年。期间,很多新的模型先后被提出,它们对人们认知市场产生了深远的影响。

主流多因子模型所含因子Fama-French三因子市场/规模/价值Carhart四因子市场/规模/价值/动量Novy-Marx四因子市场/价值/动量/盈利Fama-French五因子

市场/规模/价值/盈利/投资

Hou-Xue-Zhang四因子市场/规模/盈利/投资Stambaugh-Yuan四因子市场/规模/管理/表现Daniel-Hirshleifei三因子市场/长周期行为/短周期行为

在多因子模型被提出之前,CAPM是资产定价的第一范式。然而,自20世纪70年代以来,学者们逐渐发现按照某种风格“打包”的股票能够战胜市场。这其中最值得一提的是Basu()发现的盈利市值比(EP)效应和Banz()发现的小市值效应。继EP之后,账面市值比(BM)和债务市值比(DM)效应也被发现。这些异象的发现并没有形成对CAPM质疑的合力,直到FamaandFrench()的横空出世,整合了之前被提出的多种异象,颠覆了人们对CAPM的看法。次年,FamaandFrench()在CAPM的基础上,加入了价值(HML)和规模(SMB)两个因子,提出了三因子模型:

标识股票i的期望收益率,表示无风险收益率,表示市场组合预期收益率,分别表示规模因子(SMB)与价值因子(HML)。

为构建价值和规模因子,FamaandFrench()选择了BM和市值两个指标,并用他们进行2X3双重独立排序:

BMHighMiddleLow市值

Small

SHSMSLBigBHBMBL

以市值中位数为界,将股票分为Small小市值与Big大市值两组;以BM的70%、30%分位数为界,将股票分为H、M、L三组。通过以上划分后,可将截面股票分为6组,记为SH、SM、SL、BH、BM、BL,每组股票收益率按照市值加权,构建规模与市值两个因子如下:

另外,Liuetal.()针对A股市场主张使用EP(市盈率PE的倒数)代替BM构造价值因子,后续的代码亦使用了EP作为构造价值因子的数据源(但并未因为壳效应而剔除市值排名30%以下的股票)。

EPHighMiddleLow市值

Small

SHSMSLBigBHBMBL

Fama-French三因子模型被提出后逐步取代了CAPM成为资产定价的第一范式,而上述双重划分以及由此衍生出来的多重划分因子构造法也成为了学术界竞相模仿的对象

2.FF3因子看板与代码

原始数据:全市场股票PE_TTM、总市值、日涨跌幅(储存于根文件夹中的monthly_data文件夹)以及上证指数日涨跌幅数据,均采用后复权数据

计算方法:每隔20交易日(参数可调),对于股票池中的股票,给予标记S、B与H、M、L,计算下个20天的因子收益率

代码将生成每日SH、SM、SL、BH、BM、BL每日各组收益率序列,MKT、SML、HML每日因子收益率序列以及其因子净值。通过输入A股.01-.03的数据,输出因子看板如下:

通过输入A股.01-.03的数据,输出因子看板如下:

一些代码中的坑:

由于python与C、C++编译原理的不同,采用多重循环时计算的会特别慢,最好的方法是采用内置函数,例如采用DataFrame.groupby().apply()

对于将股票标记S、B与H、M、L,直接采用forloop加ifelse语句会跑非常非常久,本代码采取整列判定的形式,先转化为0,1,2的数字,再用字典形式映射成str,避免循环

得出了股票的标记后,将把标记刷到接下来20个交易日中各个股票上,这里比较巧的使用了内置的fillna函数+groupby,如果上一个值是非nan且本值为nan则把上一个值刷下来

计算市值加权时,同样采用了内置的DataFrame.groupby().apply()与lambda函数,以一行简单公式进行加权,避免循环

总之就是绞尽脑汁避免for循环,多使用内置函数,不然对于时间与机器压力都是负担(本代码约5分钟内跑完),因子挖掘中的计算也要特别注意这点。

完整代码如下:

importpandasaspdimportnumpyasnpimportosdefmark_FF_set(df):#标记S、B以及H、M、L各档股票tmp_df=df#print(tmp_df)tmp_df[SMB]=((tmp_df[总市值]tmp_df[总市值].quantile(0.5)).astype(int)).replace({1:B,0:S})tmp_df[HML]=((tmp_df[EP]tmp_df[EP].quantile(0.7)).astype(int)+\(tmp_df[EP]tmp_df[EP].quantile(0.3)).astype(int)).replace({2:H,1:M,0:L})returntmp_dfif__name__==__main__:#读取数据并处理root=./monthly_data/file_name=os.listdir(root)df=pd.DataFrame()foriinfile_name:#将文件夹数据整合成一个大的DataFrametmp_df=pd.read_excel(root+i)df=df.append(tmp_df)df.dropna(how=any,inplace=True)df[EP]=1/df[市盈率(TTM)]df=df[[代码,时间,涨跌幅(%),总市值,EP]]#标记S、B与H、M、Ltime_list=list(df[时间].drop_duplicates())change_d=20#换仓间隔changeing_lst=time_list[0:len(time_list):change_d]#换仓时点changeing_df=df[df[时间].isin(changeing_lst)].reset_index()changeing_df=changeing_df.groupby(时间).apply(mark_FF_set)#将标记黏贴进dfdf=pd.merge(df,changeing_df[[代码,时间,SMB,HML]],how=left,on=[代码,时间])#刷填缺失值为上一非缺失值df=df.groupby(代码).apply(lambdax:x.sort_values(时间).fillna(method=ffill,axis=0)).reset_index(drop=True)#计算每日6大组别平均收益率与SMB、HML因子收益率(可选组内市值加权或等权平均)df[class]=df[SMB]+df[HML]#(1)市值加权法:returns=df[[时间,class,涨跌幅(%),总市值]].groupby([时间,class])\.apply(lambdax:(x[涨跌幅(%)]*x[总市值]/x[总市值].sum()).sum()).unstack()#(2)也可以采用等权平均法:#returns=df[[时间,class,涨跌幅(%),总市值]].groupby([时间,class]).mean()[涨跌幅(%)].unstack()returns[SMB]=(returns[SH]+returns[SM]+returns[SL])/3-(returns[BH]+returns[BM]+returns[BL])/3returns[HML]=(returns[SH]+returns[BH])/2-(returns[SL]+returns[BL])/2#合并上证指数,算出因子净值:df=pd.read_excel(.SH.xlsx).dropna(how=any).set_index(时间)returns[MKT]=df[涨跌幅(%)]#(1)计算每日收益乘数R=1+rreturns[SMB-R]=1+returns[SMB]/returns[HML-R]=1+returns[HML]/returns[MKT-R]=1+returns[MKT]/#(2)计算因子净值netvaluesmb_nv=[1]hml_nv=[1]mkt_nv=[1]foriinreturns.index:smb_nv.append(smb_nv[-1]*returns.loc[i,SMB-R])hml_nv.append(hml_nv[-1]*returns.loc[i,HML-R])mkt_nv.append(mkt_nv[-1]*returns.loc[i,MKT-R])returns[SMB-NV]=smb_nv[1:]returns[HML-NV]=hml_nv[1:]returns[MKT-NV]=mkt_nv[1:]returns.to_excel(SMB_HML_+time_list[0]+_+time_list[-1]+.xlsx)预览时标签不可点收录于话题#个上一篇下一篇



转载请注明地址:http://www.sanbaicaoasb.com/scgj/8351.html
  • 上一篇文章:
  • 下一篇文章:
  • 热点文章

    • 没有热点文章

    推荐文章

    • 没有推荐文章