一、CAPM 模型和公式
参考作者:肖睿在量化课堂的文章
CAPM 公式
CAPM 公式是从以上模型框架推导出的数学表达式,它表达了任何风险资产的收益率和市场组合的收益率之间关系。在这个公式中,任何风险资产的收益率都可以被分为两个部分:无风险收益(利率)和风险收益(ββ 收益)。我们先看公式。
定理(CAPM 公式). 对于某一风险资产 S(可以把 SS想象为一种证券),有
其中:
− 是组合 S 的收益变量;
− 是市场组合的收益变量;
− 是市场的无风险利率;
− 是组合 SS 对于市场风险的敏感度,计算公式为
在现实环境里,我们可以将一个概括市场整体的组合(比如大盘指数)作为市场组合,并以其为基准计算每个风险资产的系统性风险 ββ。这样,我们根据对市场整体趋势的判断以及对风险控制的需要,选择适当的 ββ 进行资产配置。
二、Python 代码实现
以美的股票为例, 按过去两年美的的日收益率(先不考虑分红),当前的合理定价是多少? 以3年期定期存款作为无风险收益率,通过CAPM模型计算美的的合理定价。 P.S: 这里把定价按收益率处理, 没有转换成价格。
#环境&数据准备
import sys as sy
import numpy as np
import pandas as pd
import tushare as ts
import pyecharts as pye
from sklearn import datasets as ds
import matplotlib as mpl
from matplotlib import pyplot as plt
import seaborn as sns
import pyecharts as pye
#读入美的“000333”2017-01-01 到 2018-11-08复权后数据
#美的取了前复权数据
df_000333 = ts.get_h_data('000333', start='2017-01-01', end='2018-11-8')
#深成指数木有复权一说
df_sz = ts.get_hist_data('sz',start='2017-01-01', end='2018-11-8')
#数据准备
df_tmp1 = pd.DataFrame()
df_tmp2 = pd.DataFrame()
df_tmp1['rt_000333'] =(df_000333.close.diff(1))/df_000333.close.shift(1)
df_tmp2['rt_sz'] =(df_sz.close.diff(1))/df_sz.close.shift(1)
df_tmp = df_tmp1.join(df_tmp2)
df_tmp = df_tmp.dropna()
del df_tmp1
del df_tmp2
#计算Beta系数
cov_sm = np.cov(df_tmp.rt_000333, df_tmp.rt_sz)[0,1]
var_m = np.var(df_tmp.rt_sz)
Beta = cov_sm/var_m
#下面的例子是为了告诉大家Beta可通过线性回归系数来求得, 效果有一点不一样一样的。
#from scipy import stats
#Beta_ln = stats.linregress(df_tmp.rt_sz, df_tmp.rt_000333)
#这个算法不是很好, 不应该把SZ的日均收益率转换成年化收益率的,用365天来差分,可能合理一些
Erm = df_tmp.rt_sz.mean()*365 #计算年化市场期望收益率
Rf = 0.015 #央行一年期定存利率, 也可也换成10年期债券, 其实每个人眼里的无风险收益的欧是不一样的。
#根据公司Ers = rf + Beta*(Erm - rf)
Ers = Rf + Beta*(Erm - Rf)
print('Bata = ' + str(Beta))
print('Rf = ' + str(Rf))
print('Erm = ' + str(Erm))
print('Ers = ' + str(Ers))
Bata = 1.0479583979512406
Rf = 0.015
Erm = 0.16496466600799972
Ers = 0.1721567311390363
参考文章: