Optimización de Portafolio Utilizando Critical Line Algorithm

Una implementación para el mercado de valores mexicano del documento. ** *An Open-Source Implementation of the Critical-Line Algorithm for Portfolio Optimization.* ** David H. Bailey, Marcos López de Prado.

**Abstract**: *Portfolio optimization is one of the problems most frequently encountered by financial practitioners. The main goal of this paper is to fill a gap in the literature by providing a well-documented, step-by-step open-source implementation of Critical Line Algorithm (CLA) in a scientific language. The code is implemented as a Python class object, which allows it to be imported like any other Python module, and integrated seamlessly with pre-existing code. We discuss the logic behind CLA following the algorithm’s decision flow. In addition, we developed several utilities that support finding answers to recurrent practical problems. We believe this publication will offer a better alternative to financial practitioners, many of whom are currently relying on generic- purpose optimizers which often deliver suboptimal solutions. The source code discussed in this paper can be downloaded at the authors’ websites (see contact details).*

Resumen conceptual del papper

En este trabajo se aborda el problema de optimización planteandolo como un problema de minimización del riesgo del portafolio, expresado como la desviación estándar de los rendimientos, sujeto a un rendimiento objetivo. Normalmente se plantean 2 restricciones, la primera es estableciendo un límite superior e inferior de los pesos (o participaciones) individuales de cada activo dentro del portafolio, y la segunda es la condición de igualdad de la suma de los pesos debe de ser 1 (todo el capital disponible debe de ser asignado).

CLA es el único algoritmo específicamente diseñado para problemas de optimización de portafolios de inversión con restricciones de igualdad. Se establece que lo anterior garantiza que el algoritmo converge y logra la solución exacta después de un número dado de iteraciones. Más aún, CLA no sólo realiza el proceso para un sólo portafolio si no que deriva la completa frontera eficiente. En contraste con los algoritmos de optimización basados en gradientes que dependen de un vector semilla inicial que podrán converger a un óptimo local, pero son altamente sensitivos a las restricciones de frontera y requieren sean ejecutados de manera independiente para cada portafolio miembro de la frontera eficiente.

CLA fue desarrollado por Harry Markowitz para optimizar funciones generales cuadráticas sujetas a restricciones lineales de igualdad, de manera que se establece CLA resuelve cualquier problema de optimización de portafolios que pueda ser representado en tales términos, como lo es el problema de la Frontera Eficiente Estandar. En otras palabras, si el problema de optimización del portafolio no puede ser representado en una forma cuadrática entonces éste no puede resolverse utilizando el CLA.

Resolución de un problema de programación cuadrática resuelto utilizando CLA

**Problema** Considera un universo de $n$ activos de inversión con observaciones (rendimientos) caracterizadas por un vector de medias $μ$, de tamaño $nx1$, y una matriz de covarianza de tamaño $nxn$ denotada por $Σ$. El vector de medias $μ$ y la matriz de covarianza $Σ$ están calculados en observaciones homogéneamente medidas en el tiempo. En el caso de activos financieros clasificados como de capital, materias primas y tipos de cambio, el rendimiento continuamente compuesto (logaritmico) es considerado como observaciones homogéneamente medidas en el tiempo, para el caso de activos financieros del tipo renta fija, los cambios en el yield-to-maturity son considerados como tal. Finalmente en el caso de derivados financieros los cambios en la volatilidad implícita futura móvil.

De manera que para resolver un problema de programación cuadrática sujeto a restricciones lineales en desigualdades y a una restricción lineal en igualdades se plantea la siguiente nomenclatura:

  • N = {1,2,3 ... ,n} el conjunto de índices para enumerar el universo de activos de inversión.
  • $ω$ el vector $nx1$ de participaciones, el cual es la variable a optimizar.
  • $l$ el vector $nx1$ de límites inferiores de participación, para $ω_i ≥ l_i , ∀i ∈ N$
  • $u$ el vector $nx1$ de límites inferiores de participación, para $ω_i ≤ u_i , ∀i ∈ N$
  • $F ⊆ N$ es el subconjunto de activos libres, donde $l_i < ω_i < u_i$. En palabras, aquellos activos que no recaen en sus respectivos limites. $F$ tiene una longitud de $1 ≤ k ≤ n$
  • $B ⊂ N$ es el subconjunto de pesos que recaen en uno de los límites. Por definición, $B ∪ F = N$

De tal manera que comensamos a construir $μ$ y $Σ$ como un arreglo y una matriz, respectivamente.

$$ Σ=\begin{bmatrix} { Σ }_{ F } & { Σ }_{ FB } \\ { Σ }_{ BF } & { Σ }_{ B } \end{bmatrix}\quad ,\quad μ=\left[ \frac { { μ }_{ F } }{ { μ }_{ B } } \right] \quad ,\quad ω=\left[ \frac { { ω }_{ F } }{ ω_{ B } } \right] $$

We have implemented CLA as a class object in Python programming language. The only external library needed for this core functionality is Numpy

The inputs are:

  • mean: The (nx1) vector of means.
  • covar: The (nxn) covariance matrix.
  • lB: The (nx1) vector that sets the lower boundaries for each weight.
  • uB: The (nx1) vector that sets the upper boundaries for each weight.

And the outputs are:

  • w: A list with the (nx1) vector of weights at each turning point.
  • l: The value of λ at each turning point.
  • g: The value of γ at each turning point.
  • f: For each turning point, a list of elements that constitute F.

In [ ]: