投资组合的可行集

  以(二十一)中选出的4支股票为例,随机生成1000组权重,绘制投资组合的可行集(部分代码和变量在上一篇文章中):

import matplotlib.pyplot as plt
rp=[]
volp=[]
for i in range(1000):x=np.random.rand(4)w=x/sum(x)rp.append(sum(r_mean*w))volp.append(np.sqrt(w*r_cov*w.reshape(4,1)))#矩阵相乘时写w@r_cov@w也可, 最后一个w自动转为列向量
plt.scatter(volp,rp)
plt.xlabel('波动率')
plt.ylabel('收益率')
plt.title('投资组合的可行集')
plt.grid()


  在可行集内部,波动率一定时,理性的投资者会选择可行集最上方的点进行投资,实现收益最大化;收益率一定时会选择最左边的点进行投资,实现风险最小化。
  注意在计算矩阵乘法w * r_cov * w.T时,只要其中一个元素是mat格式就能按照矩阵相乘(比如这里r_cov是mat),若全为array或dataframe时则只会对应元素相乘。最保险的方法是用矩阵内积符号@。

有效边界

  有效边界是可行集的一条包络线,它表示在不同收益率下获得的最小风险组合或者在不同风险下获得的最高预期收益率组合。有效边界的求解是一个最优化问题:在权重之和等于1且权重均大于等于0的约束条件下,求组合的最小标准差,因此我们需要用到scipy.optimize函数。

from scipy import optimize
def min_f(w):optvar=np.sqrt(w*r_cov*w.reshape(4,1))return optvar
cons=({'type':'eq','fun':lambda w:sum(w)-1})
bnds=tuple((0,1) for i in range(len(w)))#生成含有4个(0,1)的元组
x=len(w)*[1/len(w)]#定义初始解
#数字乘列表表示列表元素重复相应次数,[0.25 for i in range(len(w))]也可
result=optimize.minimize(min_f,x,method='SLSQP',bounds=bnds,constraints=cons)
result
Out[2]: fun: 0.14445922866687042jac: array([0.14374754, 0.14490873, 0.14455363, 0.14453749])message: 'Optimization terminated successfully.'nfev: 36nit: 6njev: 6status: 0success: Truex: array([0.13933975, 0.05509104, 0.70363178, 0.10193743])
optrp=round(sum(r_mean*result.x),4)
optvolp=round((result.fun),4)#在format格式里保留小数也可
print('组合最小波动率为{},对应的组合收益率为{}'.format(optvolp,optrp))组合最小波动率为0.1445,对应的组合收益率为0.2789

  因此在组合波动率最小时,4支股票配置的权重为[0.13933975, 0.05509104, 0.70363178, 0.10193743],此时组合的最小波动率为0.1445,对应的组合收益率为0.2789,对应于可行集图形最左边的点。下面画有效边界:

ry=np.linspace(optrp,0.7,100)#波动率在收益率的约束下求出,因此先定义收益率的范围(y轴)
vp=[]#需要计算的最小波动率列表(x轴)
for r in ry:con=({'type':'eq','fun':lambda w:sum(w)-1},{'type':'eq','fun':lambda w:sum(w*r_mean)-r})#增加了一个约束条件Σw*ri=r,即给定收益率下求最小标准差result2=optimize.minimize(min_f,x,method='SLSQP',bounds=bnds,constraints=con)vp.append(result2.fun)
plt.scatter(volp,rp)
plt.plot(vp,ry,'r-',label='有效边界')
plt.plot(optvolp,optrp,'ko',label='组合最小波动率点')#黑色圆点标记
plt.xlabel('波动率')
plt.ylabel('收益率')
plt.title('有效边界')
plt.legend()
plt.grid()

资本市场线(CML)

  资本市场线是一条从无风险利率引出的与有效边界相切的切线,并且有且仅有一条,其表达式为E(RP) = Rf + [(E(RM) - Rf) / σM] × σP,所以求CML也是一个最优化问题,找出使得斜率(E(RP) - Rf) / σP最大的股票权重wi。假设无风险利率为2%:

rf=0.02
def k(w):premium=sum(w*r_mean)-rfsigmap=np.sqrt(w*r_cov*w.reshape(4,1))SR=premium/sigmapreturn (premium,sigmap,SR)
def SRmax(w):#定义我们要求最大值的函数return -k(w)[2]
result3=optimize.minimize(SRmax,x,method='SLSQP',bounds=bnds,constraints=cons)
#初始解、边界值和约束条件与之前设置的变量一样
result3
Out[4]: fun: -2.660173349004466jac: array([-0.10626441, -0.10623619, -0.1063377 ,  1.76733685])message: 'Optimization terminated successfully.'nfev: 56nit: 9njev: 9status: 0success: Truex: array([3.42106270e-01, 2.84399911e-01, 3.73493820e-01, 1.52906388e-16])
slope=-result3.fun
rm=sum(result3.x*r_mean)
sigmam=(rm-rf)/slope
print('市场组合预期收益率为{:.2%},市场组合波动率为{:.2%},夏普比率为{:.2f}'.format(rm,sigmam,slope))市场组合预期收益率为52.06%,市场组合波动率为18.82%,夏普比率为2.66

  这样我们就找到了CML与有效边界的切点坐标,以及对应的斜率(夏普比率),此切点代表市场组合。下面绘制资本市场线:

