My Authors
Read all threads
Método de Montecarlo, una herramienta bastante potente pero poco conocida o poco usada al menos

Abro hilo 👇👇
El método tiene sus inicios en los 40s en el campo de la física cuántica en el proyecto Manhattan en la carrera por resolver rápido ecuaciones difíciles, pero se popularizó en los 60s en juegos de azar, de hecho lleva el nombre "Montecarlo" por el famoso casino de las Vegas
Ahora, el método se usa tanto para cálculos determinísticos (como veremos en unos tweets, por ej. para estimar Pi) como para procesos estocásticos (o procesos que dependen en gran parte del azar, como simular un portafolio de acciones)
Claramente para procesos determinísticos es innecesario ya que siempre hay métodos exactos para calcular estas cosas, pero ojo que hay veces que esos métodos son bastante complejos y por ende es mas sencillo aplicar montecarlo
La desventaja de Montecarlo es que usa la fuerza bruta, es decir, tiene que repetir muchísimas veces un mismo cálculo para estimar un valor con cierta precisión, veamos un ejemplo, como calcularíamos Pi con Montecarlo
Podríamos dibujar un círculo de radio=1, y un cuadrado que lo contenga de lado=2, si calculamos las áreas
area_cuad = L*L = 4
area_circ = Pi*r^2 = Pi
Es decir que el área del círuclo sobre la del cuadrado es Pi/4, ahora bien ¿que tiene que ver esto con montecarlo?
Supongamos tiro un punto al azar entre estas figuras, puede caer
- dentro del circulo
- entre el cículo y el cuadrado

Entonces, la probabilidad de que caiga dentro del círculo es
P = Casos_favorables / Casos_totales = Area_circulo / Area_cuadrado = Pi/4
Entonces, si tirara al azar, totalmente al azar, millones de puntos y luego cuento la cantidad adentro del círculo y la divido por la cantidad de puntos total, obtengo Pi/4, luego multiplico por 4 y con eso tengo un estimado del valor de Pi
Eso es calcular Pi por montecarlo, aquí código básico en python:

import math, random as rd

adentro = 0
total = 1000000

for i in range(0, total):
if math.sqrt(rd.random()**2 + rd.random()**2) < 1.0:
adentro += 1

pi = 4 * adentro / total
print(pi)
Pero claro, en este caso para tener un Pi con 4 decimales de precision necesito pi*10^8 puntos (iteraciones) mientras que por métodos deterministas con muchos menos cálculos tengo mucho mas precisión, en este caso no tiene mucha utilidad práctica
Pero cuando hay cosas cuyo modelo determinista es demasiado complejo de modelizar (muchas variables con relaciones cruzadas y complejas) quizá el esfuerzo de modelizar para obtener una fórmula determinista no valga la pena y es preferible la fuerza bruta de montecarlo
Por ejemplo, imaginen dibujar, ponele, 20 figuras geométricas en un pizarrón todas superpuestas entre sí cada figura depende de 2 o 3 variables

Y quiero saber el % que representa la interseccion de la figX y figY en funcion de las, ponele, 50 variables dadas
Obtenida la fórmula, con un solo cálculo tengo un valor exacto, pero quizá esté días buscando la fórmula, si bien es un problema determinista, en este caso quizá conviene resolver por montecarlo, así fue en el proyecto Manhattan en donde necesitaban resolver rápido las ecuaciones
¿Desventaja? Y que por montecarlo para aproximar 4 o 5 decimales, como vimos, necesitaremos millones de cálculos pero es siempre el mismo, y lo hace una computadora, es decir es facil y rápido llegar al resultado con fuerza bruta de calculos
¿Cuantos millones de cálculos necesitamos? bueno, el error es proporcional a 1/raiz(n) siendo "n" la cantidad de simulaciones o cálculos, es decir que con 10.000 simulaciones tenemos precisión de 0.01 es decir 1%, con 1 millón precisión de 0,001 o sea 0,1% y así
Es decir que si nos alcanza con una precisión del 1% o 0,1% es muy práctico Montecarlo y sencillo, si necesitamos 10 decimales de precisión quizá necesitemos demasiado poder de cálculo y mas si queremos rapidez en el cálculo
Ahora imaginemos un proceso estocástico como la variación de un portafolio, ahí aparecen variables que no se pueden modelizar, o si se modeliza tenemos que tomar supuestos irreales, ademas en estos casos con una precisión del 0.1% alcanza y sobra
Esta es una simulación 30x en python de un portfolio en el que asumimos una variación media diaria (mu) del 0.04% y un sigma diario (desvío estandar) del 2%, bastante parecido a un indice de acciones pero sigue siendo irreal porque asumimos una distribución normal
Podriamos remplazar la "línea 18" del código por una selección aleatoria de una muestra pasada de rendimientos diarios reales, en fin, es una aproximación igual, la idea es simular miles o millones de veces con las mismas características para ver como se comporta el portafolio
Podemos ver qué % de las simulaciones el potafolio "quiebra" un límite inferior dado, si suponemos una perdida max=30% como límite tolerable y simulamos 1000 veces un año, vemos que en 206 simulaciones quiebra ese límite en algún momento y 90 veces termina el año por debajo
Pero si hacemos las mismas simulaciones con un límite de perdida máxima del 50% en esta ejecución me dio solo 14 simulaciones quiebra ese límite en algún momento y solo 11 simulaciones de 1000 terminan el año debajo de esa pérdida
También pueden plantearse escenarios de μ, σ futuros, con una probabilidad asignada cada uno y simular con una suma ponderada, en fin las posibilidades son muchas, se usa mucho esta herramienta para risk management no solo de un portafolio, sino de estrategias de trading también
De hecho, mas que el backtesting de las estrategias en sí, simular por montecarlo los retornos de estrategias, coberturas y sistemas de trading completos, es la mejor herramienta para setear el Money Management de la misma
Nunca subestimen el Money Mangement, por mas que sean super traders acertando % altisimos, con mal manejo del riesgo pueden fundir la comitente, en cambio, si son malos traders (como yo), pero tienen buen manejo del riesgo, un mal año solo saldrán algo abajo del benchmark y ya
Interesados en el código python les dejo el link que subi a github

github.com/gauss314/Bursa…
Missing some Tweet in this thread? You can try to force a refresh.

Keep Current with ae^((-(x-b)^2)/(2c^2))

Profile picture

Stay in touch and get notified when new unrolls are available from this author!

Read all threads

This Thread may be Removed Anytime!

Twitter may remove this content at anytime, convert it as a PDF, save and print for later use!

Try unrolling a thread yourself!

how to unroll video

1) Follow Thread Reader App on Twitter so you can easily mention us!

2) Go to a Twitter thread (series of Tweets by the same owner) and mention us with a keyword "unroll" @threadreaderapp unroll

You can practice here first or read more on our help page!

Follow Us on Twitter!

Did Thread Reader help you today?

Support us! We are indie developers!


This site is made by just two indie developers on a laptop doing marketing, support and development! Read more about the story.

Become a Premium Member ($3.00/month or $30.00/year) and get exclusive features!

Become Premium

Too expensive? Make a small donation by buying us coffee ($5) or help with server cost ($10)

Donate via Paypal Become our Patreon

Thank you for your support!