主要内容

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

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

二次模型

假设一个投资组合包含$ 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'

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

Covariance = 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(portprobb,“选项”、选择);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)

具有组约束的资产问题

现在,我们向模型组添加了一些约束条件,要求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”'相关性');

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

Covariance = 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 innas互补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.852958e-06 1.023291e-08 1.170562e-07 4 8.490176e-05 7.650016e-08 7.048637e-09 5 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™的产品组合优化的功能,可以更具精细分析。

相关的话题