Un activo $S_t$ evoluciona según el modelo Black-Scholes. Queremos replicar una opción de compra sobre este activo manteniendo unidades Delta del activo en cada momento.
Utilizo un algoritmo de Monte Carlo para calcular el coste medio de esta estrategia de replicación. Esperaría que este coste fuera algo cercano, por término medio, a la retribución de la opción de compra correspondiente, pero compruebo que no es así en absoluto.
Mi pregunta es: ¿hay algún problema con mi aplicación?
Aquí está mi código: (me salto el import numpy as np y la definición del Delta)
def make_path(spot, r, d, vol, T, N):
dt = T/(N-1)
Z = np.insert(np.random.normal(size=N-1), 0, 0)
X = np.exp((r-d-vol**2/2) * np.linspace(0,T,N) + np.cumsum(vol * math.sqrt(dt) * Z))
path = spot * X
return path
def make_time(T,N):
return np.linspace(0,T,N)
def hedging_portfolio(path, strike, r, d, vol, T):
t = make_time(T,len(path))
alpha = delta_of_call(path[:-1], strike, r, d, vol, T-t[:-1])
cashflow = alpha * (path[1:] - path[:-1])
return np.sum(cashflow)
spot = 100
strike = 100
r = 0.0
d = 0.0
vol = 0.1
T = 1
N = 10000
path = make_path(spot,r,d,vol,T,N)
x = (hedging_portfolio(path, strike,r, d, vol, T), max(path[-1]-strike,0) - call_option(spot,strike,r,d,vol,T))
print(x)
Edición: Me he dado cuenta de parte de mi error. En primer lugar, como señaló Iván, mi generación de trayectorias tenía un error tipográfico, pero éste no era el origen del problema, ya que r=0 en mi ejemplo. El problema era que estaba comparando el coste de la creación de esta cartera con el beneficio final, mientras que debería mirar la diferencia entre el beneficio y el precio de la opción de compra. He modificado mi código en consecuencia. Ahora funciona cuando los tipos de interés son cero. Cuando no son cero, todavía hay un problema. El coste de creación de esta cartera debería ser igual a la diferencia entre el resultado y el precio de la opción de compra.
0 votos
¿Por qué el primer término de X no está dentro de la exponencial?
0 votos
Tienes razón, se trata de un error, aunque no es exactamente el problema, ya que yo estaba mirando a 0 tipos de interés. Voy a editar mi pregunta.
0 votos
¿Qué lenguaje/plataforma de codificación se ha utilizado para ello?
0 votos
@user11823918 todavía tienes la volatilidad allí sin embargo. Seguro que te fastidia las rutas.
0 votos
@Ivan no lo entiendo, ¿por qué no debería haber un término de volatilidad?
0 votos
@Quantfint El lenguaje es Python. Esto es sólo una simulación numérica, no una cobertura real.
0 votos
@user11823918 Sólo me refería a fuera del exp() pero ya está corregido como me has indicado.