La cópula gaussiana y la crisis de 2008, explicada con Python | Quantum Club

Etapa 3 de 4 · Nivel hedge fund

La cópula gaussiana y la crisis de 2008: la fórmula que hundió Wall Street

Qué es una cópula, cómo la cópula gaussiana de David Li se usó para valorar CDO de hipotecas, por qué ignora las caídas conjuntas y qué papel tuvo en la crisis financiera de 2008. Con simulaciones en Python.

En este artículo
  1. El problema: la correlación entre impagos
  2. Qué es una cópula
  3. El fallo: la cópula gaussiana no ve las caídas conjuntas
  4. Del par de activos a una cartera de hipotecas
  5. Qué pasó en 2008
  6. Resumen

En febrero de 2009, en plena crisis, la revista Wired publicó un artículo de Felix Salmon con un titular inolvidable: «Receta para el desastre: la fórmula que mató a Wall Street». La fórmula era la cópula gaussiana, y su autor, un actuario y quant llamado David X. Li.

El titular exagera, como todos los buenos titulares. Pero la historia de la cópula gaussiana es la mejor lección que conozco sobre cómo un modelo elegante, usado fuera de sus límites y con los incentivos equivocados, puede contribuir a una catástrofe. Vamos a entenderla con matemáticas y con simulaciones.

El problema: la correlación entre impagos

Antes de la crisis, los bancos empaquetaban miles de hipotecas y otros préstamos en productos llamados CDO (collateralized debt obligations). El CDO se dividía en tramos:

  • El tramo equity absorbía las primeras pérdidas. Muy arriesgado, muy rentable.
  • Los tramos intermedios solo perdían si los impagos superaban cierto nivel.
  • El tramo senior, el más grande, solo perdía si una parte enorme de los préstamos impagaba a la vez. Por eso recibía la calificación AAA, la misma que la deuda de los países más solventes.

Valorar el tramo senior se reduce a una pregunta: ¿qué probabilidad hay de que muchos préstamos impaguen a la vez? Y eso depende de la correlación entre impagos: si son independientes, que impague un 30 % de la cartera es casi imposible; si están muy correlacionados, no tanto.

Qué es una cópula

Una cópula es una forma de separar dos cosas: cómo se comporta cada variable por separado (sus distribuciones marginales) y cómo dependen entre sí. El teorema de Sklar (1959) garantiza que cualquier distribución conjunta se puede escribir así:

\[ F(x_1, \dots, x_n) = C\big(F_1(x_1), \dots, F_n(x_n)\big) \]

donde las \( F_i \) son las marginales y \( C \) es la cópula, que solo se ocupa de la dependencia. La cópula gaussiana toma la dependencia de una normal multivariante con correlación \( \rho \):

\[ C_\rho(u, v) = \Phi_\rho\!\left(\Phi^{-1}(u),\, \Phi^{-1}(v)\right) \]

La gran aportación de Li, en su artículo de 2000 On Default Correlation: A Copula Function Approach, fue usarla para los tiempos de impago: cada préstamo tiene su propia probabilidad de impago, que se puede sacar de los precios de mercado, y la cópula gaussiana los une con un solo parámetro de correlación. Sencillo, rápido y fácil de calibrar. La industria lo adoptó en masa: bancos, agencias de calificación e inversores.

El fallo: la cópula gaussiana no ve las caídas conjuntas

La cópula gaussiana tiene una propiedad matemática con consecuencias enormes: su dependencia en las colas es cero. Formalmente, la probabilidad de que una variable esté en su peor extremo sabiendo que la otra lo está tiende a cero cuanto más extremo es el extremo:

\[ \lambda_L = \lim_{q \to 0} P\left(U_2 \le q \mid U_1 \le q\right) = 0 \quad \text{(cópula gaussiana, } \rho < 1\text{)} \]

Dicho en cristiano: aunque la correlación sea alta, la cópula gaussiana dice que los desastres simultáneos son rarísimos. En la realidad es al revés: en una crisis todo cae a la vez. La cópula t de Student, en cambio, tiene dependencia positiva en las colas:

