用python计算有效前沿_【投资组合理论】Python绘制上证50成分股有效前沿和CML

马科维茨有效前沿是经典的资产配置模型,对于给定收益率,有效前沿上的投资组合风险最小。

初学时,感觉绘制有效前沿是个极其有难度的事情,基本不可能完成。后来学了Python的一些数值计算方法,才感觉用程序绘制有效前沿其实是能完成的。

本文选择了上证50成分股进行有效前沿绘制,并用shibor代替无风险利率绘制CML。

一.公共函数

1.引入所用到的库

2.定义根据股票代码获取股票价格的函数

用到的财经数据库还是tushare,根据股票列表逐个获取行情,并将行情拼接成一个df返回。

3.定义计算投资组合收益率、风险、夏普比率的函数

因为数据是日行情,所以算出收益率和风险后要进行年化。其中计算期望收益率标准差的部分,用到的是协方差矩阵与权重的矩阵运算,从这我感受到了矩阵之美,感兴趣的可以自己进行数学推导。

二.蒙特卡洛方法生成资产组合

1.定义生成投资组合的方法

该函数有四个返回值,分别是各投资组合的各股票的权重列表,是各投资组合的收益率列表,各投资组合的波动率列表,各投资组合的夏普比率列表,其中第一个是二维数组,后三个是一维数组。

2.定义用到的变量

无风险利率本来想用一年的shibor的均值,无奈tushare的api返回空值,只好自己查了下shibor近几天的均值,写定到程序。

由于我的破电脑的算力不高,开始时间设为20160101,结束时间设为20171231了。其实时间范围应该大一些,才能更好反映股票预期收益率情况。

上证成分股列表,纯手工制作。应该也可以调用api,懒得查了。

要模拟的投资组合个数为10000,这个数也是大一点好。

3.蒙特卡洛模拟生成投资组合

首先获取成分股的行情数据,然后根据行情数据模拟出指定数量的投资组合。

4.绘制投资组合的分布图投资组合分布图

三.约束最优化方法计算有效前沿、最高夏普比率点、最低风险点、CML

1.定义最小化目标函数

本例中用到的约束最优化方法是scipy中的optimize.minimize,这个方法需要定义目标函数,minimize会调整函数的输入参数,使函数达到最小值。

2.定义输入参数的约束条件和取值范围

约束最优化,就要有约束条件,以上就是定义了目标函数输入参数的约束条件和取值范围,约束是等式约束。需要说明的一点是,各权重的最低值我设为了0.001,这是因为根据理论,有效前沿上的投资组合应该包含所有单个投资。设个最低值是为接近理想情况,防止计算过程中有的股票未被包含。

3.计算最高夏普比率和最低风险的投资组合

将两个计算都转换为求输入参数有约束函数的极小值,其中参数是权重,函数值是夏普比率和标准差。用到了Sequential Least-Squares Quadratic Programming (SLSQP) 算法。

4.定义计算有效前沿的函数

计算有效前沿的函数,主要是循环遍历一个收益率区间,寻找指定收益率的最小波动率组合。其中每次寻找都是一个约束最优化问题。约束条件和上一步有所差别,加了一个收益率的等式约束。函数返回有效前沿上投资组合的收益率和波动率。

5.计算有效前沿

6.绘制投资组合、有效前沿、最高夏普组合、最低风险组合、资本市场线CML最终图形

是不是感觉图形不符合预期?我们预期图形应该是类似下图,有效前沿是投资组合区域的边缘。至于为什么上图有效前沿和投资组合区域是分离的,后边再写篇文章分析一下吧,感兴趣的可以先自己想想原因。预期图形

了解更多欢迎关注我的公众号和专栏。

微信公众号:曲曲菜

原创作品,未标明作者不得转载。

你可能感兴趣的:(用python计算有效前沿)