提示:文章内容主要来自《金融统计分析》课程的课题作业。

文章目录

文章目录

前言

一、检验方案简述

二、实现步骤

1.数据获取

2.数据整理

3.一阶回归与个例展示

4、 二阶回归

总结


前言

CAPM模型是由哈里·马科威茨提出的,CAPM中文叫资本资产定价模型,是基于风险资产期望收益均衡基础上的预测模型。模型指出:资产的预期超额收益与市场组合的预期收益在长期内成正比。在上世纪60年代,多位经济学家对该模型进行过验证,这些经济学家运用了不同的方法,却都得到了相同的结论。那么,CAPM模型在中国A股市场的定价表现又如何呢?本文将通过截面回归的方式,来探讨这一问题。


一、检验方案简述

1、以沪深300成分股为样本,以沪深300指数代表市场因子,以shibor利率代表无风险收益率;

2、从tushare数据库获2017年1月·1日至2021年12月31日期间内300只成分股的历史行情数据;

3、数据处理,只保留期间一直存在的成分股,去除其他变动的成分股,并将保留的股票数据转换成月度收益;

4、对每只成分股进行回归,得出所有成分股的βi值和预期超额收益E(ri);

5、用所得β值和预期超额收益E(ri)进行截面回归,得到证券市场线。

二、实现步骤

1.数据获取

代码如下:

import tushare as ts
import time
pro = ts.pro_api('##########################')  # tushare数据接口,需个人注册获取
# 获取shibor(1个月)数据作为无风险收益率
shibor_history=pro.shibor(start_date='20170101',end_date='20211231',fields='date,1m')
shibor_history.to_csv('E:\\python_outputs\\CAPM\\shibor_history.csv',index=False)
# 获取沪深300指数月线数据
HS300_history=pro.index_monthly(ts_code='000300.SH',start_date='20161201',end_date='20211231',fields='ts_code,trade_date,close')
HS300_history.to_csv('E:\\python_outputs\\CAPM\\HS300_history.csv',index=False)
# 获取沪深300指数成份股(2021年12月31日)
cons_HS300=pro.index_weight(index_code='000300.SH',trade_date='20211231',fields='con_code,trade_date')
cons_HS300.to_csv('E:\\python_outputs\\CAPM\\cons_HS300.csv',index=False)
# 获取沪深300所有成份股的月线数据
# 因为每分钟最多访问该接口120次,需要间隔1分钟分次获取
for i in cons_HS300.truncate(before=0,after=99).con_code:con=pro.monthly(ts_code=i,start_date='20161201',end_date='20211231',fields='ts_code,trade_date,close')con.to_csv('E:\\python_outputs\\CAPM\\cons_monthly\\{}_monthly.csv'.format(i),index=False)
time.sleep(61)  # 等待61秒
for i in cons_HS300.truncate(before=100,after=199).con_code:con=pro.monthly(ts_code=i,start_date='20161201',end_date='20211231',fields='ts_code,trade_date,close')con.to_csv('E:\\python_outputs\\CAPM\\cons_monthly\\{}_monthly.csv'.format(i),index=False)
time.sleep(61)  # 等待61秒
for i in cons_HS300.truncate(before=200,after=299).con_code:con=pro.monthly(ts_code=i,start_date='20161201',end_date='20211231',fields='ts_code,trade_date,close')con.to_csv('E:\\python_outputs\\CAPM\\cons_monthly\\{}_monthly.csv'.format(i),index=False)

2.数据整理

代码如下:

