Método de Monte Carlo · Tema 01

¿Qué es el método de Monte Carlo?

Usar el azar repetido para aproximar lo que no podemos calcular exacto: promediar miles de escenarios y decidir con el resultado.

01 · Punto de partida

Cuando la fórmula no alcanza, el azar ayuda

Hay cantidades fáciles de definir pero difíciles de calcular: el área de una figura rara, una integral sin primitiva, la probabilidad de perder dinero con demanda incierta, el valor de π sin calculadora. Intentar la cuenta exacta puede ser imposible o carísimo.

El método de Monte Carlo propone otro camino: generar muchos escenarios aleatorios, evaluar cada uno y promediar. Con suficientes réplicas, el promedio se acerca al valor buscado.

  • ¿Qué cantidad quiero aproximar?
  • ¿Cómo genero un escenario aleatorio de ese problema?
  • ¿Qué calculo en cada réplica?
  • ¿Cuántas réplicas necesito para confiar en el promedio?

02 · Definición

Los tres ingredientes

Todo Monte Carlo, del más simple al financiero, combina lo mismo:

🎲

Escenario aleatorio

Un caso posible generado con azar: un punto uniforme, una tirada, una demanda simulada. Ejemplo: xᵢ ~ U(0,1).

🔁

Réplicas

Repetir N veces lo mismo de forma independiente. N = 100 es un boceto; N = 100 000 es una estimación seria.

📊

Promedio

El estimador: el promedio de lo observado en cada réplica. Ese número es la respuesta Monte Carlo.

Si en cada réplica calculamos g(Xᵢ), el promedio estima la esperanza E[g(X)]. Esa es toda la magia: probabilidades, áreas e integrales se escriben como esperanzas.

Cálculo exacto frente a Monte Carlo.
ProblemaVía exactaVía Monte Carlo
Probabilidad de cara1/2 por simetríaTirar 10 000 veces y promediar
Área raraIntegrar el contornoContar puntos dentro / total
Integral sin primitivaNo existe fórmulaPromediar la función en puntos aleatorios
Ganancia con demanda inciertaDistribución complejaSimular demandas y promediar la ganancia

03 · Cómo funciona

El ciclo en 4 pasos

La simulación estática no tiene reloj: cada réplica es independiente y el orden no importa. Eso la hace simple y paralelizable.

Aleatorio→Evaluar→Promediar→Decidir
  1. 1
    Generar.

    Muestrear la entrada: random.random(), un dado, una demanda normal. Cada xᵢ es un escenario.

  2. 2
    Evaluar.

    Calcular g(xᵢ): ¿cayó dentro?, ¿cuánto vale f(xᵢ)?, ¿qué ganancia deja?

  3. 3
    Promediar.

    Acumular y dividir por N. Ese promedio es la estimación puntual.

  4. 4
    Decidir.

    Medir el error (± σ/√N), dar un intervalo y tomar la decisión con ese margen.

Simulación estática
No evoluciona en el tiempo: N fotos independientes que se promedian. Lo contrario de la simulación dinámica.
Estimador
La regla que convierte las réplicas en número: casi siempre, el promedio muestral.
Error Monte Carlo
El promedio tiene ruido: su desvío típico cae como 1/√N. Para partir el error a la mitad, hay que cuadruplicar N.

04 · Ejemplos

Dónde brilla el método

El mismo patrón aparece en problemas muy distintos. Si podés sortearlo y promediarlo, podés estimarlo:

Clásicos

π, áreas e integrales

Tirar puntos en un cuadrado y contar cuántos caen en el círculo: π ≈ 4 · dentro/N. Igual para áreas raras e integrales.

Decisiones

Riesgo, finanzas e inventarios

Simular demandas, precios o fallas y promediar ganancias, pérdidas o faltantes para elegir stock, precio o cobertura.

  1. 1
    Moneda.

    Estimar P(cara) ≈ caras/N. Con N = 10 000, el error típico es ≈ 0,005.

  2. 2
    Dado.

    El promedio de un dado tiende a 3,5. Pocas tiradas engañan; miles estabilizan.

  3. 3
    π.

    Puntos uniformes en [0,1]²: la fracción dentro del cuarto de círculo tiende a π/4.

  4. 4
    Inventario.

    Demanda aleatoria cada réplica: se promedia la ganancia para cada nivel de stock y se elige el mejor.

05 · Representación en Python

Tu primer Monte Carlo en 5 líneas

En Python, Monte Carlo es un bucle: sortear, evaluar, acumular y dividir. El módulo random es el generador de escenarios.

Python en tu navegador. Los bloques se ejecutan localmente con Pyodide, sin instalar nada. Podés editarlos y re-ejecutarlos.

import random

def montecarlo(N):
    caras = sum(1 for _ in range(N) if random.random() < 0.5)
    return caras / N

