CAMP模型python实现

一、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模型公式

r i ‾ = r f + β i ∗ ( r m ‾ − r ˉ f ) \overline{r_{i}}=r_{f}+\beta_{i} *\left(\overline{r_{m}}-\bar{r}_{f}\right) ri=rf+βi(rmrˉf)
其中 r f 是 无 风 险 回 报 率 ; r_{f}是无风险回报率; rf b e t a i 是 证 券 i 的 b e t a 系 数 ; beta_{i}是证券i的beta系数; betaiibeta r m 是 市 场 期 望 回 报 率 ; r_m是市场期望回报率; rm; r m ‾ − r ˉ f 是 市 场 的 超 额 回 报 率 . \overline{r_{m}}-\bar{r}_{f}是市场的超额回报率. rmrˉf.

四、 单个股票的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()

可视化结果如下:
在福耀玻璃与沪深300日收益率时序图
福耀玻璃与沪深300的累计收益率
我们取银行间一年的同业拆借利率为无风险利率即为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')

结果如下:
OLS回归
可见β=0.8905,α=0.07%,即沪深300每上升一个百分点,福耀玻璃的股价会上涨0.8905个百分点。R^2=0.337,故CAPM模型的拟合效果一般。

  • 3
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值