Simulación de Montecarlo de un subyacente utilizando la fórmula de Black-Scholes con MATLAB

Escrito por Manuel el enero 4, 2012

Anteriormente escribí un post en el que realizaba una simulación de Montecarlo. Dicha simulación es calculada mediante la volatilidad y números aleatorios normales en cada salto de tiempo.

Ahora lo que he implementado es una simulación de Montecarlo algo más compleja, dicha simulación se basa en las fórmulas del modelo de Black-Scholes para obtener las sendas de simulación. Dichas fórmulas se han obtenido con la discretización log-Euler de la fórmula del futuro del subyacente.

Estas fórmulas las he sacado del enunciado del proyecto final del máster pero creo que buscando por Internet no es difícil encontrarlas.

Para calcular el tipo de interés sin riesgo he descargado los datos en formato CSV de la página http://www.ecb.int/stats/money/yc/html/index.en.html, los he pasado a EXCEL para que sea más cómodo su tratamiento y he cargado los datos de la curva en MATLAB para así poder interpolar sobre esa curva, se incluye en el ZIP.

Para los datos del subyacente, he utilizado la función downloadValues, algo ya típico en mis desarrollos de MATLAB, y descargo los datos de cotización del último año a partir de hoy hacia atrás, ya que solo voy a simular un año. Si se quisiera tener una simulación más grande simplemente tendriamos que cambiar en la llamada a esta función el today-365 por el valor que se quiera tener, por ejemplo para 2 años, today-730.

Para la utilización de esta simulación es necesario tener la tasa de dividendos y el tipo de interés sin riesgo que son datos que utiliza el modelo de Black-Scholes. Tanto como la tasa de dividendos como el tipo de interés sin riesgo son recalculados mediante interpolación para cada una de las sendas de simulación con la función curvasRQ. Previamente tenemos que haber calculado la tasa de dividendos para el subyacente, esta tasa la he definido en el propio código fuente para no liar el tema, ya que el objetivo es la simulación no dicho cálculo, pero si se desea se puede utilizar lo que escribí en el post de la tasa de dividendos implícita en opciones Vanilla Europeas y utilizar la paridad PUT-CALL para hayar dicho valor.

La función con el grueso del programa es montecarloBS pero la función para ejecutar el programa es principalBS.m.

Utilizo los forward de la tasa de dividendos y del tipo de interés, dichos forward los voy calculando en cada senda de simulación a partir de las curvas obtenidas anteriormente.

Una vez obtenidos los forward, aplico las funciones de la discretización mostrada anteriormente para obtener los dos términos principales por separado para simplificar su cálculo en MATLAB.

Uno de los problemas que surgen en las simulaciones de Montecarlo es la baja precisión, es decir, la alta varianza, la forma en que se arregla es incrementando el número de simulaciones, pero esto nos lleva a tener tiempos de procesamiento altos. Uno de las formas que se tienen para aumentar la precisión sin tener que aumentar las simulaciones es por técnicas de reducción de varianza y una de esas técnicas es la de las variables antitéticas que consiste en realizar pares de simulaciones en lugar de una sola. Para poder implementar esta técnica en el código he realizado dos simulaciones realmente y lo implemento sumando en una simulación y restando en la otra (sumo y resto porque la base de las potencias que se multiplican es la misma) los términos de Black-Scholes calculados, es decir, en lugar de multiplicar únicamente las dos potencias, en una simulación multiplico las potencias y en la otra las divido. La simulación final es la media de ambas simulaciones (línea verde), pero en la gráfica resultante de la ejecución muestro en rojo y azul las dos simulaciones antitéticas.

La imagen anterior es una simulación de técnicas reunidas.

Para ejecutar dicho programa hay que ejecutar el script principalBS, el cual muestra la gráfica resultante que dije en el párrafo anterior.

montecarloBS

Como siempre, para cualquier duda que os pueda surgir escribidme un correo electrónico a la dirección que encontraréis el el pie de página de mi web personal o dejándome un comentario en el POST, resolveré vuestras dudas encantado.

Espero que le saquéis partido a dicha simulación.

4Ene

Valoración de una opción barrera con Simulación de Montecarlo en MATLAB

Escrito por Manuel el noviembre 22, 2011

Como comenté en el POST que presenté la simulación de Montecarlo, dicho método tiene multiples aplicaciones en muchísimos procesos y métodos financieros y en otros muchos campos que no son financieros.

Una de las aplicaciones en las que la simulación de Montecarlo es más utilizada es en la valoración de opciones y lo que es más útil todavía es es en la valoración de opciones exóticas. Depende de la opción exótica que se elija, la valoración de dicho producto puede ser de lo más complicado, laborioso y computacionalmente hablando, muy muy costoso. Por ejemplo las opciones asiáticas aritméticas, que son las más comunes, deben valorarse con el método de los dos/tres momentos (en otro post me centraré en estos métodos) para aproximar los parámetros que tiene y poder utilizar las fórmulas de Black-Scholes.

