最优投资组合--马科维茨投资组合理论
<代码已经过期,其中爬虫链接已经失效>
一:马科维茨投资组合理论
投资组合(Portfolio)是由投资人或金融机构所持有的股票、债券、衍生金融产品等组成的集合。投资组合的目的在于分散风险,投资组合按粗略的分类有三种不同的模式可供运用,即积极的、中庸的和保守的。
投资组合理论[1]:若干种证券组成的投资组合,其收益是这些证券收益的加权平均数,但是其风险不是这些证券风险的加权平均风险,投资组合能降低非系统性风险。人们进行投资,本质上是在不确定性的收益和风险中进行选择。投资组合理论用均值-方差来刻画这两个关键因素。其中均值是指投资组合的期望收益率,它是单只证券的期望收益率的加权平均,权重为相应的投资比例。方差是指投资组合的收益率的方差。我们把收益率的标准差称为波动率,它刻画了投资组合的风险。
那么在证券投资决策中应该怎样选择收益和风险的组合呢?投资组合理论主要通过研究"理性投资者"优化投资组合。所谓理性投资者:是指在给定期望风险水平下对期望收益进行最大化,或者在给定期望收益水平下对期望风险进行最小化。
二:求解最优投资组合过程
本文最优投资组合思想是:在给定期望收益水平下对期望风险进行最小化的投资。利用的是马克维茨的均值-方差模型:
本文实现最优投资组合的主要步骤:
1:得到夏普比率最大时的期望收益
2:得到标准差最小时的期望收益
3:根据1,2所得的期望收益,获取预估期望收益范围,在预估期望收益范围内取不同值,获取其最小方差,得到预估期望收益与最小方差的关系即获得最小方差边界。
4:最小方差边界位于最小方差资产组合上方为有效边界
5;获取最小方差边界上最大夏普比率,绘出CML
6:得到最小方差边界上最大夏普比率处各股票权重
三:实证数据用例:
1:获取10股股票历史收盘价记录(2014.07.01—2017.07.01)(附件:stocks.xlsx)
stocks=['601166', #兴业银行
'600004', #白云机场
'300099', #精准信息
'601328', #交通银行
'601318', #中国平安
'601398', #中设股份
'000333', #美的集团
'600036', #招商银行
'600016', #民生银行
'601818'] #光大银行
1.1:股票历史收盘价趋势折线图如下:
2:计算预期收益率:连续复利收益率即对数收益率(附件:stock_revs.xlsx)
revs=np.log(data/data.shift(1))
3: 用蒙特卡洛模拟产生大量随机组合,得到随机权重投资组合散点图如下:
4:最优投资组合步骤:
4.1:得到夏普比率最大时的期望收益
def max_sharpe(weights):
return -getPortfolioInformation(weights)[2]
opts=sco.minimize(max_sharpe,numb * [1. / numb,], method='SLSQP',bounds=bnds, constraints=cons)
getPortfolioInformation(opts['x']).round(4) #opts['x'] : 得到夏普比率最大时的权重,收益率,标准差,夏普比率
#此时权重:[ 3.21290938e-01 5.00704152e-02 8.67642540e-02 0.00000000e+00 5.41874393e-01 0.00000000e+00 0.00000000e+00 0.00000000e+00
0.00000000e+00 5.15579333e-16]
# [收益率= 0.478 标准差=0.251 夏普比率=1.904]
4.2: minimize:优化,最小化风险:方差最小化
def min_variance(weights):
return getPortfolioInformation(weights)[1] ** 2
optv=sco.minimize(min_variance, numb * [1. / numb,],method='SLSQP', bounds=bnds,constraints=cons)
#此时权重:[ 1.18917047e-01 1.00755105e-01 1.04406546e-01 4.08438380e-02 4.53999968e-02 0.00000000e+00 0.00000000e+00 9.16150836e-18 5.89677468e-01 1.52059355e-17]
# [收益率= 0.309 标准差= 0.22 夏普比率=1.405]
4.3:获取有效边界
4.3.1:获取最小方差边界曲线图,最小方差资产组合,随机组合散点图:
指定收益率范围 [0.1545, 0.5736 ],求最小方差:
def min_sd(weights):
return getPortfolioInformation(weights)[1]
tvols = []
infor_min_sd=[]
#获取在指定期望收益下的最小标准差:
for tret in trets:
cons = ({'type': 'eq', 'fun': lambda x: getPortfolioInformation(x)[0] - tret},
{'type': 'eq', 'fun': lambda x: np.sum(x)-1})
res = sco.minimize(min_sd, numb * [1. / numb,], method='SLSQP',bounds=bnds, constraints=cons)
infor_min_sd.append(res) # tret 唯一的
tvols.append(res['fun']) #获取函数返回值,即最小标准差
tvols = np.array(tvols)
ind_min_sd = np.argmin(tvols) #最小方差组合处进行划分,分两段
evols = tvols[:ind_min_sd]
erets = trets[:ind_min_sd]
tck = sci.splrep(erets,evols ) #B-Spline样条曲线函数 #前一个必须是唯一
y2 = np.linspace(np.min(erets), np.max(erets), 100)
x2 = sci.splev(y2, tck)
evols = tvols[ind_min_sd:]
erets = trets[ind_min_sd:]
tck = sci.splrep(evols, erets)
x3 = np.linspace(np.min(evols), np.max(evols), 100)
y3 = sci.splev(x3, tck)
plt.figure(figsize=(10, 8))
plt.scatter(pvols, prets, c=prets/pvols,s=5, marker='.')
plt.plot(x2, y2,'g',label=u"最小方差边界")
plt.plot(x3, y3,'g',label=u"最小方差边界")
plt.axhline(y=rev_min_variance,color='b',label=u"最小方差资产组合") #最小方差资产组合
plt.plot(getPortfolioInformation(opts['x'])[1], getPortfolioInformation(opts['x'])[0],'r*', markersize=5.0)#最大夏普比率
plt.plot(getPortfolioInformation(optv['x'])[1], getPortfolioInformation(optv['x'])[0],'y*', markersize=5.0)#最小方差
plt.grid(True)
plt.xlabel('Expect Volatility')
plt.ylabel('Expect Return')
plt.show()
结果显示如下
4.3.2:获取有效边界曲线图:
plt.figure(figsize=(10, 8))
plt.scatter(pvols, prets, c=prets/pvols,s=5, marker='.')
plt.plot(x3, y3,'g',label=u"有效边界")
plt.plot(getPortfolioInformation(opts['x'])[1], getPortfolioInformation(opts['x'])[0],'r*', markersize=8.0)#最大夏普比率
plt.plot(getPortfolioInformation(optv['x'])[1], getPortfolioInformation(optv['x'])[0],'y*', markersize=8.0)#最小方差
plt.grid(True)
plt.xlabel('Expect Volatility')
plt.ylabel('Expect Return')
plt.show()
5: 获取最小方差边界上最大夏普比率,绘出CML
5.1: B-Spline样条曲线的参数
tck = sci.splrep(evols, erets)
5.2: B-Spline样条曲线函数
def f(x):
return sci.splev(x, tck, der=0)
5.3: B-Spline样条曲线函数一阶导数
def df(x):
return sci.splev(x, tck, der=1)
5.4: 构造非线性函数,使函数fun(x)无限逼近0向量, risk_free_return:无风险收益,默认为0.00
def fun(x, risk_free_return=0.00):
e1 = risk_free_return - x[0]
e2 = risk_free_return + x[1] * x[2] - f(x[2])
e3 = x[1] - df(x[2])
return e1, e2, e3
5.5 利用最小二乘法 无限逼近0, 无风险收益率:0,斜率:0.5,初始自变量:zone
X = sco.fsolve(fun, [0.00, 0.50, zone])
plt.figure(figsize=(12, 6))
#圆点为随机资产组合
plt.scatter(pvols, prets,c=prets/ pvols,s=5, marker='.')#随机组合散点集
plt.plot(x3, y3,'g',label=u"有效边界")
plt.plot(getPortfolioInformation(opts['x'])[1], getPortfolioInformation(opts['x'])[0],'g*', markersize=5.0)#最大夏普比率
plt.plot(getPortfolioInformation(optv['x'])[1], getPortfolioInformation(optv['x'])[0],'y*', markersize=5.0)#最小方差
#设定资本市场线CML的x范围从0到1.5最大夏普利率时标准差值
x = np.linspace(0.0, 1.5*zone)
#带入公式a+b*x求得y,作图
plt.plot(x, X[0] + X[1] * x, lw=1.5)
#标出资本市场线与有效边界的切点,绿星处
plt.plot(X[2], f(X[2]), 'r*', markersize=5.0)
plt.grid(True)
plt.axhline(0, color='k', ls='--', lw=2.0)
plt.axvline(0, color='k', ls='--', lw=2.0)
plt.xlabel('expected volatility')
plt.ylabel('expected return')
plt.colorbar(label='Sharpe ratio')
plt.show()
#最大夏普比率点: (0.251241778282 ,0.478266895458)
#切点: (0.251147161667, 0.4781282509275755)
结果图如下:
6: 得到最小方差边界上最大夏普比率处各股票权重:
根据收益率差绝对值最小选取权重进行投资:
rev_result=f(X[2])
flag=0
temp=abs(trets[0]-rev_result)
length=len(trets)
for i in range(1,length):
if abs(trets[i]-rev_result)<temp:
temp=trets[i]-rev_result
flag=i
weight_result=infor_min_sd[flag]['x']
all=0 #最终为 1.0
for i in range(10):
all=all+weight_result[i]
print('{:.5f}'.format(weight_result[i]))
# weight_result=[ 0.00000 0.04802 #白云机场
0.00000 0.85880 #交通银行 0.00000 0.00000 0.00000 0.00000 0.09318 #民生银行 0.00000 ]
故最终投资股票是:
0.04802 #白云机场
0.85880 #交通银行
0.09318 #民生银行
转载于:https://www.cnblogs.com/laoketeng/p/11268677.html
最优投资组合--马科维茨投资组合理论相关推荐
- 马科维茨模型 matlab,马科维茨投资组合理论(均方模型)学习笔记——基于Matlab(四)...
这是本阶段最后一次学习马科维茨投资组合理论的软件实现. 一.创建投资组合 %模拟N种资产的收益率mu=[10 20 30 50 60 90 120];sigma=[0.06 0.01 0.2 0.8 ...
- 马科维茨投资组合理论(均方模型)学习笔记——基于Matlab(四)
这是本阶段最后一次学习马科维茨投资组合理论的软件实现. 一.创建投资组合 %模拟N种资产的收益率 mu=[10 20 30 50 60 90 120];sigma=[0.06 0.01 0.2 0.8 ...
- 马科维茨投资组合理论(均方模型)学习笔记——基于Matlab(二)
马科维兹投资理论,即均方模型,是一种投资组合选择理论,其基本内容是:在不存在无风险借贷的假设下,基于资产组合个别股票收益率的均值和方差找出投资组合的有效前沿边界,投资者在有效前沿上配置资产组合时为一定 ...
- 八、马科维茨投资组合
@Author:Runsen 文章目录 马科维茨投资组合 标准差计算 实战 马科维茨投资组合 美国经济学家马科维茨(Markowitz)1952年首次提出投资组合理论(Portfolio Theory ...
- python n个list如何组成矩阵_如何用马科维茨投资组合优化法和现代资产组合理论生成交易策略?...
全文共6852字,预计学习时长14分钟 图源:pixabay 本文旨在展示如何用马科维茨(Markowitz)的投资组合优化法和现代资产组合理论(MPT)来生成交易策略. 本文首先对均值-方差优化法进 ...
- 数学建模债券投资组合_最优投资组合问题的数学模型
最优投资组合问题的数学模型 李成博①LI Cheng -bo :宓颖②MI Ying:衣国洋③YI Guo -xiang :黄小宇 ①HUANG Xiao -yu [摘 要] 摘要:本文研究的是投资者 ...
- 利用python构建马科维茨_使用CVXOPT包实现马科维茨投资组合优化
在真实股票市场的回测 上面的例子特别有趣但不是很适用. 接下来,我们将演示如何在BigQuant中创建一个策略. 本实验的目的是验证在一个买入固定5只股票的多头组合,利用马科维茨组合优化确定的投资组合 ...
- 西方投资组合理论及其新发展综述
西方投资组合理论及其新发展综述 投资组合理论有狭义和广义之分.狭义的投资组合理论指的是马柯维茨投资组合理论:而广义的投资组合理论除了经典的投资组理论以及该理论的各种替代投资组合理论外,还包括由资本资产 ...
- 有效前沿和最优投资组合matlab,matlab 实验名称:投资组合分析
实验性质:综合性和研究探索性
实 联合开发网 - pudn.com...
matlab 所属分类:matlab例程 开发工具:matlab 文件大小:5918KB 下载次数:30 上传日期:2017-12-27 13:31:24 上 传 者:waffle 说明: 实验名称 ...
- 最优投资组合构建问题,Python实现
本文记录在可投资集已知预期收益率和预期协方差矩阵的条件下,使用程序工具求解最优投资组合的方法. 问题描述 构建最优投资组合是一个带约束的优化问题,优化目标是最大化投资组合的夏普比率,而约束是资产权重相 ...
最新文章
- 图神经网络如何对知识图谱建模? | 赠书
- DHTMLX-Tabbar
- XtraBackup出现 Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'
- 区块链究竟是什么鬼?看完漫画秒懂
- sublime linux下无法输入中文
- jzoj6451-[2020.01.19NOIP提高组]不幸运数字【记忆化搜索,数位dp,高精度】
- 金融数据分析与挖掘实战练习2.5-2.9
- 幸亏有这本623页的微服务框架实战笔记,面试篇
- 【DFS笔记】对dfs(index,状态)一类问题的思考
- matlab邻域平均,数字图像处理邻域平均法滤波实验报告matlab实现
- oracle转为纯大写,Oracle认证:oracle中小写转换成大写方法
- linux bttrack服务,给centos7上的aria2添加BT Tracker服务器
- 根据给出的关系矩阵,判断该关系所具有的特性
- How to Register/Update Ad Muncher using TOR
- 【计算机网络 (谢希仁) 习题题解】第6章 应用层 (1)——域名系统DNS
- Kryo 缓冲区溢出
- Java发起GET请求的二三事
- 三种照片保存形式 :JPEG、TIFF、RAW
- 一元购抽奖号码 thinkphp php
- Linux下的FTP安装和登录