有效性前沿
在无数风险资产投资组合中,只要给出既定风险水平,我们总是可以找到收益最高的一个组合。当投资者可承受的风险水平变化时,与该风险水平相对应的最优投资组合A点也一直存在,并且随着风险水平变化不断的移动。这条由不同风险水平下最优投资组合A点构成的曲线,我们称之为有效曲线,又叫有效前沿。

有效性前沿python计算
输入项:
1、资产收益率irr
2、资产相关性矩阵(协方差):cov
3、随机种子:seed。随机生成的配置比例数量,随机种子越大计算越精确
4、目标收益:r_return。投资者期望获得的收益率。
5、无风险利率:rf。指的是10年期国债收益率或者同业拆借利率。

计算步骤:
1、首先随机生成配置比例,个数为随机种子(seed)。
对应的代码为def random_weight
2、依据随机生成的配置比例,计算目标收益(r_return)下的最优配置比例
对应的代码为def cal_random_weight
3、依据随机生成的配置比例,求有效性前沿最左侧的点,即为有效性前沿的起点。
对应的代码为 self.cal_left_point
4、依据所有的最优点,绘制有效性前沿
对应的代码为 self.cal_ff
5、计算市场组合的预期收益率,预期波动率
对应的代码为 self.cal_market_weight
6、依据无风险利率,及市场组合两点连线,求出资本市场线

