I am currently trying to price swaptions under QuantLib/Python using a volatility cube using ql.SwaptoinVolCube2. From the documentation:

optionTenors = ['1y', '2y', '3y']
swapTenors = [ '5Y', '10Y']
strikeSpreads = [ -0.01, 0.0, 0.01]
volSpreads = [
    [0.5, 0.55, 0.6],
    [0.5, 0.55, 0.6],
    [0.5, 0.55, 0.6],
    [0.5, 0.55, 0.6],
    [0.5, 0.55, 0.6],
    [0.5, 0.55, 0.6],

optionTenors = [ql.Period(tenor) for tenor in optionTenors]
swapTenors = [ql.Period(tenor) for tenor in swapTenors]
volSpreads = [[ql.QuoteHandle(ql.SimpleQuote(v)) for v in row] for row in volSpreads]

swapIndexBase = ql.EuriborSwapIsdaFixA(ql.Period(1, ql.Years), e6m_yts, ois_yts)
shortSwapIndexBase = ql.EuriborSwapIsdaFixA(ql.Period(1, ql.Years), e6m_yts, ois_yts)
vegaWeightedSmileFit = False

volCube = ql.SwaptionVolatilityStructureHandle(

Currently, I am wondering which role the two swap indices play in this?

I assume it has something to do with calculation of ATM and strike-spreads vs ATM, but I do not understand why it requires two indices for this.

Thanks for any pointers!


1 Answer 1


The swaption vol cube is basically a series of surface layers, each layer refers to a given strike and has vols for combinations of option expiries and swap tenors of the same underlying: a swap with given conventions. That underlying is defined by the swapIndexBase.

However, for shorter maturities, the conventions are often different. For example, in Euro, you have swap vs 6M Euribor for tenors > 1Y and swap vs 3M Euribor for the 1Y tenor. The shortSwapIndexBase is used to identify this second underlying.

The example on readthedocs could be better in that respect.

  • $\begingroup$ Thanks! And a follow-up: how would I be able to infer the ‚breakpoint‘ between the two conventions? Is that driven by the ‚1Y‘ in the ISDA-Swap? And would I then setup the shorter swap curve with A EUR3M-curve? $\endgroup$ Aug 27, 2020 at 1:16
  • 1
    $\begingroup$ The tenor of the shortSwapIndexBase will define the limit, If swapTenor > shortSwapIndexBase.tenor() use swapIndexBase else use shortSwapIndexBase. Check out the QuantLib source (QuantLib/ql/termstructures/volatility/swaption/swaptionvolcube.cpp) $\endgroup$ Aug 27, 2020 at 8:08

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.