金融学习之十五——投资组合的有效前沿

前一讲我们已经说了如何计算一个投资组合的预期收益率和预期收益率的波动率。然而,人们在投资的时候,往往都是在风险相同的情况下,选择收益最大的配置方案,而在收益相同的情况下,会选择风险最小的配置方案。但上讲的内容在整个计算过程中,有一个问题是没有解决的:在什么配置情况下,我能获得最大的投资收益率?(收益最大)或者说,在投资收益率确定的情况下,什么配置能让我的波动率最小?(风险最小)
这里就不得不引入一个概念:有效前沿。
我们通常将一定资产所有可能的投资组合称为可行集,而有效前沿就是可行集的一条包络线,在有效前沿上的所有的点,都满足在风险相同的情况下,收益最大的条件。也可以理解为,将每一个投资组合看成一个点,有效前沿就是由那些风险既定时,收益最大的点所构成的一条曲线。
在这里,我们还是沿用上讲中所用到的数据,意图找到该投资组合的有效前沿。
首先先绘制可行集

rp=[]#收益率
vp=[]#波动率
for i in np.arange(2000):#随机生成2000组配置比例数据
    x=np.random.random(5)
    weights=x/sum(x)    #每支股票的权重计算
    rp.append(np.sum(weights*r_mean)) #计算组合的收益率   
    vp.append(np.sqrt(np.dot(weights,np.dot(r_cov,weights.T))))#计算组合的波动率,这里的r_mean,r_cov都是沿用上讲的数据,请自行回看并制作
from matplotlib import pyplot as plt
plt.figure(figsize=(10,8))
plt.scatter(vp,rp)
plt.title(u'投资组合收益率与波动率关系',fontsize=12)
plt.xlabel(u'波动率')
plt.ylabel(u'组合收益率',rotation=90)
plt.grid('True')
plt.show()

在这里插入图片描述
可以看到,2000个点,即2000种投资组合配置的收益率和波动率,其实已经依稀的围出一条曲线了。
接着我们来假定一下计算的环境,假设我们希望能够获得15%的预期收益率,此时应如何配置5支股票的权重?
这个题目实际上已经可以转化为一个有约束条件的求方程最优解了,约束条件有两个,15%的收益率,权重之和等于1。关于求最优解,如果不太会的可以回看第六讲。
话不多说,上代码:

import scipy.optimize as sco
#定义一个求配置比例的函数
def pzbl(w):
    w=np.array(w)
    rp=np.sum(w*r_mean)
    vp=np.sqrt(np.dot(w,np.dot(r_cov,w.T)))
    return np.array([rp,vp])
#定义一个得到最小波动率的函数
def vpmin(w):
    return pzbl(w)[1]
m=len(r_mean)*[1.0/len(r_mean),]  #生成权重相等的数组
cons=({'type':'eq','fun':lambda x:np.sum(x)-1},{'type':'eq','fun':lambda x:pzbl(x)[0]-0.15})#两个约束条件
bnds=tuple((0,1) for x in range(len(r_mean)))#权重的边界
result=sco.minimize(vpmin,m,method='SLSQP',bounds=bnds,constraints=cons)
result

结果为:
fun: 0.25304071202791995
jac: array([0.10406828, 0.17881957, 0.18455074, 0.19230236, 0.43532638])
message: ‘Optimization terminated successfully’
nfev: 42
nit: 7
njev: 7
status: 0
success: True
x: array([1.18308268e-17, 3.22141466e-01, 2.00546211e-01, 2.03116061e-01,
2.74196263e-01])
最后面的x就是各支股票的配置比例了。其实猜也猜得到,平安银行跌成那个惨样,不配置就是对了。
接着我们来求最小波动率及其对应的收益率。

cons_min={'type':'eq','fun':lambda x:np.sum(x)-1}
result1=sco.minimize(vpmin,m,method='SLSQP',bounds=bnds,constraints=cons_min)
rp_min=np.sum(r_mean*result1['x'])
vp_min=result1['fun']
rp_min,vp_min

结果为:
(0.021836092618377573, 0.21781831209936875)
可以看到,最小波动率为0.2178的时候,收益率只有0.0218,没有风险就没有收益啊,富贵险中求。
最后,我们画出该投资组合的有效前沿:

t=np.linspace(rp_min,0.3,100)     #收益率从最低到30%,生成100个收益率
v=[]
for i in t:
    cons=({'type':'eq','fun':lambda x:np.sum(x)-1},{'type':'eq','fun':lambda x:pzbl(x)[0]-i})
    result=sco.minimize(vpmin,m,method='SLSQP',bounds=bnds,constraints=cons)
    v.append(result['fun'])
plt.figure(figsize=(10,8))
plt.scatter(vp,rp)
plt.plot(v,t,'r-',label=u'有效前沿',lw=2)
plt.plot(vp_min,rp_min,'y*',label=u'全局最小波动率',markersize=14)
plt.xlabel(u'波动率',fontsize=12)
plt.ylabel(u'收益率',fontsize=12,rotation=90)
plt.title(u'投资组合的有效前沿',fontsize=14)
plt.legend(fontsize=12)
plt.grid('True')
plt.show()

在这里插入图片描述
可以看到,这根红色的曲线就是我们的投资组合有效前沿了,最前面的顶点也就是波动率最小的点。

  • 9
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
投资组合绩效分析与评价是投资研究的重要内容之一,通过分析投资组合的绩效可以帮助投资者评估其投资策略的有效性和可行性。而Matlab作为一种功能强大的计算工具,可以帮助投资者更加准确地进行投资组合绩效分析与评价。 首先,通过Matlab可以对投资组合的收益率进行计算和分析。投资组合的收益率是衡量投资者投资策略成功与否的重要指标之一。借助Matlab的数据分析功能,可以对投资组合中不同资产的收益率进行计算,并绘制出收益率曲线和累计收益率曲线,从而直观地观察到投资组合的收益情况。 其次,Matlab还可以进行投资组合的风险分析。投资组合的风险是投资者所需关注的关键问题,通过Matlab的统计分析功能,可以计算投资组合的标准差、协方差矩阵等风险指标,从而衡量投资组合的风险水平。 除了绩效分析,Matlab还可以帮助投资者进行投资组合的优化。投资者可以通过Matlab的优化函数,选择最佳的资产配置比例,从而实现最大化收益或最小化风险的目标。此外,Matlab还可以进行投资组合的后验分析,将历史数据输入模型中进行回测,以验证投资组合的绩效。 总之,投资组合绩效分析与评价是投资决策的重要环节之一,而Matlab作为一种功能强大的计算工具,可以提供丰富的数据分析和数学建模功能,帮助投资者更加准确地进行投资组合绩效分析与评价。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值