2 votos

Precio de una simple autocall - Sebastien Bossu Derivados avanzados de renta variable

Estoy leyendo Advanced Equity Derivates de Sebastien Bossu e intentando hacer los ejercicios. En el capítulo 1 tenemos la siguiente pregunta :

Consideremos una opción exótica que vence en uno, dos o tres años sobre un subyacente subyacente S con el siguiente mecanismo de retribución:

  • Si al cabo de un año S1 > S0 la opción se amortiza 1 + C y se extingue;
  • En caso contrario, si al cabo de dos años S2 > S0 la opción se amortiza 1 + 2C y se extingue;
  • En caso contrario, si al cabo de tres años S3 > 0,7 × S0 la opción se amortiza máx(1 + 3C, S3S0);
  • En caso contrario, la opción se amortiza S3/S0.

Suponiendo S0 = 100 $, tipos de interés y dividendos cero y una volatilidad del 25%, estime el nivel de C para que la opción valga 1 utilizando la simulación de Monte Carlo de Monte Carlo.

En el manual de soluciones da C 12% sin detalles. Ejecuté el siguiente código ( disculpas ya que no es limpio o eficiente, sólo estoy tratando de obtener la respuesta).

import numpy as np

sigma = 0.25
S0 = 100
N = 100000

simuls = []
for _ in range(N):
    S1 = S0 * np.exp(-0.5 * sigma**2 + sigma * np.random.normal())
    S2 = S1 * np.exp(-0.5 * sigma**2 + sigma * np.random.normal())
    S3 = S2 * np.exp(-0.5 * sigma**2 + sigma * np.random.normal())
    simuls.append([S1,S2,S3])

coupon = 0.0765
payoff = []
for simul in simuls:
    if simul[0]>S0:
        payoff.append(1+coupon)
    elif simul[1]>S0:
        payoff.append(1+2*coupon)
    elif simul[2]>0.7*S0:
        payoff.append(max(1+3*coupon, simul[2]/S0))
    else:
        payoff.append(simul[2]/S0)

print(np.mean(payoff))

Me parece que un cupón de alrededor del 7,65% hace que este producto valga 1 ( no resolvió correctamente con la optimización). Como me cuesta ver donde me he equivocado quería saber si habéis encontrado el 12% y en caso afirmativo como ? Muchas gracias de antemano

1voto

boucekv Puntos 103

Yo tenía más o menos el mismo nivel que tú cuando lo intenté: $0.076\%$ .

El código está más abajo: siéntete libre de inspirarte en él, así como de dar tu opinión. Es la mejor manera de aprender en colaboración.

import numpy as np
import numpy.random as npr
from statistics import mean

def payoff(path, coupon):
    if path[1] > path[0]:
        return 1 + coupon
    elif path[2] > path[0]:
        return 1 + 2 * coupon
    elif path[3] > 0.7 * path[0]:
        return max(1 + 3 * coupon, path[3]/path[0])
    else:
        return path[3]/path[0]
testpath = [100, 101, 120, 60]
print(payoff(testpath, 0.1))

spot, volatility, coupon = 100, 0.25, 0.076
nPaths = 500000
path = spot * np.ones((nPaths, 4))
epsilon = npr.randn(nPaths, 3)
for i in range(nPaths):
    for j in range(3):
        path[[i], [j + 1]] = path[[i], [j]] * np.exp(-0.5 *
    volatility**2 + volatility * epsilon[i, j])

print(mean([payoff(path[i], coupon) for i in range(nPaths)]))

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