当前位置: 首页 > 科技观察

用Python实现资本资产定价模型

时间:2023-03-19 17:07:33 科技观察

Python中文社区(ID:python-china)在本文中,我们将学习如何计算资本资产定价模型(CAPM)并获取beta系数。资本资产定价模型(CapitalAssetPricingModel,简称CAPM)是美国学者在资产组合理论和资本市场理论的基础上于1964年发展起来的。它主要研究证券市场资产的预期收益率与风险资产之间的关系。这种关系以及均衡价格是如何形成的,是现代金融市场价格理论的支柱,广泛应用于投资决策和企业融资。CAPM被认为是一个单因子模型,可以在其上构建更复杂的因子模型。(扫描本文底部二维码,获取全部完整源码和JupyterNotebook文件包下载。)CAPM用下式表示:其中E(ri)代表资产i的预期收益,rf为无风险利率(如国债),E(rm)为市场预期收益,β为贝塔系数。β可以解释为资产回报相对于一般市场水平的敏感性水平。β的一些情况包括:β<=-1:资产走势与市场基准相反,且大于基准的负值。-1<β<0:资产价格与市场基准走势相反β=0:资产价格与市场基准走势一致。0<β<1:资产与市场走势相同,但幅度较小。一个例子是公司的股票价格容易受到每日市场波动的影响。β=1:资产和市场以相同的幅度向同一方向移动。β>1:资产与市场同向运动,但数量更大。例如,一家公司的股票极易受到每日市场新闻的影响。CAPM也可以表示为:这里,等式左边可以解释为风险溢价,而右边包含市场溢价。相同的等式可以改写为:其中:在这个例子中,我们以亚马逊股票为例,并假设标准普尔500指数代表市场。我们使用5年(2014-2018年)的月度数据来估计β。目前,无风险利率很低,为简单起见,我们假设它为零。执行以下步骤在Python中实现CAPM:1.导入第三方库:importpandasapdimportyfinanceeasyfimportstatsmodels.apiassm2。指定风险资产和时间范围:RISKY_ASSET='AMZN'MARKET_BENCHMARK='^GSPC'START_DATE='2014-01-01'END_DATE='2018-12-31'3。从YahooFinance下载必要的数据:df=yf.download([RISKY_ASSET,MARKET_BENCHMARK],start=START_DATE,end=END_DATE,adjusted=True,progress=False)4.重新抽样到每月数据并计算简单回报:X=df['AdjClose'].rename(columns={RISKY_ASSET:'asset',MARKET_BENCHMARK:'market'})\.resample('M')\.last()\.pct_change()\.dropna()5.使用计算beta值的协方差方法:covariance=X.cov().iloc[0,1]benchmark_variance=X.market.var()beta=covariance/benchmark_variance代码结果为β=1.6709。6.准备输入并将CAPM估计为线性回归:y=X.pop('asset')X=sm.add_constant(X)capm_model=sm.OLS(y,X).fit()print(capm_model.summary())下图显示了CAPM模型的估计结果:这些结果表明beta系数(这里表示为市场)等于1.67,这意味着亚马逊股票的回报率比市场波动率(衡量的)高出67%标准普尔500指数表明市场走势)。截距的值很小,在5%的显着性水平上不具有统计显着性。首先,我们指定要使用的资产(亚马逊和标准普尔500指数)和时间范围。在第3步中,我们从YahooFinance下载了数据。然后我们只保留最后一个月的可用价格并计算月回报率的百分比变化。在第5步中,我们将β计算为风险资产与基准方差之间的协方差之比。在第6步中,我们使用pandasDataFrame的pop方法组合了目标(亚马逊股票收益)和特征(标准普尔500指数收益)。之后,我们添加了常量,使用add_constant函数添加到特征中(有效地添加了一列)。将截距添加到此回归背后的想法是调查在估计模型时截距(在CAPM的情况下也称为Jensen的alpha)是否为零。如果它为正且显着,则意味着-假设CAPM模型为真-资产或投资组合正在产生异常高的风险调整后回报。然后有两种可能的影响——市场效率低下,或者模型中应该包含一些其他未发现的风险因素。这个问题被称为联合假设问题。最后,我们运行OLS回归并打印摘要。在这里我们可以看到市场变量的系数(即CAPMbeta)等于计算步骤5中资产和市场之间的协方差。在主要示例中,我们假设不存在无风险利率,这是一个合理的假设。然而,在某些情况下,我们可能希望考虑非零无风险利率。在本节中,我们描述了三种可能的方法:使用来自肯尼斯·弗伦奇教授网站的数据:市场溢价(rm-rf)和无风险利率(大约1个月的国库券)可以从肯尼斯·弗伦奇教授的网站上下载。该指数不同于标准普尔500指数——在他的网站上有详细介绍。第二种选择是近似无风险利率,例如13周(3个月)国库券(雅虎金融代码:^IRX)。按照以下步骤学习如何下载数据并将其转换为合适的无风险利率。1.定义周期的天数:N_DAYS=902。从YahooFinance下载数据:df_rf=yf.download('^IRX',start=START_DATE,end=END_DATE)3.将数据重新采样为每月频率(通过取每个月的最后一个值):rf=df_rf.resample('M').last().Close/1004,计算无风险收益(以日值表示)并将值转换为月收益:rf=(1/(1-rf*N_DAYS/360))**(1/N_DAYS)rf=(rf**30)-15,画出计算出的无风险利率:rf.plot(title='Risk-freerate(13WeekTreasuryBill)')下图是可视化的随时间变化的无风险利率:最终方法使用3个月期国库券来估计无风险利率,可以从美联储经济数据(FRED)数据库下载。按照以下步骤学习如何下载数据并将其转换为无风险月利率:1.导入第三方库:importpandas_datareader.dataasweb2。从FRED数据库下载数据:rf=web.DataReader('TB3MS','fred',start=START_DATE,end=END_DATE)3。将得到的无风险利率换算成月值:rf=(1+(rf/100))**(1/12)-14。画出计算出的无风险利率:rf.plot(title='Risk-freerate(3-MonthTreasuryBill)')我们可以通过比较两种方法的绘图来比较两种方法的无风险利率:我们可以看到情节非常相似。