Método de Monte Carlo · Tema 35

Simulación de riesgo

Del promedio al peligro: P(pérdida), VaR y cola que la media esconde.

01 · Punto de partida

La media no quiebra, la cola sí

Dos Q con media 290 pueden tener P(pérdida) 0% o 15%. Riesgo es la distribución de lo malo: probabilidad de perder, percentil 5% (VaR) y pérdida media si se pierde (CVaR).

Monte Carlo la entrega gratis: las mismas réplicas que dan la media dan el riesgo.

  • ¿Qué es perder en mi problema (< 0, < meta)?
  • ¿Qué P(pérdida) tolero?
  • ¿Qué VaR me deja dormir?
  • ¿Media o riesgo manda la decisión?

02 · Definición

Tres medidas del peligro

🎯

P(pérdida)

Fracción bajo el umbral: casos/N. Simple y directa.

📉

VaR 5%

Percentil 5: «el 95% gana más que esto». El colchón mínimo.

🕳️

CVaR

Media de lo que cae bajo el VaR: «si se pone feo, pierdo esto en promedio».

Media igual, riesgo opuesto (ejemplo).
QMediaP(<0)VaR 5%
100 seguro2900%200
140 jugado29512%−40

03 · Método

Simular→Ordenar→Decidir
  1. 1
    Simular N ganancias.

    Guardar las N Yᵢ, no solo la media. N ≥ 10 000 para colas.

  2. 2
    Ordenar y cortar.

    P = contar bajo umbral; VaR = percentil 5; CVaR = media de esos.

  3. 3
    Decidir con regla.

    «Elijo mayor media con P < 5% y VaR > 0». Sin regla, el riesgo se ignora.

Umbral
Qué es perder: 0, la meta, el costo fijo. Explícito y con unidad.
N para colas
VaR 5% con N = 500 usa 25 puntos: ruidoso. Colas piden N grande.
Media vs riesgo
La media elige valor; el riesgo veta. Decidir con ambas es gestión, no optimismo.

04 · Ejemplos

  1. 1
    Diariero Q = 140.

    Media alta, P(pérdida) 12%: el riesgo veta aunque la media tiente.

  2. 2
    Proyecto N(50,15).

    P(<0) ≈ 0, VaR₅ ≈ 25: dormir tranquilo.

  3. 3
    Garantía p = 0,05.

    Pierdo 200 el 5%: CVaR = 200. La media 10 esconde el golpe.

05 · Representación en Python

Riesgo en 8 líneas

Python en tu navegador. Una corrida, cuatro respuestas.

import random

N, Q = 10000, 120
gs = []
for _ in range(N):
    D = random.choices([80, 100, 120], weights=[30, 40, 30])[0]
    gs.append(5*min(Q, D) - 2*Q)
gs.sort()
print("media:", round(sum(gs)/N, 1))
print("P(<0):", round(sum(1 for g in gs if g < 0)/N, 4))
print("VaR5:", gs[int(0.05*N)])
print("CVaR:", round(sum(gs[:int(0.05*N)])/int(0.05*N), 1))

06 · Exploración

Laboratorio: la cola en rojo

Mové Q: el histograma muestra ganancias; lo rojo es pérdida (< 0) y la amarilla el VaR 5%. Q grande sube la media pero engorda la cola.

EXPERIMENTO 35

Media que esconde, cola que avisa

riesgo = P(g < 0) + VaR₅

Los resultados numéricos aparecen debajo.
Media—
P(pérdida)—
VaR 5%—
Lectura—

Tocá «Evaluar» para medir el riesgo.

Barras rojas bajo 0. Si el VaR cae bajo 0, el 5% pierde: la media ya no alcanza para decidir.

Preguntas para explorar

  1. Con Q = 100, ¿P es 0? ¿Y con Q = 150?
  2. ¿Qué Q maximiza la media? ¿Y cuál minimiza el riesgo?
  3. ¿Elegirías media máxima o riesgo acotado?
Ver respuestas sugeridas
  1. Sí: 0 con Q = 100 en este modelo; ~15% con 150 por sobrante.
  2. Media ~100–110; riesgo ~80. Típico dilema valor vs seguridad.
  3. Regla del curso: mayor media con P < 5% y VaR > 0.

07 · Comprensión

Confusiones frecuentes

«VaR es la pérdida máxima»

No: es el percentil 5. El 5% pierde MÁS que el VaR; el CVaR dice cuánto más.

«P = 0 significa sin riesgo»

Con N = 500, P = 0 puede ser suerte. Colas piden N ≥ 10 000.

«La media alta compensa el riesgo»

Solo si podés quebrar varias veces. Una quiebra no se promedia.

«CVaR es lo mismo que VaR»

VaR es el corte; CVaR la media de lo cortado. El golpe real lo da el CVaR.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: tablero de Q = 130

Calculá media, P, VaR y CVaR.

import random

N, Q = 10000, 130
gs = sorted(5*min(Q, random.choices([80,100,120], weights=[30,40,30])[0])-2*Q for _ in range(N))
k = int(0.05*N)
print(sum(gs)/N, sum(1 for g in gs if g < 0)/N, gs[k], sum(gs[:k])/k)
Ver solución razonada

Media ~260, P ~8%, VaR negativo: la media tienta, la cola veta.

Ejercicio 2: umbral con meta

P(g < 200) con Q = 100: ¿llega a la meta?

import random

N = 10000
gs = [5*min(100, random.choices([80,100,120], weights=[30,40,30])[0])-200 for _ in range(N)]
print(sum(1 for g in gs if g < 200)/N)
Ver solución

~0,30: el 30% no llega a 200. Riesgo de meta, no de quiebra.

Ejercicio 3: elegir con regla

Elegí entre Q = 90/100/110/120 con regla media máx + P < 5%.

Ver una posible respuesta
import random

def tablero(Q, N=8000):
    gs = sorted(5*min(Q, random.choices([80,100,120], weights=[30,40,30])[0])-2*Q for _ in range(N))
    return sum(gs)/N, sum(1 for g in gs if g < 0)/N

for Q in [90, 100, 110, 120]:
    m, p = tablero(Q)
    print(Q, round(m, 1), round(p, 3), "OK" if p < 0.05 else "vetado")

Gana 100–110 entre los OK. La regla decide donde la media sola duda.

09 · Síntesis

Ideas para recordar

  • Riesgo = P(umbral) + VaR₅ + CVaR, de las mismas réplicas.
  • VaR es percentil; CVaR, media de la cola. P es frecuencia.
  • Colas piden N ≥ 10 000: con poco N el 0 es suerte.
  • Regla: mayor media con P < 5% y VaR > 0.
  • La media propone; el riesgo veta.

En el próximo tema mediremos si algo aguanta: la simulación de confiabilidad.