@Channelchan
2018-01-06T09:51:27.000000Z
字数 2971
阅读 73587
马克维茨投资组合理论的基本假设为:
(1)投资者是风险规避的,追求期望效用最大化;
(2)投资者根据收益率的期望值与方差来选择投资组合;
(3)所有投资者处于同一单期投资期。马克维茨提出了以期望收益及其方差(E,δ2)确定有效投资组合。
安装Portfolioopt: pip install Portfolioopt
from datetime import datetimeimport pandas as pdimport numpy as npimport portfolioopt as optimport matplotlib.pyplot as pltsymbol=['600036.XSHG','600050.XSHG','601318.XSHG']data_dict = {}for s in symbol:data = pd.read_excel('sz50.xlsx',sheetname=s, index_col='datetime')data_dict[s] = dataPN = pd.Panel(data_dict)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
data_r = PN.minor_xs('close').pct_change()[1:]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]
#主要的两个输入模式exp_rets = data_r.mean()*252cov_mat = data_r.cov()*252print (exp_rets)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
#计算目标收益的权重portfolio_1 = opt.markowitz_portfolio(cov_mat, exp_rets, 0.2, allow_short=False, market_neutral=False)print (portfolio_1)
600036.XSHG 0.438192
600050.XSHG 0.179256
601318.XSHG 0.382552
dtype: float64
#计算最小方差的权重portfolio_mv = opt.min_var_portfolio(cov_mat, allow_short=False)print (portfolio_mv)
600036.XSHG 0.438192
600050.XSHG 0.179256
601318.XSHG 0.382552
dtype: float64
#计算最优组合的权重portfolio_tp = opt.tangency_portfolio(cov_mat, exp_rets, allow_short=False)print (portfolio_tp)
600036.XSHG 0.258217
600050.XSHG 0.009330
601318.XSHG 0.732453
dtype: float64
#去除少于0.01权重的股票weigth_t = opt.truncate_weights(portfolio_tp, min_weight=0.01, rescale=True)print (weigth_t)
600036.XSHG 0.260649
600050.XSHG 0.000000
601318.XSHG 0.739351
dtype: float64

Portfolio_v = np.dot(weigth_t.T, np.dot(cov_mat,weigth_t))P_sigma = np.sqrt(Portfolio_v)print (P_sigma)
0.226852365098
port_returns = []port_variance = []for p in range(4000):weights = np.random.rand(len(data_r.T))weights /= np.sum(weights)port_returns.append(np.sum(data_r.mean()*252*weights))port_variance.append(np.sqrt(np.dot(weights.T, np.dot(cov_mat,weights))))port_returns = np.array(port_returns)port_variance = np.array(port_variance)risk_free = 0.04P_r = np.sum(exp_rets*weigth_t)sharpe = (P_r-risk_free)/P_sigmaprint('sharpe:', sharpe)plt.figure(figsize = (15,7))plt.scatter(port_variance, port_returns, c=(port_returns-risk_free)/port_variance, marker='o')plt.grid(True)plt.xlabel('excepted volatility')plt.ylabel('expected return')plt.colorbar(label='Sharpe ratio')plt.scatter(P_sigma, P_r, c='r', marker='*')plt.show()
sharpe: 3.61630738966

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