基于求解器的组合优化问题的二次规划
这个例子展示了如何用内点二次规划算法来解决投资组合优化问题quadprog
.这个函数quadprog
属于优化工具箱™。
在这个例子中定义问题的矩阵是密集的;然而,内点算法在quadprog
还可以利用问题矩阵中的稀疏性来提高速度。有关稀疏示例,请参见大型稀疏二次规划的内点算法.
二次模型
假设有不同的资产。资产回报率随机变量是否具有期望值.问题是找出哪个比例投资于每一项资产为了最大限度地降低风险,在规定的最低预期回报率的前提下。
让表示资产收益率的协方差矩阵。
经典的均值-方差模型包括最小化投资组合风险,用
受制于一组限制条件。
预期回报率应不低于投资组合回报率的最小值投资者想要的,
投资分数的和的总和应该是1,
作为分数(或百分比),它们应该是0到1之间的数字,
由于最小化投资组合风险的目标是二次的,约束条件是线性的,因此得到的优化问题是二次规划,或QP。
225 -资产问题
现在让我们用225种资产来解决QP。数据集来自OR-Library [Chang, T.-J.],Meade, N., Beasley, J.E. and Sharaiha, Y.M., "Heuristics for cardinality constrained portfolio optimisation" Computers & Operations Research 27 (2000) 1271-1302].
我们加载数据集,然后以期望的格式设置约束quadprog
.在这个数据集中是回报率范围在-0.008489和0.003971之间;我们选择一个期望的回报介于两者之间,例如0.002(0.2%)。
加载存储在mat文件中的数据集。
负载(“port5.mat”,“相关”,“stdDev_return”,“mean_return”)
由相关矩阵计算协方差矩阵。
Covariance = Correlation .* (stdDev_return * stdDev_return');nAssets = numel(mean_return);R = 0.002;%的资产数量和期望回报Aeq = ones(1,nAssets);Beq = 1;%等式Aeq*x = beqAineq = -mean_return';Bineq = -r;%不等式Aineq*x <= bineqlb = 0 (nAssets,1);ub = ones(nAssets,1);%边界lb <= x <= ubc = 0 (nAssets,1);%目标没有线性项;设为0
在Quadprog中选择内点算法
为了使用内点算法求解QP,我们将选项算法设置为“内点-凸”。
选项= optimoptions(“quadprog”,“算法”,“interior-point-convex”);
解决225资产问题
现在我们设置一些额外的选项,并将求解器称为quadprog。
设置其他选项:打开迭代显示,并设置更严格的最优终止容差。
选项= optimoptions(选项,“显示”,“通路”,“TolFun”1平台以及);
调用求解器并测量挂钟时间。
tic [x1,fval1] = quadprog(Covariance,c,Aineq,bineq,Aeq,beq,lb,ub,[],options);toc
Iter Fval原始Infeas双Infeas互补性0 2.384401e+01 2.253410e+02 1.337381e+00 1.337381e -03 1.038098e-02 2 1.186079e-03 6.443975e-01 3.824446e-03 8.727381e-03 3 5.923977e-04 2.730703e-01 1.620650e-03 3.147632e-04 5.354880e-04 5.573816e -07 2.848171e-04 5 5.066191e-04 9.285375e-06 5.510794e-08 1.041224e-04 7 3.923090e-04 7.619855e-06 5.522322e -08 5.536006e-041.770065e-06 1.50519e -08 1.382075e-04 9 2.923749e-04 8.850312e-10 5.252599e-12 3.858983e-05 10 2.277722e-04 4.431702e-13 2.627914e-15 6.204101e-06 11 1.992243e-04 2.229120e-16 2.127959e-18 4.391483e-07 12 1.950468e-04 3.339343e-16 1.456847e-18 1.949141e- 08 13 1.949141e-04 8.886121e-16 6.938894e- 10 14 1.949121e-04满足约束的最小值。优化完成是因为目标函数在可行方向上不递减,在最优性容差值范围内,约束条件满足在约束容差值范围内。运行时间为0.106398秒。
阴谋的结果。
plotPortfDemoStandardModel (x1)
225-组约束的资产问题
现在,我们在模型组中添加约束条件,要求投资者的资金的30%必须投资于资产1到75,30%投资于资产76到150,30%投资于资产151到225。例如,这些资产组中的每一组都可以是不同的行业,如技术、汽车和制药。捕获这个新需求的约束条件是
向现有等式中添加组约束。
Groups = blkdiag(ones(1,nAssets/3),ones(1,nAssets/3),ones(1,nAssets/3));Aineq = [Aineq;组);%转换为<= constraintBineq = [Bineq;-0.3 * 1 (3,1)];通过改变符号
调用求解器并测量挂钟时间。
tic [x2,fval2] = quadprog(Covariance,c,Aineq,bineq,Aeq,beq,lb,ub,[],options);toc
Iter Fval原始Infeas对偶Infeas互补性0 2.384401e+01 4.464410e+02 1.337324e+00 4.417606e-03 3.414918e-02 2 1.190113e-03 1.280566e+00 3.835962e-03 2.94585e -02 3 5.990845e-04 5.560762e- 04 8.3287370e -07 7.3287370e -03 5 3.887787e -04 8.423843e -09 2.578178e-05 7 3.089240e-04 2.707587e-07 8.2707587e -06 8 2.639458e-046.586817e-08 1.973095e-10 6.509001e-06 9 2.252657e-04 2.225507e-08 6.666551e-11 6.783212e-06 10 2.105838e-04 5.811527e-09 1.740855e-11 1.967570e-06 11 2.024362e-04 4.129834e-12 1.237133e-14 5.924109e-08 12 2.009703e-04 4.289104e-15 1.409629e-17 6.353270e-10 13 2.009650e-04 3.903128e-16 6.938894e-18 1.596041e-13满足约束的最小值。优化完成是因为目标函数在可行方向上不递减,在最优性容差值范围内,约束条件满足在约束容差值范围内。运行时间为0.031752秒。
图上的结果,与之前问题的结果叠加。
plotPortfDemoGroupModel (x1, x2);
到目前为止的结果总结
我们从第二个条形图中看到,由于附加的组约束,投资组合现在比第一个投资组合更均匀地分布在三个资产组上。这种强加的多样化也导致了风险的轻微增加,正如目标函数所测量的那样(参见两次运行迭代显示中最后一次迭代中标记为“f(x)”的列)。
使用随机数据的1000资产问题
为了展示如何quadprog
的内点算法在更大的问题上的行为,我们将使用一个1000资产随机生成的数据集。生成一个随机相关矩阵(对称的,正半定的,对角线上有一个)画廊
函数在MATLAB®。
重置随机流的再现性。
rng (0,“旋风”);nAssets = 1000;所需资产数量的%
生成收益在-0.1到0.4之间的均值。
A = -0.1;B = 0.4;mean_return = a + (b-a).*rand(nAssets,1);
生成0.08到0.6之间的收益标准偏差。
A = 0.08;B = 0.6;stdDev_return = a + (b-a).*rand(nAssets,1);%相关矩阵,使用Correlation = gallery('randcorr',nAssets)生成。%(生成这个大小的相关矩阵需要一段时间,所以我们加载%一个预先生成的。)负载(“correlationMatrixDemo.mat”,“相关”);由相关矩阵计算协方差矩阵。Covariance = Correlation .* (stdDev_return * stdDev_return');
定义并解决随机生成的1000资产问题
我们现在定义标准QP问题(这里没有组约束)并求解。
R = 0.15;期望回报率%Aeq = ones(1,nAssets);Beq = 1;%等式Aeq*x = beqAineq = -mean_return';Bineq = -r;%不等式Aineq*x <= bineqlb = 0 (nAssets,1);ub = ones(nAssets,1);%边界lb <= x <= ubc = 0 (nAssets,1);%目标没有线性项;设为0
调用求解器并测量挂钟时间。
tic x3 = quadprog(协方差,c,Aineq,bineq,Aeq,beq,lb,ub,[],选项);toc
Iter Fval原始Infeas双Infeas互补性0 7.083800e+01 1.142266e+03 1.610094e+00 1.005541e-02 9.857295e-02 2 1.076070e-04 3.566858e-03 3.542285e-09 8.148386e-06 4 7.257177e-05 1.230928e-06 3.735068e -09 3.979480e-06 5 3.610589e-05 2.634706e- 08 3.612553e-11 5.617206e-07 7 1.611590e-05 4.711751e-10 5.652911e-08 8 1.491953e-054.926282e-12 6.940520e-15 2.427880e-09 9 1.477930e-05 1.317835e-13 1.852562e-16 2.454705e-10 10 1.476910e-05 8.049117e-16 9.619336e-19 2.786060e-11满足约束的最小值。优化完成是因为目标函数在可行方向上不递减,在最优性容差值范围内,约束条件满足在约束容差值范围内。运行时间为0.903679秒。
总结
这个例子说明了如何使用内点算法quadprog
在一个投资组合优化问题上,给出了算法在不同规模二次问题上的运行时间。
通过使用Financial Toolbox™中专门为投资组合优化设计的功能,可以进行更详细的分析。