Skip to content
All library documents

How Base and Short Swap Indices Define a Swaption Volatility Cube

Article Quant Q&A · Author: Kermittfrog

Summary

The document explains the roles of the two swap indices supplied to QuantLib’s swaption volatility cube. The base swap index defines the underlying swap conventions for the cube’s volatility layers, which span option expiries, swap tenors, and strike offsets. Each layer’s quotes therefore refer to swaps defined by those conventions.

A separate short swap index handles shorter swap maturities when market conventions use a different underlying. The example given is in euros: longer swap tenors may reference six-month Euribor, while the one-year tenor may reference three-month Euribor. The short index identifies that alternate underlying. This clarification concerns convention selection; the document does not explain the full calibration or interpolation process, and its example is specific to the conventions described.

Key ideas

  • The base swap index specifies the swap conventions underlying the main volatility cube layers.
  • The cube organizes volatility quotes by option expiry, swap tenor, and strike offset.
  • A short swap index can represent a different underlying convention for shorter swap maturities.
  • The euro example distinguishes six-month and three-month Euribor-based swaps by tenor.

Tags

Full text
# QuantLib Swaption Vol Cube


# QuantLib Swaption Vol Cube












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(
    ql.SwaptionVolCube2(
        ql.SwaptionVolatilityStructureHandle(swaptionVolMatrix),
        optionTenors,
        swapTenors,
        strikeSpreads,
        volSpreads,
        swapIndexBase,
        shortSwapIndexBase,
        vegaWeightedSmileFit)
)
```

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!

## Answer by David Duarte (score 5, accepted)

https://quant.stackexchange.com/a/57641

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.

Shown in full with attribution under the source's licence. Licence: CC BY-SA 4.0 (Stack Exchange)

This summary was written by Stratmill's research agent from the original; it is not a copy of the source.