财务的自我修养,微信公众号:机智出品(jizhjchupin)
一、系统环境:
Windows7+Python3.6+Jupyter Notebook
二、目标:
以近两年中国石化(600028)的收益率作为CAPM模型中的Ri,上证指数(000001)收益率作为Rm,计算中国石化Beta、Alpha值。2016年一年期国债利率为2.13%。
三、过程:
step 1:需要的库
import pandas as pd
import tushare as ts
import matplotlib.pyplot as plt
import statsmodels.api as sm
step 2:获取中国石化和上证指数数据并处理
#tushare获取市场数据
mktcd=ts.get_hist_data('sh',start='2015-10-01',end='2017-10-01')
mktret=pd.Series(mktcd.p_change.values,index=pd.to_datetime(mktcd.index))
mktret.name='mktret'
snp=ts.get_hist_data('600028',start='2015-10-01',end='2017-10-01')
snp.index=pd.to_datetime(snp.index)
snpret=pd.Series(snp.p_change.values,index=pd.to_datetime(snp.index))
snpret.name='snpret'
step 3:合并收益率并计算风险溢酬
ret=pd.merge(pd.DataFrame(mktret),
pd.DataFrame(snpret),
left_index=True,right_index=True,how='inner')
#计算无风险收益率
rf=1.0213**(1/360)-1
#计算股票超额收益率和市场风险溢酬
Eret=ret-rf
step 4:绘制两者收益率散点图
plt.scatter(Eret.values[:,0],Eret.values[:,1])
plt.title('SNP return and market return')
plt.show()
step 4:拟合CAPM模型
OLS()函数进行拟合
model=sm.OLS(Eret.snpret[1:],sm.add_constant(Eret.mktret[1:]))
result=model.fit()
result.summary()
OLS Regression Results
Variable: | snpret | squared: | 0.468 |
---|---|---|---|
Model: | OLS | Adj. R-squared: | 0.467 |
Method: | Least Squares | F-statistic: | 427.8 |
Date: | Mon, 02 Oct 2017 | Prob (F-statistic): | 1.22e-68 |
Time: | 17:08:22 | Log-Likelihood: | -645.24 |
No. Observations: | 488 | AIC: | 1294. |
Df Residuals: | 486 | BIC: | 1303. |
Df Model: | 1 | ||
No. Observations: | 488 | ||
Df Residuals: | 486 |
coef | std err | t | P>|t| | [0.025 | 0.975] | |
---|---|---|---|---|---|---|
const | 0.0295 | 0.041 | 0.715 | 0.475 | -0.051 | 0.110 |
mktret | 0.7018 | 0.034 | 20.684 | 0.000 | 0.635 | 0.768 |
Omnibus: | 83.061 | Durbin-Watson: | 1.907 |
---|---|---|---|
Prob(Omnibus): | 0.000 | Jarque-Bera (JB): | 186.530 |
Skew: | 0.897 | Prob(JB): | 3.13e-41 |
Kurtosis: | 5.440 | Cond. No. | 1.22 |
四、结果:
根据OLS拟合结果,近两年中国石化与上证指数的关系为:
Ri-Rf=0.0295+0.7018(Rm-Rf)+ε
可根据该模型预估中国石化预期收益率。