\[ \lambda_L = 2\, t_{\nu+1}\!\left(-\sqrt{\frac{(\nu+1)(1-\rho)}{1+\rho}}\right) \]

Con \( \rho = 0{,}5 \) y \( \nu = 4 \) grados de libertad, \( \lambda_L \approx 0{,}25 \): cuando un activo sufre una caída extrema, hay un 25 % de probabilidad de que el otro también. Veámoslo simulando las dos cópulas con la misma correlación:

Python
import numpy as np
from scipy import stats

rng = np.random.default_rng(5)
n, rho, nu = 100_000, 0.5, 4

L = np.linalg.cholesky([[1, rho], [rho, 1]])
Z = rng.standard_normal((n, 2)) @ L.T               # normales correlacionadas

u_gauss = stats.norm.cdf(Z)                         # cópula gaussiana
W = rng.chisquare(nu, n) / nu
u_t = stats.t.cdf(Z / np.sqrt(W)[:, None], nu)      # cópula t: mismo rho, colas conjuntas

for nombre, u in [("Gaussiana", u_gauss), ("t de Student", u_t)]:
    ambos = ((u[:, 0] < 0.01) & (u[:, 1] < 0.01)).mean()
    print(f"{nombre:<13} P(los dos en su peor 1 %) = {ambos:.3%}")
print(f"Si fueran independientes:        {0.01 ** 2:.3%}")
0 0,5 1 Activo 1 (percentil) 0 0,5 1 Activo 2 (percentil) 25 caídas extremas conjuntas Cópula gaussiana 0 0,5 1 Activo 1 (percentil) 33 caídas extremas conjuntas Cópula t de Student
2.000 simulaciones de cada cópula con la misma correlación (ρ = 0,5). En naranja, los casos en que los dos activos están a la vez en su peor 5 %. La cópula t concentra muchos más desastres conjuntos en la esquina.

Del par de activos a una cartera de hipotecas

Para una cartera grande se usa la versión de un factor (el modelo de Vasicek, que es también la base de los requisitos de capital de Basilea). Cada préstamo impaga si su «salud» \( X_i \) cae por debajo de un umbral, y esa salud depende de un factor común \( M \) (la economía, el precio de la vivienda) y de un factor propio \( \varepsilon_i \):

\[ X_i = \sqrt{\rho}\, M + \sqrt{1-\rho}\, \varepsilon_i, \qquad \text{impago si } X_i < \Phi^{-1}(p) \]

Simulemos una cartera de 100 préstamos, cada uno con un 5 % de probabilidad de impago y \( \rho = 0{,}3 \), y comparemos la probabilidad de que impaguen 30 o más, que es el tipo de desastre que tendría que ocurrir para que el tramo senior perdiera:

Python
def impagos(copula, n_sim=200_000, n=100, pd=0.05, rho=0.3, nu=4, seed=2):
    rng = np.random.default_rng(seed)
    M = rng.standard_normal(n_sim)                     # factor común (la economía)
    if copula == "gaussiana":
        umbral = stats.norm.ppf(pd)
        p_cond = stats.norm.cdf((umbral - np.sqrt(rho) * M) / np.sqrt(1 - rho))
    else:                                              # cópula t de un factor
        W = rng.chisquare(nu, n_sim) / nu              # shock común a la volatilidad
        umbral = stats.t.ppf(pd, nu)
        p_cond = stats.norm.cdf((umbral * np.sqrt(W) - np.sqrt(rho) * M) / np.sqrt(1 - rho))
    return rng.binomial(n, p_cond)                     # impagos en cada escenario

for c in ["gaussiana", "t"]:
    d = impagos(c)
    print(f"Cópula {c:<9} impagos medios: {d.mean():.1f}   P(≥ 30 impagos) = {(d >= 30).mean():.2%}")

