Python实现马科维茨有效边界

参考文章

  1. https://mp.weixin.qq.com/s/neCSaWK0c4jzWwCfDVFA6A
  2. https://mp.weixin.qq.com/s/2X_VCZwv8EX4S48wAeL0AQ

导入包

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import tushare as ts
import scipy.optimize as sco

获取股票数据

原文章中是用美股数据实现的,我试着用沪深的数据实现一下,通过tuhsare来获取选定股票的日收益率。我挑了5只股票:贵州茅台(600519)、格力电器(000651)、万科A(000002)、中国平安(601318)、中国石油(601857)

df = pd.DataFrame()
df = ts.get_hist_data('600519', start='2015-01-05', end='2018-12-28')
s600519 = df['p_change']
s600519.name = '600519'df = pd.DataFrame()
df = ts.get_hist_data('000651', start='2015-01-05', end='2018-12-28')
s000651 = df['p_change']
s000651.name = '000651'df = pd.DataFrame()
df = ts.get_hist_data('000002', start='2015-01-05', end='2018-12-28')
s000002 = df['p_change']
s000002.name = '000002'df = pd.DataFrame()
df = ts.get_hist_data('601318', start='2015-01-05', end='2018-12-28')
s601318 = df['p_change']
s601318.name = '601318'df = pd.DataFrame()
df = ts.get_hist_data('601857', start='2015-01-05', end='2018-12-28')
s601857 = df['p_change']
s601857.name = '601857'data = pd.DataFrame({'600519':s600519,'000651':s000651,'000002':s000002, '601318':s601318,'601857':s601857})
data = data.dropna()

计算年化收益率和协方差矩阵(以一年252个交易日计算)

returns_annual = data.mean() * 252
cov_annual = data.cov() * 252

模拟投资组合

为了得到有效边界,我们模拟了50000个投资组合

number_assets = 5
weights = np.random.random(number_assets)
weights /= np.sum(weights)portfolio_returns = []
portfolio_volatilities = []
sharpe_ratio = []
for single_portfolio in range (50000):weights = np.random.random(number_of_assets)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 / volatilitysharpe_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')

得到马科维茨有效边界如下

找出最优组合

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)
opts['x'].round(3)  #得到各股票权重
statistics(opts['x']).round(3)  #得到投资组合预期收益率、预期波动率以及夏普比率

输出结果为

In [5]: opts['x'].round(3)
Out[5]: array([0.561, 0.   , 0.06 , 0.38 , 0.   ])In [6]: statistics(opts['x']).round(3)
Out[6]: array([31.102, 26.485,  1.174])

可以得出最优投资组合(夏普比率最高)为买入56.1%的资金买入贵州茅台(600519)、6%的资金买入万科A(000002)、38%的资金买入中国平安(601318)
其期望收益率为31.10%,期望波动率为26.49%

完整代码

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import tushare as ts
import scipy.optimize as scodf = pd.DataFrame()
df = ts.get_hist_data('600519', start='2015-01-05', end='2018-12-28')
s600519 = df['p_change']
s600519.name = '600519'df = pd.DataFrame()
df = ts.get_hist_data('000651', start='2015-01-05', end='2018-12-28')
s000651 = df['p_change']
s000651.name = '000651'df = pd.DataFrame()
df = ts.get_hist_data('000002', start='2015-01-05', end='2018-12-28')
s000002 = df['p_change']
s000002.name = '000002'df = pd.DataFrame()
df = ts.get_hist_data('601318', start='2015-01-05', end='2018-12-28')
s601318 = df['p_change']
s601318.name = '601318'df = pd.DataFrame()
df = ts.get_hist_data('601857', start='2015-01-05', end='2018-12-28')
s601857 = df['p_change']
s601857.name = '601857'data = pd.DataFrame({'600519':s600519,'000651':s000651,'000002':s000002, '601318':s601318,'601857':s601857})
data = data.dropna()returns_annual = data.mean() * 252
cov_annual = data.cov() * 252number_assets = 5
weights = np.random.random(number_assets)
weights /= np.sum(weights)portfolio_returns = []
portfolio_volatilities = []
sharpe_ratio = []
for single_portfolio in range (50000):weights = np.random.random(number_of_assets)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 / volatilitysharpe_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')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)
opts['x'].round(3)  #得到各股票权重
statistics(opts['x']).round(3)  #得到投资组合预期收益率、预期波动率以及夏普比率

