1 votos

Error en la fijación de precios de las opciones de barrera de Monte Carlo

Actualmente estoy tratando de fijar el precio de una opción de compra al alza y a la baja con la simulación de Montecarlo. Para una opción con estos parámetros :

  • Barrera: 65
  • $K$ = 50
  • $\sigma$ = 30%
  • $R $ = 1%
  • $T$ = 1Y
  • $S_0$ = 50

Con 10.000 simulaciones y $dt = \frac{1}{500}$ Obtengo un precio de la opción cercano a 0,80 (intervalo de confianza del 95% : [0,76 ; 0,853]) mientras que un pricer da 0,73. Al aumentar el número de simulaciones, el precio aumenta, por lo que es probable que esté haciendo algo mal.

Aquí está el trozo de código python que utilizo:

all_final_payoffs = np.zeros((nb_simulations,1),dtype=float)

for i in tqdm(range(nb_simulations)):
    path_generated_asset = np.zeros((1, nb_time), dtype=float)
    path_generated_asset[0, 0] = S0
    for j in range(1, nb_time):
        X = np.random.randn(1)
        path_generated_asset[0, j] = simulate_price(path_generated_asset[0, j - 1], interest_rate, volatility, dt, X)
    all_final_payoffs[i,0] = compute_barrier_call_payoff(path_generated_asset[0,:],strike,barrier)
option_price = np.mean(all_final_payoffs)*math.exp(-interest_rate*maturity)

Y las dos funciones utilizadas :

def compute_barrier_call_payoff(asset_path,strike,barrier):
    if max(asset_path)>=barrier:
        return 0
    else:
        if asset_path[-1]-strike>0:
            return asset_path[-1]-strike
        return 0

def simulate_price(S,R,Vol,dt,X):
    return S*math.exp((R-(Vol**2)/2)*dt + Vol*math.sqrt(dt)*X)

¿Alguien sabe dónde está mi error? Muchas gracias.

Editar : Al aumentar el número de simulaciones a 20.000 y los pasos de tiempo a 2000, obtengo el precio en 3 minutos (muy largo) en Python. El mismo código en C# en el mismo Mac, el programa me da el resultado en 7 segundos. Al aumentar las simulaciones a 50.000 y los pasos de tiempo a 4.000, tarda unos 35 segundos en darme 0,74$.

Edición 2 : El lanzamiento del código Python con Cython y las variables tipificadas tarda 1 minuto.

2voto

Andy Puntos 2101

La dependencia de la trayectoria de las opciones de barrera requiere un número suficiente de pasos para modelar con precisión la evolución de los precios. Por ejemplo, la simulación del precio de las acciones,

para dt=1/10, Stock price simulation with dt=1/10

para dt=1/500, Stock price simulation with dt=1/500

para dt=1/1000, enter image description here

Se puede observar que, si se utiliza un menor número de pasos, puede que no se active una barrera que se habría activado si se hubiera utilizado un mayor número de pasos. Es decir, el aumento del número de pasos modela mejor el movimiento del precio del subyacente, aumentando así la precisión de la simulación. Esto es muy importante a la hora de valorar los derivados dependientes de la trayectoria.

2voto

Michał Górny Puntos 351

También puede leer la respuesta a esta pregunta relacionada: ¿Cómo se utilizan en la práctica los puentes brownianos en la fijación de precios de los derivados?

Ten en cuenta también que los tiempos mencionados son terriblemente lentos. Sé que la velocidad no es el punto fuerte de Python, pero aún así. 3m50s para 20000 simulaciones con 2000 pasos de tiempo (dt=1/2000) da una idea equivocada de lo eficiente que puede ser MC o no. Descargando esto precio puedes ver que esto no debería llevar más de medio segundo (en un portátil económico). Usando esta aplicación también puedes jugar con la técnica del Puente Browniano y ver cómo si la usas no necesitas dt's tan bajos para obtener precios de barrera Monte Carlo precisos.

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