Python实现马科维茨投资组合有效前沿
一、理论介绍
二、代码实现
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实现马科维茨投资组合有效前沿相关推荐
- 利用python构建马科维茨_使用CVXOPT包实现马科维茨投资组合优化
在真实股票市场的回测 上面的例子特别有趣但不是很适用. 接下来,我们将演示如何在BigQuant中创建一个策略. 本实验的目的是验证在一个买入固定5只股票的多头组合,利用马科维茨组合优化确定的投资组合 ...
- Python实现马科维茨有效边界
Python实现马科维茨有效边界 参考文章 https://mp.weixin.qq.com/s/neCSaWK0c4jzWwCfDVFA6A https://mp.weixin.qq.com/s/2 ...
- 马科维茨模型 matlab,马科维茨投资组合理论(均方模型)学习笔记——基于Matlab(四)...
这是本阶段最后一次学习马科维茨投资组合理论的软件实现. 一.创建投资组合 %模拟N种资产的收益率mu=[10 20 30 50 60 90 120];sigma=[0.06 0.01 0.2 0.8 ...
- 马科维茨投资组合理论(均方模型)学习笔记——基于Matlab(四)
这是本阶段最后一次学习马科维茨投资组合理论的软件实现. 一.创建投资组合 %模拟N种资产的收益率 mu=[10 20 30 50 60 90 120];sigma=[0.06 0.01 0.2 0.8 ...
- [量化学院]使用cvxopt包实现马科维茨投资组合优化:以一个股票策略为例
实现平台:BigQuant-人工智能量化投资平台 可在文末前往原文一键克隆代码进行进一步研究 介绍 前文中,我们已介绍了许多量化投资思想,在这篇文章中,你将了解Markowitz投资组合优化的基本思想 ...
- 八、马科维茨投资组合
@Author:Runsen 文章目录 马科维茨投资组合 标准差计算 实战 马科维茨投资组合 美国经济学家马科维茨(Markowitz)1952年首次提出投资组合理论(Portfolio Theory ...
- python n个list如何组成矩阵_如何用马科维茨投资组合优化法和现代资产组合理论生成交易策略?...
全文共6852字,预计学习时长14分钟 图源:pixabay 本文旨在展示如何用马科维茨(Markowitz)的投资组合优化法和现代资产组合理论(MPT)来生成交易策略. 本文首先对均值-方差优化法进 ...
- 利用python构建马科维茨_Python_画马科维茨有效前沿
0. Backgound 有效前沿是在给定投资范围,return-risk约束条件下同等风险情况下收益最大的的资产配置集合. 说白了,就是给一堆可投资券,求各种配比的组合下,相同return方差最小( ...
- 利用python构建马科维茨_R语言动量和马科维茨Markowitz投资组合(Portfolio)模型实现...
动量和马科维茨投资组合模型使 均值方差优化 组合成为可行的解决方案.通过建议并测试: 增加最大权重限制 增加目标波动率约束 下面,我将查看8个资产的结果: 首先,让我们加载所有历史数据 #****** ...
最新文章
- Gym - 102082G
- 原创 子网划分的讲解 例题加思路
- Vmware16一打开虚拟机就蓝屏
- django添加字典格式的数据
- 计算机实验excel总结,EXCEL实验报告
- linux添加变色龙引导,变色龙Chameleon Install 2281引导工具 windows电脑安装黑苹果
- 风险预测模型_只学有用的:贷后评分模型的三种细分应用
- python开发网页视频播放器_python实现媒体播放器功能
- ARToolKit在visual studio2013(win10)的环境配置
- 大数据———Flume与Kafka整合
- php可以用中文的单引号吗,PHP中单双引号用法误区
- jQuery缩略图图片轮播插件
- 洛谷学习笔记P1008
- 高级数据结构之K-D-TREE
- PAT乙级|C语言|1025 反转链表 (25分)
- [论文阅读]:PP-YOLO: An Effective and Efficient Implementation of Object Detector
- 双链表初始化、头插、尾插、头删、尾删、任意位置插入和删除、判空、销毁、打印、查找操作
- matlab nargin不对称,在matlab中错误使用 nargin
错误: 文件:dfun.m 行:30 列:4
未结束的...
- android微信顶端导航栏,navigation-bar
- MQL5 向导: 根据计算价位下单, 止损和止盈。标准库扩展