[关闭]
@Channelchan 2018-01-06T17:51:27.000000Z 字数 2971 阅读 73391

Markowitz方差组合模型

目录

  1. 什么是Markowitz方差组合模型?
  2. Portfolioopt的输入格式是什么?
  3. 如何计算组合风险?
  4. 如何将Markowitz可视化?

什么是Markowitz方差组合模型?

马克维茨投资组合理论的基本假设为:

(1)投资者是风险规避的,追求期望效用最大化;

(2)投资者根据收益率的期望值与方差来选择投资组合;

(3)所有投资者处于同一单期投资期。马克维茨提出了以期望收益及其方差(E,δ2)确定有效投资组合。

Portfolioopt的输入格式是什么?

安装Portfolioopt: pip install Portfolioopt

  1. from datetime import datetime
  2. import pandas as pd
  3. import numpy as np
  4. import portfolioopt as opt
  5. import matplotlib.pyplot as plt
  6. symbol=['600036.XSHG','600050.XSHG','601318.XSHG']
  7. data_dict = {}
  8. for s in symbol:
  9. data = pd.read_excel('sz50.xlsx',sheetname=s, index_col='datetime')
  10. data_dict[s] = data
  11. PN = pd.Panel(data_dict)
  12. print(PN)
<class 'pandas.core.panel.Panel'>
Dimensions: 3 (items) x 215 (major_axis) x 5 (minor_axis)
Items axis: 600036.XSHG to 601318.XSHG
Major_axis axis: 2017-01-03 15:00:00 to 2017-11-20 15:00:00
Minor_axis axis: close to volume
  1. data_r = PN.minor_xs('close').pct_change()[1:]
  2. print (data_r.tail())
                     600036.XSHG  600050.XSHG  601318.XSHG
datetime                                                  
2017-11-14 15:00:00     0.012680    -0.047189     0.003819
2017-11-15 15:00:00    -0.005008     0.020021    -0.017309
2017-11-16 15:00:00     0.007910    -0.007231     0.055036
2017-11-17 15:00:00     0.045572     0.002081     0.030944
2017-11-20 15:00:00     0.039065     0.017653     0.005873

[214 rows x 3 columns]
  1. #主要的两个输入模式
  2. exp_rets = data_r.mean()*252
  3. cov_mat = data_r.cov()*252
  4. print (exp_rets)
  5. print (cov_mat)
600036.XSHG    0.695874
600050.XSHG    0.270893
601318.XSHG    0.918358
dtype: float64
             600036.XSHG  600050.XSHG  601318.XSHG
600036.XSHG     0.063026     0.006673     0.034142
600050.XSHG     0.006673     0.180320     0.017325
601318.XSHG     0.034142     0.017325     0.062236
  1. #计算目标收益的权重
  2. portfolio_1 = opt.markowitz_portfolio(cov_mat, exp_rets, 0.2, allow_short=False, market_neutral=False)
  3. print (portfolio_1)
600036.XSHG    0.438192
600050.XSHG    0.179256
601318.XSHG    0.382552
dtype: float64
  1. #计算最小方差的权重
  2. portfolio_mv = opt.min_var_portfolio(cov_mat, allow_short=False)
  3. print (portfolio_mv)
600036.XSHG    0.438192
600050.XSHG    0.179256
601318.XSHG    0.382552
dtype: float64
  1. #计算最优组合的权重
  2. portfolio_tp = opt.tangency_portfolio(cov_mat, exp_rets, allow_short=False)
  3. print (portfolio_tp)
600036.XSHG    0.258217
600050.XSHG    0.009330
601318.XSHG    0.732453
dtype: float64
  1. #去除少于0.01权重的股票
  2. weigth_t = opt.truncate_weights(portfolio_tp, min_weight=0.01, rescale=True)
  3. print (weigth_t)
600036.XSHG    0.260649
600050.XSHG    0.000000
601318.XSHG    0.739351
dtype: float64

如何计算组合风险?

MK1.png-4.7kB

  1. Portfolio_v = np.dot(weigth_t.T, np.dot(cov_mat,weigth_t))
  2. P_sigma = np.sqrt(Portfolio_v)
  3. print (P_sigma)
0.226852365098

如何将Markowitz可视化?

  1. port_returns = []
  2. port_variance = []
  3. for p in range(4000):
  4. weights = np.random.rand(len(data_r.T))
  5. weights /= np.sum(weights)
  6. port_returns.append(np.sum(data_r.mean()*252*weights))
  7. port_variance.append(np.sqrt(np.dot(weights.T, np.dot(cov_mat,weights))))
  8. port_returns = np.array(port_returns)
  9. port_variance = np.array(port_variance)
  10. risk_free = 0.04
  11. P_r = np.sum(exp_rets*weigth_t)
  12. sharpe = (P_r-risk_free)/P_sigma
  13. print('sharpe:', sharpe)
  14. plt.figure(figsize = (15,7))
  15. plt.scatter(port_variance, port_returns, c=(port_returns-risk_free)/port_variance, marker='o')
  16. plt.grid(True)
  17. plt.xlabel('excepted volatility')
  18. plt.ylabel('expected return')
  19. plt.colorbar(label='Sharpe ratio')
  20. plt.scatter(P_sigma, P_r, c='r', marker='*')
  21. plt.show()
sharpe: 3.61630738966

output_14_1.png-62.8kB

作业

选择三只或以上的股票,用Portfolioopt 将最优组合算出来,并将其可视化。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注