投资组合优化的二次规划,基于问题
这个例子展示了如何使用基于问题的方法来解决投资组合优化问题。关于基于求解器的方法,请参见投资组合优化问题的二次规划,基于求解器.
二次模型
假设一个投资组合包含不同的资产。资产收益率随机变量是否有期望值.问题是求出哪个比例投资于每一项资产为了使风险最小化,受规定的最低预期回报率约束。
让表示资产收益率的协方差矩阵。
经典的均值-方差模型包括最小化投资组合风险,由
受制于一组约束。
预期回报不应低于投资组合回报率的最小值投资者想要的,
投资分数的总和这些加起来应该是1,
作为分数(或百分比),它们应该是0到1之间的数字,
由于最小化投资组合风险的目标是二次的,而约束是线性的,因此所得到的优化问题是一个二次规划,或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].
我们加载数据集,然后为基于问题的方法设置约束。在这个数据集中,回报率范围:-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。客观的;
变量的和是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。这些资产组中的每一组都可以是不同的行业,例如技术、汽车和制药。捕获这个新需求的约束是
向现有等式添加组约束。
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秒。
总结
这个例子说明了如何在投资组合优化问题上使用基于问题的方法,并展示了算法在不同规模的二次问题上的运行时间。
通过使用金融工具箱™中专门为投资组合优化设计的功能,可以进行更详细的分析。