Расчет EuropeanOptionImpliedVolatility в квантлиб-питоне - PullRequest
7 голосов
/ 03 февраля 2011

У меня есть R-код, который использует библиотеку RQuantlib.Для запуска из Python я использую RPy2.Я знаю, что Python имеет свои собственные привязки для Quantlib (Quantlib-Python).Я бы хотел полностью перейти с R на python.

Пожалуйста, дайте мне знать, как я могу запустить следующее с помощью Quantlib-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

Пример запуска:

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

1 Ответ

21 голосов
/ 04 февраля 2011

Вам понадобится немного настроек.Для удобства, и если вы не столкнетесь с именами, лучше импортировать все:

from QuantLib import *

, затем создайте опцию, которая требует упражнения и выплаты:

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

(обратите внимание, чтовам понадобится дата упражнения, а не время до погашения.)

Теперь, хотите ли вы определить цену или получить ее предполагаемую волатильность, вам придется настроить процесс Блэка-Шоулза.Здесь задействовано немного техники, поскольку вы не можете просто передать значение, скажем, безрисковой ставки: вам понадобится полная кривая, поэтому вы создадите плоскую кривую и завернете ее в ручку.То же самое для дивидендной доходности и объема;базовая стоимость указана в цитате.(Я не объясняю, что это за объекты; прокомментируйте, если вам это нужно.)

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)

(волатильность на самом деле не будет использоваться для расчета подразумеваемого объема, но в любом случае он вам нужен).

Теперь, для подразумеваемой волатильности, вы позвоните:

option.impliedVolatility(11.10, process)

и для оценки:

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

Вы можете использовать другие функции (обернуть ставки в цитате так,вы можете изменить их позже и т. д.), но это должно помочь вам начать работу.

...