Simulación del Monte Carlo

En una de mis publicaciones, presenté el concepto de pronóstico de caminata aleatoria, usando Python para la implementación. En esta publicación quiero realizar una simulación de monte carlo de caminatas aleatorias del precio de las acciones. Para esto, usaré el siguiente historial de precios de acciones ficticio:

# declarar lista con precios de cierre de acciones diarios ficticios
history_prices = [180,192,193,195,191,199,198,200,199,203,205,207,205,208,201,203,204,201,205,206,207]
print(stockPrices)
[180, 192, 193, 195, 206, 211, 191, 204, 215, 190, 205, 207, 205, 211, 222, 215, 245, 201, 205, 206, 214]

En preparación de los próximos pasos, ahora importaré todos los módulos de Python relevantes:

# estadísticas de importación para calcular, p. ej. desviación estándar del historial de precios
import statistics as stat
# importar pyplot para trazar
import matplotlib.pyplot as plt
# importar aleatoriamente para generaciones de números aleatorios
import random as rnd

Suponiendo un movimiento aleatorio del precio de las acciones, obtengo una desviación estándar de los cambios relativos en el historial de precios ficticio, de modo que podré modelar movimientos aleatorios del precio de las acciones:

relative_prices = []
for i in range(0,len(history_prices)):
    if i == 0:
        pass
    else:
        relative_prices.append((history_prices[i]-history_prices[i-1])/(history_prices[i-1])) 
std_prices = stat.stdev(relative_prices)
print(std_prices)
0.021375589655016836

Ahora modelo una caminata de precios aleatoria ejemplar durante 100 días en el futuro, asumiendo un movimiento de precios aleatorio basado en la desviación estándar de precios aleatorios. Supongo una distribución normal aleatoria. El último precio conocido en la historia sirve como punto de partida:

# modeling a random price walk over 100 days
# -- conduct calculation, define function
def randomWalk(stdev,pastPrices):
    days = [i for i in range(1,101)]
    prices = []
    price = pastPrices[-1]
    for i in range(1,101):
        price = price + price*rnd.normalvariate(0,stdev)
        prices.append(price)
    return([days,prices])
# -- conduct calculation, use function
prices = randomWalk(std_prices,history_prices)
# -- visualize random walk in a line plot
plt.plot(prices[0],prices[1])
plt.title("random price walk")
plt.xlabel("day")
plt.ylabel("stock price")
Text(0, 0.5, 'stock price')

Puedo repetir este proceso, volviendo a calcular paseos aleatorios adicionales, creando así una simulación de monte-carlo de los movimientos del precio de las acciones. En el siguiente ejemplo, repito el proceso de caminata aleatoria para 30 caminatas separadas:

plt.figure()
for i in range(0,30):
    prices = randomWalk(std_prices,history_prices)
    plt.plot(prices[0],prices[1])
plt.title("monte-carlo simulation of stock price development")
plt.xlabel("day")
plt.ylabel("stock price")
Text(0, 0.5, 'stock price')

You May Also Like

Leave a Reply

Leave a Reply

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.