Quiero calcular el precio de la opción con pago \begin{equation} \max \big\{\max\{S^1_T, S^2_T\} - K, 0\big\}, \end{equation} donde $S^{1,2}$ tienen la misma dinámica con 0 correlación. Por lo tanto, \begin{align} dS^1_t &= r S_t^1 dt + \sigma S^1_t dW^1_t \\ dS^2_t &= r S_t^2 dt + \sigma S^2_t dW^2_t, \end{align} donde $W^1$ y $W^2$ son procesos de Wiener independientes bajo la medida de precios $Q$ . Esta opción cuenta con una fórmula analítica de fijación de precios (por ejemplo, en Guía completa de fórmulas de valoración de opciones , p.211). Sin embargo, cuando intento calcular el valor de esta opción utilizando el método MC, obtengo valores que son sistemáticamente incorrectos.
A continuación, mi código para la simulación de MC. Primero una función para hacer la integración numérica de las SDEs:
# Euler scheme for two GBMs (no correlation) with same drift and volatility
# Returns the terminal value (prices at last time step)
gbm <- function(mu, sigma, max_time, num_steps, init_value){
h = max_time / num_steps
paths <- matrix(NA, num_steps+1, 2)
paths[1, ] = init_value
normals = matrix(rnorm(num_steps*2, sd=sqrt(h)), num_steps, 2)
for (i in 1:num_steps){
paths[i+1, ] = paths[i, ] + (mu * paths[i, ] * h) + (sigma * paths[i, ] * normals[i, ])
}
return(paths[num_steps, ])
}
A continuación, el método de Montecarlo. Obsérvese que calculo el precio de una opción de compra sobre el máximo Y el precio de sólo una opción de compra vainilla:
trials <- 10000
maxes <- array(NA, trials)
max_payoffs <- array(NA, trials)
vanilla_payoffs <- array(NA, trials)
for(i in 1:trials){
# Compute terminal values of the SDEs
terminal_values <- gbm(mu=0.02, sigma=0.2, max_time=3, num_steps=1000, init_value=c(1, 1))
# Vanilla call payoff just on one of the GBM - for assuring my numerical integration correct
vanilla_payoffs[i] <- max(terminal_values[1] - 1, 0)
# Call on the maximum of the two assets - strike 1
maxes[i] = max(terminal_values)
max_payoffs[i] = max(maxes[i] - 1, 0)
}
# Mean of the payoffs + 95% confidence interval
mean(max_payoffs) * exp(-0.02 * 3)
sd(max_payoffs * exp(-0.02 * 3)) * 2 / sqrt(trials)
# Mean of the vanilla call payoffs
mean(vanilla_payoffs) * exp(-0.02 * 3)
Para la llamada al máximo de dos activos, mi media muestral es $0.2839 \pm 0.0064$ que está muy lejos del valor correcto de $0.2235$ . Sin embargo, mi opción de compra vainilla es casi exactamente correcta $0.1656$ en comparación con el valor real $0.1646$ .
Para que quede claro, los parámetros son $\sigma=0.2$ , $r=0.02$ , $S^{1,2}_0 = 1$ , $K=1$ , $T=3$ , $\rho=0$ .
Estaría muy agradecido si alguien pudiera explicar en qué me estoy equivocando.
EDITAR: He añadido código python que no utiliza integración numérica según la respuesta de @Yoda And Friends. Sin embargo, sigue dando un precio incorrecto:
def terminal_spots(trials, r, sigma, t, spot):
normals = np.random.normal(size = (trials, 2))
return spot * np.exp(t * (r - 0.5 * sigma * sigma) + sigma * np.sqrt(t) * normals)
y
def mc_call_max_two_assets(trials, r, sigma, t, spot, strike):
terminals = terminal_spots(trials, r, sigma, t, spot)
max_terminal = terminals.max(1)
payoffs = np.maximum(max_terminal - strike, 0)
mn = payoffs.mean() * np.exp(-r*t)
conf_interval = (payoffs * np.exp(-r*t)).std() * 2 / np.sqrt(trials)
return mn, conf_interval