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

Mejora en la Calculadora de SWAP

Escrito por Manuel el octubre 27, 2011

Como he comentado varias veces en twitter, he realizado una mejora en la calculadora de SWAP programada en VBA en EXCEL para que se puedan calcular el valor de SWAP anteriores al día de hoy.

La primera versión de la calculadora estaba pensada para realizar cálculos en los que se valoraba un SWAP a futuro con las curvas de tipos de EURIBOR 3 meses, 6 meses y 12 meses además del EONIA. En esta versión podremos calcular swaps que empiecen a partir del 13/12/2006. Es hasta fecha porque no he podido descargar más datos históricos de los tipos de interés. Como se supone, el factor de descuento para los tipos hasta el día 19/07/2011 es 1 ya que tengo los históricos hasta ese día.

Además he realizado otra modificación en la calculadora de SWAP y es que se pueda ir liquidando el SWAP trimestral, semestral o anualmente independientemente del euribor elegido ya que en la versión antigua, si se elegía por ejemplo hacer las liquidaciones con el euribor a 6 meses, obligatoriamente había que realizar liquidaciones semestrales.

calculadora_derivadosTI

Intentaré realizar estas modificaciones en la calculadora de CAP pero es que estoy bastante liado con MATLAB también, del que como sabéis hay algún POST que otro en el blog de algunos desarrollos y algoritmos que he implementado.

Me gustaría escribir más a menudo en el blog, pero entre las clases de inglés y todo lo que llevo en mente no puedo, también tengo que actualizar un poco mi web personal que la tengo abandonada. Tengo ganas de comentar algo sobre la quita de Grecia y todo lo transcurrido en la economía europea ultimamente pero antes quería subir esta mejora de la calculadora que tengo ya preparada y revisada hace un par de semanas.

Espero que os sea útil esta nueva mejora, y como en el otro post, si alguien desea el código fuente que se ponga en contacto conmigo a través del correo electrónico de mi web personal, twitter o dejando un comentario en el post.

27Oct

CDS, ¿protección o especulación?

Escrito por Manuel el octubre 19, 2011

Se ha estado hablando mucho desde que empezó la crisis de los CDS, el acrónimo de “Credit Default Swap“. Para los que no saben de que va este producto, así en líneas generales, es un derivado de tipo de interés que te cubre ante posibles pérdidas por quiebra de una empresa. En resumen, una especie de seguro para los que poseen bonos corporativos ó estatales de una entidad que se declara en “Default“. Aquí pongo el enlace de Wikipedia donde lo explica más a fondo.

Ayer se publicó que la UE prohibirá la venta en corto al descubierto de estos productos, lo que quiere decir que se va a frenar la especulación con este producto. Esta especulación trata de comprar protección de una entidad sin tener el bono correspondiente, de esta forma sube la cotización del CDS, lo que a su vez lleva a que si es más cara la protección hay más riesgo de quiebra. Está clarísimo que el precio de un CDS que nos proteja contra la quiebra de Grecia es mucho más caro que el que nos protege contra la quiebra de España por ejemplo.

Yo siempre he opinado que es un producto de protección no de especulación, hay otros muchos productos derivados con los que se puede especular. La especulación con CDS es difícil que lleve a quebrar una entidad pero lo que si puede hacer y está haciéndose todos los días es que lleven a subir el tipo de interés de un bono corporativo o estatal. Tiene sentido que si la protección es cara, haya riesgo de quiebra, por lo que el bono debe pagar más interés al poder quebrar. Es una bola de nieve que se puede ir agrandando de forma continua hasta que se estrelle al final de la colina.

A esta especulación tampoco ayudan las agencias de rating que la tienen tomada con Europa y tampoco creo yo que se merezcan el castigo que están recibiendo muchos países y entidades entre las que se encuentra España. A ver si esta medida les ayuda a callarse un poco también.

En el máster de finanzas cuantitativas que realicé, en la asignatura de derivados de tipos de interés y en la de riesgo de crédito tuvimos el debate de si es ético la especulación con CDS y hubo opiniones de todo tipo. Yo opino que no sé si es ético o no, pero al estar en una crisis de deuda soberana como en la que estamos, esta decisión de la UE es perfecta y que solo compre protección el que tenga deuda comprada.

En definitiva, espero que acierten con esta decisión (estoy seguro de que sí lo han hecho) y que reduzca la especulación que se vive a día de hoy con la deuda soberana y los CDS ya que puede ser muy nocivo que no se arregle el panorama que tienen a día de hoy los países que forman el grupo de los PIGS.

Respecto a la pregunta principal de si los CDS son productos de protección o especulación, queda clara mi opinión, deben ser claramente un producto de protección.

19Oct

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