for N in [100, 1000, 10000]:
    print(N, montecarlo(N))

Consejo: ejecutalo varias veces con el mismo N. El resultado cambia: ese temblor es el error Monte Carlo.

Promedio de un dado

El mismo esquema estima esperanzas: el promedio de randint(1,6) debe acercarse a 3,5.

import random

def promedio_dado(N):
    total = sum(random.randint(1, 6) for _ in range(N))
    return total / N

print(promedio_dado(5000))

06 · Exploración

Laboratorio: la moneda se estabiliza

Elegí cuántas tiradas simular y observá cómo el promedio acumulado tiembla al inicio y se calma alrededor de 0,5. Esa calma es la convergencia.

EXPERIMENTO 01

Caras / N → 0,5

estimación = caras / N

Los resultados numéricos aparecen debajo.
Caras—
Estimación—
Error típico ±—
Lectura—

Tocá «Correr simulación» para sortear N tiradas.

La línea muestra el promedio acumulado tirada a tirada. La línea punteada marca 0,5, el valor teórico. Con N chico la curva salta; con N grande se pega al 0,5.

Preguntas para explorar

  1. Corré con N = 100 varias veces. ¿Cuánto varía la estimación entre corridas?
  2. Subí a N = 10 000. ¿Qué le pasa a la variación y al error típico?
  3. ¿Por qué la curva se mueve mucho al principio y poco al final?
Ver respuestas sugeridas
  1. Con N = 100 el error típico es ≈ 0,05: verás valores como 0,44 o 0,56. Es normal, no es un error de código.
  2. Con N = 10 000 el error cae a ≈ 0,005: las corridas se parecen entre sí. El error cae como 1/√N.
  3. Al principio cada tirada pesa mucho (1/10, 1/20…); al final cada tirada pesa 1/5000. El promedio viejo «amortigua» lo nuevo.

07 · Comprensión

Confusiones frecuentes

«Monte Carlo da el valor exacto»

No: da una estimación con error. Sin N y sin ± error, el número no significa nada.

«Más N siempre es proporcionalmente mejor»

El error cae como 1/√N: para dividirlo por 10 necesitás 100 veces más réplicas. Hay rendimientos decrecientes.

«Aleatorio significa sin regla»

Al contrario: cada escenario sigue una distribución precisa (uniforme, normal, etc.). El azar está modelado, no es caos.

«Si el promedio dio 0,5 con N = 20, ya convergió»

Con N chico, acertar puede ser suerte. La convergencia se juzga con el error y repitiendo el experimento.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: estimar un par del dado

Estimá P(par) tirando un dado N veces. El valor teórico es 0,5. Probá con N = 500 y N = 20 000.

import random

def prob_par(N):
    pares = sum(1 for _ in range(N) if random.randint(1, 6) % 2 == 0)
    return pares / N

print(prob_par(500))
print(prob_par(20000))
Ver solución razonada

Ambos se acercan a 0,5, pero el de 20 000 tiembla mucho menos. El primero puede dar 0,47 u 0,53; el segundo rara vez se aleja más de 0,01.

Ejercicio 2: predecir antes de correr

Sin ejecutar: si tirás una moneda 4 veces y salen 3 caras, ¿la estimación es 0,75 y eso refuta que la moneda es justa? Después comprobá qué pasa con 4 000 tiradas.

import random

def estimar(N):
    return sum(random.random() < 0.5 for _ in range(N)) / N

print(estimar(4))
print(estimar(4000))
Ver solución

0,75 con N = 4 no refuta nada: el error típico es ≈ 0,25. Con N = 4 000 el error es ≈ 0,008 y el valor vuelve a ~0,5. N chico, ruido grande.

Ejercicio 3: escribir el ciclo completo

Escribí montecarlo(N) que devuelva la tupla (estimación, error) para la moneda, usando error = √[p(1−p)/N]. Probala con N = 1 000.

Ver una posible respuesta
import random
import math

def montecarlo(N):
    caras = sum(1 for _ in range(N) if random.random() < 0.5)
    p = caras / N
    error = math.sqrt(p * (1 - p) / N)
    return p, error

print(montecarlo(1000))

Verás algo como (0.5, 0.016). La estimación sin el error está incompleta: en temas próximos la convertiremos en intervalo de confianza.

09 · Síntesis

Ideas para recordar

  • Monte Carlo estima cantidades sorteando escenarios y promediando: (1/N)·Σ g(Xᵢ).
  • Es simulación estática: réplicas independientes, sin reloj, fáciles de paralelizar.
  • El error típico cae como 1/√N: cuadruplicar N parte el error a la mitad.
  • En Python es un bucle de sortear → evaluar → promediar con random.
  • Toda estimación se reporta con su error: el número solo no alcanza.

En el próximo tema veremos la historia del método: de los dados de Ulam y von Neumann en Los Álamos a la computadora moderna.