一、CAPM 模型简介
资本资产定价模型(简称 CAPM)是由美国学者夏普、林特尔、特里诺和莫辛等人在资产组合理论的基础上发展起来的,是现代金融市场价格理论的支柱。现代资产组合理论认为,资产组合面临的风险主要有系统性风险和非系统性风险。系统性风险与整体经济运行(如通货膨胀,经济危机等)相关,而系统性风险与资产自身的特性相关。通过投资于由多种资产构成的资产组合,虽不能消除系统性风险,但可以降低直至消除资产组合的非系统性风险。而 CAPM 模型就是对资产的系统性风险的定价。
二、CAPM的基本假设
CAPM的基本假设条件包括:
1、投资者希望财富越多愈好, 效用是财富的函数, 财富又是投资收益率的函数, 因此可以认为效用为收益率的函数。
2. 投资者能事先知道投资收益率的概率分布为正态分布。
3. 投资风险用投资收益率的方差或标准差标识。
4、影响投资决策的主要因素为期望收益率和风险两项。
5、投资者都遵守主宰原则(Dominance rule), 即同一风险水平下, 选择收益率较高的证券; 同一收益率水平下, 选择风险较低的证券。
(1、2、3、5理性人假设,4是模型约束)
CAPM的附加假设条件包括:(完全有效市场假设)
7. 所有投资者对证券收益率概率分布的看法一致, 因此市场上的效率边界只有一条。
8、所有投资者具有相同的投资期限, 而且只有一期。
9. 所有的证券投资可以无限制的细分, 在任何一个投资组合里可以含有非整数股份。
10、买卖证券时没有税负及交易成本。
12. 不存在通货膨胀, 且折现率不变。.
13、投资者具有相同预期, 即他们对预期收益率、标准差和证券之间的协方差具有相同的预期值。
上述假设表明: 第一, 投资者是理性的, 而且严格按照马科威茨模型的规则进行多样化的投资, 并将从有效边界的某处选择投资组合; 第二, 资本市场是完美/完全市场, 没有任何磨擦阻碍投资。
三、CAPM模型公式
其中
四、 单个股票的CAPM分析
首先我们载入相关的模块:
import pandas as pd
import tushare as ts
import seaborn as sns
import matplotlib.pyplot as plt
import matplotlib as mpl
import statsmodels.api as sm
#若没有以上模块,win+R,CMD版面输入<pip install 模块>下载.eg:pip install pandas
其次从Tushare数据库导入股票数据,并进行数据清洗(股票我以福耀玻璃为例,市场收益率选择沪深300的收益率)
# 获取数据
token="。。。。。"#引号里填入Tushare“我的主页”里面的token码,做以下分析需要Tushare里面的积分达到200分以上
ts.set_token(token)
pro = ts.pro_api()
fy= pro.daily(ts_code='600660.SH', start_date='20180101')
hs300 = pro.index_daily(ts_code='000300.SH', start_date='20180101')
# 仅保留收益率数据,且用日期作为index
# 然后按照日期排序(增序)
stock_list = [fy, hs300]
for stock in stock_list:
stock.index = pd.to_datetime(stock.trade_date)
df = pd.concat([stock.pct_chg / 100 for stock in stock_list], axis=1)
df.columns = ['fy', 'hs300']
df = df.sort_index(ascending=True)
df.describe()
Tushare注册网址如下 https://tushare.pro/register?reg=415985
我们查看以下累积收益率以及方差的情况
df = df.fillna(0)
returns = (df + 1).product() - 1
print('累计收益率:\n', returns)
print('\n标准差:\n', df.std())
接下来我们进行数据可视化,查看一下收益率波动情况和累计收益率:
sns.set()
mpl.rcParams['font.family'] = 'sans-serif'
plt.rcParams['font.sans-serif'] = ['SimHei']#用来显示中文标签
plt.rcParams['axes.unicode_minus'] = False#用来正常显示负号
plt.figure(figsize=(10, 5))
for col in df.columns:
plt.plot(df[col], label=col)
plt.title('日收益率时序图(2018至今)', fontsize=20)
plt.legend()
plt.figure(figsize=(10, 5))
for col in df.columns:
plt.plot((df[col]+1).cumprod()-1, label=col)
plt.title('累计收益率时序图(2018至今)', fontsize=20)
plt.legend()
plt.show()
可视化结果如下:
我们取银行间一年的同业拆借利率为无风险利率即为2.91,所以平均每日的无风险收益率为:
rf = 1.0291**(1/360) - 1
print(rf)
福耀玻璃与沪深300的风险溢价:
df_rp = df - rf
df_rp.head()
sns.pairplot(df_rp)
我们这次使用statsmodels来求解β值
stock_names = {'fy': '福耀玻璃'}
for stock in ['fy']:
model = sm.OLS(df_rp[stock], sm.add_constant(df_rp['hs300']))
result = model.fit()
print(stock_names[stock] + '\n')
print(result.summary())
print('\n\n')
结果如下:
可见β=0.8905,α=0.07%,即沪深300每上升一个百分点,福耀玻璃的股价会上涨0.8905个百分点。R^2=0.337,故CAPM模型的拟合效果一般。