marko

阅读 / 问答 / 标签

NadaMarkovic-Bebler是谁

NadaMarkovic-Bebler外文名:NadaMarkovic-Bebler职业:编剧代表作品:Disiduboko合作人物:DraganMarinkovic

MarkoJovanovic出生于哪里

MarkoJovanovicMarkoJovanovic,演员,主要电影作品有《爱的猎犬》。外文名:MarkoJovanovic职业:演员代表作品:《爱的猎犬》外文名MarkoJovanovic参演电影爱的猎犬-2017-06-01,饰演SergeantHenderson

MarkoDyrlich是谁

MarkoDyrlichMarkoDyrlich是一名演员,代表作品有《布达佩斯大饭店》等。外文名:MarkoDyrlich职业:演员代表作品:《布达佩斯大饭店》合作人物:韦斯·安德森

MarkoMandic人物介绍

MarkoMandicMarkoMandic是一名演员,代表作品有《总有意外》。外文名:MarkoMandic出生日期:1974年6月8日职业:演员代表作品:总有意外

MarkO’polo的衣服号码偏大偏小

MarkO"polo衣服属于正常码数:不偏大也不偏小,可根据自身身高及体重选择码数,可选择的码数有44、46、48、50、52、54。

MarkoCindric人物简介

MarkoCindric外文名:MarkoCindric职业:演员代表作品:《冰与火之歌:权力的游戏》合作人物:艾伦·泰勒电视剧作品

如何用python实现Markowitz投资组合优化

