MindOpt优化如何分散化风险并实现收益与风险最优配比问题

简介: 资产配置,投资组合是指通过分散投资资金的方式来规避投资过程中的风险。在实际的投资过程中,如何决定投资哪些产品来实现收益最大化和风险最小化是一个关键的问题。

1.问题描述


资产配置,投资组合是指通过分散投资资金的方式来规避投资过程中的风险。在实际的投资过程中,如何决定投资哪些产品来实现收益最大化和风险最小化是一个关键的问题。

美国经济学家马科维茨在上世纪50年代首次使用数学方法给出风险与收益的定义,其主要思想是使用均值方差的方法来建立了投资组合理论。该理论构成了现代投资组合理论的基础。马科维茨提出的投资组合理论认为投资某种金融产品的风险可以划分为系统性风险和非系统性风险。其中系统性风险主要指市场风险,例如政策影响或者宏观经济波动。非系统性风险主要指一些具体事件,例如公司破产,财务造假或者产品质量问题等。非系统性风险对某个金融产品或者某只股票冲击比较显著,但是人们在投资时可以选择多只股票或者多个金融产品,将风险分摊。


在本节讨论的例子中,我们将使用1960年到2003年标普500的股票,债券,和货币市场指数为数据来简要介绍投资组合问题。数据文件参考:2011-Optimization-Portfolio-Table1.csv。投资总是伴随着风险,通常越高的投资回报对应着更高的风险(通常如下表所示)。
引用:本案例数据和部分解题思路参考自互联网资料,仅供学习交流用。


股票

高回报

高风险

债券

较高回报

较高风险

货币市场

低回报

低风险


本例子涉及的优化是非线性规划(QP和QC问题)。

2. 量化问题:收益与风险

2.1. 单一资产投资回报率的计算

我们用image.png来表示指数,image.png表示某种投资选择在某一年的回报率。则image.png的计算公式为:

image.png

根据以上公式,我们可以进一步计算得到该投资选择的平均回报率:

image.png

根据以上公式,我们可以计算数据文件中股票,债券,和货币市场的平均收益率分别为12.0569%,7.8501%,6.323%。下图为三种投资选择的标普500指数,年度收益率,和平均收益率。

image.png

image.png

image.png


一个好的投资组合将具有较高的投资回报和较低的投资风险,因此我们需要解决如何分散化风险并实现收益与风险最优配比的问题。解决该问题有三种思路,每种思路分别对应了一种问题建模:


  • Problem 1:在获得预期收益率基础上,承受最小的投资风险
  • Problem 2:在可接受的投资风险水平上,实现最大的投资收益
  • Problem 3:最小化风险和负的预期收益的加权和


2.2. 单一资产投资风险的计算

“风险”可以用资产年回报率的“方差”来度量,其计算公式如下:

image.png

根据上述公式,我们从数据文件中可以计算出股票,债券,和货币市场的风险分别为0.027778434,0.011118948,0.001153996。下表列出了我们刚刚计算得出的股票,债券,和货币市场的平均回报率和风险。


股票

债券

货币

年均回报率

12.0569%

7.8501%

6.323%

风险

0.027778434

0.011118948

0.001153996


2.3. 组合资产投资收益的计算


在马科维茨投资组合理论中,组合投资的收益可以用各个资产平均回报率的均值来定义。假设image.png
用于表示我们投资的资产组合,则该投资组合的收益image.png可以用如下公式来计算:

image.png

其中,image.png是第image.png种资产的平均回报率。


2.4. 组合资产投资风险的协方差矩阵


在概率论和统计学中,协方差image.png是两个随机变量image.png一起变化的度量(方差是两个变量相同时协方差的特殊情况)。协方差的数学定义如下:

image.png

如果两个变量趋于同时变化(即当其中一个变量高于其期望值时,那么另一个变量也趋于高于其期望值),那么两个变量之间的协方差将是正的。另一方面,如果两个变量趋于相反变化时(即当一个变量低于其期望值时,其中一个变量趋于高于其期望值),则两个变量之间的协方差为负。在金融市场中,不同资产之间的回报率是呈现一定的相关性的。例如,当股票行情好的时候,债券一般也会有较好的表现。为了挖掘出不同资产之间的关联性,我们用如下公式来计算两种资产的协方差:

image.png

由此,我们可以从数据文件中计算得到股票,债券和货币之间的协方差矩阵image.png

股票

债券

货币市场

