在quantlib-python中计算欧式期权隐含波动率
我有一段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 个回答
28
你需要做一些准备工作。为了方便起见,除非你遇到名字冲突,最好把所有东西都导入进来:
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()
你可能会使用其他功能(比如把利率放在报价里,这样你可以稍后更改它们等等),但这些应该能帮助你入门。