Método de Monte Carlo · Tema 04

Simulación estática

Sin reloj ni memoria: cada réplica es una foto independiente que se promedia para decidir.

01 · Punto de partida

Hay problemas sin tiempo

¿Cuántos diarios comprar hoy si la demanda es incierta? ¿Qué precio poner si el costo varía? No hay evolución ni colas: hay una decisión, un azar y un resultado. Repetir esa foto miles de veces es la simulación estática.

Es el hábitat natural de Monte Carlo: réplicas independientes, sin eventos ni reloj, donde el orden no importa y todo se puede paralelizar.

  • ¿El tiempo cambia el problema o solo hay un periodo?
  • ¿Cada réplica depende de la anterior?
  • ¿Basta promediar fotos para decidir?
  • ¿Qué gano si agrego dinámica?

02 · Definición

Estática frente a dinámica

📸

Estática

Una foto por réplica: demanda de hoy, tirada de hoy. Sin memoria entre réplicas. Ejemplo: vendedor de diarios.

🎬

Dinámica

Una película: el stock de mañana depende del de hoy. Hay reloj, eventos y estado. Ejemplo: cola con llegadas.

⚖️

Regla de oro

Si el orden no cambia el promedio, usá estática: es más simple, rápida y paralelizable.

¿Estática o dinámica?
ProblemaTipoPor qué
Diarios de hoyEstáticaUn periodo, sin arrastre al día siguiente
Área / integral / πEstáticaPuntos independientes, sin tiempo
Cartera con riesgoEstáticaEscenarios del mismo horizonte que se promedian
Cola de bancoDinámicaLa espera de ahora depende de los que llegaron antes
Inventario con reposiciónDinámicaEl stock evoluciona periodo a periodo

03 · Estructura

Anatomía de una simulación estática

Entradas→Modelo→Salidas
  1. 1
    Entradas aleatorias.

    Demanda, precio, falla: cada una con su F. Se sortean frescas en cada réplica.

  2. 2
    Modelo instantáneo.

    Una función sin tiempo: ganancia(Q, D), dentro(x,y), f(x).

  3. 3
    Salidas por réplica.

    Un número por escenario: ganancia, acierto, valor. Se acumulan.

  4. 4
    Promedio y error.

    Media, desvío y ± σ/√N. Sin warm-up ni transitorios que descartar.

Ventajas

Simple y paralela

Sin reloj, sin estado, sin orden: podés repartir réplicas en núcleos y el código cabe en una función.

Límites

No sirve si hay memoria

Si el hoy depende del ayer (colas, stocks encadenados), la foto miente: necesitás simulación dinámica.

Réplica
Una foto completa: un sorteo de cada entrada evaluado por el modelo. N réplicas = N fotos.
Política
La decisión a evaluar: comprar Q diarios, fijar precio p. Se simula una política por vez y se comparan promedios.
Sin transitorio
En dinámica hay que descartar el arranque; en estática no: la réplica 1 vale igual que la 10 000.

04 · Ejemplos

Cuatro estáticas típicas

  1. 1
    Vendedor de diarios.

    Q fijo, demanda D aleatoria: ganancia = 5·min(Q,D) − 2·Q. Se busca el Q con mayor promedio.

  2. 2
    π por puntos.

    Punto (x,y) uniforme: dentro = x²+y² ≤ 1. π ≈ 4·dentro/N. Fotos puras.

  3. 3
    Proyecto con costo incierto.

    Costo ~ Normal(100, 15): ¿P(costo > 120)? Se cuenta cuántas réplicas superan el umbral.

  4. 4
    Garantía.

    Falla con p = 0,05: costo = 200 si falla. Costo medio ≈ 10. Una Bernoulli por réplica.

05 · Representación en Python

El vendedor de diarios en 10 líneas

El modelo estático es una función pura: recibe Q y D, devuelve ganancia. La simulación la llama N veces.

Python en tu navegador. Cambiá Q y la distribución de D y mirá qué política gana.

import random

def ganancia(Q, D, precio=5, costo=2):
    return precio * min(Q, D) - costo * Q

def simular(Q, N):
    total = 0
    for _ in range(N):
        D = random.choices([80, 100, 120], weights=[30, 40, 30])[0]
        total += ganancia(Q, D)
    return total / N

