主要内容

基于求解器的组合优化问题的二次规划

这个例子展示了如何用内点二次规划算法来解决投资组合优化问题quadprog.这个函数quadprog属于优化工具箱™。

在这个例子中定义问题的矩阵是密集的;然而,内点算法在quadprog还可以利用问题矩阵中的稀疏性来提高速度。有关稀疏示例,请参见大型稀疏二次规划的内点算法

二次模型

假设有n美元不同的资产。资产回报率我美元随机变量是否具有期望值m_i美元.问题是找出哪个比例x_i美元投资于每一项资产我美元为了最大限度地降低风险,在规定的最低预期回报率的前提下。

美元加元表示资产收益率的协方差矩阵。

经典的均值-方差模型包括最小化投资组合风险,用

$$\frac{1}{2}x^T C x$$

受制于一组限制条件。

预期回报率应不低于投资组合回报率的最小值r美元投资者想要的,

$$\sum_{i=1}^n m_i \;X_i \ge r,$$

投资分数的和x_i美元的总和应该是1,

$$\sum_{i=1}^n x_i =1,$$

作为分数(或百分比),它们应该是0到1之间的数字,

$$0 \le x_i \le 1, \;\;\;I = 1 \ldots n.$$

由于最小化投资组合风险的目标是二次的,约束条件是线性的,因此得到的优化问题是二次规划,或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.在这个数据集中是回报率m_i美元范围在-0.008489和0.003971之间;我们选择一个期望的回报r美元介于两者之间,例如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。例如,这些资产组中的每一组都可以是不同的行业,如技术、汽车和制药。捕获这个新需求的约束条件是

$ $ \ sum_ {i = 1} ^ {75} x_i \通用电气0.3 \ qquad $ $ & # xA; $ $ \ sum_{我= 76}^ {150}x_i \通用电气0.3 \ qquad $ $ & # xA; $ $ \ sum_{我= 151}^ {225}x_i \通用电气0.3,$ $

向现有等式中添加组约束。

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™中专门为投资组合优化设计的功能,可以进行更详细的分析。

另请参阅

Baidu
map