1 votos

¿Por qué obtengo esta diferencia al simular el movimiento Browniano geométrico?

Intenté simular GBM usando tanto la definición de EDS como la solución en forma cerrada. Las trayectorias que obtengo a través de estos métodos son muy diferentes. ¿Alguien puede ayudarme a encontrar mi error?

import numpy as np
import matplotlib.pyplot as mp
import statsmodels.api as sm

time_step = 1e-6
N = 30000

np.random.seed(987654321)
A = np.zeros((N,1))
A[0] = 2
B = np.zeros((N,1))
B[0] = 2
volvol = 40.0

s = np.sqrt(time_step)

y = np.exp(-volvol**2.0/2 * time_step + volvol * s * np.random.normal(0, 1, N))
y1 = np.random.normal(0, s, N)

for i in np.arange(1, N, 1):
   A[i] = A[i-1] * y[i]

for i in np.arange(1, N, 1):
    print(B)
    dB = volvol * B[i - 1] * y1[i]
    B[i] = B[i-1]+ dB

mp.plot(A, label = 'exp')
mp.plot(B, label = 'SDE')

mp.legend(loc='lower right', ncol=1, fancybox=True, shadow=True, prop={'size': 6})
mp.grid()
mp.show()

gráfico

4voto

Chris Mc Puntos 31

Aquí están las cosas que necesitas corregir en tu código:

Aunque estás estableciendo una semilla, estás generando los números aleatorios dos veces, y por lo tanto no son idénticos. Intenta esto:

rand = np.random.randn(N)
y = np.exp(-volvol**2.0/2 * time_step + volvol * s * rand)
y1 = rand

También necesitas multiplicar el sigma por la raíz cuadrada del paso de tiempo en la versión SDE:

dB = volvol * B[i-1] * y1[i] * s

Eso debería ser suficiente para obtener los mismos resultados.

Además de eso, tu volatilidad es del 4000%. El sigma debería ser 0.4 y no 40.0.

Finanhelp.com

FinanHelp es una comunidad para personas con conocimientos de economía y finanzas, o quiere aprender. Puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X