Generación de Variables Aleatorias · Tema 29

Vectores aleatorios

Puntos correlacionados y multivariados: X = μ + LZ con Cholesky sobre la covarianza Σ.

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

L↓

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.

La misma receta 2D, tres geometrías.
Caso (σ₁=1)L fila 2Nube
ρ = 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

Z ~ N(0,I)→μ + LZ→X ~ N(μ,Σ)
  1. 1
    Carteras y riesgo.

    Retornos correlacionados: el ρ conjunto mueve la cola del portafolio, no cada activo aislado.

  2. 2
    Sensores y medidas.

    Ruido acoplado en varias señales con media μ y geometría Σ conocida.

  3. 3
    Puntos con forma.

    Nubes elipsoidales, regiones de confianza y controles de calidad multivariados.

  4. 4
    Puente 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.

EXPERIMENTO 29

Nube N(0,Σ)

X = Z₁ · Y = σ₂(ρZ₁ + √(1−ρ²)Z₂)

Los resultados numéricos aparecen debajo.
Corr muestral0,600
Teórica ρ0,600
Var Y muestral1,000
Teórica σ₂²1,000

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

  1. Con ρ = 0,6 y σ₂ = 1, ¿corr y var Y teóricas?
  2. Subí σ₂ a 2 con ρ fijo. ¿La elipse se estira en Y? ¿La corr cambia?
  3. Poné ρ = 0 con σ₂ = 2. ¿La nube se vuelve eje-alineada? ¿Qué elipse queda?
Ver respuestas sugeridas
  1. Corr 0,6 y var Y = 1.
  2. Sí se estira (var Y → 4); la corr sigue en 0,6: escala y vínculo son independientes.
  3. 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.