CAPM模型介绍
资本资产定价模型(CAPM)在投资方面经常被用来投资策略的是否有效,β 值在投资方面也有一定的参考价值,
今天我们就带领大家简单实现对单只股票的CAPM计算。
在CAPM模型中,个股与大盘指数的收益率都是期望值,其公式如下:
Ri-Rf = α +β(Rm-Rf)+ε*
Ri:代表个股
Rf:无风险资产,通常使用银行存款或国债的年化收益率
Rm:市场指数收益率,即大盘收益率
α: Alpha
在CAPM模型中,首先假设 Ri 服从正态分布随机数,并且所有资产的 Alpha 都应该是零或接近于 0,
如果和零有显著差异,说明个股有异常收益,代表收益率胜过大盘。β = 1 ,说明个股收益与大盘收益的波动性一致,
|β|<1,说明个股的波动程度小于大盘,|β|>1,说明个股的波动大于大盘。
程序实例 capm.py
可见 α、β 有助于我们分析个股相对于大盘的收益情况,下面我们就通过程序简单计算 平安银行的 α、β值,
以验证平安银行与上证指数的收益比较,直接上代码,代码中已经有详细的注释:
# coding: utf-8
import os, sys
from datetime import datetime
import pandas as pd
import tushare as ts
if len(sys.argv) ==3:
zs = sys.argv[1] # sh or sz 指数
code = sys.argv[2]
else:
print('usage: python capm.py sh stockcode ')
sys.exit(1)
if len(code) !=6:
print('stock code length: 6')
sys.exit(2)
# 资本资产进价模型(CAPM)--利用平安银行做实证
# Ri-Rf = α +β*(Rm-Rf)+ε
# 载入股指数据
today = datetime.now().strftime('%Y-%m-%d')
print(today)
sh = ts.get_hist_data(zs, start='2020-01-01',end=today) # 获取上证指数数据
stock1 = ts.get_hist_data(code,start='2020-01-01',end=today) # 获取平安银行数据
ret_merge=pd.merge(pd.DataFrame(sh.p_change),pd.DataFrame(stock1.p_change),left_index=True,right_index=True,how='inner')
# 计算日无风险利率
Rf_year =0.0305 # 以2020年中国三年期国债年化收益率为无风险利率
Rf= (1+Rf_year)**(1/365)-1 ## 年利率转化为日利率
print('Rf=',Rf)
# 计算风险溢价: Ri-Rf
Eret = ret_merge-Rf
# Eret.head()
# 画出两个风险溢价的散点图,查看相关性
import matplotlib.pyplot as plt
plt.scatter(Eret.values[:,0],Eret.values[:,1])
plt.show()
##利用最小二乘法进行线性回归,拟合CAPM模型
import statsmodels.api as sm
md_capm = sm.OLS(Eret.p_change_y[1:],sm.add_constant(Eret.p_change_x[1:]))
result = md_capm.fit()
#result.summary()
print(result.summary())
运行 python capm.py sh 000001
Rf= 8.231604900843514e-05
OLS Regression Results
==============================================================================
Dep. Variable: p_change_y R-squared: 0.503
Model: OLS Adj. R-squared: 0.501
Method: Least Squares F-statistic: 223.6
Date: Sun, 06 Dec 2020 Prob (F-statistic): 2.17e-35
Time: 19:57:17 Log-Likelihood: -415.00
No. Observations: 223 AIC: 834.0
Df Residuals: 221 BIC: 840.8
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 0.0355 0.105 0.339 0.735 -0.171 0.242
p_change_x 1.1690 0.078 14.952 0.000 1.015 1.323
==============================================================================
Omnibus: 7.347 Durbin-Watson: 2.000
Prob(Omnibus): 0.025 Jarque-Bera (JB): 7.134
Skew: 0.391 Prob(JB): 0.0282
Kurtosis: 3.395 Cond. No. 1.35
==============================================================================
回归结果如下:
α = 0.0355 ,说明和零差异不是非常大,有一定异常收益
β = 1.1690 ,说明波动力稍大于大盘,但不明显
Ri-Rf = 0.0355 +1.1690*(Rm-Rf)+ε
python capm.py sz 000001
2021-02-12
Rf= 8.231604900843514e-05
OLS Regression Results
==============================================================================
Dep. Variable: p_change_y R-squared: 0.205
Model: OLS Adj. R-squared: 0.202
Method: Least Squares F-statistic: 69.48
Date: Fri, 12 Feb 2021 Prob (F-statistic): 4.02e-15
Time: 12:52:47 Log-Likelihood: -583.40
No. Observations: 271 AIC: 1171.
Df Residuals: 269 BIC: 1178.
Df Model: 1
Covariance Type: nonrobust
==============================================================================
coef std err t P>|t| [0.025 0.975]
------------------------------------------------------------------------------
const 0.0884 0.128 0.693 0.489 -0.163 0.340
p_change_x 0.6406 0.077 8.336 0.000 0.489 0.792
==============================================================================
Omnibus: 26.963 Durbin-Watson: 1.984
Prob(Omnibus): 0.000 Jarque-Bera (JB): 44.146
Skew: 0.598 Prob(JB): 2.59e-10
Kurtosis: 4.575 Cond. No. 1.68
==============================================================================