混合整数二次规划投资组合优化:Solver-Based
这个例子展示了如何解决混合整数二次规划(MIQP)使用投资组合优化问题intlinprog
混合整数线性规划(MILP)解算器。这个想法是为了迭代解决一系列MILP问题MIQP局部近似的问题。具体问题具体分析的方法,请参阅混合整数二次规划投资组合优化:具体问题具体分析。
问题概述
马科维茨显示(“投资组合选择,”j .金融卷7,问题1,第91 - 77页,1952年3月),你可以表达许多投资组合优化问题的二次规划问题。假设您有一组N
资产和想要选择一个投资组合,
是你投资的资产的一部分
。如果你知道这个向量
平均每个资产的回报,和协方差矩阵
的回报,那么对于一个给定的风险规避水平
你的风险调整后的预期收益最大化:
的quadprog
解算器地址这二次规划问题。然而,除了普通的二次规划问题,您可能希望限制投资组合以多种方式,如:
没有超过
米
资产投资组合,M < = N
。有至少
米
资产投资组合,0 < m < = m
。有断断续续的约束,这意味着要么 ,或 对于一些固定的分数 和 。
你不能包含这些约束quadprog
。的困难是离散特性约束。此外,混合整数线性规划求解器进行求解intlinprog
处理离散约束,它并没有解决二次目标函数。
这个例子构建一系列MILP问题,满足约束,这越来越近似二次目标函数。虽然这种技术对于这个示例,它可能不适用于不同的问题或约束类型。
首先建模的约束。
模拟离散约束
资产配置是向量分数, 为每一个 。在投资组合模型资源的数量,你需要的指标变量 这样 当 , 当 。获取变量满足这一限制,设置 向量是一个二进制变量,对线性约束
这些不平等执行 和 零在完全相同的时间,他们还执行吗 每当 。
同时,实施资产组合的数量限制,对线性约束
客观的和连续的线性近似
第一次制定,你试图最大化目标函数。不过,所有的优化工具箱解决™最小化。所以制定问题,尽量减少负的目的:
这个目标函数是非线性的。的intlinprog
MILP解算器需要一个线性目标函数。有一个标准技术就是将这个问题转化为一个线性目标和非线性约束。引入松弛变量
来表示二次项。
你迭代解决MILP近似,包括新的线性约束,每个接近当前点附近的局部非线性约束。特别是,对 在哪里 是一个常数向量和 是一个变量向量,一阶泰勒近似约束是什么
替换 通过 给了
为每一个中间的解决方案 你介绍一个新的线性约束 和 正如上面的线性表达式的一部分:
的形式 ,在那里 ,有一个 乘数的 项, 。
这种方法添加新的线性约束问题称为割平面法。小,j·e·凯利。“割平面法求解凸规划。”J. Soc. Indust. Appl. Math. Vol. 8, No. 4, pp. 703-712, December, 1960.
MATLAB®问题公式化
表达问题intlinprog
解算器,您需要执行以下操作:
决定你的变量代表什么
表达的上下边界的这些变量
给出线性矩阵平等和不平等
第一个 变量代表了 向量,下一个 变量代表二进制 向量,最终变量表示 松弛变量。有 变量的问题。
加载数据的问题。这个数据有225年预期收益向量r
和协方差的回报在225 - - 225矩阵问
。使用的数据是一样的二次规划投资组合优化问题的例子。
负载port5r = mean_return;Q =相关性。* (stdDev_return * stdDev_return”);
设置资产的数量N
。
N =长度(r);
为变量设置索引
xvars = 1: N;vvars = N + 1:2 * N;zvar = 2 * N + 1;
所有的下界2 n + 1
变量为零的问题。第一个的上界2 n
变量是一个,最后一个变量没有上限。
磅= 0 (2 * N + 1, - 1);乌兰巴托的= (2 * N + 1, - 1);乌兰巴托(zvar) =正;
设置资源的数量在100年和150年之间的解决方案。把这个约束融入问题的形式,即
通过编写两个线性约束的形式 :
M = 150;m = 100;一个= 0 (1、2 * N + 1);%分配一个矩阵(vvars) = 1;% * x代表v (i)的总和一个= [;——];b = 0 (2, 1);b %分配向量b (1) = M;b (2) = - m;
包括半连续约束。的最小非零部分资产0.001
每个资产类型,最大分数0.05
。
fmin = 0.001;fmax = 0.05;
包括不平等 和 线性不等式。
Atemp =眼(N);Amax = horzcat (Atemp -Atemp * fmax, 0 (N - 1));一个= [;Amax];b = [b; 0 (N, 1)];阿明= horzcat (-Atemp Atemp * fmin, 0 (N - 1));一个= (;Amin);b = [b; 0 (N, 1)];
包括投资组合是100%的约束,意义 。
Aeq = 0 (1、2 * N + 1);%分配Aeq矩阵Aeq (xvars) = 1;说真的= 1;
设置风险规避系数
来One hundred.
。
λ= 100;
定义目标函数 作为一个向量。包括0的乘数 变量。
f = (- r; 0 (N, 1)λ);
解决这个问题
迭代来解决这个问题,首先解决问题与当前约束,没有反映任何线性化。在整数约束vvars
向量。
选择= optimoptions (@intlinprog,“显示”,“关闭”);%抑制迭代显示[xLinInt, fval exitFlagInt、输出]= intlinprog (f vvars A、b Aeq,说真的,磅,乌兰巴托,选项);
准备一个停止条件迭代:松弛变量时停止 在真正的二次价值的0.01%。设置更严格的公差比默认帮助确保积累问题仍然严格可行的约束。
thediff = 1的军医;iter = 1;%迭代计数器资产= xLinInt (xvars);% x变量truequadratic =资产' * Q *资产;zslack = xLinInt (zvar);%松弛变量值选择= optimoptions(选项,“LPOptimalityTolerance”1平台以及“RelativeGapTolerance”1 e-8…“ConstraintTolerance”1 e-9“IntegerTolerance”1 e-6);
使计算的历史真实的二次策划和松弛变量。
历史= [truequadratic, zslack];
计算二次和松弛值。如果他们不同,然后再添加另一个线性约束和解决。
在工具箱语法,每一个新的线性约束 来自于线性近似
你看到的新行 和新元素 , 词由一个1系数表示 。
当你找到一个新的解决方案,使用一个线性约束中间旧的和新的解决方案。金宝搏官方网站这种启发式的方法包括线性约束可以比简单的新的解决方案。使用解决方案而不是一半的启发式,评论下面的“中途岛”,并取消注释以下。
而abs ((zslack - truequadratic) / truequadratic) > thediff%相对误差newArow = horzcat(2 *资产* Q, 0 (1, N), 1);%线性约束rhs =资产' * Q *资产;%右手边的线性约束一个= [;newArow];b = (b; rhs);%解决新的约束的问题[xLinInt, fval exitFlagInt、输出]= intlinprog (f vvars A、b Aeq,说真的,磅,乌兰巴托,选项);资产=(资产+ xLinInt (xvars)) / 2;%中途从先前的电流% =资产xLinInt (xvars);%使用前一行或这一个truequadratic = xLinInt (xvars) * Q * xLinInt (xvars);zslack = xLinInt (zvar);历史=(历史;truequadratic, zslack);iter = iter + 1;结束
检查解决方案和收敛速度
情节松弛变量的历史和二次目标函数的一部分,看看他们聚集。
情节(历史)传说(“二次”,“松弛”)包含(的迭代次数)标题(“二次和线性近似(松弛)”)
MILP的质量解决方案是什么?的输出
结构包含这些信息。检查internally-calculated边界之间的绝对差距的客观的解决方案。
disp (output.absolutegap)
0
绝对差距是零,这表明MILP解决方案是准确的。
图的最优分配。使用xLinInt (xvars)
,而不是资产
,因为资产
可能不满足约束使用中途时更新。
栏(xLinInt (xvars))网格在包含(“资产指数”)ylabel (投资的比例)标题(“最优资产配置”)
你可以很容易地看到所有非零半连续边界之间的资产分配 和 。
有多少非零资产?100年和150年之间的约束是有非零资产。
sum (xLinInt (vvars))
ans = 100
什么是这个分配的预期回报,风险调整后的回报率的价值?
流(% g的预期回报,风险调整后的回报率是% g。\ n”,…r * xLinInt (xvars)、-fval)
风险调整后的回报率预期收益是0.000595107,是-0.0360382。
更复杂的分析是有可能通过使用专门为投资组合优化设计的特点在金融工具箱™。为例,展示了如何使用组合类来直接处理半连续和基数约束,明白了投资组合优化与半连续和基数约束(金融工具箱)。