首页 > 编程知识 正文

马科维茨组合投资模型,马科维茨投资组合选择

时间:2023-05-04 11:37:37 阅读:266442 作者:2269

一、理论介绍

二、代码实现 1. 导入包并设置中文字体 import numpy as npimport pandas as pdimport pandas_datareader.data as webfrom datetime import dateimport numpy.random as nprimport matplotlib.pyplot as pltfrom pylab import mplimport scipy.optimize as scoplt.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 = 3portfolio_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) * 252 pvol = 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)) #得到投资组合预期收益率、预期波动率以及夏普比率

 

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。