Esta página aún no se ha traducido para esta versión. Puede ver la versión más reciente de esta página en inglés.

Programación cuadrática para problemas de optimización de carteras, basada en Solver

Este ejemplo muestra cómo resolver problemas de optimización de carteras utilizando el algoritmo de programación cuadrática de punto interior.quadprog La función pertenece a Optimization Toolbox™.quadprog

Las matrices que definen los problemas en este ejemplo son densas; sin embargo, el algoritmo de punto interior en también puede explotar la dispersión en las matrices de problemas para aumentar la velocidad.quadprog Para ver un ejemplo disperso, consulte.Gran programa cuadrático disperso con algoritmo de punto interior

El modelo cuadrático

Supongamos que hay diferentes activos. La tasa de devolución del activo es una variable aleatoria con valor esperado . El problema es encontrar qué fracción invertir en cada activo para minimizar el riesgo, sujeto a una tasa de rentabilidad esperada mínima.

Dejar denotan la matriz de covarianza de las tasas de devoluciones de activos.

El modelo de media-varianza clásico consiste en minimizar el riesgo de la cartera, medido por

sujeto a un conjunto de restricciones.

El rendimiento esperado no debe ser menor que una tasa mínima de devolución de la cartera que el inversor desea,

la suma de las fracciones de inversión debe sumar un total de uno,

y, siendo fracciones (o porcentajes), deben ser números entre cero y uno,

Dado que el objetivo de minimizar el riesgo de la cartera es cuadrático, y las restricciones son lineales, el problema de optimización resultante es un programa cuadrático o QP.

225-problema de activos

Ahora resolvamos el QP con 225 activos. El conjunto de datos es de la biblioteca OR [Chang, T.-J., Meade, N., Beasley, J.E. y Sharaiha, Y.M., "heurística para la optimización de la cartera restringida de cardinalidad" ordenadores y operaciones Research 27 (2000) 1271-1302].

Cargamos el conjunto de datos y, a continuación, configuramos las restricciones en un formato esperado.quadprog En este conjunto de datos, las tasas de retorno oscilan entre-0,008489 y 0,003971; recogemos la devolución deseada en el medio, por ejemplo, 0,002 (0,2 por ciento).

Cargue el DataSet almacenado en un archivo MAT.

load('port5.mat','Correlation','stdDev_return','mean_return') 

Calcule la matriz de covarianza de la matriz de correlación.