Python实现马科维茨有效边界相关推荐

  1. python 画出决策边界_决策边界可视化,让你的分类合理有序

    作者--Navoneel Chakrabarty 在数据科学领域,分类问题是一个非常普遍和重要的问题.例如:糖尿病视网膜病变.情绪分析.数字识别.癌症类型预测(恶性或良性)等.这些问题往往通过机器学习 ...

  2. Python 工匠:在边界处思考

    这是 "Python 工匠"系列的第 15 篇文章.[点击原文链接查看所有] 2016 年,Linux 操作系统的创造者 Linus Torvalds 参加了一场 TED 访谈节目 ...

  3. 利用python构建马科维茨_利用马科维茨投资组合模型建立Alpha策略

    理论基础 马科维茨的投资组合(均值-方差.有效边界)模型最早采用了风险资产的期望收益率(均值)和用方差(或标准差)代表的风险来研究资产组合和选择问题.理论上来说可以通过投资组合规避非系统性风险. 而A ...

  4. python实现马科维茨模型的资本市场线_资产配置理论的基础之马科维茨模型

    *本文来自金斧子.选股宝app大师精华,精选证券市场中投资大师心得,打造距离投资大师最近.最有价值的信息场. 1952年,马科维茨在他的学术论文<资产选择:有效的多样化>中,首次应用资产组 ...

  5. python 画出决策边界_python 画出使用分类器得到的决策边界

    python 画出使用分类器得到的决策边界 发布时间:2020-09-25 21:10:09 来源:脚本之家 阅读:113 作者:星之空殇 获取数据集,并画图代码如下: import numpy as ...

  6. Python对象的空间边界:独善其身与开放包容

    ♚ 豌豆花下猫,某985高校毕业生, 兼具极客思维与人文情怀 .公众号Python猫, 专注python技术.数据科学和深度学习,力图创造一个有趣又有用的学习分享平台. 睡觉是我最爱做的事--因为可以 ...

  7. python 乡镇轮廓 高德_基于高德地图api和Python的区县地理边界坐标提取

    在工作中,经常想用到类似于地热图的方式进行数据展示,奈何工作环境是内网,无法在线进行地图关联,没办法,只好自己想办法上网找边界坐标. 查了很多文档和费心以后,最终发现高德地图api的方法和方式最简单, ...

  8. python 画出决策边界_Python3入门机器学习 - 逻辑回归与决策边界

    logistic回归又称logistic回归分析,是一种广义的线性回归分析模型,以胃癌病情分析为例,选择两组人群,一组是胃癌组,一组是非胃癌组,两组人群必定具有不同的体征与生活方式等.因此因变量就为是 ...

  9. python怎样缩进语法边界-Python的基础语法

    一.数据 1.1 变量 数据用变量来存放,并用等号对变量赋值. 例:nameStr = "OREO" 其中 nameStr 是变量名称,"OREO" 是变量值. ...

最新文章

  1. 机器学习中,梯度下降算法的问题引入
  2. SSRS 2012 仪表 -- 关键绩效指标
  3. 开源Web应用中最常见漏洞是XSS和SQLI漏洞
  4. myeclipse 清理项目缓存的几大步骤
  5. 使用LINQ解除SQL注入安全问题
  6. 电商扣减库存_以电商为例 | B端产品经理,怎么做好库存系统设计
  7. SQL Server 事务日志
  8. iphone照片删掉又出现_iPhone手机相册无法加锁应该怎么办?
  9. P2863 [USACO06JAN]牛的舞会The Cow Prom
  10. 你(wo)不注意的和数据类型有关的小细节
  11. bootstrap批量删除操作!
  12. vue引入,两种组件库vant,vue-ydui变量冲突问题
  13. Aras Innovator: TOC category的视图
  14. win用户计算机批量添加用户,win10系统巧用cmd命令快速创建新账户的技巧
  15. 云服务器系统esxi,云服务器安装esxi
  16. Java课程设计-日历记事本
  17. 思考:Redis为什么这么快?
  18. ONES 敏捷项目管理迭代流程图文演示
  19. 【智能物流】河南烟草:新网络模式下的物流系统优化
  20. 从 Windows 切换到 Mac,这些不能错过的 Tips!

热门文章

  1. 用pip安装django
  2. 摘要算法(MD5、SHA、CRC)
  3. 云巡店php源码,云巡店™〡连锁版正式上线开放注册〡《系统使用手册 1.0》
  4. kirin710f是什么处理器_我告诉你kirin710f是什么处理器
  5. 关于Gitlab恼人的Git无权限访问问题解决
  6. 手机里android文件夹是什么文件夹,安卓手机里的.androidlmage test是什么文件夹?...
  7. python getch_python – 是否可以使用getch()来获取不同长度的输入?
  8. python实现多EXCEL表格合并xls、xlsx格式
  9. 【XSS漏洞-06】XSS漏洞利用案例(浏览器劫持、会话劫持、GetShell)—基于神器beEF
  10. 芸品绿-PythonWeb开发工程师