股票

0.027778

0.003866

0.000207

债券

0.003866

0.011119

-0.000195

货币市场

0.000207

-0.000195

0.001154


3. 模型建立

集合

image.png投资选择集合,即{股票、债券、货币市场}。

参数

image.png投资选择image.png的平均收益

image.png投资组合image.pngimage.png之间的协方差

image.png预期的最低投资收益

image.png可承担的最高投资风险

image.png目标中风险的权重系数

image.png目标中收益的权重系数


决策变量

image.png每种投资选择的投资比例

数学模型

Problem 1:在获得预期收益率基础上,承受最小的投资风险

image.png

Problem 2:在可接受的投资风险水平上,实现最大的投资收益

image.png

Problem 3:最小化风险和负的预期收益的加权和

image.png

4.MindOpt APL建模和求解

接下来我们采用MindOptAPL来建模问题,并且调用求解器来求解。其中有些影响的参数我们可以修改,然后汇总统计运行结果。

Problem 1:在获得预期收益率基础上,承受最小的投资风险

我们将image.png从6.5%,7%...不断增加至10.5%,以此来观察结果。下面给出0.065和0.105的示例。

这个是个二次规划(QP)问题,可以采用MindOpt来求解。

clear model;
# 建模
# problem1.mapl
param R:=0.065; #目标收益,修改此处从6.5%,7%...不断增加至10.5%来运行
set I ={"Stocks","Bonds","MoneyMarket"};
param avg_return[I]:=<"Stocks"> 0.120569233,<"Bonds"> 0.078501498,<"MoneyMarket"> 0.063230293;
param cov_matrix[I*I]:=
  |"Stocks","Bonds","MoneyMarket"|
|"Stocks"|0.027778434,0.003865623,0.000207039|
|"Bonds"|0.003865623,0.011118948,-0.000195386|
|"MoneyMarket"|0.000207039,-0.000195386,0.001153996|;
var x[I] real >= 0; #变量:在三类资产上的投资比例
minimize risk:  
    sum {<i,j> in I*I } (cov_matrix[i,j]*x[i]*x[j]);
subto returnR:
    sum {<i> in I} (avg_return[i]*x[i]) >= R;
subto sumto1:
    sum {<i> in I} x[i] == 1;
print "-----------------用MindOpt求解---------------";
option solver mindopt;     # (可选)指定求解用的求解器,默认是MindOpt
option mindopt_options 'print=0'; #设置求解器输出级别,减少过程打印
solve;         # 求解
print "-----------------Display---------------";
display;        # 展示结果
print "期望收益=",R,"时,优化决策后最低风险 = ", sum {<i,j> in I*I } (cov_matrix[i,j]*x[i]*x[j]);;

运行代码结果为:

-----------------用MindOpt求解---------------
Running mindoptampl
wantsol=1
mip_integer_tolerance=1e-9
print=0
MindOpt Version 0.24.1 (Build date: 20230423)
Copyright (c) 2020-2023 Alibaba Cloud.
Start license validation (current time : 29-JUN-2023 17:57:05).
License validation terminated. Time : 0.006s
OPTIMAL; objective 0.00
0 simplex iterations
Completed.
-----------------Display---------------
Primal Solution:
x@Stocks = 0.01557551846056755
x@Bonds  = 0.1003952141090600
x@MoneyMarket = 0.8840292674303752
期望收益=0.065时,优化决策后最低风险 = 0.001003774880094264

clear model;
# 建模
# problem1_2.mapl
param R:=0.105; #目标收益,修改此处从6.5%,7%...不断增加至10.5%来运行
set I ={"Stocks","Bonds","MoneyMarket"};
param avg_return[I]:=<"Stocks"> 0.120569233,<"Bonds"> 0.078501498,<"MoneyMarket"> 0.063230293;
param cov_matrix[I*I]:=
  |"Stocks","Bonds","MoneyMarket"|
|"Stocks"|0.027778434,0.003865623,0.000207039|
|"Bonds"|0.003865623,0.011118948,-0.000195386|
|"MoneyMarket"|0.000207039,-0.000195386,0.001153996|;
var x[I] real >= 0; #变量:在三类资产上的投资比例
minimize risk:  
    sum {<i,j> in I*I } (cov_matrix[i,j]*x[i]*x[j]);
subto returnR:
    sum {<i> in I} (avg_return[i]*x[i]) >= R;
