1 votos

Réplica de la opción Call europea

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?

1voto

Alphax Puntos 29

Bien, he encontrado el problema. No estaba descontando el valor según el tipo de interés. El siguiente código modificado funciona bien para un tipo de interés distinto de cero. Cuando la tasa de dividendos es distinta de cero, probablemente sea mejor cubrirse usando un contrato a plazo en lugar del propio activo. Por el momento me saltaré esto.

def hedging_portfolio(path, strike, r, d, vol, T):
   t = make_time(T,len(path))
   dt = t[1]
   alpha = delta_of_call(path[:-1], strike, r, d, vol, T-t[:-1])
   cashflow = alpha * (path[1:] - path[:-1]*np.exp(r*dt))*np.exp(r*(T-t[1:]))
   return np.sum(cashflow)
path = make_path(spot,r,d,vol,T,N)
x = hedging_portfolio(path, strike,r, d, vol, T)
y = max(path[-1]-strike,0) - call_option(spot,strike,r,d,vol,T)*np.exp(r*T)
print(x)
print(y)

Ahora $x=y$  como se quería.

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