Covariance = Correlation .* (stdDev_return * stdDev_return'); nAssets = numel(mean_return); r = 0.002;     % number of assets and desired return Aeq = ones(1,nAssets); beq = 1;              % equality Aeq*x = beq Aineq = -mean_return'; bineq = -r;           % inequality Aineq*x <= bineq lb = zeros(nAssets,1); ub = ones(nAssets,1); % bounds lb <= x <= ub c = zeros(nAssets,1);                        % objective has no linear term; set it to zero 

Seleccione el algoritmo de punto interior en Quadprog

Para resolver el QP utilizando el algoritmo de punto interior, configuramos el algoritmo de opción en ' interior-punto-convexo '.

options = optimoptions('quadprog','Algorithm','interior-point-convex'); 

Resolver 225-problema de activos

Ahora se establecen algunas opciones adicionales y se llama al Solver quadprog.

Establezca opciones adicionales: Active la visualización iterativa y establezca una tolerancia de terminación de Optimalidad más ajustada.

options = optimoptions(options,'Display','iter','TolFun',1e-10); 

Llame al solucionador y mida el tiempo de reloj de pared.

tic [x1,fval1] = quadprog(Covariance,c,Aineq,bineq,Aeq,beq,lb,ub,[],options); toc 
  Iter            Fval  Primal Infeas    Dual Infeas  Complementarity       0    2.384401e+01   2.253410e+02   1.337381e+00     1.000000e+00       1    1.338822e-03   7.394864e-01   4.388791e-03     1.038098e-02       2    1.186079e-03   6.443975e-01   3.824446e-03     8.727381e-03       3    5.923977e-04   2.730703e-01   1.620650e-03     1.174211e-02       4    5.354880e-04   5.303581e-02   3.147632e-04     1.549549e-02       5    5.181994e-04   2.651791e-05   1.573816e-07     2.848171e-04       6    5.066191e-04   9.285375e-06   5.510794e-08     1.041224e-04       7    3.923090e-04   7.619855e-06   4.522322e-08     5.536006e-04       8    3.791545e-04   1.770065e-06   1.050519e-08     1.382075e-04       9    2.923749e-04   8.850298e-10   5.252598e-12     3.858983e-05      10    2.277722e-04   4.436152e-13   2.627767e-15     6.204101e-06      11    1.992243e-04   2.224783e-16   2.092992e-18     4.391483e-07      12    1.950468e-04   4.453903e-16   7.767160e-19     1.429441e-08      13    1.949141e-04   1.333135e-15   8.459699e-19     9.731942e-10      14    1.949121e-04   8.894795e-16   6.938894e-18     2.209702e-12    Minimum found that satisfies the constraints.  Optimization completed because the objective function is non-decreasing in  feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance.  Elapsed time is 0.502086 seconds. 

Resultados de trazado.

plotPortfDemoStandardModel(x1) 

225-problema de activos con restricciones de grupo

Ahora añadimos a las restricciones de grupo modelo que requieren que el 30% del dinero del inversor tenga que invertirse en activos 1 a 75, 30% en activos 76 a 150, y 30% en activos 151 a 225. Cada uno de estos grupos de activos podría ser, por ejemplo, diferentes industrias como la tecnológica, automotriz y farmacéutica. Las restricciones que capturan este nuevo requisito se

Agregue restricciones de grupo a las ecualidades existentes.

Groups = blkdiag(ones(1,nAssets/3),ones(1,nAssets/3),ones(1,nAssets/3)); Aineq = [Aineq; -Groups];         % convert to <= constraint bineq = [bineq; -0.3*ones(3,1)];  % by changing signs 

Llame al solucionador y mida el tiempo de reloj de pared.

tic [x2,fval2] = quadprog(Covariance,c,Aineq,bineq,Aeq,beq,lb,ub,[],options); toc 
  Iter            Fval  Primal Infeas    Dual Infeas  Complementarity       0    2.384401e+01   4.464410e+02   1.337324e+00     1.000000e+00       1    1.346872e-03   1.474737e+00   4.417606e-03     3.414918e-02       2    1.190113e-03   1.280566e+00   3.835962e-03     2.934585e-02       3    5.990845e-04   5.560762e-01   1.665738e-03     1.320038e-02       4    3.890097e-04   2.780381e-04   8.328691e-07     7.287370e-03       5    3.887354e-04   1.480950e-06   4.436214e-09     4.641988e-05       6    3.387787e-04   8.425389e-07   2.523842e-09     2.578178e-05       7    3.089240e-04   2.707587e-07   8.110631e-10     9.217509e-06       8    2.639458e-04   6.586817e-08   1.973094e-10     6.509001e-06       9    2.252657e-04   2.225507e-08   6.666550e-11     6.783212e-06      10    2.105838e-04   5.811528e-09   1.740855e-11     1.967570e-06      11    2.024362e-04   4.130831e-12   1.237027e-14     5.924109e-08      12    2.009703e-04   3.122069e-15   1.361637e-17     6.353270e-10      13    2.009650e-04   6.665675e-16   1.387779e-17     1.596041e-13    Minimum found that satisfies the constraints.  Optimization completed because the objective function is non-decreasing in  feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance.  Elapsed time is 0.152400 seconds. 

Resultados de la trama, superpuestos a los resultados del problema anterior.

plotPortfDemoGroupModel(x1,x2); 

Resumen de resultados hasta ahora

Vemos en el gráfico de la segunda barra que, como resultado de las restricciones de grupo adicionales, la cartera está ahora más uniformemente distribuida entre los tres grupos de activos que la primera cartera. Esta diversificación impuesta también dio lugar a un ligero aumento del riesgo, medido por la función objetiva (ver columna etiquetada como "f (x)" para la última iteración en la pantalla iterativa para ambas corridas).

1000-problema de activos utilizando datos aleatorios

Para mostrar cómo se comporta el algoritmo de punto interior en un problema mayor, usaremos un conjunto de datos generado aleatoriamente de 1000 activos.quadprog Generamos una matriz de correlación aleatoria (simétrica, positiva-semidefinida, con unos en diagonal) utilizando la función en MATLAB®.gallery

Restablezca el flujo aleatorio para reproducibilidad.

rng(0,'twister'); nAssets = 1000; % desired number of assets 

Genere medios de retornos entre-0,1 y 0,4.

a = -0.1; b = 0.4; mean_return = a + (b-a).*rand(nAssets,1); 

Genere desviaciones estándar de las devoluciones entre 0,08 y 0,6.

a = 0.08; b = 0.6; stdDev_return = a + (b-a).*rand(nAssets,1); % Correlation matrix, generated using Correlation = gallery('randcorr',nAssets). % (Generating a correlation matrix of this size takes a while, so we load % a pre-generated one instead.) load('correlationMatrixDemo.mat','Correlation'); % Calculate covariance matrix from correlation matrix. Covariance = Correlation .* (stdDev_return * stdDev_return'); 

Definir y resolver generado aleatoriamente 1000-problema de activos

Ahora definimos el problema estándar de QP (no hay restricciones de grupo aquí) y resolvemos.

r = 0.15;                                     % desired return Aeq = ones(1,nAssets); beq = 1;               % equality Aeq*x = beq Aineq = -mean_return'; bineq = -r;            % inequality Aineq*x <= bineq lb = zeros(nAssets,1); ub = ones(nAssets,1);  % bounds lb <= x <= ub c = zeros(nAssets,1);                         % objective has no linear term; set it to zero 

Llame al solucionador y mida el tiempo de reloj de pared.

tic x3 = quadprog(Covariance,c,Aineq,bineq,Aeq,beq,lb,ub,[],options); toc 
  Iter            Fval  Primal Infeas    Dual Infeas  Complementarity       0    7.083800e+01   1.142266e+03   1.610094e+00     1.000000e+00       1    5.603619e-03   7.133717e+00   1.005541e-02     9.857295e-02       2    1.076070e-04   3.566858e-03   5.027704e-06     9.761758e-03       3    1.068230e-04   2.513041e-06   3.542286e-09     8.148386e-06       4    7.257177e-05   1.230928e-06   1.735068e-09     3.979480e-06       5    3.610589e-05   2.634706e-07   3.713780e-10     1.175001e-06       6    2.077811e-05   2.562892e-08   3.612554e-11     5.617206e-07       7    1.611590e-05   4.711771e-10   6.641534e-13     5.652911e-08       8    1.491953e-05   4.924144e-12   6.940713e-15     2.427880e-09       9    1.477930e-05   1.310341e-13   1.850259e-16     2.454705e-10      10    1.476910e-05   6.661338e-16   9.034300e-19     2.786060e-11    Minimum found that satisfies the constraints.  Optimization completed because the objective function is non-decreasing in  feasible directions, to within the value of the optimality tolerance, and constraints are satisfied to within the value of the constraint tolerance.  Elapsed time is 0.698769 seconds. 

Resumen

Este ejemplo ilustra cómo utilizar el algoritmo de punto interior en un problema de optimización de cartera, y muestra el algoritmo de tiempo de ejecución en problemas cuadráticos de diferentes tamaños.quadprog

Los análisis más elaborados son posibles mediante el uso de características diseñadas específicamente para la optimización de carteras en Financial Toolbox™.

Consulte también