Las dos cópulas dan el mismo número medio de impagos (5 de cada 100) y usan la misma correlación. Pero la t da más del doble de probabilidad de un desastre de 30 impagos, y la diferencia crece cuanto más extremo es el escenario.

0 10 20 30 40 50 60 Impagos en una cartera de 100 préstamos (prob. individual 5 %) 1·10⁻5 1·10⁻4 1·10⁻3 1·10⁻2 1·10⁻1 1 Probabilidad de ≥ k impagos donde pierde un tramo «AAA» Cópula gaussiana Cópula t (ν = 4)
Probabilidad de tener al menos k impagos en una cartera de 100 préstamos, en escala logarítmica. En el centro las dos cópulas coinciden; en la cola, justo donde se decide si un tramo «AAA» pierde, se separan.

Qué pasó en 2008

El modelo no fue el único culpable, ni mucho menos. Pero la forma en que se usó reunió varios errores a la vez:

  1. Correlaciones calibradas en tiempos tranquilos. Se estimaban con datos de pocos años, casi todos de precios de la vivienda al alza en EE. UU. En esos datos, los impagos de distintas regiones apenas estaban correlacionados.
  2. Un único número para toda la dependencia. Una sola \( \rho \), constante, para toda la cartera y para todos los escenarios, incluido el peor.
  3. Dependencia en las colas nula. Justo el escenario que importaba para los tramos senior, una caída nacional del precio de la vivienda, era el que el modelo consideraba casi imposible.
  4. Productos sobre productos. Se construyeron CDO con tramos de otros CDO (los «CDO al cuadrado»), en los que los errores de correlación se amplificaban.
  5. Incentivos. A los bancos les convenía crear tramos AAA, a las agencias les pagaban quienes emitían los productos y a los inversores les gustaba cobrar más que en un bono del Tesoro con la misma nota.

Cuando los precios de la vivienda cayeron en todo el país a la vez, los impagos dejaron de ser independientes. Tramos calificados como AAA sufrieron pérdidas que, según los modelos, no deberían haber ocurrido en miles de años.

La lección no es «las cópulas son malas». Las cópulas son una herramienta útil y se siguen usando. La lección es que todo modelo tiene supuestos, que los supuestos que más importan son los de las colas y que un único parámetro calibrado en una época tranquila no puede describir una crisis. El propio Li lo advirtió en 2005 en The Wall Street Journal: lo más peligroso es que la gente se crea todo lo que sale del modelo.

Resumen

  • Una cópula separa el comportamiento de cada variable de la dependencia entre ellas.
  • La cópula gaussiana de Li permitió valorar CDO con una sola correlación y se convirtió en el estándar de la industria.
  • Su defecto clave: dependencia en las colas nula. Subestima las caídas simultáneas.
  • La cópula t, con la misma correlación, da muchas más pérdidas extremas.
  • La crisis de 2008 combinó ese riesgo de modelo con correlaciones de tiempos tranquilos, productos complejos e incentivos perversos.

Diez años antes, LTCM ya había dejado muchas de estas lecciones. Con esto cierras la etapa más avanzada del recorrido. Solo queda el último paso: demostrarlo en una entrevista, con las preguntas que de verdad caen.

Fuentes

Quantum Pablo

Sobre Quantum Pablo

Físico de partículas y quant. Enseño finanzas cuantitativas en español desde la intuición y con código: más de 400 alumnos en más de 25 países se han formado en Quantum Club. También en YouTube e Instagram.

Etapa 3 de 4 · Nivel hedge fund

  1. 10Optimización de carteras de Markowitz y frontera eficiente en Python
  2. 11El modelo GARCH: cómo predecir la volatilidad (con Python)
  3. 12Pairs trading y cointegración en Python: de la idea al backtest
  4. 13El filtro de Kalman en trading: un hedge ratio que se adapta (con Python)
  5. 14Por qué tu backtest miente: sobreajuste y cómo evitarlo
  6. 15La cópula gaussiana y la crisis de 2008: la fórmula que hundió Wall Street
Ver el recorrido completo →