在进行多目标进化算法求解投资组合问题时,由于多目标进化算法求得的是一组近似最优解,对于最大化收益和最小化风险的两目标M-V模型,需要找到一个基准,方便作为参考。这里利用Cplex工具求解均值-方差模型。

1、模型构建

   马科维茨的均值-方差模型,实质上是一个非线性的双目标的最优化问题,为的是达到最大化收益和最小化风险双目标的均衡状态。模型的数学描述如式所示:

   其中,其中V为投资组合的风险,希望其尽可能小。R为投资组合的收益,希望其尽可能大。X为投资到各个证券上的资产比例组成的权重向量。
双目标问题聚合为单目标问题:
   下面我们将该双目标问题转化为单目标优化问题,它是假设在投资组合收益率相同的情况下,把风险降为最小的模型。即仅保留最小化风险这个目标,将收益转化为约束。

2、数据准备

   数据准备对模型构建至关重要,原始数据集为100只股票的周盘价,通过统计计算,我们得到98只股票的期望收益率以及收益率的协方差矩阵。

3、Cplex求解

(1)首先导入所需函数库

import cplex
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt

(2)数据准备

cov_matrix =pd.read_csv(r'data\股票收盘价集合\股票收益率矩阵.csv')
expect_return = pd.read_csv(r'data\股票收盘价集合\股票期望收益率.csv')
cov_matrix = cov_matrix.to_numpy()
expect_return = expect_return['0'].tolist()
return_max = max(expect_return)
return_min = min(expect_return)
StockNames = range(0,98)

(3)构建Cplex模型

def setproblemdata(p):p.objective.set_sense(p.objective.sense.minimize)    names = ['w' + str(i) for i in range(98)]    p.variables.add(obj=[0] * 98, ub=[1] * 98, lb=[0] * 98, names=names)my_senses = 'EG'my_rhs = [1, 0.005]rows = [[names, [1] * 98],[names, list(expect_return[:98])]]p.linear_constraints.add(lin_expr=rows, senses=my_senses, rhs=my_rhs )qmat = []for j in range(98):qmat.append([[i for i in range(98)], [2 * cov_matrix[j, m] for m in range(98)]])p.objective.set_quadratic(qmat)

(4)模型运行求解

p = cplex.Cplex()
setproblemdata(p)
p.solve()print(sum(p.solution.get_values()))#是否满足预算约束
print(p.solution.get_objective_value())#最低风险值
print(np.array(p.solution.get_values()).round(3))#对应的投资组合portfolio_names = []
portfolio_weights = []
for i in range(98):proportion = np.round(p.solution.get_values()[i], 3)  # keep results with 3 decimals and keep weights larger than 0if proportion != 0:portfolio_names.append(StockNames[i])portfolio_weights.append(proportion)
df = pd.DataFrame(columns = portfolio_names)
df.loc['Weight'] = portfolio_weights
print('Selected stocks and their weights:')
print(df)

运行结果

(5)敏感性分析

def sensitivity(exp_return):p = cplex.Cplex()p.objective.set_sense(p.objective.sense.minimize)names = ['w' + str(i) for i in range(98)]p.variables.add(obj=[0] * 98, ub=[1] * 98, lb=[0] * 98, names=names)my_senses = 'EG'my_rhs = [1, exp_return]rows = [[names, [1] * 98], [names, list(expect_return[:98])]]p.linear_constraints.add(lin_expr=rows, senses=my_senses, rhs=my_rhs)qmat = []for j in range(98):qmat.append([[i for i in range(98)], [2 * cov_matrix[j, m] for m in range(98)]])p.objective.set_quadratic(qmat)p.solve()return (p.solution.get_objective_value(), np.array(p.solution.get_values()).round(3))return_values = np.arange(0.0000635, 0.0095, 0.00009436)
risks = []
for i in return_values:risks.append(sensitivity(i)[0])
print(return_values)
print(risks)
plt.figure(figsize=(15,8))
plt.plot(risks, return_values, '.--')
plt.xlabel('Portfolio Risk', fontsize = 18)
plt.ylabel('Portfolio Return', fontsize = 18)
plt.title('Efficient Frontier for our stocks pool\n', fontsize = 25)
plt.grid()
plt.show()
print(np.sum(sensitivity(0.005)[1]))

最优边界图片

