Usando R, me gustaría simular una trayectoria de una ecuación de movimiento browniano geométrico usando
\begin{equation*} S(t) = S(0) \exp\left(\left(\mu - \frac{\sigma^{2}}{2}\right)t + \sigma B_{t}\right), \end{equation*}
donde $(B_t)$ es el proceso de Wiener, es decir $B_t\sim N(0,t)$ para todo $t$.
Me gustaría comparar esta trayectoria con la que obtengo utilizando el esquema de Euler-Maruyama:
\begin{equation*} S(i+1) = S(i) + mu*S(i)*delta_t + sigma*S(i)*B_{t} \end{equation*}
Me gustaría reproducir el gráfico en la página 534 del paper Higham (2001) "An algorithmic introduction to numerical simulation of SDE":
Obtuve un resultado incorrecto usando el código:
rm(list=ls())
#Simulating Geometric Brownian motion (GMB)
tau <- 1 #tiempo de vencimiento
N <- 1000 #número de subintervalos
dt <- tau/N #longitud de cada subintervalo de tiempo
time <- seq(from=0, to=tau, by=dt) #momentos de tiempo en los que simulamos el proceso
length(time) #debería ser N+1
mu <- 0.05 #parámetro 1 de GBM
sigma <- 0.9 #parámetro 2 de GBM
X0 <- 10 #condición inicial
#simular 1 trayectoria de un movimiento browniano geométrico
Z <- rnorm(N, mean = 0, sd = 1) #muestra normal estándar de N elementos
dW <- Z*sqrt(dt) #incrementos de movimiento browniano
W <- c(0, cumsum(dW)) #movimiento browniano en cada instante de tiempo con N+1 elementos
#Solución analítica
X_analytic <- numeric(N+1) #vector de ceros, N+1 elementos
X_analytic[1] <- X0 #primer elemento de X_analytic es X0. con el bucle for encontramos los otros N elementos
for(i in 2:length(X_analytic)){
X_analytic[i] <- X_analytic[1]*exp(mu - 0.5*sigma^2*i*dt + sigma*W[i-1])
}
#graficar X contra el tiempo
plot(time, X_analytic, type = "l", main = "Trayectoria GBM con solución analítica",
xlab = expression("t"[i]), ylab = expression("W"[t[i]]))
#Esquema de Euler-Maruyama
X_EM <- numeric(N+1) #vector de ceros, N+1 elementos
X_EM[1] <- X0 #primer elemento de X_EM es X0. con el bucle for encontramos los otros N elementos
for(i in 2:length(X_EM)){
X_EM[i] <- X_EM[i-1] + mu*X_EM[i-1]*dt + sigma*dW[i-1]
}
#graficar X contra el tiempo
plot(time, X_EM, type = "l", main = "Trayectoria GBM con esquema de Euler-Maruyama",
xlab = expression("t"[i]), ylab = expression("W"[t[i]]))
#graficar W contra el tiempo
matplot(time, cbind(X_analytic, X_EM), type = "l", main = "GBM",
xlab = expression("t"[i]), ylab = expression("X"[t[i]]))
No sé cuál de los dos es incorrecto y por qué