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

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

二次模型

假设一个投资组合包含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 \le x_i \le 1, \;i = 1 \ldots n.$$

由于最小化投资组合风险的目标是二次的,且约束是线性的,因此最终的优化问题是二次规划,即QP。

225 -资产问题

现在让我们用225个资产来解QP。数据集来自or库[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”)

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

* (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,这意味着整个投资组合都被投资了。将其表示为约束,并将其放入问题中。

sumcons = sum(x) == 1;portprob.Constraints。sumcons = sumcons;

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

averagereturn = dot(mean_return,x) >= r;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 4.440892 3.587475 6.661338 8.002618 3.122502 e-16 e-16 e-07 6 e-04 e-16 e-18 3.035766 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 9 2.31063e -18 1.110223e- 09 10 2.04248e -09 1.22122e -18 6.423267e-09 11 1.961775e- 16 9.757820e-19 6.068329e-10 12 4.440892e-16 9.215718e-19 4.279951e-12满足约束条件。优化完成是因为目标函数在可行方向上是不递减的,使其落在最优公差的取值范围内,且约束满足约束公差的取值范围内。运行时间是0.292806秒。

绘图效果。

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] =解(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.4712e -09 9 2.195712e -09 8.12770e -12 2.24320e -12 2.102910e-04 2.102910e- 08 11 2.060985e-04 6.713696e-11 1.93613e -09 12 2.0107e -04 0.00000 000e+00 8.131516e- 10 15 2.22226e -04 4.440892e-16 8.673617e-19 5.264375e-13满足约束条件。优化完成是因为目标函数在可行方向上是不递减的,使其落在最优公差的取值范围内,且约束满足约束公差的取值范围内。运行时间是0.162406秒。

绘图结果,与前一个问题的结果重叠。

plotPortfDemoGroupModel(x1.x,x2.x);

到目前为止的结果总结

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

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

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

重置随机流的再现性。

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

创建随机数据

产生-0.1到0.4之间的收益均值。

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

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

一个= 0.08;b = 0.6;stdDev_return = a + (b-a).*兰德(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

sumcons = sum(x) == 1;portprob2.Constraints。sumcons = sumcons;averagereturn = dot(mean_return,x) >= r;portprob2.Constraints。averagereturn = averagereturn;

解决1000 -资产问题

调用求解器并测量挂钟时间。

tic x3 =解(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™中专门为投资组合优化设计的特性,可以进行更详细的分析。