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 optimización de carteras, basada en problemas

Este ejemplo muestra cómo resolver problemas de optimización de cartera utilizando el enfoque basado en problemas. Para el enfoque basado en el solucionador, consulte.Programación cuadrática para problemas de optimización de carteras, basada en Solver

El modelo cuadrático

Supongamos que una cartera contiene 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 para el enfoque basado en problemas. 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 

Crear problema de optimización, objetivo y restricciones

Cree un problema de optimización para la minimización.

portprob = optimproblem; 

Cree una variable vectorial de optimización con elementos.'x'nAssets Esta variable representa la fracción de riqueza invertida en cada activo, por lo que debe estar entre 0 y 1.

x = optimvar('x',nAssets,'LowerBound',0,'UpperBound',1); 

La función objetiva es.1/2*x'*Covariance*x Incluya este objetivo en el problema.

objective = 1/2*x'*Covariance*x; portprob.Objective = objective; 

La suma de las variables es 1, lo que significa que se invierte toda la cartera. Exprese esto como una restricción y colóquelo en el problema.

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

La rentabilidad media debe ser mayor que.r Exprese esto como una restricción y colóquelo en el problema.

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

Resolver 225-problema de activos

Establezca algunas opciones y llame al solucionador.

Configure las opciones para activar la visualización iterativa y establezca una tolerancia de terminación de Optimalidad más ajustada.

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

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

tic [x1,fval1] = solve(portprob,'Options',options); toc 
  Iter            Fval  Primal Infeas    Dual Infeas  Complementarity       0    7.212813e+00   1.227500e+02   1.195948e+00     2.217295e-03       1    8.160874e-04   3.615084e-01   3.522160e-03     2.250524e-05       2    7.220766e-04   3.592574e-01   3.500229e-03     3.378157e-05       3    4.309434e-04   9.991108e-02   9.734292e-04     2.790551e-05       4    4.734300e-04   5.551115e-16   7.771561e-16     4.242216e-06       5    4.719034e-04   6.661338e-16   3.122502e-16     8.002618e-07       6    3.587475e-04   4.440892e-16   3.035766e-18     3.677066e-07       7    3.131814e-04   8.881784e-16   3.686287e-18     9.586695e-08       8    2.760174e-04   7.771561e-16   1.463673e-18     1.521063e-08       9    2.345751e-04   1.110223e-15   1.138412e-18     4.109608e-09      10    2.042487e-04   1.221245e-15   1.084202e-18     6.423267e-09      11    1.961775e-04   1.110223e-16   9.757820e-19     6.068329e-10      12    1.949281e-04   4.440892e-16   9.215718e-19     4.279951e-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.292806 seconds. 

Resultados de trazado.

plotPortfDemoStandardModel(x1.x) 

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.

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; 

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

tic [x2,fval2] = solve(portprob,'Options',options); toc 
  Iter            Fval  Primal Infeas    Dual Infeas  Complementarity       0    7.212813e+00   1.227500e+02   3.539920e-01     5.253824e-03       1    7.004556e-03   2.901399e+00   8.367185e-03     2.207460e-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.486333e-04       4    4.238346e-04   9.005778e-02   2.597127e-04     1.607718e-04       5    3.695008e-04   1.909891e-04   5.507829e-07     1.341881e-05       6    3.691407e-04   6.146337e-07   1.772508e-09     6.817457e-08       7    3.010636e-04   7.691892e-08   2.218223e-10     1.837302e-08       8    2.669065e-04   1.088252e-08   3.138350e-11     5.474712e-09       9    2.195767e-04   8.122574e-10   2.342425e-12     2.814320e-08      10    2.102910e-04   2.839773e-10   8.189470e-13     1.037476e-08      11    2.060985e-04   6.713696e-11   1.936133e-13     2.876950e-09      12    2.015107e-04   0.000000e+00   8.131516e-19     1.522226e-10      13    2.009670e-04   4.440892e-16   8.673617e-19     5.264375e-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.162406 seconds. 

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

plotPortfDemoGroupModel(x1.x,x2.x); 

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 solucionador en un problema mayor, usaremos un conjunto de datos generado aleatoriamente de 1000 activos. 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 

Crear datos aleatorios

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

a = -0.1; b = 0.4; mean_return = a + (b-a).*rand(nAssets,1); r = 0.15;                                     % desired return 

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); 

Cargue la matriz de correlación, que se generó mediante.Correlation = gallery('randcorr',nAssets) (Generar una matriz de correlación de este tamaño toma un tiempo, así que cargue el pregenerado en su lugar.)

load('correlationMatrixDemo.mat','Correlation'); 

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

Covariance = Correlation .* (stdDev_return * stdDev_return'); 

Crear problema de optimización, objetivo y restricciones

Cree un problema de optimización para la minimización.

portprob2 = optimproblem; 

Cree la variable vectorial de optimización con elementos.'x'nAssets

x = optimvar('x',nAssets,'LowerBound',0,'UpperBound',1); 

Incluya la función objetiva en el problema.

objective = 1/2*x'*Covariance*x; portprob2.Objective = objective; 

Incluya las restricciones que la suma de las variables es 1 y la rentabilidad promedio es mayor que.r

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

Resolver 1000-problema de activos

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

tic x3 = solve(portprob2,'Options',options); toc 
  Iter            Fval  Primal Infeas    Dual Infeas  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.802721e-05       3    1.118804e-04   1.852958e-06   1.023291e-08     1.170562e-07       4    8.490176e-05   7.650016e-08   4.224702e-10     7.048637e-09       5    3.364597e-05   4.440892e-16   3.062871e-18     1.037370e-09       6    1.980189e-05   2.220446e-16   8.876905e-19     8.465558e-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.913357 seconds. 

Resumen

En este ejemplo se ilustra cómo utilizar el enfoque basado en problemas en un problema de optimización de carteras y se muestra el algoritmo de ejecución de los tiempos de las dificultades cuadráticas de diferentes tamaños.

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™.

Temas relacionados