Estoy tratando de simular el Movimiento Browniano Geométrico en Python, sin embargo los resultados que obtengo parecen muy extraños y en mi opinión no pueden ser correctos. Mi objetivo es simular cada día de 1 año. Básicamente, utilicé dos enfoques ligeramente diferentes. Basado en mi investigación, debería ser posible usar deriva y volatilidad diaria con dt = 1
o anualizar la deriva y volatilidad y usar dt = 1/365
. Calculé la deriva y volatilidad diarias basadas en datos históricos diarios para el primer enfoque y las anualicé para el segundo. En consecuencia, también se cambia T
. A continuación se muestra el código en Python que obtuve parcialmente de esta respuesta (Geometric Brownian Motion simulation in Python):
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(1000)
quandl.ApiConfig.api_key = "XXXXXX"
def gen_paths(S0, r, sigma, T, M, I):
dt = float(T) / M
paths = np.zeros((M + 1, I), np.float64)
paths[0] = S0
for t in range(1, M + 1):
rand = np.random.standard_normal(I)
paths[t] = paths[t - 1] * np.exp((r - 0.5 * sigma ** 2) * dt + sigma * np.sqrt(dt) * rand)
return paths
# Obtener datos
df = quandl.get(...)
value = df['Value']
# Calcular rendimientos
returns = value.pct_change(1)
# Deriva y volatilidad diarias
S0 = value[-1] # precio inicial de la acción
r = np.mean(returns) # deriva
sigma = np.std(returns) # volatilidad
T = 365 # tiempo
M = 365 # número de pasos
I = 100000 # número de simulaciones
paths_1 = gen_paths(S0, r, sigma, T, M, I)
print("Promedio: " + str(np.average(paths_1[-1])))
# Deriva y volatilidad anuales
r = np.mean(returns) * 365
sigma = np.std(returns) * np.sqrt(365)
T = 1.0
paths_2 = gen_paths(S0, r, sigma, T, M, I)
print("Promedio: " + str(np.average(paths_2[-1])))
# Visualizar 5 caminos simulados para cada uno
fig, axs = plt.subplots(2)
axs[0].plot(paths_1[:, :5])
axs[1].plot(paths_2[:, :5])
plt.show()
Este es el resultado que obtengo:
Para los promedios obtengo 117183
para el enfoque con deriva y volatilidad diarias y 76145
para el enfoque con deriva y volatilidad anuales. Aquí están mis preguntas:
- ¿Estos resultados pueden ser correctos o qué hay de malo en mi código?
- ¿No deberían ser muy similares los promedios para ambos enfoques?
- ¿Qué enfoque es más favorable usar?
0 votos
Hola, por lo general, la volatilidad se define en términos anualizados. Entonces, en tu ejemplo: 40% es la volatilidad anualizada. Así que si tienes M=365 pasos, entonces tienes dt=1/365 y usas 0.4 como volatilidad. Si quieres simular en una escala diaria, estableces dt=1 y luego tienes que usar una volatilidad de sqr(365)*40%.