Introduccion

En este lab, se valoran opciones americanas en Python, de una forma sencilla, como viene siendo habitual. Se utiliza la librería de QuantLib, una librería de finanzas cuantitativas opensource, programada originalmente en C++,pero adaptadaa otros lenguajes, tales como Python. Esta librería no esta centrada en la estadística, como viene siendo habitual, sino en las probabilidades.

La principal motivación fue la de crear una comunidad de desarolladores quant, y un código común, validado y testeado, para “evitar la perdida de tiempo de los quants ‘reinventen la rueda’ cada vez que necesitan un modelo de pricing, o una yield curve.

Podríamos definir la ibrería como una liberia basada en programación orientada a objetos, de pricing riesgo muy profesional, digna de un investment banking o un quant-fund. Resuelve de manera sencilla, grandes grandes retos financieros, como suele ser el ‘daycount’, los calendarios en los diferentes mercados etc…  Y incluso con un poco de tiempo y esfuerzo, podemos utilizar QuantLibpara tener una librería robusta de pricing y riesgo

Antes de entrar en QuantLib, Repaso de Opciones para los que no entiendan muy bien de que hablamos..

Definición : Una opción, es un contrato que el comprador adquiere un derecho, pero no la obligación de negociar un activo predeterminado, al cual, denominaremos activo subyacente. Por un precio determinado, al que llamaremos, precio de ejercicio, en un tiempo futuro, al que llamaremos, fecha de expiración del contrato.

Una opción call, da el derecho a comprar y una opción put, da el derecho a vender, que repetimos, no la obligación.

Las opciones también pueden ser vendidas, pero esto lo trataremos en otro lab, de estrategias clásicas con opciones.

El valor a vencimiento del contrato, lo que denominarios, payoff, de una opción call es:

CALL1

El payoff de una opcion put es:

PUT

Para valorar una opcion, vamos a necesitar la siguiente informacion:

Precio spot (S) del activo subyacente

  • Precio de ejercicio (K) – fijado en el contrato
  • Tiempo a Expiración (T) (Time to Maturity) – fijado en el contrato
  • Volatilidad (σ) – Dependiendo el modelo elegido sera constante (volatilidad implícita anual), estocastica, o alguna estructura local, etc.
  • Tasa de interés libre de riesgo (r) (Risk-free IR) – Dependiendo el modelo elegido sera constante (tasa constante libre de riesgo), estocastica o bien una curva de tasa, etc.
  • Dividendos (q) – – Dependiendo el modelo elegido sera constante (tasa constante libre de riesgo), que represente el flujo esperado de pagos, etc.

Caso Practico en Python

quantlib

Supongamos que se le quiere buscar un precio justo a una opcion de ETF QQQ con precio strike de 275 expirando el 1 de enero de 2021. Supongamos que el spot es  285.75 La vol implicita es sabida que es 65% (1), y tiene un dividendo de 0.25% anual (2) y en el mercado se puede prestar y tomar prestado sin riesgo al 0.01% (3). Valoremos  la opcion al dia de hoy (10 de de octubre 2020)

El primer paso, va a ser el de cargar las librerías y declarar los parámetros necesarios para realizar los cálculos, en este caso, extraídos el enunciado anterior.

El siguiente paso, construimos la opción, asignandole un modelo de payoff y un tipo de ejercicio. Posteriormente crearemos el resto de objetos necesarios para la correcta valoración de las opciones en QuantLib

Una vez realizado el paso anterior, crearemos un objeto de volatilidad, flat en este caso, ya que la asignamos como constante. El modelado de la volatilidad es uno de los mayores desafíos para un analista, por consecuencia QuantLib permite el uso de múltiples modelos de volatilidad. El mas general es VolatilityTermStructure. Supone una volatilidad constante mediante la clase BlackConstantVol.

Una vez declarados todos los objetos necesarios , creamos el proceso estocastico que modela el activo. En este caso es el de Black Scholes Merton, que necesita como entrada los objetos anteriormente declarados.

Los procesos estocásticos que admite QuantLib son los siguientes:

BatesProcess, BlackProcess, BlackScholesMertonProcess, BlackScholesProcess, CoxIngersollRossProcess, ExtendedBlackScholesMertonProcess, ExtendedOrnsteinUhlenbeckProcess, ExtOUWithJumpsProcess, ForwardMeasureProcess, ForwardMeasureProcess1D, G2ForwardProcess, G2Process, GarmanKohlagenProcess, GemanRoncoroniProcess, GeneralizedBlackScholesProcess, GeneralizedOrnsteinUhlenbeckProcess, GeometricBrownianMotionProcess, GJRGARCHProcess, GsrProcess, HestonProcess, HullWhiteForwardProcess, HullWhiteProcess, HybridHestonHullWhiteProcess, KlugeExtOUProcess, LiborForwardModelProcess, MarketModelVolProcess, Merton76Process, MfStateProcess, OrnsteinUhlenbeckProcess, SquareRootProcess, StochasticProcess, StochasticProcess1D, StochasticProcessArray, VarianceGammaProcess, VegaStressedBlackScholesProcess,

Para valorar un derivado necesitamos

  • La opcion (en nuestro ejemplo opción_americana)
  • El proceso (en nuestro ejemplo proceso_BSM)
  • El modelo (Engine)

Tenemos ya la opción, y el proceso, ahora quedaría seleccionar un modelo de valoración(Engine)

Al objeto opcion que es parte de instrument, le aplico el metodo setPricingEngine

QuantLib ofrece un largo catalogo de modelos de pricing, esto es uno de sus puntos fuertes,

VarianceGammaEngine, FFTEngine, FFTVanillaEngine, FFTVarianceGammaEngine, AnalyticBSMHullWhiteEngine, AnalyticDigitalAmericanEngine, AnalyticDigitalAmericanKOEngine, AnalyticDividendEuropeanEngine, AnalyticEuropeanEngine, AnalyticH1HWEngine, AnalyticHestonEngine, AnalyticHestonHullWhiteEngine, AnalyticPTDHestonEngine, BaroneAdesiWhaleyApproximationEngine, BatesEngine, BinomialVanillaEngine, BjerksundStenslandApproximationEngine, COSHestonEngine, FdBatesVanillaEngine, FDBermudanEngine, FDDividendEngineMerton73, FDDividendEngineShiftScale, FDDividendShoutEngine, FdHestonHullWhiteVanillaEngine, FDShoutEngine, FDStepConditionEngine, FDVanillaEngine, HestonExpansionEngine, IntegralEngine, JumpDiffusionEngine, JuQuadraticApproximationEngine, MCAmericanEngine, MCDigitalEngine, MCEuropeanEngine, MCEuropeanGJRGARCHEngine, MCEuropeanHestonEngine, MCVanillaEngine,

En este lab, veremos los 4 modelos que suelen ser habituales cuando se empieza a analizar la valoración de derivados financieros.

  • Diferencias Finitas – Resolucion de la ecuacion diferencial de Black Sholes
  • Montecarlo – Simulaciones del proceso de BSM y promedio descontado
  • Binomial – Arbol Binomial de un proceso que en el limite tiende al proceso de BSM
  • Analitico – Formula cerrada, Black Scholes y alternativas

En este lab, se trabaja en diferentes metodos,para un pricer estilo BS, trabajamos con dos alternativas, en un lado el modelo de aproximación de Bjerksund y Stensland y el de Barone Adesi y Whaley, ademas de Diferencias finitas, Montecarlo y Binomial

Como ultimo paso, mostramos en pantalla los precios resultado de las valoraciones por los diferentes métodos en QuantLib, y vemos que son todos muy parecidos, sin demasiada discrepancia entre los difeerentes modelos.

Libro QuantLib en Python

Este libro ha sido la bibliografia completa para este articulo, y dejo por aqui en enlace, donde se puede obtener desde 4.99$

https://leanpub.com/implementingquantlib

Tambien te recomendamos que pases por los otros articulos del blog, con tematica en las opciones como este y este, ademas de este de por que utilizar formato pickle y este sobre como cargar largos datasets en dask