subto sumto1:
    sum {<i> in I} x[i] == 1;
print "-----------------用MindOpt求解---------------";
option solver mindopt;     # (可选)指定求解用的求解器,默认是MindOpt
option mindopt_options 'print=0'; #设置求解器输出级别,减少过程打印
solve;         # 求解
print "-----------------Display---------------";
display;        # 展示结果
print "期望收益=",R,"时,优化决策后最低风险 = ", sum {<i,j> in I*I } (cov_matrix[i,j]*x[i]*x[j]);;

运行代码结果为:

-----------------用MindOpt求解---------------
Running mindoptampl
wantsol=1
mip_integer_tolerance=1e-9
print=0
MindOpt Version 0.24.1 (Build date: 20230423)
Copyright (c) 2020-2023 Alibaba Cloud.
Start license validation (current time : 29-JUN-2023 17:57:06).
License validation terminated. Time : 0.006s
OPTIMAL; objective 0.01
0 simplex iterations
Completed.
-----------------Display---------------
Primal Solution:
x@Stocks = 0.6623911385783557
x@Bonds  = 0.2481075493747278
x@MoneyMarket = 0.08950131204911776
期望收益=0.105时,优化决策后最低风险 = 0.01416827579918437

Problem 2:在可接受的投资风险水平上,实现最大的投资收益


我们将风险上限image.png从0.020,0.015不断减少至0.005观察结果.


注意:这个是个二次约束(QC)的规划问题,目前MindOpt还不支持,我们更换用开源的求解器,查阅MindOpt APL支持的求解器来选择求解器。下面我们选用Ipopt求解器来求解。

clear model;
# 建模
# problem2.mapl
param S = 0.005; #风险上限,修改此处从0.020,0.015不断减少至0.005来运行
set I ={"Stocks","Bonds","MoneyMarket"};
param avg_return[I]:=<"Stocks"> 0.120569233,<"Bonds"> 0.078501498,<"MoneyMarket"> 0.063230293;
param cov_matrix[I*I]:=
  |"Stocks","Bonds","MoneyMarket"|
|"Stocks"|0.027778434,0.003865623,0.000207039|
|"Bonds"|0.003865623,0.011118948,-0.000195386|
|"MoneyMarket"|0.000207039,-0.000195386,0.001153996|;
var x[I] real >= 0; #变量:在三类资产上的投资比例
maximize returnR:
    sum {<i> in I} (avg_return[i]*x[i]);
subto risk:
    sum {<i,j> in I*I } (cov_matrix[i,j]*x[i]*x[j]) <= S;
subto sumto1:
    sum {<i> in I} x[i] == 1;
print "-----------------用Ipopt求解---------------";
option solver ipopt;   
option ipopt_options 'outlev=0';
solve;         # 求解
print "-----------------Display---------------";
display;        # 展示结果
print "风险上限=",S,"时,优化决策后最高回报 = ",  sum {<i> in I} (avg_return[i]*x[i]);

运行代码结果为:

-----------------用Ipopt求解---------------
Running ipopt
wantsol=1
outlev=0
******************************************************************************
This program contains Ipopt, a library for large-scale nonlinear optimization.
 Ipopt is released as open source code under the Eclipse Public License (EPL).
         For more information visit http://projects.coin-or.org/Ipopt
******************************************************************************
Ipopt 3.12.13: Optimal Solution Found
Completed.
-----------------Display---------------
Primal Solution:
x@Stocks = 0.3719475671271639
x@Bonds  = 0.1817795679218096
x@MoneyMarket = 0.4462728649510265
风险上限=0.005时,优化决策后最高回报 = 0.0873333652811958

Problem 3:最小化风险和负预期收益的加权和


这里令image.png,逐渐调整image.pngimage.png观察结果。


需要注意的是,由于风险和收益我们评估用的数的量级差异大,直接这样处理不一定合适,可以再引入系数消除数据量级差异。


这个是个二次规划(QP)问题,可以采用MindOpt来求解。

clear model;
# 建模
# problem3.mapl
param alpha:=0.5;
param beta:= 1.0 * (1 - alpha); #也可以单独取值,与alpha独立;也可以增加个调整系数比例,这里用1.0,用户可以调整0.5试一试。
set I ={"Stocks","Bonds","MoneyMarket"};
param avg_return[I]:=<"Stocks"> 0.120569233,<"Bonds"> 0.078501498,<"MoneyMarket"> 0.063230293;
param cov_matrix[I*I]:=
  |"Stocks","Bonds","MoneyMarket"|