En este post me voy a centrar en la valoración de opciones barrera, estas opciones son vigiladas continuamente durante su vida y en el momento que se traspase la barrera hacia arriba o hacia abajo, puede hacer que estemos dentro o fuera de la opción según del tipo que sea, por lo que claramente se distinguen 4 tipos de opciones barrera simples: UP and IN, UP and OUT, DOWN and IN y DOWN and OUT, CALL y PUT para cada uno de estos cuatro tipos. Existen variantes más complejas con dos o más barreras y combinando cada uno de los tipos anteriores, por lo que es un mundo solo el que conlleva el estudio de este tipo de opciones. Como es previsible, estas opciones son más baratas que las opciones sin barrera normales y corrientes.

Existen varios modelos de valoración para las opciones barrera, por ejemplo, el principio de reflexión, modelos lognormales, paridad IN-OUT, modelo de volatilidad local, PDE y por supuesto, el modelo de Montecarlo.

He realizado un script en MATLAB, que utiliza también el script de descarga de datos de yahoo finance, downloadValues.m, para descargar cotizaciones de un subyacente. Dicho script realiza la valoración de una opción barrera UP and OUT en la que el usuario define la barrera y el subyacente.

El script lo que hace es una simulación de montecarlo discreta para cada uno de los días de vida de la opción y una vez ha finalizado la simulación compruebo si se ha sobrepasado la barrera. En el caso de que no lo haya hecho, el valor de la opción es el valor final de la opción es el máximo entre 0 y el valor final menos el precio de ejercicio, es decir, max(0,ST(end)-X). En el caso en que se haya sobrepasado la barrera, la opción tiene un valor de 0 al ser UP and OUT. El valor de la opción simulada por Montecarlo es la media de cada una de las simulaciones actualizada al tipo de interés actual sin riesgo (algo difícil de encontrar hoy en día), yo he tomado en el sctipt un valor de un 3%.

montecarlo_discreto_barrera.m

El script muestra una gráfica con todas las simulaciones y la barrera, pintando en rojo las simulaciones que han traspasado la barrera y al final de la ejecución muestra por pantalla el valor de la prima.

He realizado una ejecución con 10000 simulaciones que es lo normal para que la valoración sea efectiva, como está claro, cuanto menos simulaciones se realizan, más incoherente son los resultados. La gráfica es un poco locura pero muestra a primera vista que porción de las simulaciones han sobrepasado la barrera. En este ejemplo defino una barrera del 150% del valor del subyacente, que en este caso ha sido Inditex, ITX.MC. El valor de la prima ha sido de 3.750397 euros.

Nunca lo he comentado, pero para la gente que no tenga MATLAB, si me pide algún otro lenguaje de programación podría implementarlo también. He estado buscando librerías estadísticas para JAVA pero no encuentro, por lo que también comento que si alguien sabe de alguna, por favor, que me lo comente por aquí o que me mande un correo a la dirección que se encuentra en el pie de página de mi web personal. Y además, para cualquier duda o aclaración, lo mismo, un comentario o un correo. Espero que os sirva y que lo entendáis perfectamente.

22Nov

Estudio de la Volatilidad implícita en opciones Vanilla europeas con MATLAB.

Escrito por Manuel el octubre 10, 2011

La volatilidad implícita es la que iguala el precio de mercado de una opción Plain Vanilla al precio obtenido por la fórmula del modelo de Black-Scholes. La siguiente fórmula es la representación de la volatilidad implícita:

Uno de los parámetros que se utiliza es el de la tasa de dividendos implícita la cual ya expliqué en un POST anterior como calcularla con MATLAB.

Esta volatilidad es la negociada en el mercado, es decir, es el riesgo que se percibe en el mercado por las personas que negocian las opciones.  Esta volatilidad es calculada continuamente para ver el riesgo de las opciones, al ser considerada una estimación de la volatilidad futura del subyacente.

Se dice que la volatilidad de las opciones Vanilla crea una sonrisa de volatilidad respecto al strike por lo que realicé un estudio de dicha volatilidad con opciones de E.ON realizado en MATLAB en el que represento gráficamente sus opciones CALL y PUT a vencimientos de Junio 2012 y Diciembre 2012.

Esta es la representación de las volatilidades implícitas de las opciones CALL y PUT de E.ON en función del Strike y del tiempo. La cotización de E.ON cuando hice el estudio de la volatilidad era de 19,06 (20/06/2011). En ambas graficas se observa el SMILE típico de la volatilidad implícita que se acentúa la volatilidad cuando la opción CALL está muy OTM y cuando la PUT está muy ITM.

Enlace de Wikipedia Volatility Smile.

Las funciones de MATLAB que adjunto son volatilidadImplicita.m y calcularVol.m. La primera de ellas calcula la diferencia entre el precio de mercado y el precio calculado por Black-Scholes con los parámetros de entrada suministrados a la función. calcularVol.m utiliza la función volatilidadImplicita.m en el algoritmo que halla las raíces de la siguiente expresión:

Para ésto, volatilidadImplicita.m utiliza la función de MATLAB fzero que sirve para hallar las raíces que hacen 0 la función.

En cada una de las funciones explico cuales son los parámetros y la salida que dan, podéis ver la ayuda de estas funciones a través del código fuente o utilizando el comando help. Aquí pongo en un zip las dos funciones comentadas:

