Estoy intentando simular los precios de las materias primas utilizando el modelo exponencial Vasicek/Ornstein-Uhlenbeck de Schwartz 1997 p. 926 Ecuación (1). Estoy utilizando la solución de forma cerrada de Vega 2018 p. 5 Ecuación (9) que es:
$$\ln(X_{t})=\ln(X_{t-1})e^{-\theta \Delta t}+\left(\mu-\frac{\sigma^2}{2\theta}\right)(1-e^{-\theta \Delta t})+\sigma\sqrt{\frac{1}{2\theta}(1-e^{-2\theta \Delta t})}\epsilon_i$$
Aquí está mi código en Python:
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(123)
def gen_paths(X0, theta, mu, sigma, T, num_steps, num_sims):
dt = float(T) / num_steps
paths = np.zeros((num_steps + 1, num_sims), np.float64)
paths[0] = X0
for t in range(1, num_steps + 1):
rand = np.random.standard_normal(num_sims)
paths[t] = np.exp(np.log(paths[t-1]) * np.exp(-theta * dt)
+ (mu - (sigma ** 2) / (2 * theta)) * (1 - np.exp(-theta * dt))
+ np.sqrt((1 - np.exp(-2 * theta * dt)) * (sigma ** 2) / (2 * theta)) * rand)
return paths
X0 = 5
theta = 0.4
mu = 5
sigma = 0.15
T = 1
num_steps = 365
num_sims = 5
paths = gen_paths(X0, theta, mu, sigma, T, num_steps, num_sims)
plt.plot(paths[:, :10])
plt.grid(True)
plt.xlabel('time steps')
plt.ylabel('index level')
plt.show()
Y este es el resultado que estoy obteniendo:
Este no es ciertamente el resultado que esperaba, esperaba que la trayectoria fluctuara alrededor de la media a largo plazo $\mu$ y no un aumento exponencial.
Pregunta: ¿He entendido mal la exponencial Vasicek/Ornstein-Uhlenbeck que significa que este resultado es correcto y esperado o hay algo mal en mi simulación?
Actualización:
Aquí está mi nueva función después de la sugerencia en la respuesta de abajo:
def gen_paths(X0, theta, mu, sigma, T, num_steps, num_sims):
dt = float(T) / num_steps
paths = np.zeros((num_steps + 1, num_sims), np.float64)
paths[0] = X0
for t in range(1, num_steps + 1):
rand = np.random.standard_normal(num_sims)
z = np.log(paths[t-1])
paths[t] = z * np.exp(-theta * dt)
+ (mu - (sigma ** 2) / (2 * theta)) * (1 - np.exp(-theta * dt))
+ np.sqrt((1 - np.exp(-2 * theta * dt)) * (sigma ** 2) / (2 * theta)) * rand
paths_new = np.exp(paths)
return paths_new
0 votos
¿Por qué hacen que el OU sea exponencial en lugar de utilizar el OU tradicional?
0 votos
@develarist Porque eso es lo que Schwartz 1997 utiliza y se utiliza mucho en otra literatura también.
0 votos
Mi pregunta es por qué lo usan
0 votos
Y por qué espera que la trayectoria de la OU exponencial fluctúe alrededor de la media a largo plazo $\mu$ y no una subida exponencial, cuando es la tradicional OU la que sí fluctúa en torno a $\mu$
0 votos
@devalarist Porque no lo hace en por ejemplo Un conjunto de herramientas de procesos estocásticos para la gestión de riesgos p.32 Figura 18. También la modelización de los productos básicos parecería muy errónea si este fuera realmente el resultado esperado, en mi opinión.
0 votos
@develarist Por qué lo usan no estoy del todo seguro, probablemente porque pensaron que sí se ajusta a los productos básicos.
0 votos
Lo que estoy tratando de decir es que estás esperando que la OU exponencial fluctúe alrededor de $\mu$ al igual que la tradicional OU fluctúa alrededor de $\mu$ , lo que no tiene sentido para mí porque se espera que ambos se comporten de la misma manera. Uno es un exponencial del otro, ¿qué esperas?
2 votos
@develarist Lo entiendo, pero parece que el exponencial también fluctúa aproximadamente alrededor de $\mu$ Sin embargo, no es lo mismo que la OU normal. Tal vez lo formulé mal, nunca esperé los mismos resultados que el O/U normal, sólo estaba tratando de decir que en base a mi investigación el resultado que estoy obteniendo no puede ser correcto y mi expectativa era que los resultados todavía fluctuaran en algún lugar alrededor de $\mu$ .
1 votos
¡Bienvenido Quant SE, @Tharmis!