一、理论介绍

二、代码实现

1. 导入包并设置中文字体

import numpy as np
import pandas as pd
import pandas_datareader.data as web
from datetime import date
import numpy.random as npr
import matplotlib.pyplot as plt
from pylab import mpl
import scipy.optimize as sco
plt.rcParams['font.family'] = 'Arial Unicode MS'
plt.rcParams['axes.unicode_minus']=False

2. 获取招商银行、科大讯飞和格力电器收盘价数据,并导出

df1 = web.DataReader('600036.SS','yahoo',date(2020,1,1),date(2020,12,31))['Adj Close']#招商银行调整收盘价
df2 = web.DataReader('002230.SZ','yahoo',date(2020,1,1),date(2020,12,31))['Adj Close']#科大讯飞调整收盘价
df3 = web.DataReader('000651.SZ','yahoo',date(2020,1,1),date(2020,12,31))['Adj Close']#格力电器调整收盘价
data = pd.concat([df1,df2,df3],axis = 1)
data.columns = ['zhaoshang','xunfei','geli']
data.to_csv('gushi.csv',encoding = 'utf-8')

3. 导入数据并计算年化收益率与协方差矩阵

data = pd.read_csv('gushi.csv')
returns_annual = data.mean()*252#计算年化收益率
cov_annual = data.cov()*252#计算协方差矩阵

4. 模拟50000个投资组合并计算组合收益率、波动率和夏普比率

#模拟50000个投资组合
number_assets = 3
portfolio_returns = []#组合收益率
portfolio_volatilities = []#组合波动率
sharpe_ratio = []#夏普比率
for singel_portfolio in range(50000):weights = np.random.random(number_assets)#权重weights = weights/(np.sum(weights))#权重归一化returns = np.dot(weights,returns_annual)#投资组合收益率volatility = np.sqrt(np.dot(weights.T,np.dot(cov_annual,weights)))#投资组合波动率portfolio_returns.append(returns)portfolio_volatilities.append(volatility)sharpe = returns/volatility#计算夏普比率sharpe_ratio.append(sharpe)
portfolio_returns = np.array(portfolio_returns)
portfolio_volatilities = np.array(portfolio_volatilities)

绘制夏普比率图:

plt.style.use('seaborn-dark')
plt.figure(figsize=(9, 5))
plt.scatter(portfolio_volatilities, portfolio_returns, c=sharpe_ratio,cmap='RdYlGn', edgecolors='black',marker='o')
plt.grid(True)
plt.xlabel('expected volatility')
plt.ylabel('expected return')
plt.colorbar(label='Sharpe ratio')
plt.savefig('/Users/harper/Desktop/2.png',dpi=500,bbox_inches = 'tight')
plt.show()

5. 找出最优组合

def statistics(weights):weights = np.array(weights)pret = np.sum(data.mean() * weights) * 252pvol = np.sqrt(np.dot(weights.T, np.dot(data.cov() * 252, weights)))return np.array([pret, pvol, pret / pvol])def min_func_sharpe(weights):return -statistics(weights)[2]bnds = tuple((0, 1) for x in range(number_assets))
cons = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})
opts = sco.minimize(min_func_sharpe, number_assets * [1. / number_assets,], method='SLSQP',  bounds=bnds, constraints=cons)
print(opts['x'].round(3)) #得到各股票权重
print(statistics(opts['x']).round(3)) #得到投资组合预期收益率、预期波动率以及夏普比率

