主要内容

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

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

二次模型

假设一个投资组合包含n美元不同的资产。资产收益率我美元随机变量是否有期望值m_i美元.问题是求出哪个比例x_i美元投资于每一项资产我美元为了使风险最小化,受规定的最低预期回报率约束。

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

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

$$ $$ $$ $$ $$ $$ $$

受制于一组约束。

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

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

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

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

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

$$0 \ \ le1, \;\;\;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”

由相关矩阵计算协方差矩阵。

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。客观的;

变量的和是1,意味着整个投资组合都被投资了。将其表达为约束条件,并将其置于问题中。

Sumcons = sum(x) = 1;portprobe . constraints .sumcons = sumcons;

平均收益必须大于r.将其表达为约束条件,并将其置于问题中。

Averagereturn = dot(mean_return,x) >= r;portprobe . constraints .averagereturn =平均返回;

解决225-资产问题

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

设置选项以打开迭代显示,并设置更严格的最优终止容忍。

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

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

Tic [x1,fval1] = solve(portprob,“选项”、选择);toc
用四码程序解决问题。Iter Fval原星双星互补0 7.212813e+00 1.227500e+02 1.195948e+00 2.217295e-03 1 8.160874e-04 3.6150160e -01 3.522160e- 01 3.5500524e -05 2 7.220766e-04 3.991108e -02 9.73429e -04 2.79055e -05 4 4.734300e-04 2.220446e-16 6.661338e-16 4.242216e-06 5 4.719034e-04 1.110223e-16 3.139849e-16 8.002618e-07 7 3.131814e-04 4.440892e-16 2.168404e-18 9.586695e-08 8 2.760174e-045.551115e-16 2.114194e-18 1.521063e-08 9 2.345751e-04 4.440892e-16 1.138412e-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)

带群约束的资产问题

现在,我们在模型组中增加了约束条件,要求投资者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,“选项”、选择);toc
用四码程序解决问题。Iter Fval原星双星互补0 7.212813e+00 1.227500e+02 3.539920e-01 5.253824e-03 1 7.004556e-03 2.901399e+00 8.367185e-03 2.2074600e -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.488333e -04 4.238343e -04 1.607718e-04 1.90989e -04 5.507829e- 04 1.146337e -07 1.772508e-09 6.817457e-08 7 3.010636e-04 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.342425e-12 2.814320e-08 10 2.102910e-04 2.839771e-10 8.189465e-13 1.037476e-08 11 2.060985e-04 6.713785e-11 1.936135e-13 2.8769500e -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个资产的随机生成数据集。生成一个随机相关矩阵(对称的,正半定的,对角线上有1)画廊函数。

重置随机流以获得再现性。

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

创建随机数据

产生在-0.1和0.4之间的平均回报。

A = -0.1;B = 0.4;means = 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);

加载相关矩阵,该矩阵是使用关联= 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。客观的;

包括变量之和为1且平均收益大于的约束r

Sumcons = sum(x) = 1;portprob2.Constraints。Sumcons = Sumcons;Averagereturn = dot(mean_return,x) >= r;portprob2.Constraints。平均回报=平均回报;

解决1000资产问题

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

tix3 = solve(portprob2,“选项”、选择);toc
用四码程序解决问题。Iter Fval Primal infas Dual infas 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.850016e -04 1.852958e-06 1.023292e -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.574980e-18 1.037370e-09 6 1.980189e-05 8.881784e-16 9.419006e-19 8.465558e-11满足约束条件的最小发现值。由于目标函数在可行方向上不减小,优化完成到最优性容限范围内,约束满足到约束容限范围内。运行时间为5.070618秒。

总结

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

通过使用金融工具箱™中专门为投资组合优化设计的功能,可以进行更详细的分析。

相关的话题