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

技术层-python(63)
来源:/p/?refer=quantstory
多股票策略回测时常常遇到问题。
仓位如何分配?
你以为基金经理都是一拍脑袋就等分仓位了吗?
或者玩点玄乎的斐波拉契数列?
OMG,谁说的黄金比例,让我看到你的脑袋(不削才怪)!!
其实,这个问题,好多好多年前马科维茨(Markowitz)我喜爱的小马哥就给出答案——投资组合理论。
根据这个理论,我们可以对多资产的组合配置进行三方面的优化。
1.找到有效前沿。在既定的收益率下使组合的方差最小。
2.找到sharpe最优的组合(收益-风险均衡点)
3.找到风险最小的组合
跟着我,一步两步,轻松实现。
该理论基于用均值和方差来表述组合的优劣的前提。将选取几只股票,用蒙特卡洛模拟初步探究组合的有效前沿。
通过最大Sharpe和最小方差两种优化来找到最优的资产组合配置权重参数。
最后,刻画出可能的分布,两种最优以及组合的有效前沿。
文中的数据API来自量化平台聚宽,在此表示感谢。
原文见(包含正态检验部分)
0.导入需要的包
import pandas as pd
import numpy as np
import statsmodels.api as sm #统计运算
import scipy.stats as scs #科学计算
import matplotlib.pyplot as plt #绘图
1.选取几只感兴趣的股票
000413 东旭光电,000063 中兴通讯,002007 华兰生物,000001 平安银行,000002 万科A
并比较一下数据(至)
stock_set = ['000413.XSHE','000063.XSHE','002007.XSHE','000001.XSHE','000002.XSHE']
noa = len(stock_set)
df = get_price(stock_set, start_date = '', end_date ='', 'daily', ['close'])
data = df['close']
#规范化后时序数据
(data/data.ix[0]*100).plot(figsize = (8,5))
2.计算不同证券的均值、协方差
每年252个交易日,用每日收益得到年化收益。计算投资资产的协方差是构建资产组合过程的核心部分。运用pandas内置方法生产协方差矩阵。
returns = np.log(data / data.shift(1))
returns.mean()*252
000413.XSHE 0.184516
000063.XSHE 0.176790
002007.XSHE 0.309077
000001.XSHE -0.102059
000002.XSHE 0.547441
returns.cov()*252
3.给不同资产随机分配初始权重
由于A股不允许建立空头头寸,所有的权重系数均在0-1之间
weights = np.random.random(noa)
weights /= np.sum(weights)
array([ 0.....])
4.计算预期组合年化收益、组合方差和组合标准差
np.sum(returns.mean()*weights)*252
np.dot(weights.T, np.dot(returns.cov()*252,weights))
np.sqrt(np.dot(weights.T, np.dot(returns.cov()* 252,weights)))
5.用蒙特卡洛模拟产生大量随机组合
进行到此,我们最想知道的是给定的一个股票池(证券组合)如何找到风险和收益平衡的位置。
下面通过一次蒙特卡洛模拟,产生大量随机的权重向量,并记录随机组合的预期收益和方差。
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.04
plt.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')
6.投资组合优化1——sharpe最大
建立statistics函数来记录重要的投资组合统计数据(收益,方差和夏普比)
通过对约束最优问题的求解,得到最优解。其中约束是权重总和为1。
def statistics(weights):
weights = np.array(weights)
port_returns = np.sum(returns.mean()*weights)*252
port_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)
success: True
fun: -1.1221
x: array([ -3., 2., 1., -2., 8.])
message: 'Optimization terminated successfully.'
jac: array([ 1., 5., 8., 1.e+00, -1., 0.e+00])
得到的最优组合权重向量为:
opts['x'].round(3)
array([-0. , 0. , 0.164, -0. , 0.836])
sharpe最大的组合3个统计数据分别为:
#预期收益率、预期波动率、最优夏普指数
statistics(opts['x']).round(3)
array([ 0.508, 0.437, 1.162])
7.投资组合优化2——方差最小
接下来,我们通过方差最小来选出最优投资组合。
#但是我们定义一个函数对 方差进行最小化
def min_variance(weights):
return statistics(weights)[1]
optv = sco.minimize(min_variance, noa*[1./noa,],method = 'SLSQP', bounds = bnds, constraints = cons)
success: True
fun: 0.47221
x: array([ 1., 3., 2., 3., 3.])
message: 'Optimization terminated successfully.'
jac: array([ 0.3851725 , 0..3861807 , 0.3849672 , 0.. ])
方差最小的最优组合权重向量及组合的统计数据分别为:
optv['x'].round(3)
array([ 0.115, 0. , 0.21 , 0.353, 0.322])
#得到的预期收益率、波动率和夏普指数
statistics(optv['x']).round(3)
array([ 0.226, 0.385, 0.587])
8.组合的有效前沿
有效前沿有既定的目标收益率下方差最小的投资组合构成。
在最优化时采用两个约束,1.给定目标收益率,2.投资组合权重和为1。
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最大的投资组合
黄星:方差最小的投资组合
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')
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:63672次
积分:1066
积分:1066
排名:千里之外
转载:207篇
评论:10条
(29)(17)(12)(15)(3)(25)(24)(26)(3)(13)(30)(24)您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
几类投资组合优化模型及算法.pdf105页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
文档加载中...广告还剩秒
需要金币:200 &&
你可能关注的文档:
··········
··········
作者简介 王贞,生于 1983 年,陕西咸阳人.2005 年毕业于湖 南大学获理学学士学位.2008 年毕业湖南大学获硕士学 位.2012 年 6 月获西安电子科技大获理学博士学位.导师: 刘三阳. 主要研究方向:金融数学、投资组合优化、智能优化 等. Zhen
China, in 1983. She received her B.A. in Applied Mathematics from Hunan University,
Econometrics
University,
Changsha, China, in 2008, and the PH.D. degree in Applied Mathematics from Xidian
University, Xi’an, China, in June 2012.
Advisor: Prof. Sanyang Liu . Her
Mathematical
Optimization,
Intelligent Optimization, and so on. 西安电子科技大学 学位论文独创性(或创新性)声明 秉承学校严谨的学风和优良的科学道德,本人声明所呈交的论文是我个人在
导师指导下进行的研究工作及取得的研究成果.尽我所知,除了文中特别加以标
注和致谢中所罗列的内容以外,论文中不包含其他人已经发表或撰写过的研究成
果;也不包含为获得西安电子科技大学或其它教育机构的学位或证书而使用过的
材料.与我一同工作的同志对本研究所做的任何贡献均已在论文中做了明确的说
明并表示了谢意. 申请学位论文与资料若有不实之处,本人承担一切的法律责任.
本人签名: 日 期: 西安电子科技大学 关于论文使用授权的说明 本人完全了解西安电子科技大学有关保留和使用学位论文的规定,即:研究
生在校攻读学位期间论文工作的知识产权单位属西安电子科技大学.学校有权保
留送交论文的复印件,允许查阅和借阅论文;学校可以公布论文的全部或部分内
正在加载中,请稍后...}

我要回帖

更多关于 python markowitz 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信