Python实现马科维茨投资组合有效前沿相关推荐

  1. 利用python构建马科维茨_使用CVXOPT包实现马科维茨投资组合优化

    在真实股票市场的回测 上面的例子特别有趣但不是很适用. 接下来,我们将演示如何在BigQuant中创建一个策略. 本实验的目的是验证在一个买入固定5只股票的多头组合,利用马科维茨组合优化确定的投资组合 ...

  2. Python实现马科维茨有效边界

    Python实现马科维茨有效边界 参考文章 https://mp.weixin.qq.com/s/neCSaWK0c4jzWwCfDVFA6A https://mp.weixin.qq.com/s/2 ...

  3. 马科维茨模型 matlab,马科维茨投资组合理论(均方模型)学习笔记——基于Matlab(四)...

    这是本阶段最后一次学习马科维茨投资组合理论的软件实现. 一.创建投资组合 %模拟N种资产的收益率mu=[10 20 30 50 60 90 120];sigma=[0.06 0.01 0.2 0.8 ...

  4. 马科维茨投资组合理论(均方模型)学习笔记——基于Matlab(四)

    这是本阶段最后一次学习马科维茨投资组合理论的软件实现. 一.创建投资组合 %模拟N种资产的收益率 mu=[10 20 30 50 60 90 120];sigma=[0.06 0.01 0.2 0.8 ...

  5. [量化学院]使用cvxopt包实现马科维茨投资组合优化:以一个股票策略为例

    实现平台:BigQuant-人工智能量化投资平台 可在文末前往原文一键克隆代码进行进一步研究 介绍 前文中,我们已介绍了许多量化投资思想,在这篇文章中,你将了解Markowitz投资组合优化的基本思想 ...

  6. 八、马科维茨投资组合

    @Author:Runsen 文章目录 马科维茨投资组合 标准差计算 实战 马科维茨投资组合 美国经济学家马科维茨(Markowitz)1952年首次提出投资组合理论(Portfolio Theory ...

  7. python n个list如何组成矩阵_如何用马科维茨投资组合优化法和现代资产组合理论生成交易策略?...

    全文共6852字,预计学习时长14分钟 图源:pixabay 本文旨在展示如何用马科维茨(Markowitz)的投资组合优化法和现代资产组合理论(MPT)来生成交易策略. 本文首先对均值-方差优化法进 ...

  8. 利用python构建马科维茨_Python_画马科维茨有效前沿

    0. Backgound 有效前沿是在给定投资范围,return-risk约束条件下同等风险情况下收益最大的的资产配置集合. 说白了,就是给一堆可投资券,求各种配比的组合下,相同return方差最小( ...

  9. 利用python构建马科维茨_R语言动量和马科维茨Markowitz投资组合(Portfolio)模型实现...

    动量和马科维茨投资组合模型使 均值方差优化 组合成为可行的解决方案.通过建议并测试: 增加最大权重限制 增加目标波动率约束 下面,我将查看8个资产的结果: 首先,让我们加载所有历史数据 #****** ...

最新文章

  1. Gym - 102082G
  2. 原创 子网划分的讲解 例题加思路
  3. Vmware16一打开虚拟机就蓝屏
  4. django添加字典格式的数据
  5. 计算机实验excel总结,EXCEL实验报告
  6. linux添加变色龙引导,变色龙Chameleon Install 2281引导工具 windows电脑安装黑苹果
  7. 风险预测模型_只学有用的:贷后评分模型的三种细分应用
  8. python开发网页视频播放器_python实现媒体播放器功能
  9. ARToolKit在visual studio2013(win10)的环境配置
  10. 大数据———Flume与Kafka整合
  11. php可以用中文的单引号吗,PHP中单双引号用法误区
  12. jQuery缩略图图片轮播插件
  13. 洛谷学习笔记P1008
  14. 高级数据结构之K-D-TREE
  15. PAT乙级|C语言|1025 反转链表 (25分)
  16. [论文阅读]:PP-YOLO: An Effective and Efficient Implementation of Object Detector
  17. 双链表初始化、头插、尾插、头删、尾删、任意位置插入和删除、判空、销毁、打印、查找操作
  18. matlab nargin不对称,在matlab中错误使用 nargin 错误: 文件:dfun.m 行:30 列:4 未结束的...
  19. android微信顶端导航栏,navigation-bar
  20. MQL5 向导: 根据计算价位下单, 止损和止盈。标准库扩展

热门文章

  1. Telsa K40m
  2. 用JavaScript技术实现弹幕效果
  3. pytho中的json序列化与反序列化操作
  4. vue-cli 项目打包后 代理接口报404错误 解决办法!
  5. 全球都热炸了,谷歌服务器已经崩掉了
  6. 美团外卖用户差评情况分析
  7. Docker Docker Habor一个比Register更加好用的仓库
  8. 扩展欧几里得算法 求解 丢番图方程
  9. linux解压时的tar -zxvf是什么意思?
  10. orCAD中的文本编辑框如何换行?