主要内容

投资组合优化的二次规划,基于问题

这个例子展示了如何使用基于问题的方法来解决投资组合优化问题。有关基于求解器的方法,请参见基于求解器的组合优化问题的二次规划

二次模型

假设一个投资组合包含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].

我们加载数据集,然后为基于问题的方法设置约束。在这个数据集中是回报率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;%的资产数量和期望回报

创建优化问题、目标和约束条件

创建一个最小化的优化问题。

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。例如,这些资产组中的每一组都可以是不同的行业,如技术、汽车和制药。捕获这个新需求的约束条件是

$ $ \ 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,$ $

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

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

相关的话题

Baidu
map