python多因子量化选股模型-Python量化入门:Fama-French三因子模型.pdf

python多因子量化选股模型-Python量化入门:Fama-French三因子模型.pdf

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

python多因⼦量化选股模型_Python量化⼊门:Fama-French

三因⼦模型

技技术术讨讨论论,,不不构构成成任任何何投投资资建建议议!!

⼀⼀、、CAPM的的不不与与三三因因⼦⼦模模型型的的诞诞⽣⽣

CAPM模型经历了⼤量的实证和应⽤之后,有证据表明,市场风险溢酬并不能充分解释个别风险资产的收益率。于是很多研究者开始探索其

他的因素,⽐如公司市值、PE、杠杆⽐例、账⾯市值⽐等。

Fama和French两个⼈对于各种因素进⾏了全⾯的组合分析,当单独使⽤Beta或者⽤Beta分别与其他⼏个因⼦相结合时,Beta的解释能⼒

很弱;市值、PE(市盈率)、杠杆⽐例、BM(账⾯市值⽐,PB的倒数)单独来⽤时,对于收益率的解释能⼒都很强,但是组合起来时,

市值、BM会弱化杠杆⽐例和PE的解释能⼒。

后来Fama和French两⼈提取了3个重要因⼦:市场风险溢酬因⼦、市值因⼦和账⾯市值⽐因⼦,以收益率作为因变量构建了⼀个类似

CAPM的线性模型,即著名的三因⼦模型。

⼆⼆、、三三因因⼦⼦模模型型的的原原理理

三因⼦模型中的3个因⼦均为投资组合的收益率:市场风险溢酬因⼦对应了市场投资组合的收益率,市值因⼦对应了做多市值较⼩的公司与

做空市值较⼤的公司的投资组合带来的收益率,账⾯市值⽐因⼦对应的是做多⾼BM公司、做空低BM公司的投资组合带来的收益率。三因⼦

模型的形式为:

可以看到这⾥⽤的是期望,所以我们仍然转换成线性回归模型的形式:

这样⼤家就⽐较熟悉了,⼀个常数项,三个⾃变量,⼀个误差项,⼀个因变量,妥妥的⼀个多元线性回归模型。跟CAPM中⼀样,α代表超

额收益率,越⾼越好,说明我们的投资组合越优秀。

不要看到这么多名词就害怕,在实际应⽤过程中,这些数据都是已知的,我们直接把数据扔给计算机,通过最⼩⼆乘法求解得到α、b、s、

h的估计值即可以及它们是否显著即可。

唯⼀稍显⿇烦⼀点的是SMB和HML的计算,这⼀部分需要先根据流通市值将股票分为1:1的⼤市值(B)和⼩市值(S)股票;根据BM数

据将股票分为3:4:3的⾼中低(H/M/L)三组;这样我们就有了2×3共计6种投资组合(SL/SM/SH/BL/BM/BH)。然后我们通过市

值加权平均的⽅式求得各组的收益率,最后就是求SMB和HML了:

写再多公式都不如直接⽤Python实战演练⼀下。

三三、、Python三三因因⼦⼦模模型型选选股股实实战战

1.计计算算SMB和和HML

导导⼊⼊必必要要的的库库

importpandasaspd

importtushareasts

importseabornassns

importmatplotlib.pyplotasplt

importmatplotlibasmpl

importdatetime

sns.set()

mpl.rcParams[font.sans-serif]=WenuanYiMicroHei

pro=ts.pro_api()

定定义义计计算算函函数数

defcal_smb_hml(df):

#划分⼤⼩市值公司

df[SB]=df[circ_mv].map(lambdax:Bifx=df[circ_mv].median()elseS)

#求账⾯市值⽐:PB的倒数

df[BM]=1/df[pb]

#划分⾼、中、低账⾯市值⽐公司

border_down,border_up=df[BM].quantile([0.3,0.7])

border_down,border_up

df[HML]=df[BM].map(lambdax:Hifx=border_upelseM)

df[HML]=df.apply(lambdarow:Lifrow[BM]=border_downelserow[HML],axis=1)

#组合划分为6组

df_SL=df.query((SB==S)(HML==L))

df_SM=df.query((SB==S)(HML==M))

df_SH=df.query((SB==S)(HML==H))

文档评论(0)

liuzhouzhong + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档