python代码:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import scipy.optimize as scoplt.rcParams['font.sans-serif'] = ['SimHei']  # 中文显示问题
plt.rcParams['axes.unicode_minus'] = False  # 负数显示问题class EffectiveForefront(object):"""有效性前沿类"""def __init__(self, irr, cov, seed, r_return, rf):"""有效性前沿初始化:param irr: 收益率:param cov: 协方差:param seed: 随机种子数:param r_return: 目标收益率:param rf: 无风险利率"""self.irr = irrself.rf = rfself.cov = covself.seed = seedself.r_return = r_returnself.plt = Noneself.cons = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1},{'type': 'eq', 'fun': lambda x: self.opt_return_vol(x)[0] - r_return})  # 输入最优解条件self.bnds = tuple((0, 1) for x in range(len(irr)))  # 输入边界条件self.frist_weight = len(irr) * [1 / len(irr)]  # 生成初始权重def eff_handler(self):"""有效性前沿计算流程:return: self.plt   有效性前沿及资本市场线:return: opt_w      目标收益率下资产配置比例"""self.plt = self.random_weight()opt_w = self.cal_random_weight()left_point_return, left_point_vol = self.cal_left_point()self.plt.plot(left_point_vol, left_point_return, 'y*', markersize=14)self.cal_ff(left_point_return)rm, vm, slope = self.cal_market_weight()rp_cml, vp_cml = self.cal_cml(slope)self.plt.plot(vp_cml, rp_cml, 'b--')self.plt.plot(vm, rm, 'g*', markersize=14)self.plt.show()return self.plt, opt_wdef cal_cml(self, slope):"""计算资本市场线:param slope: 计算资本市场线斜率:return:"""rp_cml = np.linspace(0.02, 0.25)vp_cml = (rp_cml - self.rf) / slopereturn rp_cml, vp_cmldef cal_market_weight(self):"""市场组合的预期收益率,预期波动率:return:"""# 仅设定权重之和为1的约束条件cons_sr = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})# 求解最优权重result_sr = sco.minimize(self.srmin_f, self.frist_weight, method='SLSQP', bounds=self.bnds, constraints=cons_sr)slope = -result_sr['fun']  # 即资本市场线斜率# 市场组合的预期收益率rm = np.sum(irr * result_sr['x'])  # 市场组合的收益率# 市场组合的波动率vm = (rm - self.rf) / slope  # 市场组合的波动率return rm, vm, slopedef cal_ff(self, left_point_return):"""求解有效前沿:param left_point_return: 最左侧点收益率:param left_point_vol: 最左侧点波动率:return:"""rp_target = np.linspace(left_point_return, 0.25, 100)# 设定波动率列表vp_target = []for r in rp_target:cons_new = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1},{'type': 'eq', 'fun': lambda x: self.opt_return_vol(x)[0] - r})result_new = sco.minimize(self.vmin_f, self.frist_weight, method='SLSQP',bounds=self.bnds, constraints=cons_new)vp_target.append(result_new['fun'])self.plt.plot(vp_target, rp_target, 'r-')def cal_random_weight(self):"""计算最有结果权重:return:"""# 求最值result = sco.minimize(self.vmin_f, self.frist_weight, method='SLSQP', bounds=self.bnds, constraints=self.cons)# 获取最优化结果的权重result['x'].round(4)w_df = pd.DataFrame()w_df['asset'] = list(self.cov)w_df['weight'] = result['x']return w_dfdef random_weight(self):"""随机生成配置比例:return:"""rp_list = []vp_list = []# 设定投资组合各产品的均值for i in np.arange(self.seed):x = np.random.random(5)weights = x / sum(x)rp_list.append(np.sum(weights * self.irr))vp_list.append(np.sqrt(np.dot(weights, np.dot(self.cov, weights.T))))plt.figure(figsize=(8, 6))plt.scatter(vp_list, rp_list)plt.xlim(0.12, 0.28)plt.ylim(-0.1, 0.2)plt.xlabel('波动率')plt.ylabel('预期收益率')plt.grid('True')return pltdef opt_return_vol(self, w):"""计算最优组合的预期收益率、收益波动率:param w: 资产配置权重:return:"""w = np.array(w)rp_opt = np.sum(w * self.irr)  # 计算最优投资组合的预期收益率vp_opt = np.sqrt(np.dot(w, np.dot(self.cov, w.T)))  # 计算最优投资组合的收益波动率return np.array([rp_opt, vp_opt])def vmin_f(self, w):return self.opt_return_vol(w)[1]def cal_left_point(self):"""求解有效前沿最左侧的点:return:"""cons_vmin = ({'type': 'eq', 'fun': lambda x: np.sum(x) - 1})result_vmin = sco.minimize(self.vmin_f, self.frist_weight, method='SLSQP',bounds=self.bnds, constraints=cons_vmin)# 求解投资组合的最左侧点的收益率rp_vmin = np.sum(irr * result_vmin['x'])# 求解投资组合的最左侧点的波动率vp_vmin = result_vmin['fun']return rp_vmin, vp_vmindef srmin_f(self, w):"""最优投资组合夏普比率:param w::return:"""w = np.array(w)rp_opt = np.sum(w * irr)vp_opt = np.sqrt(np.dot(w, np.dot(cov, w.T)))SR = (rp_opt - self.rf) / vp_optreturn -np.array([rp_opt, vp_opt, SR])[2]  # 求解最大的夏普比率就是求解负的最小值if __name__ == '__main__':irr = np.array([0.20, 0.08, -0.17, 0.06, -0.04])cov = pd.DataFrame({'A': [0.09, 0.02, 0.02, 0.01, 0.02], 'B': [0.02, 0.12, 0.04, 0.02, 0.03], 'C': [0.02, 0.04, 0.07, 0.02, 0.03],'D': [0.01, 0.02, 0.02, 0.04, 0.02], 'E': [0.02, 0.03, 0.03, 0.02, 0.04]})seed = 10000r_return = 0.1rf = 0.02ef = EffectiveForefront(irr, cov, seed, r_return, rf)plt, opt_w = ef.eff_handler()print('目标收益率下的配置比例为')print(opt_w)plt.show()

该算法的优点:
1、无需用到复杂的tensorflow模型,比较好调试参数
2、资产数较少的时候,计算非常准确。

缺点:
1、资产数较大的时候,要满足相同的精度,需要的随机种子数会指数级增加。在本案例中,五个资产用了一万随机种子。如果资产数增加为六,随机种子数要达到十万个。如果50个资产,随机种子数要达到10^50。不适合资产配置较多的投资组合。
2、大量随机生成的配置点离最优点非常远,浪费掉了。

附上python结果:

目标收益率下的配置比例为:
asset weight
0 A 0.310922
1 B 0.085937
2 C 0.000000
3 D 0.550663
4 E 0.052478

