主要内容

混合整数二次规划组合优化:基于问题

这个例子展示了如何使用基于问题的方法解决混合整数二次规划(MIQP)投资组合优化问题。其思想是迭代地求解一系列局部近似MIQP问题的混合整数线性规划(MILP)问题。有关基于求解器的方法,请参见混合整数二次规划组合优化:基于求解器

问题概述

正如Markowitz所展示的(“投资组合选择”,J. Finance卷7,第1期,第77-91页,1952年3月),你可以用二次规划问题来表达许多投资组合优化问题。假设你有一组N资产和想要选择的组合,有 x 资产是你投资的一部分 .如果你知道这个向量 r 每种资产的平均收益,和协方差矩阵 在一定的风险规避水平下 λ 使风险调整后的预期收益最大化:

马克斯 x r T x - λ x T x

quadprog求解器解决了这个二次规划问题。然而,除了简单的二次规划问题之外,你可能还想以多种方式限制投资组合,例如:

  • 不超过在资产组合中,其中M <= n

  • 至少有在资产组合中,其中0 < m <= m

  • 断断续续的约束,意思是 x 0 ,或 f n x f 一个 x 对于某些固定分数 f n > 0 而且 f 一个 x f n

您不能将这些约束包含在quadprog.困难在于约束的离散性。此外,虽然混合整数线性规划求解器处理离散约束,但它不处理二次目标函数。

本例构造了一系列满足约束条件的MILP问题,并且越来越接近二次目标函数。虽然这种技术适用于本例,但它可能不适用于不同的问题或约束类型。

首先对约束进行建模。

离散约束建模

x 资产配置的矢量是分数,用的 0 x 1 为每一个 .要对投资组合中的资产数量建模,您需要指标变量 v 这样 v 0 x 0 , v 1 x > 0 .要获得满足此限制的变量,请设置 v 向量为二进制变量,并施加线性约束

v f n x v f 一个 x

这些不等式都是强制的 x 而且 v 同时是0,它们也强制执行吗 f n x f 一个 x 每当 x > 0

此外,为了加强对投资组合中资产数量的约束,可以施加线性约束

v

目标与连续线性逼近

正如第一个公式,你试着最大化目标函数。但是,所有优化工具箱™求解器都最小化。所以将问题表述为最小化目标的负面影响:

最小值 x λ x T x - r T x

这个目标函数是非线性的。MILP求解器需要一个线性目标函数。有一种标准的技术可以将这个问题重新表述为一个具有线性目标和非线性约束的问题。引入松弛变量 z 表示二次项。

最小值 x z λ z - r T x 这样的 x T x - z 0 z 0

当你迭代地求解MILP近似时,你包含了新的线性约束,每个约束都在当前点附近局部逼近非线性约束。特别地,对于 x x 0 + δ 在哪里 x 0 是常数向量和吗 δ 是一个变量向量,约束的一阶泰勒近似是

x T x - z x 0 T x 0 + 2 x 0 T δ - z + O | δ | 2

替换 δ 通过 x - x 0 给了

x T x - z - x 0 T x 0 + 2 x 0 T x - z + O | x - x 0 | 2

对于每个中间溶液 x k 引入一个新的线性约束 x 而且 z 如上面表达式的线性部分:

- x k T x k + 2 x k T x - z 0

这是表格 一个 x b ,在那里 一个 2 x k T ,有一个 - 1 的乘数 z 项, b x k T x k

这种向问题中添加新的线性约束的方法被称为切割平面法。详情见小J. E.凯利。求解凸程序的切平面法j . Soc。工业上。达成。数学。第8卷第4期,703-712页,1960年12月。

MATLAB®问题公式

为了表达优化问题:

  • 决定你的变量代表什么

  • 表示这些变量的下界和上界

  • 给出线性等式和不等式表达式

加载问题的数据。该数据在向量中有225个预期收益r225 × 225矩阵中收益的协方差.数据与在投资组合优化问题上使用二次规划示例中的数据相同。

