主要内容

对产品组合优化的二次编程,基于问题

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

二次模型

假设一个投资组合包含$ n $不同的资产。资产收益率我美元是带有期望值的随机变量吗$ m_i $.问题是找到什么小部分$ x_i $投资每种资产我美元为了使风险最小化,在规定最低期望收益率的前提下。

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

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

$$ \ frac {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,\; \; \;我= 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%)。

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

加载('port5.mat''相关性'“stdDev_return”'意思是_return'

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

协方差= Correlation .* (stdDev_return * stdDev_return');nAssets =元素个数(mean_return);r = 0.002;%资产数量和期望的回报

创建优化问题,目标和约束

为最小化创建一个优化问题。

portprob = OptimProblem;

创建一个优化向量变量“x”nAssets元素。这个变量表示投资于每种资产的财富比例,所以应该在0到1之间。

x = optimvar (“x”nAssets,下界的0,'上行'1);

目标函数是协方差1/2 * x ' * * x.将此目标包括在问题中。

协方差目标= 1/2 * x ' * * x;portprob。目标=目标;

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

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

平均回报必须大于R..将其表示为约束,并将其置于问题中。

= dot(mean_return,x) >= r;portprob.Constraints.averagereturn = averagereturn;

解决225 -资产问题

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

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

选择= optimoptions (“quadprog”“显示”“通路”“TolFun”,1E-10);

调用求解器和测量时钟时间。

Tic [x1,fval1] = solve(portprob,“选项”、选择);toc
ITER FVAL原始Infeas双Infeas互补0 7.212813e + 00 1.227500e + 02 1.195948e + 00 2.217295e-03 8.160874e 1-04 3.615084e-01 3.522160e-03 2.250524e-05 7.220766e 2-04 3.592574e-013.378157E-05 3 4.309434E-04 9.734292S-04 2.790551C-04 4.734292C-04 4.734300C-04 5.551115C-04 5.551115CE-16 7.771561C-16 7.771561C-16 7.771561C-16 4.242216CE-16 4.2422160-16 4.242216CE-06 5 4.719034E-04-16 3.122502E-16 8.002618C-07 6 3.587475E-16 3.440892C-16 3.035766E-18 3.677066C-18 3.131814CE-04 8.8817890-16 3.686287E-18 9.586287E-18 9.586695C-18 9.586695E-18 9.586695E-18 9.586695E-08 8 2.760174C-08 8 2.770174E-04 7.7715612-16 1.463673E-18 1.521063E-08 9 2.345751E-04 1.110223E-15 1.138412C-18 4.1096080-09 10 2.096080-04 1.222450-15 1.08425E-15 1.084202O-18 6.423267E-18 6.423267E-09 11 1.961775E-04 1.110223 1.110223E-16 9.757820E-19 6.068329E-10 12 1.949281E-04 4.440892C-16 9.215718E-19 4.279951E-12 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 PRIMAL INFEAS双INFEAS互补0 7.212813E + 00 1.227500E-02 3.539920E-01 5.2539920E-03 1 7.004556E-03 2.901399C-03 2.901399C-03 2.901399C-03 2.207460E-03 2.207460E-03 2 9.1819620-04 4.095630E-04 4.095630E-04 4.095630E-04 4.095630E-04 4.095630E-04 4.095630E-04 4.095630E-04 4.095630E-04 4.095630E-011.181116E-03 3.749424E-04 3 7.515047E-04 3.567918E-01 1.028932E-01 1.486333E-04 4.238333E-04 4.238333E-04 9.005778C-04 9.005778E-02 2.597127E-04 1.6077127E-04 1.607718E-04 5 3.695008E-04 1.907718E-04 5 3.695008E-04 3.695008E-04 1.907718E-04 5 3.695008E-04 3.695008E-04-04 5.507829E-07 1.3418829E-05 6 3.691407E-04 6.146337E-07 1.772508C-09 6.817457E-09 6.817457E-09 7.010636C-04 7.691892C-04 7.691836E-04 7.691892C-08 2.2181892C-08 2.218223E-10 1.837302C-10 1.837302E-08 8 2.669065E-04 1.088252-04-08 3.138350E-11 5.474712E-09 9 2.195767E-04 8.122574C-10 2.342425C-12 2.814320E-08 10 2.102910E-04 2.839773E-10 8.189773C-10 8.189470E-13 1.037476C-08 11 2.060985C-04E-11 1.936133E-13 2.876950E-09 12 2.015107E-04 0.000000E + 00 8.131516E-19 1.522226E-19 1.522226E-10 13 2.009670E-04 4.440892C-16 8.673617E-19 5.264375E -13最低限度发现约束。优化完成是因为目标函数在可行方向上是不递减的,到最优公差的值以内,并且约束满足到约束公差的值以内。经过时间为0.162406秒。

绘图结果,叠加在前一个问题的结果上。

plotPortfDemoGroupModel (x1.x x2.x);

到目前为止的结果摘要

我们从第二个条形图中看到,由于额外的组约束,投资组合现在比第一个投资组合更均匀地分布在三个资产组中。这种施加的多样化也导致风险略有增加,如目标函数(参见标记为“F(x)”的迭代显示中的迭代显示中的迭代迭代)所测量的风险。

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

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

重置随机流以进行再现性。

RNG(0,'twister');nAssets = 1000;%所需资产数量

创建随机数据

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

a = -0.1;B = 0.4;mean_return = a +(b-a)。* rand(尼索特,1);r = 0.15;%想要回报

在0.08和0.6之间产生返回的标准偏差。

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

加载相关矩阵,使用相关性=画廊('randcorr',尼索特).(生成这种大小的相关矩阵需要一段时间,所以加载预生成的矩阵。)

加载(“correlationMatrixDemo.mat”'相关性');

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

协方差= Correlation .* (stdDev_return * stdDev_return');

创建优化问题,目标和约束

为最小化创建一个优化问题。

portprob2 = OptimProblem;

创建优化向量变量“x”nAssets元素。

x = optimvar (“x”nAssets,下界的0,'上行'1);

将目标函数纳入问题。

协方差目标= 1/2 * x ' * * x;portprob2。目标=目标;

包含变量之和为1且平均收益率大于的约束条件R.

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

解决1000 -资产问题

调用求解器和测量时钟时间。

Tic x3 = solve(portprob2,“选项”、选择);toc
Iter Fval Primal infas Dual infas互补性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.802721e-05 3 1.118804e-04 1.85295e -06 1.023291e-08 1.170562e-07 4 8.490176e-05 7.224702e -10 7.048637e-09 3.364597e-05 4.440892e-163.062871e-18 1.037370e-09 6 1.980189e-05 2.220446e-16 8.876905e-19 8.465558e-11找到满足约束的最小值。优化完成是因为目标函数在可行方向上是不递减的,到最优公差的值以内,并且约束满足到约束公差的值以内。经过时间是0.913357秒。

总结

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

通过使用专门设计用于Financial Toolbox™的产品组合优化的功能,可以更具精细分析。

相关的话题