使用Cplex求解均值方差模型相关推荐

  1. 数量金融学(8):Markowitz均值-方差模型(2)

    之前写过一篇.那个时候不是很懂-- Review:数量金融学(3):Markowitz均值-方差模型 现在重新整理一下. 第一部分,生成各个资产组合的风险-收益特征. 先上效果图. 再上代码. # - ...

  2. 【量化笔记】Markowitz均值-方差模型

    Markowitz均值-方差模型是一种确定在N种资产上投资比例的模型 假定现在投资人初始财富W0W_0W0​,在N种资产上的投资比重分别为w1,w2,w3,...,wNw_1,w_2,w_3,..., ...

  3. matlab均值方差模型,马科维茨均值方差模型的Matlab实现(10页)-原创力文档

    马科维茨均值方差模型的Matlab 实现 假设投资者可选的基金如下:股票型基金-诺安高端制造股票 (001707).混 合型基金-嘉实主题新动力混合 (070021).债券型基金-博时裕瑞纯债债券 ( ...

  4. 金融数量分析2:Markowitz均值方差模型

    博客原址:http://blog.sina.com.cn/s/blog_6afc560001017xuy.html Portfolio在金融投资理论中占有非常重要的地位,Markowitz根据每一种证 ...

  5. 不借助 matlab 内置函数,生撸均值方差模型

    不借助 matlab 内置函数,生撸均值方差模型 前言 我在之前的一篇文章中介绍了,如何使用 matlab 自带的函数(对象)portfolio,实现均值方差模型.matlab 内置的函数自然实用.但 ...

  6. 均值-方差模型实现及应用_python_数据分析_9

    用的是米筐的研究模块,从结果来看,均值方差模型对参数的敏感性很高,很多参数都不如随机权重,很难应用到实战. import pandas as pd import numpy as np from sc ...

  7. matlab中portcons,Matlab在马柯维茨均值-方差模型的简单应用.ppt

    Matlab在马柯维茨均值-方差模型的简单应用 Matlab在马柯维茨均值-方差模型的简单应用 陈思仰 20100512003 Markowitz(1952)发展了一 个在不确定条件下严格陈述的 可操 ...

  8. 大类资产配置(一)均值方差模型MOV

    大类资产配置专题(四)均值方差模型(MVO):https://xueqiu.com/9509413026/172746747 MVO的基本思想是:假定投资者都是风险厌恶的,根据各类资产的预期收益和方差 ...

  9. 【tushare使用经验分享】等权重模型、均值方差模型、风险平价模型的投资组合配置比较

    id:472745 获取2015.1.1至2021.12.31期间 贵州茅台.美的集团.宁波银行.中国平安.三一重工 五只股票的日度收益数据. 利用2015.1.1-2019.12.31间的数据作为训 ...

最新文章

  1. 物联网:企业需要面临七大风险
  2. SAP Cloud Application Programming 编程模型(CAP)的设计准则
  3. 进程控制块PCB结构体 task_struct 描述
  4. Platform Builder实践之配置文件
  5. 华为云发布 EI 城市智能体
  6. vue项目text-overflow:ellipsis;在生产环境上不显示...的问题
  7. 【工具】获取窗口与控件信息
  8. matlab的发展历史,仿真的发展历程以及目前现状
  9. 推荐的五款市面上常用的免费CMS建站系统
  10. 关于基金知识的一些整理
  11. 电源完整性(PI)概述
  12. MATLAB编写用户登陆界面小结——更改界面左上角图标、输入用户名提醒和输入密码隐藏
  13. 多生成树协议,冗余备份,负载均衡
  14. P2905 [USACO08OPEN]农场危机Crisis on the Farm(简单dp+麻烦“回溯”)
  15. 美国这几年的人口死亡数据
  16. 10Mbps是多少网速呢
  17. [转载]无欲则刚?_huadingjin_新浪博客
  18. 文职辅警的技能测试计算机操作是考什么,辅警文职体测都考哪些内容?
  19. PHP源码的加密方法分享
  20. 数字图像处理Matlab-彩色图像处理(附代码)

热门文章

  1. 桃词典 Peach Dictionary 简易英语词典app开发 安卓软件开发 Part 1
  2. 十大排序算法代码集锦(java)
  3. hbase/hadoop异常:No lease on /hbase/archive/data/... File is not open for writing
  4. AcWing120防线 经典题二分+前缀和+等差数列
  5. 从零开始的纪中生活(7.11~7.22)
  6. ZJM要抵御宇宙射线
  7. onenote如何删除笔记本
  8. python 点击按钮 click_selenium+Python(Js处理click失效)
  9. 分布式事务(6)-分布式事务处理技术之RocketMQ
  10. 网易云IM Flutter版本来啦,需要的拿去用。