cmlr=np.linspace(rf,0.7)#画资本市场线的收益率(y轴)数组
vcml=(cmlr-rf)/slope#画资本市场线的波动率(x轴)数组
plt.scatter(volp,rp)
plt.plot(vp,ry,'r-',label='有效边界')
plt.plot(optvolp,optrp,'ko',label='组合最小波动率点')
plt.plot(sigmam,rm,'ro',label='市场组合点')
plt.plot(vcml,cmlr,'k--',label='资本市场线')
plt.xlabel('波动率')
plt.ylabel('收益率')
plt.xlim(0,0.35)
plt.ylim(-0.1,0.8)
plt.title('投资组合理论的可视化')
plt.legend()
plt.grid()


  在不允许借钱的情况下,新的有效边界为红点左边的直线+红点右边的曲线,左边表示持有一定比例的无风险资产和市场组合,右边表示只持有风险资产;可以借钱融资时,CML就是有效边界,红点右边的直线表示该投资者按照无风险利率融资并且全部投入到市场组合,运用了杠杆。如果存贷款利率不同则有效边界就得分为三段,在此不作讨论。

根据无差异曲线计算最优资产配置


  若有一极度厌恶风险的投资者A=20,计算其最优资产组合:

y=(rm-rf)/(20*sigmam**2);y
Out[6]: 0.6624855494929857
print('A=20的风险厌恶者在无风险资产的投资比例为{:.2%},在这4支股票的投资权重分别为{:.2%}、{:.2%}、{:.2%}、{:.2%},\
实现的收益率为{:.2%}'.format((1-y),y*result3.x[0],y*result3.x[1],y*result3.x[2],y*result3.x[3],rf+y*(rm-rf)))A=20的风险厌恶者在无风险资产的投资比例为33.75%,在这4支股票的投资权重分别为23.41%、19.81%、23.04%、0.00%,实现的收益率为36.64%
U=rf+y*(rm-rf)-0.5*20*(sigmam*y)**2;U
Out[7]: 0.20321886442810244#该投资者的最大效用值
#在上图中加入该投资者的无差异曲线:
ux=np.linspace(0,0.35)
erc=rf+y*(rm-rf)
sigmac=sigmam*y
plt.plot(vp,ry,'r-',label='有效边界')
plt.plot(ux,U+10*ux**2,'b-',label='无差异曲线')
plt.plot(optvolp,optrp,'ko',label='组合最小波动率点')
plt.plot(sigmac,erc,'go',label='该投资者最优组合点')
plt.plot(sigmam,rm,'ro',label='市场组合点')
plt.plot(vcml,cmlr,'k--',label='资本市场线')
plt.xlabel('波动率')
plt.ylabel('收益率')
plt.xlim(0,0.35)
plt.ylim(-0.1,0.8)
plt.title('投资组合理论下的该风险厌恶者的最优资产配置')
plt.legend()
plt.grid()

