这个例子展示了如何使用基于问题的方法来解决投资组合优化问题。有关基于求解器的方法,请参阅基于求解的组合优化问题,二次规划。
假设一个投资组合包含不同的资产。资产回报率是一个带有期望值的随机变量吗。问题是求什么分数投资于每一项资产为了把风险降到最低,必须达到规定的最低预期回报率。
让表示资产收益率的协方差矩阵。
经典的均值-方差模型由最小化投资组合风险构成
受制于一组约束条件。
预期回报率应不低于投资组合的最低回报率投资者希望,
投资部分之和的总和应该是1,
由于是分数(或百分比),它们应该是0到1之间的数字,
由于最小化投资组合风险的目标是二次的,且约束是线性的,因此最终的优化问题是二次规划,即QP。
现在让我们用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”)
计算从相关矩阵的协方差矩阵。
* (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;
设置一些选项,并调用解决程序。
设置选项中打开迭代显示屏上,并设置严格的最优终止宽容。
选项= 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)
我们现在增加了模型组的约束,要求投资者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] =解(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资产随机生成的数据集。我们使用。生成一个随机相关矩阵(对称的、正半定的、对角线上的)画廊
功能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;
调用求解器并测量挂钟时间。
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™中专门为投资组合优化设计的特性,可以进行更详细的分析。