import glob
import numpy as np
import pandas as pd
HS300=pd.read_csv('E:\\python_outputs\\CAPM\\HS300_history.csv',parse_dates=['trade_date'])
HS300.trade_date=HS300.trade_date.apply(lambda x:x.strftime('%Y%m'))  # 日期转为年月格式
df=pd.read_csv('E:\\python_outputs\\CAPM\\shibor_history.csv',parse_dates=['date'],index_col='date')
df0=(df.resample('M')  # 调整周期,以月为周期.mean().div(12)  # shibor利率为单利年利,直接出除以12.reset_index())
df0.date=df0.date.apply(lambda x:x.strftime('%Y%m'))
shibor=df0.rename(columns={'date':'trade_date','1m':'rf_shibor'}).set_index('trade_date')
shibor.to_csv('E:\\python_outputs\\CAPM\\rf_shibor.csv')
files=glob.glob('E:\\python_outputs\\CAPM\\cons_monthly\\*.csv')
cons_monthly=pd.concat([pd.read_csv(j,parse_dates=['trade_date']) for j in files])
cons_monthly.trade_date=cons_monthly.trade_date.apply(lambda x:x.strftime('%Y%m'))
data=(pd.concat([cons_monthly,HS300]).set_index('trade_date').pivot(columns='ts_code',values='close').dropna(axis=1).apply(np.log).diff().dropna().mul(100))
regression_data_set=(data.T-shibor.T.loc['rf_shibor']).T  # regression_data_set为成分股和沪深300的历史超额收益率
regression_data_set.to_csv('E:\\python_outputs\\CAPM\\regression_data_set.csv')

3.一阶回归与个例展示

一阶回归基于每只成分股的月度超额收益和指数月度超额收益数据,得出股票的βi值和预期超额收益E(ri)。并以个例(贵州茅台)绘出证券特征线。代码如下:

import statsmodels.api as sm
import matplotlib.pyplot as plt
regression_data_set=pd.read_csv('E:\\python_outputs\\CAPM\\regression_data_set.csv',index_col='trade_date')
print(regression_data_set)
X=sm.add_constant(regression_data_set['000300.SH'])
params_list=[]
r2_adj_list=[]
cons=regression_data_set.columns
for a in cons:y=regression_data_set[a]model=sm.OLS(y,X)result=model.fit()param = result.params.to_list()r2_adj = result.rsquared_adjparams_list.append(param)r2_adj_list.append(r2_adj)
r2_adj = pd.DataFrame(r2_adj_list, index=cons, columns=['rsquared_adj'])
params = pd.DataFrame(params_list, columns=['const', '000300.SH'], index=cons)
regression_result = pd.concat([params, r2_adj], axis=1)
regression_result.to_csv('E:\\python_outputs\\CAPM\\regression_result.csv')# 个例展示(贵州茅台)
X1=sm.add_constant(regression_data_set['000300.SH'])
y1=regression_data_set['600519.SH']
model1=sm.OLS(y1,X1)
result1=model1.fit()
print(result1.summary())plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
regression_data_set1=regression_data_set.assign(observes_month=range(1,61))
plt.figure(figsize=(9,5))
plt.plot(regression_data_set1.observes_month,[0]*60,color='black')
plt.plot(regression_data_set1.observes_month,regression_data_set['600519.SH'],label='贵州茅台',linestyle='--')
plt.plot(regression_data_set1.observes_month,regression_data_set['000300.SH'],label='沪深300')
plt.title('沪深300和贵州茅台的超额收益')
plt.xlabel('观察样本(月)')
plt.ylabel('超额收益(%)')
plt.legend()
plt.savefig('E:\\python_outputs\\CAPM\\沪深300和贵州茅台的超额收益.png')X1=regression_data_set['000300.SH']
Y1=result1.predict()
plt.figure(figsize=(9,6))
plt.scatter(X1,y1,label='观测值')
plt.plot(X1,Y1,label='预测值',color='orange')
plt.title('贵州茅台证券特征线')
plt.xlabel('沪深300超额收益(%)',position=(1,1))
plt.ylabel('贵州茅台超额收益(%)',position=(-5,0.95),rotation=0)
plt.legend()
ax=plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['bottom'].set_position(('data',0))
ax.spines['left'].set_position(('data',0))
plt.savefig('E:\\python_outputs\\CAPM\\贵州茅台证券特征线.png')

4、 二阶回归

二阶回归基于一阶回归的结果,得出证券市场线。代码如下:

regression_result=pd.read_csv('E:\\python_outputs\\CAPM\\regression_result.csv',index_col='Unnamed: 0')
regression_result.rename(columns={'000300.SH':'beta'},inplace=True)
df1=regression_data_set.div(100).add(1).apply(np.cumprod)
mean_return=df1.loc[202112].apply(lambda s:np.power(s,1/60)).sub(1).mul(100).rename('mean_Return')
X2=sm.add_constant(regression_result['beta'])
y2=mean_return
model2=sm.OLS(y2,X2)
result2=model2.fit()
print(result2.summary())
s=regression_data_set.mean()
rf=pd.read_csv('E:\\python_outputs\\CAPM\\rf_shibor.csv',index_col='trade_date')
mean_rf=rf.rf_shibor.mean()
print('mean_rf:','{:.4f}'.format(mean_rf))X3=regression_result['beta']
Y3=pd.Series(result2.predict()).add(mean_rf)
y3=y2.add(mean_rf)plt.figure(figsize=(6,6))
plt.scatter(X3,y3,label='observes')
plt.plot(X3,Y3,label='CML',color='orange')
plt.title('证券市场线')
plt.xlabel('beta',position=(1,1))
plt.ylabel('E(R)',position=(-5,0.95),rotation=0)
plt.legend()
ax=plt.gca()
ax.spines['right'].set_color('none')
ax.spines['top'].set_color('none')
ax.spines['bottom'].set_position(('data',0))
ax.spines['left'].set_position(('data',0))
plt.savefig('E:\\python_outputs\\CAPM\\证券市场线.png')
plt.show()

总结

最后的结果显示,贵州茅台又一个正的α值,而证券市场线显示在2017年到2021年的五年中,A股的资产的预期超额收益与市场组合的预期收益不成成正比。本该为正的无风险收益在证券市场线上则不然。故我们得出:CAPM在A股的定价效果不佳。这一点在A股指数上也不到了一定的印证:217年1月3日1沪深300指数为3342.23点,2021年12月31日为3769.57点。整整5年,上涨了点427.34点,涨幅12.79%,年均(几何平均)2.43%的收益率……

抑郁……

关注获取完整代码和数据库

一个文科生,用Python检验CAPM模型在A股市场的有效性,老师期末给了95分相关推荐

  1. 文科生学python_一个文科生的python心路历程

    没错,我是一个文科生.作为一个文科生,学习python这种计算机编程语言,一般人会认为是不是疯了.大概我之前也没有想过会选这门课.而做下决定的原因很简单,肖胜刚老师曾是大一时任我们计算机课的老师,当时 ...

  2. 文科生自学python要多久_一个文科生开始python的初学体验

    剧荒.无聊的时候怎么办?别刷手机了,学一些新技能吧 曾经数学物理经常挂科,我是一名妥妥的文科生.然而,最近我开始挑战编程.学习线上python课程. 要转换思维不容易,但我觉得挺值得,忍不住来分享一下 ...

  3. Python银行风控模型的建立 SVM 决策树 神经网络 三种模型比较

    一.首先要感谢原作者的无私分享 原文网页链接: Python银行风控模型的建立_DG息的博客-CSDN博客_银行风控模型 首先感谢"Python银行风控模型的建立"()这位老师,他 ...

  4. Barra模型初探,A股市场风格解析

    >>> 引言 本篇内容是参考方正金工研究报告"星火" 多因子系列报告的第一篇<Barra模型初探,A股市场风格解析>,下面将对Barra模型的基本原理 ...

  5. 乐学偶得python视频_怎么用历史估计法,ERP与CAPM模型计算股票资产的内在价值

    内容首发 乐学偶得(http://lexueoude.com) 公众号: 乐学Fintech 用代码理解分析解决金融问题 我们之前在 <那个骗你50%回报的保险,用的是啥套路>一文中向大家 ...

  6. Python计算机视觉——照相机模型与增强现实

    Python计算机视觉--照相机模型与增强现实 文章目录 Python计算机视觉--照相机模型与增强现实 1 针孔照相机模型 1.1 照相机矩阵 1.2 三维点的投影 1.3 照相机矩阵的分解 1.4 ...

  7. 文科生学python系列_文科生学 Python 系列 3:函数

    文科生学Python系列3:函数​www.jianshu.com 还是第二课的内容 函数是一段可以重复使用的代码,往往是为了解决某个特定的人物.在 Python 中有两种函数:内置函数和自定义函数. ...

  8. python股票交易模型_如何用Python建模GGM模型并对股票估值?

    内容首发 乐学偶得(http://lexueoude.com) 公众号: 乐学Fintech 用代码理解分析解决金融问题 首先我们快速了解一下什么是GGM模型. GGM模型又叫做"戈登增长模 ...

  9. 用Python对CAPM和Fama French Three Factor model的初步学习

    用Python对CAPM和Fama French Three Factor model的初步学习 概述 介绍 建模与分析 CAPM Fama French Three-Factor Model 总结 ...

最新文章

  1. C语言a+++b的问题
  2. php如何判断多文件上传,php多文件上传
  3. C# 控制台或者winform程序开启http的监听状态
  4. 苹果手机屏幕镜像搜索不到电视_最全小米电视投屏教程(建议收藏)
  5. Android应用程序的debug属性
  6. 接口测试——测试用例执行
  7. 解决iview中</Input>标签报错的方法
  8. python getopt_Python getopt
  9. 选择编程语言前需要知道的事
  10. 如何进行网站流量分析?你需要知道这些指标
  11. 在matlab设置三角波,matlab 中repeating sequence中怎样设置20khz三角波
  12. 【Git/Bugfix系列】fatal: in unpopulated submodule的分析和解决方案
  13. 测试分析——熟悉被测软件
  14. Win10电脑开机进不去系统怎么修复
  15. 基于Matlab模拟AWGN 信道上 OFDM附完整代码
  16. ORA-00933:SQL 命令未正确结束(1)
  17. SplitSR: An End-to-End Approach to Super-Resolution on Mobile Devices
  18. 网络编程代码实例:多进程版
  19. 计算机安全法的发行日期,网络安全法实施时间,网络安全法是什么时候实施的?...
  20. 无痕去水印软件哪个好用?

热门文章

  1. 什么叫做API?看完你就理解了 老夏博客
  2. TensorFlow2.x 常用知识
  3. 落单的数IV --- lintcode 824
  4. 【CSS】css3绘制各种形状图形三角形,菱形,五角星,椭圆等
  5. ME-27(USAF)
  6. 全面解析电商促销系统
  7. 利用Python turtle库实现六角形、无角正方形的绘制
  8. 搭建达梦数据库数据守护-实时主备
  9. nyoj 455-黑色帽子
  10. 军用加固计算机 厂家 排名,中国加固计算机品牌有哪些?