多股票策略回测时常常遇到问题。仓位如何分配?你以为基金经理都是一拍脑袋就等分仓位了吗?或者玩点玄乎的斐波拉契数列?OMG,谁说的黄金比例,让我看到你的脑袋(不削才怪)!!其实,这个问题,好多好多年前马科维茨(Markowitz)我喜爱的小马哥就给出答案——投资组合理论。根据这个理论,我们可以对多资产的组合配置进行三方面的优化。1.找到有效前沿。在既定的收益率下使组合的方差最小。2.找到sharpe最优的组合(收益-风险均衡点)3.找到风险最小的组合跟着我,一步两步,轻松实现。该理论基于用均值和方差来表述组合的优劣的前提。将选取几只股票,用蒙特卡洛模拟初步探究组合的有效前沿。通过最大Sharpe和最小方差两种优化来找到最优的资产组合配置权重参数。最后,刻画出可能的分布,两种最优以及组合的有效前沿。注:文中的数据API来自量化平台聚宽,在此表示感谢。原文见【组合管理】——投资组合理论(有效前沿)(包含正态检验部分)0.导入需要的包import pandas as pdimport numpy as npimport statsmodels.api as sm #统计运算import scipy.stats as scs #科学计算import matplotlib.pyplot as plt #绘图1.选取几只感兴趣的股票000413 东旭光电,000063 中兴通讯,002007 华兰生物,000001 平安银行,000002 万科A并比较一下数据(2015-01-01至2015-12-31)In[1]:stock_set = ["000413.XSHE","000063.XSHE","002007.XSHE","000001.XSHE","000002.XSHE"]noa = len(stock_set)df = get_price(stock_set, start_date = "2015-01-01", end_date ="2015-12-31", "daily", ["close"])data = df["close"]#规范化后时序数据(data/data.ix[0]*100).plot(figsize = (8,5))Out[1]:2.计算不同证券的均值、协方差每年252个交易日,用每日收益得到年化收益。计算投资资产的协方差是构建资产组合过程的核心部分。运用pandas内置方法生产协方差矩阵。In [2]:returns = np.log(data / data.shift(1))returns.mean()*252Out[2]:000413.XSHE 0.184516000063.XSHE 0.176790002007.XSHE 0.309077000001.XSHE -0.102059000002.XSHE 0.547441In [3]:returns.cov()*252Out[3]:3.给不同资产随机分配初始权重由于A股不允许建立空头头寸,所有的权重系数均在0-1之间In [4]:weights = np.random.random(noa)weights /= np.sum(weights)weightsOut[4]:array([ 0.37505798, 0.21652754, 0.31590981, 0.06087709, 0.03162758])4.计算预期组合年化收益、组合方差和组合标准差In [5]:np.sum(returns.mean()*weights)*252Out[5]:0.21622558669017816In [6]:np.dot(weights.T, np.dot(returns.cov()*252,weights))Out[6]:0.23595133640121463In [7]:np.sqrt(np.dot(weights.T, np.dot(returns.cov()* 252,weights)))Out[7]:0.48574822326099625.用蒙特卡洛模拟产生大量随机组合进行到此,我们最想知道的是给定的一个股票池(证券组合)如何找到风险和收益平衡的位置。下面通过一次蒙特卡洛模拟,产生大量随机的权重向量,并记录随机组合的预期收益和方差。In [8]:port_returns = []port_variance = []for p in range(4000):weights = np.random.random(noa)weights /=np.sum(weights)port_returns.append(np.sum(returns.mean()*252*weights))port_variance.append(np.sqrt(np.dot(weights.T, np.dot(returns.cov()*252, weights))))port_returns = np.array(port_returns)port_variance = np.array(port_variance)#无风险利率设定为4%risk_free = 0.04plt.figure(figsize = (8,4))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")Out[8]:6.投资组合优化1——sharpe最大建立statistics函数来记录重要的投资组合统计数据(收益,方差和夏普比)通过对约束最优问题的求解,得到最优解。其中约束是权重总和为1。In [9]:def statistics(weights):weights = np.array(weights)port_returns = np.sum(returns.mean()*weights)*252port_variance = np.sqrt(np.dot(weights.T, np.dot(returns.cov()*252,weights)))return np.array([port_returns, port_variance, port_returns/port_variance])#最优化投资组合的推导是一个约束最优化问题import scipy.optimize as sco#最小化夏普指数的负值def min_sharpe(weights):return -statistics(weights)[2]#约束是所有参数(权重)的总和为1。这可以用minimize函数的约定表达如下cons = ({"type":"eq", "fun":lambda x: np.sum(x)-1})#我们还将参数值(权重)限制在0和1之间。这些值以多个元组组成的一个元组形式提供给最小化函数bnds = tuple((0,1) for x in range(noa))#优化函数调用中忽略的唯一输入是起始参数列表(对权重的初始猜测)。我们简单的使用平均分布。opts = sco.minimize(min_sharpe, noa*[1./noa,], method = "SLSQP", bounds = bnds, constraints = cons)optsOut[9]:status: 0success: Truenjev: 4nfev: 28fun: -1.1623048291871221x: array([ -3.60840218e-16, 2.24626781e-16, 1.63619563e-01, -2.27085639e-16, 8.36380437e-01])message: "Optimization terminated successfully."jac: array([ 1.81575805e-01, 5.40387481e-01, 8.18073750e-05, 1.03137662e+00, -1.60038471e-05, 0.00000000e+00])nit: 4得到的最优组合权重向量为:In [10]:opts["x"].round(3)Out[10]:array([-0. , 0. , 0.164, -0. , 0.836])sharpe最大的组合3个统计数据分别为:In [11]:#预期收益率、预期波动率、最优夏普指数statistics(opts["x"]).round(3)Out[11]:array([ 0.508, 0.437, 1.162])7.投资组合优化2——方差最小接下来,我们通过方差最小来选出最优投资组合。In [12]:#但是我们定义一个函数对 方差进行最小化def min_variance(weights):return statistics(weights)[1]optv = sco.minimize(min_variance, noa*[1./noa,],method = "SLSQP", bounds = bnds, constraints = cons)optvOut[12]:status: 0success: Truenjev: 7nfev: 50fun: 0.38542969450547221x: array([ 1.14787640e-01, 3.28089742e-17, 2.09584008e-01, 3.53487044e-01, 3.22141307e-01])message: "Optimization terminated successfully."jac: array([ 0.3851725 , 0.43591119, 0.3861807 , 0.3849672 , 0.38553924, 0. ])nit: 7方差最小的最优组合权重向量及组合的统计数据分别为:In [13]:optv["x"].round(3)Out[13]:array([ 0.115, 0. , 0.21 , 0.353, 0.322])In [14]:#得到的预期收益率、波动率和夏普指数statistics(optv["x"]).round(3)Out[14]:array([ 0.226, 0.385, 0.587])8.组合的有效前沿有效前沿有既定的目标收益率下方差最小的投资组合构成。在最优化时采用两个约束,1.给定目标收益率,2.投资组合权重和为1。In [15]:def min_variance(weights):return statistics(weights)[1]#在不同目标收益率水平(target_returns)循环时,最小化的一个约束条件会变化。target_returns = np.linspace(0.0,0.5,50)target_variance = []for tar in target_returns:cons = ({"type":"eq","fun":lambda x:statistics(x)[0]-tar},{"type":"eq","fun":lambda x:np.sum(x)-1})res = sco.minimize(min_variance, noa*[1./noa,],method = "SLSQP", bounds = bnds, constraints = cons)target_variance.append(res["fun"])target_variance = np.array(target_variance)下面是最优化结果的展示。叉号:构成的曲线是有效前沿(目标收益率下最优的投资组合)红星:sharpe最大的投资组合黄星:方差最小的投资组合In [16]:plt.figure(figsize = (8,4))#圆圈:蒙特卡洛随机产生的组合分布plt.scatter(port_variance, port_returns, c = port_returns/port_variance,marker = "o")#叉号:有效前沿plt.scatter(target_variance,target_returns, c = target_returns/target_variance, marker = "x")#红星:标记最高sharpe组合plt.plot(statistics(opts["x"])[1], statistics(opts["x"])[0], "r*", markersize = 15.0)#黄星:标记最小方差组合plt.plot(statistics(optv["x"])[1], statistics(optv["x"])[0], "y*", markersize = 15.0)plt.grid(True)plt.xlabel("expected volatility")plt.ylabel("expected return")plt.colorbar(label = "Sharpe ratio")Out[16]:

如何用python实现Markowitz投资组合优化

m投资组合模型的一个很有力的替代是Index model,或者我们说的single factor model,因为markowitz是需要计算全部股票的协方差和方差的,如果证券的数量很多,计算量会非常大(这些在investment的参考书里面有),我下面就把原话打给你 first,the model requires a huge number of estimates to fill the covariance matrix.second ,the model does not provide any guideline to the forecasting to the security risk premiums that are essential to construct the efficient frontier of risky assets.第一个是硬伤,单单计算NYSE的股票就要4.5百万的估计量,而同等条件下index model才需要9002个估计量,这就是为什么markowitz模型很多人不愿意用的愿意,而优点也很直接,如果你的估算值是准确的,那么m模型的结果比其他都准确