@Channelchan
2018-01-06T17:51:27.000000Z
字数 2971
阅读 73391
马克维茨投资组合理论的基本假设为:
(1)投资者是风险规避的,追求期望效用最大化;
(2)投资者根据收益率的期望值与方差来选择投资组合;
(3)所有投资者处于同一单期投资期。马克维茨提出了以期望收益及其方差(E,δ2)确定有效投资组合。
安装Portfolioopt: pip install Portfolioopt
from datetime import datetime
import pandas as pd
import numpy as np
import portfolioopt as opt
import matplotlib.pyplot as plt
symbol=['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] = data
PN = 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()*252
cov_mat = data_r.cov()*252
print (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.04
P_r = np.sum(exp_rets*weigth_t)
sharpe = (P_r-risk_free)/P_sigma
print('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 将最优组合算出来,并将其可视化。