for Q in [80, 100, 120]:
    print(Q, simular(Q, 10000))

Consejo: el mejor Q no es el de mayor demanda, sino el que equilibra sobrante y faltante.

06 · Exploración

Laboratorio: ¿cuántos diarios compro?

Mové el stock Q y las réplicas N. El histograma muestra la ganancia de cada escenario; la línea amarilla es el promedio. Buscá el Q más alto.

EXPERIMENTO 04

Vendedor de diarios

ganancia = 5·min(Q,D) − 2·Q

Los resultados numéricos aparecen debajo.
Ganancia media—
P(pérdida)—
Q actual—
Lectura—

Tocá «Simular» para evaluar el stock Q.

Cada barra es un rango de ganancia. Si Q es chico, perdés ventas; si es grande, pagás sobrantes. El promedio dice cuál conviene.

Preguntas para explorar

  1. Probá Q = 80, 100 y 120 con N = 10 000. ¿Cuál da mayor media?
  2. Con Q = 140, ¿por qué la media cae aunque a veces ganes mucho?
  3. ¿Por qué este problema no necesita reloj ni memoria entre réplicas?
Ver respuestas sugeridas
  1. Q = 100 suele ganar: equilibra faltantes y sobrantes para esta demanda (80/100/120).
  2. Comprás de más casi siempre: el costo del sobrante supera las pocas veces que vendés todo.
  3. Cada día es independiente: la demanda de hoy no depende de la de ayer en este modelo. Es una foto, no una película.

07 · Comprensión

Confusiones frecuentes

«Estática es lo mismo que determinista»

No: estática habla del tiempo (sin reloj); estocástica habla del azar. Monte Carlo es estática y estocástica.

«Si hay varias variables ya es dinámica»

No: podés tener 10 incertidumbres en una foto. Dinámica es cuando hay dependencia temporal entre réplicas.

«El orden de las réplicas importa»

En estática no: podés mezclarlas, paralelizarlas o repetirlas y el promedio es el mismo.

«Todo se puede volver estático»

Solo si podés cortar la memoria. Colas e inventarios encadenados pierden lo esencial si los congelás.

08 · Práctica guiada

Ejercicios con Python

Ejercicio 1: comparar tres Q

Evaluá Q = 80, 100 y 120 con N = 20 000 y quedate con el mejor promedio.

import random

def simular(Q, N):
    total = 0
    for _ in range(N):
        D = random.choices([80, 100, 120], weights=[30, 40, 30])[0]
        total += 5 * min(Q, D) - 2 * Q
    return total / N

for Q in [80, 100, 120]:
    print(Q, simular(Q, 20000))
Ver solución razonada

Q = 100 gana (~290) frente a 80 (~240) y 120 (~270). Comprar poco pierde ventas; comprar mucho paga sobrante.

Ejercicio 2: probabilidad de pérdida

Con Q = 100, estimá P(ganancia < 0). Debería ser 0 con esta demanda, ¿por qué?

import random

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

Da 0: aun con D = 80, la ganancia es 5·80 − 200 = 200 > 0. El riesgo aparece si el costo sube o la demanda puede ser 0.

Ejercicio 3: hacerlo función

Generalizá a evaluar(Q, valores, pesos, N) que devuelva (media, p_perdida).

Ver una posible respuesta
import random

def evaluar(Q, valores, pesos, N, precio=5, costo=2):
    tot, perd = 0, 0
    for _ in range(N):
        D = random.choices(valores, weights=pesos)[0]
        g = precio * min(Q, D) - costo * Q
        tot += g
        if g < 0:
            perd += 1
    return tot / N, perd / N

print(evaluar(100, [80, 100, 120], [30, 40, 30], 10000))

Esta función será tu plantilla para riesgo, inventarios y finanzas en temas próximos.

09 · Síntesis

Ideas para recordar

  • Estática = sin tiempo: N fotos independientes que se promedian.
  • Es el marco ideal de Monte Carlo: simple, sin transitorio y paralelizable.
  • El modelo es una función pura: entradas sorteadas → un número por réplica.
  • Se elige la política (Q, precio) comparando promedios, no casos sueltos.
  • Si hay memoria temporal, la foto no alcanza: toca dinámica.

En el próximo tema veremos el modelo conceptual de Monte Carlo: cómo ordenar entradas, modelo y salidas antes de programar.