Domanda

Ho un codice R che utilizza la libreria RQUANTLIB. Per eseguirlo da Python sto usando RPY2. So che Python ha i suoi legami per Quantlib (Quantlib-Python). Vorrei passare completamente da R a Python.

Per favore fatemi sapere come posso eseguire quanto segue usando quantlib-pithon

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

Esempio di corsa:

$ python vol.py 
Loading required package: Rcpp
Implied Volatility for EuropeanOptionImpliedVolatility is 0.381
È stato utile?

Soluzione

Avrai bisogno di un po 'di configurazione. Per comodità e, a meno che tu non riceva scontri di nome, è meglio importare tutto:

from QuantLib import *

Quindi, crea l'opzione, che necessita di un esercizio e un payoff:

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

(Nota che avrai bisogno di una data di esercizio, non è un momento alla maturità.)

Ora, sia che tu voglia valutare o ottenere la sua volatilità implicita, dovrai impostare un processo di Black-Scholes. C'è un po 'di macchinari coinvolti, dal momento che non puoi semplicemente passare un valore, per esempio, della tariffa priva di rischi: avrai bisogno di una curva completa, quindi ne creerai uno piatto e lo avvolgerai in una maniglia. Idem per resa dei dividendi e vol; Il valore sottostante va in un preventivo. (Non sto spiegando quali sono tutti gli oggetti; commenta se ne hai bisogno.)

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 volatilità non verrà effettivamente utilizzata per il calcolo implicito-VOL, ma ne hai comunque bisogno.)

Ora, per la volatilità implicita chiamerai:

option.impliedVolatility(11.10, process)

E per i prezzi:

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

Potresti utilizzare altre funzionalità (tassi di avvolgimento in un preventivo in modo da poterle modificare in seguito, ecc.) Ma questo dovrebbe farti iniziare.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top