|"Stocks"|0.027778434,0.003865623,0.000207039|
|"Bonds"|0.003865623,0.011118948,-0.000195386|
|"MoneyMarket"|0.000207039,-0.000195386,0.001153996|;
var x[I] real >= 0; #变量:在三类资产上的投资比例
minimize weighted_sum:  
      sum {<i,j> in I*I} (alpha*cov_matrix[i,j]*x[i]*x[j])
        - sum {<i> in I} (beta*avg_return[i]*x[i]);
subto sumto1:
    sum {<i> in I} x[i] == 1;
print "-----------------用MindOpt求解---------------";
option solver mindopt;     # (可选)指定求解用的求解器,默认是MindOpt
option mindopt_options 'print=0'; #设置求解器输出级别,减少过程打印
solve;         # 求解
print "-----------------Display---------------";
display;        # 展示结果
print "优化决策后,最优加权评估值是 = ",  
        sum {<i,j> in I*I} (alpha*cov_matrix[i,j]*x[i]*x[j])
        - sum {<i> in I} (beta*avg_return[i]*x[i]);
print "此时,";
print "风险 = ", sum {<i,j> in I*I } (cov_matrix[i,j]*x[i]*x[j]);
print "收益 = ",  sum {<i> in I} (avg_return[i]*x[i]);

运行结果为:

-----------------用MindOpt求解---------------
Running mindoptampl
wantsol=1
mip_integer_tolerance=1e-9
print=0
MindOpt Version 0.24.1 (Build date: 20230423)
Copyright (c) 2020-2023 Alibaba Cloud.
Start license validation (current time : 29-JUN-2023 17:57:09).
License validation terminated. Time : 0.006s
OPTIMAL; objective -0.05
0 simplex iterations
Completed.
-----------------Display---------------
Primal Solution:
x@Stocks = 0.9076253313372271
x@Bonds  = 0.09237466866274598
x@MoneyMarket = 0.00000
优化决策后,最优加权评估值是 = -0.0465283693952063
此时,
风险 = 0.02362650112756696
收益 = 0.1166832399179795

5.结果

Problem 1:在获得预期收益率基础上,承受最小的投资风险


我们将R从6.5%,7%...不断增加至10.5%观察结果,发现预期收益越高,对应的最优投资组合风险越高,其中,货币市场投资比例逐渐下降,债券的投资比例逐渐缓慢上升,股票的投资比例上升更快。以下为求解结果及其可视化。注意,R=0.065时最优投资组合风险低于单货币市场投资风险,即,通过资产组合实现了较高的投资收益并分散化风险。


R

0.065

0.070

0.075

0.080

0.085

0.090

0.095

0.100

0.105

风险

0.001

0.001

0.002

0.003

0.004

0.006

0.008

0.011

0.014

股票

1.56%

8.70%

16.92%

25.14%

33.36%

41.58%

49.80%

58.02%

66.24%

债券

10.04%

11.67%

13.55%

15.42%

17.30%

19.18%

21.06%

22.93%

24.81%

货币市场

88.40%

79.63%

69.53%

59.44%

49.34%

39.24%

29.14%

19.05%

8.95%


image.png

image.png


Problem 2:在可接受的投资风险水平上,实现最大的投资收益


我们将S从0.020,0.015不断减少至0.005观察结果,同样发现可承担风险越低,对应的最优投资组合期望收益越低,其中,货币市场投资比例逐渐增加,债券的投资比例逐渐下降,股票的投资比例逐渐下降。以下为求解结果及其可视化。


S

0.020

0.015

0.010

0.005

收益

0.112790

0.106224

0.098180

0.087333

股票

81.51%

68.25%

55.03%

37.19%

债券

18.49%

25.27%

22.25%

18.18%

货币市场

0.00%

6.48%

22.72%

44.63%


绘图如下:

image.png

image.png


Problem 3:最小化风险和负的预期收益的加权和


α+β=1,逐渐调整αβ观察结果,发现α比例越高,即风险的权重系数越大,加权目标值越大,对应的最优投资组合的风险越低,期望收益越低,其中,货币市场投资比例逐渐增加,债券的投资比例逐渐下降,股票的投资比例逐渐下降。以下为求解结果及其可视化。


α

0.3

0.5

0.7

β

0.7

0.5

0.3

加权目标

-0.076065

-0.046528