calcularVol_volatilidadImplicita

Si alguien desea también la función que representa gráficamente los smiles de volatilidad respecto a X y T que me mande un correo o deje un comentario para comunicármelo, y como siempre digo, para cualquier duda, lo mismo.

10Oct

Tasa de dividendos implícita en opciones vanilla europeas: Paridad PUT-CALL con MATLAB.

Escrito por Manuel el octubre 3, 2011

Uno de los estudios que se realizan con las opciones Plain Vanilla europeas es el hallar la tasa de dividendos implícita en los precios de dichas opciones.

Como introducción a que es la paridad PUT-CALL voy a explicar que es la tasa de dividendos implícita en el precio de las opciones: es el porcentaje de ganancia que aporta la empresa como dividendos que incluyen las opciones. Cuanto mayor es el vencimiento de las opciones mayor es dicha tasa de dividendos, estando ajustado el precio de las opciones CALL y PUT. Si una empresa aumenta el dividendo, teóricamente, se supone que el precio de la opción aumentará ajustándose a dicho dividendo, por lo que si se tenía una opción en cartera, ya se ha ganado un porcentaje sin que el precio del subyacente varíe.

Para hallar dicha tasa de dividendos se utiliza la paridad PUT-CALL, la cual se basa en el supuesto el cual dice que no existe posibilidad de arbitraje en las opciones call y put, que siempre se cumple y si no es así, ya se encargará el mercado de que se cumpla ajustándose los precios rápidamente. Es importante que se calcule con opciones europeas y con opciones que tengan el mismo vencimiento y el mismo precio de Strike.

Lo que yo he desarrollado es una función de MATLAB que devuelve dicha tasa de dividendos implícita basándome en la fórmula que implementa dicha paridad, esta fórmula es la siguiente:

Lo que hago es depejar q que es la tasa de dividendos implícita.

Dejo el enlace de wikipedia en el que se explica más detenidamente que es la paridad PUT-CALL y la derivación de la fórmula: Paridad PUT-CALL Wikipedia.

Aquí pongo el fichero de MATLAB con la función que implementa la fórmula:

paridadPutCall.m

En el fichero explico cuales son los parámetros y datos necesarios para ejecutar dicha función y que valores devuelve, porque además de devolver la tasa ímplicita de dividendos devuelvo el tipo de interés libre de riesgo al tiempo de vencimiento de las opciones. Lo calculo interpolando los datos de dicho tipos de interés.

Como siempre, si alguien tiene dudas de la ejecución de la función o su uso que me escriba un correo electrónico o que deje un comentario en la entrada. Mi correo electrónico viene en mi web personal.

Próximamente escribiré una nueva entrada dando uso a la tasa calculada, por ejemplo, la de hallar la volatilidad implícita en el precio de las opciones Plain Vanilla.

3Oct

Proyecto del Máster finalizado

Escrito por Manuel el julio 18, 2011

A falta de recibir las notas, puedo decir que he acabado satisfactoriamente el Máster en Finanzas Cuantitativas.

El viernes entregué lo que me faltaba para completar mi formación, el proyecto final. El proyecto consistía en analizar la importancia de la consideración del Smile de Volatilidad en la valoración y análisis de riesgo de una Opción Exótica ligada a un subyacente (acción, índice, futuro sobre materias primas o divisa), todo ello con MATLAB.

El proyecto se dividía en tres partes: un análisis empírico del subyacente y las opciones Plain Vanilla, valoración de una opción exótica a elegir mediante el modelo de Black-Scholes y el Modelo de Hagan et al. (2002) ambos modelos con simulación de Montecarlo y el análisis de riesgo del subyacente y de la opción exótica elegida en el punto anterior.

La única condición impuesta es que el subyacente, índice o futuro cotizara en euros, por lo que para obtener liquidez en opciones decidí irme al DAX alemán y acabé eligiendo E.ON.

La fecha de valoración en la que descargué los datos fue el 20 de Junio. En esta fecha descargué las cotizaciones históricas, los datos de las opciones y la curva de tipos del BCE, los enlaces son los siguientes: cotizaciones E.ON, datos opciones Vanilla E.ON y curva de tipos de BCE.

Una vez que tuve los datos empecé la programación en MATLAB de los puntos pedidos, además de realizar algún ejercicio opcional.

Cuando sepa la nota y corrija algún error si se me detectan, subiré las funciones principales aquí por si a alguien le interesa, sobre todo las de la calibración del modelo de Hagan et al. (2002) que son las más interesantes y útiles y es trabajo que se puede ahorrar si ya está hecho. Tambien alguna de las simulaciones de Montecarlo y la de valoración de la opción barrera que fue la exótica que yo elegí.

A ver si ahora que tengo más tiempo puedo escribir más, prometo intentarlo.

Mientras escribo todo esto, solo comentar algo más que no tiene mucho que ver con el post: la prima de riesgo de España está alcanzando límites de rescate, esperemos que se calme la cosa y que los test de stress de la banca dejen de afectar negativamente a los mercados.

18Jul