01 · Punto de partida
Del par a la nube p-dimensional
¿Una cartera con 5 activos correlacionados? ¿Tres sensores con ruido acoplado? ¿Puntos (x,y,z) con forma elipsoidal? El par del Tema 28 es el caso p = 2: el vector general pide un vector de medias μ y una matriz de covarianza Σ, y se genera con X = μ + LZ.
La pieza nueva es L, la raíz de Cholesky con Σ = LLᵀ: reparte correlación y escala a cada dimensión de un tiro, sin bucles por coordenada.
- ¿Por qué X = μ + LZ tiene media μ y covarianza Σ?
- ¿Cómo se lee L en 2D desde σ₁, σ₂ y ρ?
- ¿Qué valida un vector: medias, varianzas y qué más?
- ¿Qué rompe Σ y cómo se detecta antes de simular?
02 · Definición
Media, covarianza y elipse
Σ es simétrica con varianzas en la diagonal y covarianzas fuera: Σᵢⱼ = ρᵢⱼσᵢσⱼ. E[Xᵢ] = μᵢ, Var(Xᵢ) = Σᵢᵢ, Corr = Σᵢⱼ/√(ΣᵢᵢΣⱼⱼ). La nube 2D es una elipse centrada en μ con ejes dados por Σ.
Cholesky reparte
L triangular inferior mezcla las Z independientes con los pesos justos: cada fila arma una coordenada con su escala y su parte de correlación.
Elipse 1σ
El contorno {μ + L·u : |u| = 1} es la elipse teórica: contiene ≈ 39 % de los puntos 2D. Su inclinación es ρ, su tamaño son los σ.
Auditoría triple
Vector de medias ≈ μ, varianzas ≈ diagonal de Σ y correlaciones ≈ las pedidas. Una sola de las tres no alcanza.
| Caso (σ₁=1) | L fila 2 | Nube |
|---|---|---|
| ρ = 0, σ₂ = 1 | [0; 1,00] | Círculo: independencia isótropa |
| ρ = 0,7, σ₂ = 1 | [0,70; 0,71] | Elipse ↗ del Tema 28 |
| ρ = 0,5, σ₂ = 2 | [1,00; 1,73] | Elipse ↗ alta y ancha |
03 · Anatomía
Cholesky, validez y costo
- Cholesky una sola vez
- Factorizar Σ cuesta O(p³) pero se hace una vez; cada muestra cuesta O(p²) en el producto LZ más p normales base (Box-Muller/polar).
- Σ debe ser válida
- Simétrica y semidefinida positiva: varianzas ≥ 0 y |ρ| ≤ 1 en cada par, sin contradicciones globales. Si Cholesky falla (raíz negativa), Σ es imposible: revisar correlaciones.
- Orden y escala
- Estandarizar no cambia ρ pero sí la elipse: generar estándar y escalar por σᵢ equivale a L con σ. No permutar filas de L sin permutar μ y Σ.
- p grande
- Con cientos de dimensiones, Cholesky denso es pesado: usar estructura diagonal, bloques o rango bajo. El par 2D de este tema es el bloque constructor.
X = μ + LZ
Exacto y vectorial
Respeta μ y Σ por construcción lineal. La vía de las librerías para la normal multivariada.
Apilar marginales sueltas
Pierde la forma
Cada histograma calza pero la nube es redonda aunque Σ pida elipse: correlación ≈ 0 en vez de ρ.
04 · Dónde vuelan los vectores
Del punto al campo
- 1Carteras y riesgo.
Retornos correlacionados: el ρ conjunto mueve la cola del portafolio, no cada activo aislado.
- 2Sensores y medidas.
Ruido acoplado en varias señales con media μ y geometría Σ conocida.
- 3Puntos con forma.
Nubes elipsoidales, regiones de confianza y controles de calidad multivariados.
- 4Puente a cópulas.
Atar con Z correlacionadas y transformar cada margen con su inversa: vector no normal con dependencia normal. (Tema 28)
05 · Representación en Python
Bivariada completa con μ y Σ
Medias distintas, escalas distintas y ρ: el L 2×2 a mano más auditoría de vector completo.
Python en tu navegador. Llevá ρ a −0,6: la elipse debe girar a ↘ con las mismas varianzas.
import random
import math
random.seed(250)
mu1, mu2 = 2.0, -1.0
s1, s2, rho, N = 1.5, 0.5, 0.6, 8000
w = math.sqrt(max(0.0, 1 - rho * rho))
def vector_normal():
z1, z2 = random.gauss(0, 1), random.gauss(0, 1)
x = mu1 + s1 * z1
y = mu2 + s2 * (rho * z1 + w * z2)
return x, y
pares = [vector_normal() for _ in range(N)]
mx = sum(a for a, _ in pares) / N
my = sum(b for _, b in pares) / N
cov = sum((a-mx)*(b-my) for a, b in pares) / N
vx = sum((a-mx)**2 for a, _ in pares) / N
vy = sum((b-my)**2 for _, b in pares) / N
print("medias:", round(mx, 3), round(my, 3), "vs 2.0 -1.0")
print("vars:", round(vx, 3), round(vy, 3), "vs 2.25 0.25")
print("corr:", round(cov / math.sqrt(vx*vy), 3), "vs", rho)
Medias ≈ (2,−1), varianzas ≈ (2,25; 0,25) y corr ≈ 0,6. Si la var de Y da ≈ 1, olvidaste escalar por σ₂.
06 · Exploración
Laboratorio: elipse con σ₂ y ρ a mando
Movete ρ y σ₂ con N fijo (σ₁ = 1, μ = 0). La elipse amarilla es la teórica 1σ: se inclina con ρ y se estira con σ₂. El panel compara varianza y corr muestrales con las teóricas.
Nube N(0,Σ)
X = Z₁ · Y = σ₂(ρZ₁ + √(1−ρ²)Z₂)
Con ρ 0,6, σ₂ 1 y N 3000, elipse ↗ y var Y ≈ 1.
Dispersión (X,Y) en [−4,4]² con elipse 1σ. Probá σ₂ = 2 (alta) y ρ = −0,8 (↘).
Preguntas para explorar
- Con ρ = 0,6 y σ₂ = 1, ¿corr y var Y teóricas?
- Subí σ₂ a 2 con ρ fijo. ¿La elipse se estira en Y? ¿La corr cambia?
- Poné ρ = 0 con σ₂ = 2. ¿La nube se vuelve eje-alineada? ¿Qué elipse queda?
Ver respuestas sugeridas
- Corr 0,6 y var Y = 1.
- Sí se estira (var Y → 4); la corr sigue en 0,6: escala y vínculo son independientes.
- Sí: elipse eje-alineada de semiejes 1 y 2, sin inclinación. Independencia con escalas distintas.
07 · Comprensión
Confusiones frecuentes
«Escalo después con σ y listo»
Escalar Y por σ₂ después de mezclar es correcto solo si la mezcla usó varianza 1. Mezclar ya escalado duplica el factor: la var da σ₂⁴.
«Σ cualquiera vale»
Debe ser simétrica semidefinida positiva. Una Σ imposible rompe Cholesky: chequear antes de generar miles.
«Valido cada margen y alcanza»
Los histogramas no ven la elipse: validar medias, varianzas y correlaciones (o la Σ completa).
«Más dimensiones, mismo N»
La covarianza muestral tiene p(p+1)/2 números: con p = 10 son 55 y piden N ≫ p para estimarse sin ruido.
08 · Práctica guiada
Ejercicios con Python
Ejercicio 1: cartera de dos activos
μ = (0,01; 0,02), σ = (0,10; 0,20), ρ = 0,5, N = 8000 (semilla 251): verificá la Σ completa.
import random
import math
random.seed(251)
mu1, mu2, s1, s2, rho, N = 0.01, 0.02, 0.10, 0.20, 0.5, 8000
w = math.sqrt(1 - rho**2)
pares = []
for _ in range(N):
z1, z2 = random.gauss(0, 1), random.gauss(0, 1)
pares.append((mu1 + s1*z1, mu2 + s2*(rho*z1 + w*z2)))
mx = sum(a for a,_ in pares)/N
cov = sum((a-mx)*(b-sum(b for _,b in pares)/N) for a,b in pares)/N
print("cov:", round(cov, 4), "vs", round(rho*s1*s2, 4))
Ver solución razonada
Cov ≈ 0,01 (ρσ₁σ₂ = 0,5·0,1·0,2). La covarianza conjunta —no cada varianza— mueve el riesgo del portafolio.
Ejercicio 2: Σ imposible que avisa
Intentá Cholesky 2×2 con ρ = 1,5: el término √(1−ρ²) falla. Verificá que tu código lo rechaza en vez de generar NaN.
import math
for rho in [0.9, 1.0, 1.5]:
try:
w = math.sqrt(1 - rho**2)
print(rho, "ok, w =", round(w, 3))
except ValueError:
print(rho, "rechazada")
Ver solución
0,9 ok; 1,0 degenerada (recta, w = 0); 1,5 imposible. Validar ρ ∈ [−1,1] antes de factorizar.
Ejercicio 3: puntos uniformes vs elipse
Generá 3000 puntos U([−2,2]²) y 3000 N(0,Σ) con σ₂ = 2, ρ = 0,6: compará qué fracción cae en la elipse 1σ teórica.
Ver una posible respuesta
import random
import math
random.seed(253)
rho, s2, N = 0.6, 2.0, 3000
w = math.sqrt(1 - rho**2)
# inversa de L 2x2 con s1=1: u1 = x, u2 = (y/s2 - rho*x)/w
def en_elipse(x, y):
u1 = x
u2 = (y/s2 - rho*x)/w
return u1*u1 + u2*u2 <= 1
pares = []
for _ in range(N):
z1, z2 = random.gauss(0, 1), random.gauss(0, 1)
pares.append((z1, s2*(rho*z1 + w*z2)))
uni = [(random.uniform(-2,2), random.uniform(-2,2)) for _ in range(N)]
print("normal en 1σ:", round(sum(1 for x,y in pares if en_elipse(x,y))/N, 3), "vs 0.393")
print("uniforme en 1σ:", round(sum(1 for x,y in uni if en_elipse(x,y))/N, 3))
La normal deja ≈ 39 % dentro de la 1σ; la uniforme mucho menos: la elipse es firma gaussiana, no del cuadrado.
09 · Síntesis
Ideas para recordar
- X = μ + LZ con Σ = LLᵀ: media y covarianza por construcción.
- En 2D, L = [[σ₁,0],[ρσ₂,σ₂√(1−ρ²)]]: el Tema 28 con escala.
- Validar medias + varianzas + correlaciones, nunca solo marginales.
- Σ imposible ⇒ Cholesky falla: validar antes de simular.
- Bloque de cópulas, carteras y campos del curso.
En el próximo tema remuestreamos datos: muestreo con reemplazo y bootstrap.