投资组合优化的二次规划,基于问题
这个例子展示了如何使用基于问题的方法来解决投资组合优化问题。有关基于求解器的方法,请参见基于求解器的组合优化问题的二次规划.
二次模型
假设一个投资组合包含不同的资产。资产回报率随机变量是否具有期望值.问题是找出哪个比例投资于每一项资产为了最大限度地降低风险,在规定的最低预期回报率的前提下。
让表示资产收益率的协方差矩阵。
经典的均值-方差模型包括最小化投资组合风险,用
受制于一组限制条件。
预期回报率应不低于投资组合回报率的最小值投资者想要的,
投资分数的和的总和应该是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].
我们加载数据集,然后为基于问题的方法设置约束。在这个数据集中是回报率范围在-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;%的资产数量和期望回报
创建优化问题、目标和约束条件
创建一个最小化的优化问题。
Portprob = optimproblem;
创建一个优化向量变量“x”
与nAssets
元素。这个变量表示投资于每种资产的财富比例,因此应该在0到1之间。
X = optimvar(“x”nAssets,下界的0,“UpperBound”1);
目标函数为协方差1/2 * x ' * * x
.把这个目标纳入到问题中。
目标= 1/2*x'*协方差*x;portprob。Objective =客观的;
变量的和为1,表示投资了整个投资组合。将其表示为约束并将其放入问题中。
sum(x) == 1;portprov . constraints .sumcons = sumcons;
平均回报率必须大于r
.将其表示为约束并将其放入问题中。
平均回报率= dot(mean_return,x) >= r;portprov . constraints . averagreturn = averagreturn;
解决225资产问题
设置一些选项,并调用求解器。
设置选项以打开迭代显示,并设置更严格的最优性终止容差。
选项= optimoptions(“quadprog”,“显示”,“通路”,“TolFun”1平台以及);
调用求解器并测量挂钟时间。
Tic [x1,fval1] = solve(portprob,“选项”、选择);toc
用quadprog解决问题。Iter Fval原始Infeas对偶Infeas互补性0 7.212813e+00 1.227500e+02 1.195948e+00 2.217295e-03 1 8.160874e-04 3.615084e-01 3.522160e-03 3.250524e -05 3 4.309434e-04 9.991108e- 04 9.991108e-02 9.734292e-04 2.220446e-16 6.661338e-16 8.002618e-07 6 3.587475e-04 2.220446e-16 2.602085e-18 9.586695e-08 8 2.760174e-045.551115e-16 2.114194e-18 1.521063e-08 9 2.345751e-04 4.48412e -18 4.109608e-09 10 2.042487e-04 4.440892e-16 1.029992e-18 6.423267e-09 11 1.961775e-04 4.440892e-16 9.757820e-19 6.068329e-10 12 1.949281e-04 0.000000e+00 9.757820e-19 4.279951e-12发现满足约束的最小值。优化完成是因为目标函数在可行方向上不递减,在最优性容差值范围内,约束条件满足在约束容差值范围内。运行时间为0.115332秒。
阴谋的结果。
plotPortfDemoStandardModel (x1.x)
225-组约束的资产问题
现在,我们在模型组中添加约束条件,要求投资者的资金的30%必须投资于资产1到75,30%投资于资产76到150,30%投资于资产151到225。例如,这些资产组中的每一组都可以是不同的行业,如技术、汽车和制药。捕获这个新需求的约束条件是
向现有等式中添加组约束。
Grp1 = sum(x(1:75)) >= 0.3;Grp2 = sum(x(76:150)) >= 0.3;Grp3 = sum(x(151:225)) >= 0.3;portprob.Constraints。Grp1 = Grp1;portprob.Constraints。Grp2 = Grp2;portprob.Constraints。Grp3 = Grp3;
调用求解器并测量挂钟时间。
Tic [x2,fval2] = solve(portprob, fval2)“选项”、选择);toc
用quadprog解决问题。Iter Fval原始Infeas对偶Infeas互补性0 7.212813e+00 1.227500e+02 3.539920e-01 5.253824e-03 1 7.004556e-03 2.207460e-03 2 9.181962e-04 4.095630e-01 1.181116e-03 3.749424e-04 3 7.515047e-04 3.567918e-01 1.028932e-03 3.486333e-04 5 3.695008e-04 1.909891e-04 5.507829e-07 1.341881e-05 6 3.010636e-04 6.146337e-07 1.772508e-09 7.691892e-08 2.218222e-10 1.837302e-08 8 2.669065e-041.088252e-08 3.138350e-11 5.474712e-09 9 2.195767e-04 8.122576e-10 2.814320e-08 10 2.102910e-04 2.839771e-10 1.037476e-08 11 2.060985e-04 6.713785e-11 1.936135e-13 2.876950e-09 12 2.015107e-04 7.771561e-16 9.215718e-19 1.522226e-10 13 2.009670e-04 6.661338e-16 1.029992e-18 5.264375e-13满足约束的最小值。优化完成是因为目标函数在可行方向上不递减,在最优性容差值范围内,约束条件满足在约束容差值范围内。运行时间为0.115345秒。
图上的结果,与之前问题的结果叠加。
plotPortfDemoGroupModel (x1.x x2.x);
到目前为止的结果总结
我们从第二个条形图中看到,由于附加的组约束,投资组合现在比第一个投资组合更均匀地分布在三个资产组上。这种强加的多样化也导致了风险的轻微增加,正如目标函数所测量的那样(参见两次运行迭代显示中最后一次迭代中标记为“f(x)”的列)。
使用随机数据的1000资产问题
为了展示解算器在更大的问题上的行为,我们将使用一个1000资产随机生成的数据集。生成一个随机相关矩阵(对称的,正半定的,对角线上有一个)画廊
函数在MATLAB®。
重置随机流的再现性。
rng (0,“旋风”);nAssets = 1000;所需资产数量的%
创建随机数据
生成收益在-0.1到0.4之间的均值。
A = -0.1;B = 0.4;mean_return = a + (b-a).*rand(nAssets,1);R = 0.15;期望回报率%
生成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');
创建优化问题、目标和约束条件
创建一个最小化的优化问题。
Portprob2 = optimproblem;
创建优化向量变量“x”
与nAssets
元素。
X = optimvar(“x”nAssets,下界的0,“UpperBound”1);
将目标函数纳入问题中。
目标= 1/2*x'*协方差*x;portprob2。Objective =客观的;
包括变量和为1且平均收益大于的约束r
.
sum(x) == 1;portprob2.Constraints。Sumcons = Sumcons;平均回报率= dot(mean_return,x) >= r;portprob2.Constraints。平均回报率=平均回报率;
解决1000资产问题
调用求解器并测量挂钟时间。
Tic x3 = solve(portprob2,“选项”、选择);toc
用quadprog解决问题。Iter Fval primary Infeas Dual Infeas Complementarity 0 2.142849e+01 5.490000e+02 3.031839e+00 5.210929e-03 1 9.378552e-03 6.439102e+00 3.555978e-02 6.331676e-04 2 1.128129e-04 3.705915e-03 2.046582e-05 1.852958e-06 1.023291e-08 1.170562e-07 4 8.490176e-05 7.650016e-08 4.224702e-10 7.048637e-09 5 3.364597e-05 4.440892e-16 2.474980e -18 1.037370e-09 6 1.980189e-05 8.881784e-16 9.419006e-19 8.465558e-11发现满足约束的最小值。优化完成是因为目标函数在可行方向上不递减,在最优性容差值范围内,约束条件满足在约束容差值范围内。运行时间为5.070618秒。
总结
本例说明了如何将基于问题的方法应用于投资组合优化问题,并展示了算法在不同规模的二次问题上的运行时间。
通过使用Financial Toolbox™中专门为投资组合优化设计的功能,可以进行更详细的分析。