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

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

二次模型

假设一个投资组合包含n美元不同的资产。资产的回报率$ I $是一个有期望值的随机变量吗m_i美元。问题是要找出分数是多少x_i美元投资每一项资产$ I $为了将风险降到最低,必须遵守规定的最低预期回报率。

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

经典的均值 - 方差模型包括减少投资组合的风险,如经测量

$ $ \压裂{1}{2}x ^ T C x $ $

受制于一组约束条件。

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

$ $ \ sum_ {i = 1} ^ n m_i \;通用电气x_i \ r, $ $

投资部分的总和x_i美元加起来应该是1,

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

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

$$0 x_i 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%)。

加载存储在mati文件中的数据集。

负载(“port5.mat”,“相关”,“stdDev_return”,“mean_return”)

计算从相关矩阵的协方差矩阵。

* (stdDev_return * stdDev_return');nAssets =元素个数(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;portprob.Constraints。sumcons = sumcons;

平均收益必须大于r。将其表示为约束,并将其放入问题中。

平均返回=点(mean_return,x)portprob.Constraints.averagereturn = averagereturn;

解决225 -资产问题

设置一些选项,并调用求解器。

设置选项中打开迭代显示屏上,并设置严格的最优终止宽容。

选项= optimoptions(“quadprog”,“显示”,“通路”,“TolFun”1平台以及);

呼叫求解器并测量壁钟时间。

tic [x1,fval1] =解(portprob,“选项”、选择);toc
Iter Fval原始Infeas双重Infeas互补0 7.212813 1.227500 e + e + 00 02 1.195948 e + 00 2.217295 e 03 1 7.220766 2.250524 8.160874 3.615084 e-04 e-01 3.522160 e 03 e-05 2 e-04 e-01 3.592574 9.734292 9.991108 4.309434 3.500229 3.378157 e 03 e-05 3 e-04 e-02 e-04 e-05 4 2.790551 4.719034 4.734300 4.242216 7.771561 5.551115 e-04 e-16 e-16 e-06 5 e-04 e-16 6.661338 3.035766 4.440892 3.587475 3.122502 8.002618 e-16 e-07 6 e-04 e-16 e-18 9.586695 3.686287 8.881784 3.131814 3.677066 e-07 7 e-04 e-16 e-18 e-08 e-04 8 2.7601747.771561e-16 1.463673e-18 1.521063e-08 9 2.34575e -15 1.138412e-18 4.109608e-09 10 2.042487e-04 1.221245e-15 1.08420e -18 6.423267e-09 11 1.961775e-04 1.110223e-16 9.757820e-19 6.068329e-10 12 1.949281e-04 4.440892e-16 9.215718e-19 4.279951e-12最小值满足约束条件。优化完成是因为目标函数在可行方向上不减少,且不超过最优容差的值,且约束条件满足不超过约束容差的值。运行时间为0.292806秒。

绘图效果。

plotPortfDemoStandardModel (x1.x)

带有组约束的资产问题

现在我们在模型组中添加了一些约束条件,要求投资者的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))grp3 = sum(x(151:225)) >= 0.3;portprob.Constraints。grp1 = grp1;portprob.Constraints。grp2 = grp2;portprob.Constraints。grp3 = grp3;

呼叫求解器并测量壁钟时间。

tic [x2,fval2] = solve(portprob,“选项”、选择);toc
Iter Fval原始Infeas双重Infeas互补0 7.212813 3.539920 1.227500 e + e + 00 02 e-01 5.253824 e 03 1 7.004556 e 03 2.901399 e + 00 8.367185 e 03 2.207460 e 03 2 9.181962 e-04 4.095630 e-01 1.181116 e 03 3.749424 e-04 3 7.515047 e-04 3.567918 e-01 1.028932 e 03 1.607718 2.597127 9.005778 4.238346 3.486333 e-04 4 e-04 e-02 e-04 e-04 5 3.691407 3.695008 1.341881 5.507829 1.909891 e-04 e-04 e-07 e-05 6 e-04 7.691892 3.010636 6.146337 6.817457 1.772508 e-07 e-09 e-08 7 e-04 e-08 e-04 2.669065 2.218223 1.837302平台以及e-08 81.088252e-08 3.138350e-11 5.474712e-09 9 2.19576774e -10 2.342425e-12 2.814320e-08 2.839773e-10 8.189470e-13 1.037476e-08 11 2.060985e-04 1.936133e-13 2.876950e-09 12 2.015107e-04 0.000000e+00 8.131516e-19 1.522226e-10 13 2.009670e-04 4.440892e-16 8.673617e-19 5.264375e-13最小值满足约束条件。优化完成是因为目标函数在可行方向上不减少,且不超过最优容差的值,且约束条件满足不超过约束容差的值。运行时间为0.162406秒。

绘制结果,叠加在前面问题的结果上。

plotPortfDemoGroupModel(x1.x,x2.x);

总结到目前为止的结果

我们从第二个柱状图中看到,由于额外的组约束,投资组合现在比第一个投资组合更均匀地分布在三个资产组中。这种强加的多样化也导致了风险的轻微增加,正如目标函数所测量的那样(在两次运行的迭代显示中,见最后一次迭代标记为“f(x)”的列)。

使用随机数据的1000资产问题

为了展示求解器在更大的问题上的表现,我们将使用一个随机生成的1000个资产的数据集。我们产生一个随机相关矩阵(对称,正半定,对角上的1)使用画廊功能MATLAB®。

重置随机流的重现性。

rng (0,“旋风”);nAssets = 1000;%资产的期望数量的

创建随机数据

生成收益率均值在-0.1到0.4之间。

一个= -0.1;b = 0.4;mean_return = a + (b-a).*rand(nAssets,1);r = 0.15;%期望回报

生成收益率在0.08到0.6之间的标准差。

一个= 0.08;b = 0.6;stdDev_return = a + (b-a).*rand(nAssets,1);

加载使用生成的相关矩阵相关=画廊(randcorr, nAssets)。(生成这种大小的关联矩阵需要一段时间,所以请加载预先生成的。)

负载(“correlationMatrixDemo.mat”,“相关”);

计算从相关矩阵的协方差矩阵。

* (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;平均返回=点(mean_return,x)portprob2.Constraints。averagereturn = averagereturn;

解决1000 -资产问题

呼叫求解器并测量壁钟时间。

ticx3 =解决(portprob2,“选项”、选择);toc
ITER FVAL原始Infeas双Infeas互补0 2.142849e + 01 5.490000e + 02 3.031839e + 00 5.210929e-03 9.378552e 1-03 6.439102e + 00 3.555978e-02 6.331676e-04 1.128129e 2-04 3.705915e-032.046582e-05 1.802721e-05 1.118804e 3-04 1.852958e-06 1.023291e-08 1.170562e-07 8.490176e 4-05 7.650016e-08 4.224702e-10 7.048637e-09 3.364597e 5-05 4.440892e-16 3.062871e-18 1.037370e-09 1.980189e 6-05则为2.220446e-16 8.876905e-19 8.465558e-11最低发现满足约束。优化完成是因为目标函数在可行方向上不减少,且不超过最优容差的值,且约束条件满足不超过约束容差的值。经过时间是0.913357秒。

摘要

这个例子说明了如何使用基于问题的方法上的投资组合优化问题,并显示在不同尺寸的二次问题的运行时间的算法。

通过使用Financial Toolbox™中专门为投资组合优化设计的特性,可以进行更详细的分析。