(二十二)资产组合的有效边界、CML与最优配置相关推荐

  1. Python入门(二十二)- 常见模块2(正则表达式及容器)

    二十二 常见模块2(正则表达式及容器) 22.1 正则表达式及re模块 正则表达式(Regular Expression)用于描述一种字符串匹配模式(Pattern),它可以用于检查一个字符串是否含有 ...

  2. Python遥感图像处理应用篇(二十二):Python+GDAL 批量等距离裁剪影像-续

    之前写过一篇按照指定行列号数量来进行影像等距离裁剪的博客,链接如下: Python遥感图像处理应用篇(二十二):Python+GDAL 批量等距离裁剪影像_空中旋转篮球的博客-CSDN博客_pytho ...

  3. 无人驾驶汽车系统入门(二十二)——使用Autoware实践激光雷达与摄像机组合标定

    无人驾驶汽车系统入门(二十二)--使用Autoware实践激光雷达与摄像机组合标定 单目相机分辨率高,我们可以使用各种深度学习算法完成对目标检测,但是缺乏深度,坐标等信息.激光雷达能够获得目标相当精确 ...

  4. 2021年大数据Hadoop(二十二):MapReduce的自定义分组

    全网最详细的Hadoop文章系列,强烈建议收藏加关注! 后面更新文章都会列出历史文章目录,帮助大家回顾知识重点. 目录 本系列历史文章 前言 MapReduce的自定义分组 需求 分析 实现 第一步: ...

  5. 一位中科院自动化所博士毕业论文的致谢:二十二载风雨求学路,他把自己活成了光.........

    4月18日,中国科学院官方微博发布消息,披露了这篇论文为<人机交互式机器翻译方法研究与实现>,作者是2017年毕业于中国科学院大学的工学博士黄国平. 这篇论文中情感真挚的<致谢> ...

  6. iOS 11开发教程(二十二)iOS11应用视图实现按钮的响应(2)

    iOS 11开发教程(二十二)iOS11应用视图实现按钮的响应(2) 此时,当用户轻拍按钮后,一个叫tapButton()的方法就会被触发. 注意:以上这一种方式是动作声明和关联一起进行的,还有一种先 ...

  7. 实验二十二 SCVMM中的SQL Server配置文件

    实验二十二 SCVMM中的SQL Server配置文件 在VMM 2012中管理员可以使用 SQL Server 配置文件,在部署完成虚拟机之后,实现 SQL Server 数据库服务自动化部署并交付 ...

  8. 插入DLL和挂接API——Windows核心编程学习手札之二十二

    插入DLL和挂接API --Windows核心编程学习手札之二十二 如下情况,可能要打破进程的界限,访问另一个进程的地址空间: 1)为另一个进程创建的窗口建立子类时: 2)需要调试帮助时,如需要确定另 ...

  9. OpenCV学习笔记(二十一)——绘图函数core OpenCV学习笔记(二十二)——粒子滤波跟踪方法 OpenCV学习笔记(二十三)——OpenCV的GUI之凤凰涅槃Qt OpenCV学习笔记(二十

    OpenCV学习笔记(二十一)--绘图函数core 在图像中,我们经常想要在图像中做一些标识记号,这就需要绘图函数.OpenCV虽然没有太优秀的GUI,但在绘图方面还是做得很完整的.这里就介绍一下相关 ...

  10. 读书二十二载,信念很简单,把书念下去,然后走出去,不枉活一世。

    ‍ ‍ 关注+星标公众号,不错过精彩内容 昨天看了一篇关于博士论文的致谢,看的我想哭.改变命运有很多条路,但是对于大多数人而言,读书是改变命运的捷径. 内容是讲述了自己20多年的求学经历:小时候煤油灯 ...

最新文章

  1. 【安全牛学习笔记】手动漏洞挖掘(三)
  2. log4.properties文件【笔记自用】
  3. python cross val score_sklearn函数:cross_val_score(交叉验证评分)
  4. 小程序开发 缓存的应用
  5. iOS菜鸟之AFN的二次封装
  6. 困计算机无法启动adb,win7系统无法启动adb.exe工具包的解决方法
  7. SMM - 系统管理模式,SMRAM
  8. Swift教程之基本操作符
  9. 记一次PLC和脉冲型伺服电机的接线方法_20210915
  10. sku mysql_MySQL-THINKPHP 商城系统二 商品模块的展示
  11. 小企业主代理记账基础知识
  12. Ruby新手入门之gem配置
  13. java 数字翻译成英文_【Java】 剑指offer(46) 把数字翻译成字符串
  14. Linux学习笔记_2021-01-21
  15. 你好,CSDN!你好,C语言!
  16. 再补充三种内网穿透的方法:ngrok 、ngrok.cc、IOEE
  17. 格灵深瞳:人脸识别最新进展以及工业级大规模人脸识别实践探讨 | 公开课笔记...
  18. 服务于离群点检测的无监督特征选择值-特征层次耦合模型
  19. 孩子坐姿不正,不仅影响视力!还影响学习成绩!
  20. 使用hive制作一张日历表

热门文章

  1. PYTHON练习题:快递信息分拣程序代码(附源码与代码注释)
  2. 『Halcon与C#混合编程』第二章02_迈德威视工业相机SDK图像变量转换
  3. 放假这么多天终于完成了一项作品
  4. 双系统平板刷linux系统下载软件,台电官方论坛 - Windows平板加装Ubuntu实现双系统的尝试,有图有真相 - 平板笔记本...
  5. 007 Rust死灵书笔记之引用与别名
  6. 【计算机网络】定义、作用、特点计算机网络
  7. 打开Microsoft Outlook时出现意外错误如何解决?
  8. xtrabackup备份(全备,增备)
  9. 护眼灯真的可以保护眼睛吗?2022双十二选哪款护眼灯对孩子眼睛好
  10. 世界怎样存在---唯物辩证法