负载port5R = mean_return;Q =相关性。* (stdDev_return * stdDev_return');

设置资产数为N

N =长度(r);

创建问题变量、约束条件和目标

创建连续变量xvars表示资产配置比例的,是二进制变量vvars表示是否关联xvars是零还是严格正的zvar代表 z 变量,一个正标量。

Xvars = optimvar(“xvars”N 1下界的0,“UpperBound”1);vars = optimvar(“vvars”N 1“类型”“整数”下界的0,“UpperBound”1);Zvar = optimvar(“zvar”, 1下界的, 0);

所有的下界2 n + 1问题中的变量为零。的上界xvars而且yvars变量是1,和zvar没有上界。

将解决方案中的资产数量设置为100到150之间。将这个约束条件合并到表单中的问题中,即

v

通过写两个线性约束:

v

v

M = 150;M = 100;Qpprob =优化问题(“ObjectiveSense”“最大化”);qpprov . constraints .mconstr = sum(vars) <= M;qpprob.Constraints。米constr2 = sum(vvars) >= m;

包括半连续约束。取资产的最小非零部分为0.001对于每种资产类型,以及所要的最大分数0.05

Fmin = 0.001;Fmax = 0.05;

包括不平等 x f 一个 x v 而且 f n v x

qpprov . constraints .fmaxconstr = xvars <= fmax* vars;qpprov . constraints .fminconstr = fmin* vars <= xvars;

包括投资组合是100%投资的约束,这意味着 x 1

qpprov . constraints .allin = sum(xvars) == 1;

设置风险规避系数 λ One hundred.

Lambda = 100;

定义目标函数 r T x - λ z 把它包含在问题中。

qpprob。Objective = r'*xvars - lambda*zvar;

解决问题

要迭代地解决问题,首先要用当前的约束来解决问题,这些约束还没有反映任何线性化。

选项= optimoptions(@intlinprog,“显示”“关闭”);抑制迭代显示[xLinInt,fval,exitFlagInt,output] = solve(qpprob,“选项”、选择);

为迭代准备一个停止条件:当松弛变量时停止 z 在真实二次值的0.01%之内。

Thediff = 1e-4;Iter = 1;%迭代计数器assets = xLinInt.xvars;truequadatic =资产的*Q*资产;zslack = xLinInt.zvar;

保存计算出的真实二次变量和松弛变量的历史,以便绘图。设置比默认值更严格的公差,以帮助迭代收敛到正确的解决方案。

History = [truequadratic,zslack];选项= optimoptions(选项,“LPOptimalityTolerance”1平台以及“RelativeGapTolerance”1 e-8...“ConstraintTolerance”1 e-9“IntegerTolerance”1 e-6);

计算二次和松弛值。如果它们不同,则添加另一个线性约束并再次求解。

每个新的线性约束 一个 x b 来自于线性逼近

- x k T x k + 2 x k T x - z 0

找到新解后,在新旧解之间使用一个线性约束。金宝搏官方网站这种包含线性约束的启发式方法比简单地采用新的解决方案更快。要使用该解决方案而不是中途启发式,请注释下面的“中途”行,并取消下面的注释。

Abs ((zslack - truequadatic)/ truequadatic) > thediff%相对误差constr = 2*assets'*Q*xvars - zvar <= assets'*Q*assets;新名字= [“迭代”num2str (iter)];qpprop . constraints .(newname) = constr;用新的约束条件解决问题。[xLinInt,fval,exitFlagInt,output] = solve(qpprob,“选项”、选择);assets = (assets+xLinInt.xvars)/2;从以前到现在的中途% assets = xLinInt(xvars);使用前一行或这一行truequadratic = xLinInt.xvars'*Q*xLinInt.xvars;zslack = xLinInt.zvar;历史=[历史;truequadratic,zslack];Iter = Iter + 1;结束

检验解和收敛速度

绘制松弛变量的历史和目标函数的二次部分,看看它们是如何收敛的。

情节(历史)传说(“二次”“松弛”)包含(的迭代次数)标题(二次和线性逼近(松弛)

MILP解决方案的质量如何?的输出结构包含该信息。在解处检查内部计算的目标边界之间的绝对差距。

disp (output.absolutegap)
0

绝对差为零,说明MILP解是准确的。

画出最优分配图。使用xLinInt.xvars,而不是资产,因为资产可能无法满足使用中途更新时的约束。

栏(xLinInt.xvars)网格包含(“资产指数”) ylabel (“投资比例”)标题(“最优资产配置”

你可以很容易地看到,所有非零资产配置都在半连续边界之间 f n 0 0 0 1 而且 f 一个 x 0 0 5

有多少非零资产?限制条件是有100到150个非零资产。

总和(xLinInt.vvars)
Ans = 100

这种配置的预期回报是多少?风险调整后的回报值是多少?

流(“预期收益为%g,风险调整收益为%g。\n”...r * xLinInt.xvars, fval)
预期收益为0.000595107,风险调整收益为-0.0360382。

通过使用Financial Toolbox®中专门为投资组合优化设计的功能,可以进行更详细的分析。有关展示如何使用Portfolio类直接处理半连续约束和基数约束的示例,请参见基于半连续和基数约束的投资组合优化(金融工具箱)

相关的话题