Pregunta

Tengo un código R que usa la biblioteca RQUANTLIB. Para ejecutarlo desde Python, estoy usando RPY2. Sé que Python tiene sus propias fijaciones para Quantlib (Quantlib-Python). Me gustaría cambiar de R a Python por completo.

Por favor, hágame saber cómo puedo ejecutar lo siguiente con cuantlib-python

import rpy2.robjects as robjects

robjects.r('library(RQuantLib)')
x = robjects.r('x<-EuropeanOptionImpliedVolatility(type="call", value=11.10, underlying=100,strike=100, dividendYield=0.01, riskFreeRate=0.03,maturity=0.5, volatility=0.4)')
print x

Ejemplo de ejecución:

$ python vol.py 
Loading required package: Rcpp
Implied Volatility for EuropeanOptionImpliedVolatility is 0.381
¿Fue útil?

Solución

Necesitarás un poco de configuración. Para mayor comodidad, y a menos que obtenga enfrentamientos de nombre, es mejor que importe todo:

from QuantLib import *

Luego, cree la opción, que necesita un ejercicio y una recompensa:

exercise = EuropeanExercise(Date(3,August,2011))
payoff = PlainVanillaPayoff(Option.Call, 100.0)
option = EuropeanOption(payoff,exercise)

(Tenga en cuenta que necesitará una fecha de ejercicio, no un momento de madurez).

Ahora, ya sea que desee fijarlo o obtener su volatilidad implícita, tendrá que configurar un proceso de Scholes Black-Scholes. Hay un poco de maquinaria involucrada, ya que no puede simplemente pasar un valor, digamos, del ritmo sin riesgos: necesitará una curva completa, por lo que creará una plana y lo envolverá en un mango. Ídem para rendimiento de dividendos y vol; El valor subyacente va en una cotización. (No estoy explicando cuáles son todos los objetos; comente si lo necesita).

S = QuoteHandle(SimpleQuote(100.0))
r = YieldTermStructureHandle(FlatForward(0, TARGET(), 0.03, Actual360()))
q = YieldTermStructureHandle(FlatForward(0, TARGET(), 0.01, Actual360()))
sigma = BlackVolTermStructureHandle(BlackConstantVol(0, TARGET(), 0.20, Actual360()))
process = BlackScholesMertonProcess(S,q,r,sigma)

(La volatilidad en realidad no se usará para el cálculo de Vol implícito, pero de todos modos necesitas uno).

Ahora, para la volatilidad implícita que llamará:

option.impliedVolatility(11.10, process)

y para el precio:

engine = AnalyticEuropeanEngine(process)
option.setPricingEngine(engine)
option.NPV()

Puede usar otras características (las tarifas de envoltura en una cotización para que pueda cambiarlas más tarde, etc.), pero esto debería comenzar.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top