金融学习之十五

您所在的位置:网站首页 xform组合是怎么选出来的 金融学习之十五

金融学习之十五

2024-07-10 22:11| 来源: 网络整理| 查看: 265

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

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()

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



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3