使用python绘制有效性前沿相关推荐

  1. python画资本市场线_【投资组合理论】Python绘制上证50成分股有效前沿和CML

    马科维茨有效前沿是经典的资产配置模型,对于给定收益率,有效前沿上的投资组合风险最小. 初学时,感觉绘制有效前沿是个极其有难度的事情,基本不可能完成.后来学了Python的一些数值计算方法,才感觉用程序 ...

  2. python画蜡烛致敬烈士_「」matplotlib 股票-用python绘制蜡烛线型k线图是用代码还是绘图工具-TOP金融网...

    用python绘制蜡烛线型k线图是用代码还是绘图工具 import matplotlib.pyplot as plt from matplotlib.dates import DateFormatte ...

  3. python绘制动态k线及均线_Python绘制股票移动均线的实例

    1. 前沿 移动均线是股票最进本的指标,本文采用numpy.convolve计算股票的移动均线 2. numpy.convolve numpy.convolve(a, v, mode='full') ...

  4. 怎么用python找论文_如何利用Python绘制学术论文图表方法

    论文中图表形式多样,常用的处理工具有excel.MATLAB以及Python等,excel自处理的方法有两个缺陷: 1.当数据较多时,容易出现excel"翻白眼"的现象: 2.需要 ...

  5. python绘制条形图用什么函数_Python绘制正余弦函数图像完整代码

    通过python绘制正弦和余弦函数,从默认的设置开始,一步一步地调整改进,让它变得好看,变成我们初高中学习过的图象那样.通过这个过程来学习如何进行对图表的一些元素的进行调整. 01. 简单绘图 mat ...

  6. python绘制所有特征的密度图(density plot)

    python绘制所有特征的密度图(density plot) # python绘制所有特征的密度图: n = len(input_feats) #密度图kde,查查分布 cols = 4 rows = ...

  7. python绘制影像组学训练集、测试集对应的ROC曲线以及瀑布图(rad-score 瀑布图)

    python绘制影像组学训练集.测试集对应的ROC曲线以及瀑布图(rad-score 瀑布图) # 所有数据的瀑布图 tagets_all = df['label'] tagets_all = df. ...

  8. 什么是折线图?怎样用Python绘制?怎么用?终于有人讲明白了(附代码)

    来源:大数据DT 本文约5400字,建议阅读10分钟 本文为你介绍数据分析时经常用到的折线图,可以用来呈现哪些数据关系?在数据分析过程中可以解决哪些问题?怎样用Python绘制折线图? 01 概述 折 ...

  9. 柱状图、堆叠柱状图、瀑布图有什么区别?怎样用Python绘制?(附代码)

    来源:大数据DT(ID:hzdashuju) 作者:屈希峰,资深Python工程师,知乎多个专栏作者 本文约8000字,建议阅读20分钟 柱状图是当前应用最广泛的图表之一,你几乎每天都可以在电子产品上 ...

最新文章

  1. ROC曲线与癌症分类
  2. Maven Filter
  3. oracle全库快照,Oracle数据库快照的使用
  4. iphone怎么分屏_问答 | Mac 应用商店中无法”获取“软件怎么办?
  5. Liferay例子学习,如何部署简单的jsp portlet
  6. java fastutil_具有FastUtil的精简Java集合
  7. hat怎么安装mysql_Red Hat Enterprise Linux中怎么安装Mysql+apache+php+zend
  8. 一图看懂 Python 2 / Python 3 编码 | CSDN 博文精选
  9. mysql动态调整jndi_tomcat6.0 JNDI MYSQL设置
  10. 『自定义View实战』—— 仿ios图标下载view DownloadLoadingView
  11. OpenCV用C画线代码示例
  12. 时间序列谐波分析(HANTS)的MATLAB实现
  13. SAP FICO面试题
  14. ug冲模标准件库_UG NX插件
  15. 接入华为推送用API给iOS应用发消息时如何获取access_token?
  16. 写给Python社群的第1课:初识Python,开篇知识点就选字符串吧~
  17. 程序员开发常用英语词汇汇总,满满的干货!
  18. Linux:查看主机显卡
  19. 学机器人编程和学钢琴哪个好
  20. Android如何实现音频合成

热门文章

  1. arduino 水位传感器_Arduino教程┃数字传感器和模拟传感器的区别
  2. 用Imagex.exe 捕获Client机台映像并网络还原 网络还原篇
  3. 电脑清灰,笔记本电脑如何清灰尘 笔记本电脑清灰方法【详细介绍】
  4. 100句勉励自己的人生格言
  5. 51单片机keil提供的启动代码解析(STARTUP.A51)
  6. linux基础篇,数据流重定向
  7. linux superblock 时间,e2fsck: Bad magic number in super-block_Linux
  8. head first java勘误_Head First Java勘误
  9. 如何对台式计算机 笔记本进行日常维护,笔记本电脑日常怎么保养?这些方法别错过了...
  10. 转:团队要取得高绩效,领导别“假装”听大家的