Simulación Montecarlo

Recordamos el experimento de la caminata aleatoria.


In [1]:
from IPython.display import YouTubeVideo
YouTubeVideo('Y77WnkLbT2Q')


Out[1]:

¿Qué es una simulación montecarlo?

Revisitamos el concepto de simulación montecarlo.

La idea de una simulación montecarlo es probar muchos resultados posibles. En la realidad, solo uno de esos resultados posibles se dará, pero, en términos de evaluación de riesgos, cualquiera de las posibilidades podría ocurrir.

Los simuladores montecarlo se usan usualmente para evaluar el riesgo de una estrategia de negocios dada con opciones y acciones.

Los simuladores montecarlo pueden ayudar a tomar decisiones exitosas, y que el resultado de una decisión no sea la única medida de si dicha decisión fue buena. Las decisiones no deben ser evaluadas después del resultado. Por el contrario, los riesgos y beneficios solo deben ser considerados en el momento en que se debe tomar la decisión, sin prejuicios retrospectivos. Un simulador montecarlo puede ayudar a visualizar muchos (o en algunos casos, todos) de los resultados potenciales para tener una mejor idea de los riesgos de una decisión.

Usamos montecarlo para evaluar el resultado de la caminata aleatoria

  • Describir, de nuevo, el proceso de la caminata aleatoria en el pizarrón y ver el valor esperado de la caminata después de N pasos.

  • Luego, evaluar el proceso utilizando montecarlo y comparar resultados (borrar código para hacerlo en la clase).


In [8]:
import random
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline

In [16]:
# Función que devuelve secuencia de posiciones de una caminata aleatoria
def caminata_aleatoria(n):
    x = 0
    xx = [x]
    for i in range(n):
        paso = random.choice([-1, 1])
        x += paso
        xx.append(x)
    return xx, x

In [19]:
N = 100
x_last = []
for i in range(1000):
    xx, x = caminata_aleatoria(N)
    x_last.append(x)
    plt.plot(xx)
    
print(np.mean(x_last))
plt.show()


-0.444

Ejemplo

Ahora recapitulemos el ejemplo básico del apostador.

Referencia:

Supongamos que estamos en un casino especial, donde el usuario puede tirar un dado metafórico que puede dar como resultado del número uno (1) al número cien (100).

Si el usuario tira cualquier número entre 1 y 50, el casino gana. Si el usuario tira cualquier número entre 51 y 99, el usuario gana. Si el usuario tira 100, pierde.

Con esto, el casino mantiene un margen del 1\%, el cual es mucho más pequeño que el margen típico en casinos, al igual que el margen de mercado cuando se incorporan costos por transacción.

Por ejemplo, Scottrade cobra \$7 USD por transacción. Si se invierten \$1000 USD por acción, esto significa que tienes que pagar \$7 USD para entrar, y \$7 USD para salir, para un total de \$14 USD.

Esto pone el margen en 1.4\%. Esto significa, que a largo plazo, las ganancias tienen que ser mayores a 1.4\% en promedio, de otra manera se estará perdiendo dinero. Aunque este porcentaje es pequeño, las probabilidades ya están en contra. La comercialización de acciones es un juego 50/50, especialmente en el corto plazo.

De nuevo, con nuestro ejemplo en mente, 1-50, la casa gana. 51-99 el usuario gana. Un 100 significa que la casa gana.

Ahora, comencemos. Primero tenemos que crear nuestro dado.


In [ ]:
# Explorar función randint de la librería random y crear una función que simule la tirada de un dado

In [ ]:
# Tirar el dado 100 veces para comprobar que nuestra función si trabaja correctamente

Sin embargo, el dado por si solo no nos es útil. Necesitamos una función que nos devuelva sólamente si ganamos o perdemos.


In [ ]:
# Cambiar/usar la anterior función para obtener una que devuelva simplemente ganar(true) o perder(false)

Ahora, necesitamos crear un apostador. Empezaremos con uno extremadamente básico por ahora. Veremos, que aún con un apostador muy básico, veremos cosas muy reveladoras usando un simulador montecarlo.


In [ ]:
# Crearemos un apostador simple. Las caracterísitcas son: se empieza con un capital inicial, siempre se apuesta lo mismo,
# y se va a apostar un número determinado de veces.