-0.022774

风险

0.027778

0.023627

0.006403

收益

0.120569

0.116683

0.090853

股票

100.00%

90.76%

42.98%

债券

0.00%

9.24%

19.50%

货币市场

0.00%

0.00%

37.52%


绘图如下:

image.png

image.png



相关文章
|
6月前
|
达摩院 开发者 容器
「达摩院MindOpt」优化形状切割问题(MILP)
在制造业,高效地利用材料不仅是节约成本的重要环节,也是可持续发展的关键因素。无论是在金属加工、家具制造还是纺织品生产中,原材料的有效利用都直接影响了整体效率和环境影响。
「达摩院MindOpt」优化形状切割问题(MILP)
|
6月前
|
人工智能 自然语言处理 达摩院
MindOpt 云上建模求解平台:多求解器协同优化
数学规划是一种数学优化方法,主要是寻找变量的取值在特定的约束情况下,使我们的决策目标得到一个最大或者最小值的决策。
|
1月前
|
机器学习/深度学习 算法 数据可视化
如果你的PyTorch优化器效果欠佳,试试这4种深度学习中的高级优化技术吧
在深度学习领域,优化器的选择对模型性能至关重要。尽管PyTorch中的标准优化器如SGD、Adam和AdamW被广泛应用,但在某些复杂优化问题中,这些方法未必是最优选择。本文介绍了四种高级优化技术:序列最小二乘规划(SLSQP)、粒子群优化(PSO)、协方差矩阵自适应进化策略(CMA-ES)和模拟退火(SA)。这些方法具备无梯度优化、仅需前向传播及全局优化能力等优点,尤其适合非可微操作和参数数量较少的情况。通过实验对比发现,对于特定问题,非传统优化方法可能比标准梯度下降算法表现更好。文章详细描述了这些优化技术的实现过程及结果分析,并提出了未来的研究方向。
26 1
|
4月前
|
人工智能 算法 调度
优化问题之如何选择合适的优化求解器
优化问题之如何选择合适的优化求解器
|
4月前
|
调度 决策智能
优化问题之优化求解器有哪些主要的评估特性
优化问题之优化求解器有哪些主要的评估特性
|
达摩院 调度
使用达摩院MindOpt优化交通调度_最大化通行量—线性规划问题
在数学规划中,网络流问题是指一类基于网络模型的流量分配问题。网络流问题的目标是在网络中分配资源,使得网络的流量满足一定的限制条件,并且使得某些目标函数最小或最大化。网络流问题通常涉及一个有向图,图中每个节点表示一个资源,每条边表示资源之间的关系。边上有一个容量值,表示该边上最多可以流动的资源数量。流量从源节点开始流出,经过一系列中间节点,最终到达汇节点。在这个过程中,需要遵守一定的流量守恒和容量限制条件。
|
6月前
|
存储 达摩院 调度
「达摩院MindOpt」优化FlowShop流水线作业排班问题
在企业在面临大量多样化的生产任务时,如何合理地安排流水线作业以提高生产效率及确保交货期成为了一个重要的问题。
「达摩院MindOpt」优化FlowShop流水线作业排班问题
MindOpt V1.0优化种植计划问题,新的建模方法
种植计划是指农业生产中针对不同农作物的种植时间、面积和种植方式等方面的规划安排。根据具体情况进行合理的规划和安排,以实现农作物的高产、优质和可持续发展。
MindOpt V1.0优化种植计划问题,新的建模方法
|
6月前
|
达摩院 自然语言处理 Java
MindOpt APL:一款适合优化问题数学建模的编程语言
本文将以阿里达摩院研发的MindOpt建模语言(MindOpt Algebra Programming Language, MindOptAPL,简称为MAPL)来讲解。MAPL是一种高效且通用的代数建模语言,当前主要用于数学规划问题的建模,并支持调用多种求解器求解。
|
达摩院 供应链 JavaScript
网络流:优化仓储物流调度问题-达摩院MindOpt
仓储物流调度是指在物流供应链中,对仓储和运输(运输路线、成本)进行协调和安排的过程。主要包含物流计划、运输调度、运发管理、库存管理等重要环节。随着网络、电商行业的迅速发展,仓储物流调度对于企业来说也非常重要,优秀的调度方案可以帮助降低库存成本、物流配送的效率、成本等等等,从而给企业带来降本增效。
网络流:优化仓储物流调度问题-达摩院MindOpt