The Construction of an Interest Rate Vol Cube

A volatility surface maps the time-to-expiration and strike to the volatility data. To capture the implied volatilities for a particular instrument such as an equity index or a currency, a volatility surface is sufficient. The interest rate volatility products are more complex as they have an extra dimension: the tenor of the underlying swap type of instrument. Hence, a volatility cube which handles the mapping from time-to-expiration, tenor, strike to implied volatility is required.

Based on [1] and [2], I implemented the algorithms related to the construction of a volatility cube. Swaptions and cap/floor are taken as a the raw inputs. In some implementation, other derivatives such as eurodollar futures (ED/ER series) can also be included as extra inputs. I pick the USD rates market on 2021-03-16 as an example throughout this blog. By adding a market to each of the cell in the volatility cube that I have access to the quotation of the underlying instrument, we can see the sparseness of the input data set. While those at forefront of rates trading would have better access, that would not change the fact that many data points would not have readily available quotations as the liquidity is similarly not there for some of the data points. Some form of volatility extrapolation (“smile-lift” as explained later) would be necessary.

Quote available to build a Volatility Cube (USD as of 2021-03-16). Source: ICAP/Bloomberg

Vol from Cap/Floor & Swaption

As swaption and cap/floor provide complementary information, they are both necessary when building a volatility cube.

One of the main use of swaption is to hedge the prepayment risk of mortgage exposure. The demand is thus concentrated to the at-the-money (ATM) or near ATM strikes. While ATM quotations are readily available for most standard expiration dates and tenors, quotations for Out-of-The-Money (OTM) strikes are limited only to a few most popular time-to-expiration and tenor combinations. Also the range of strikes is usually not far away from the ATM strike.

Introducing interest rate cap/floor as the inputs fill some gaps in both time-to-expiration and strike dimensions. As the caps and floors are often utilised to hedge contractual upper and lower bounds floating rate obligations, the dealers tend to make market for a wider set of fixed strikes for expiration dates ranging from 1 year to 20-30 years. However, the caps/floors have very limited range in terms of tenor. A cap/floor should be interpreted as a series of interest rate options with a tenor the same as that of the payment period. Much of the trading follows the market convention of which payment period is 3-month for USD, 6-month for GBP, 3-month if maturity equals to or below 2-year and 6-month if above for EUR. In other words, the tenor is restricted to either 3-month or 6-month. Nevertheless, the wider strike range and comprehensive coverage on different expiration dates make them complementary to the swaption data.

Implied volatilities

For a strike {K}, notional {N}, year fraction between time x and y be {\tau_{x,y}} and a reference index rate {L} e.g. LIBOR being fixed at {t_{t-1}} and paid at {t_i}, the payoffs of cap, floor and swaption are as follows.

\displaystyle  Cap = N \sum_{i=1}^n P(t_0, t_i) \, \tau_{t_{i-1}, t_i} \, (L(t_{i-1}, t_i)-K)^+

\displaystyle  Floor = N \sum_{i=1}^n P(t_0, t_i) \, \tau_{t_{i-1}, t_i} \, (K-L(t_{i-1}, t_i))^+

\displaystyle  Swaption = N \left( \sum_{i=1}^n P(t_0, t_i) \, \tau_{t_{i-1}, t_i} \, (L(t_{i-1}, t_i)-K) \right)^+

Each swaption is defined by its time-to-expiration, tenor and strike The calculation of the implied volatility is straightforward. It involves the conversion of quoted price to implied volatility using a root finding algorithm. Due to the current low rate environment, either shifted Black or Bachelier model are commonly being used

The volatility calculation for a cap requires more in-depth explanation. Recalling that a cap is comprised of a series of caplets. There is a flat volatility which treats the whole cap as if it is a single option. A series of spot volatilities corresponding to the maturity of each caplet can also be calculated. In the case of volatility cube, the latter is what we require. Let’s say the payment frequency is quarterly and the 1-year cap is examined first. Note the convention to ignore the trade date as a reset date. There are three caplets in that of the 1-year cap with the reset date be 3-month, 6-month, 9-month and the payment date at 6-month, 9-month, 12-month respectively. Since the caplets are not traded separately, assumptions have to make upon the shape of the caplet volatility curve. A common assumption is to assume the caplet volatilities to be the constant within the same year. After processed the 1-year cap, the implied caplet volatility calculations can be advanced to the 2-year cap. There are 4 caplets between year 1 and year 2 (reset date at 12-, 15-, 18- and 21-month). Subtracting the premium of a 1-year cap from that of the 2-year cap gives the sum of premiums for these four caplets. The implied volatility calculation can be repeated for the rest of the interest rate caps as well as the floors.

Filling in the Blanks

The table below shows the number of implied volatility calculations is available each time-to-expiration and tenor tuple (referred as a “cell” in this section). There are three main types of cells when classified in terms of data source: 1. with cap/floor data (grey cells), 2. with ATM and OTM swaption data (beige cells), 3. with ATM swaption data only (turquoise cells). In the first type of cells (in grey), implied volatility are derived from cap and floor data. When examined the raw input, each cell has cap/floor prices at fixed strikes from 0.5 to 7% with 0.5% increment for the lower rates and 1.0% for the higher end. ATM caps are also available. The second type of cells (in beige) has both ATM and OTM swaption data. The strikes are relative to ATM (e.g. ATM {\pm0.5\%, \pm1\%, \pm2\%, \pm3\%}) rather than fixed. The third type of cells (in turquoise) only has volatility calculation at ATM strike.

Number of implied volatilities calculations available for each expiration and tenor (as of 2021-03-16 USD Volatility Cube)

The SABR is a popular model which can be used to capture the volatility smile. Usually {\beta} for SABR is preselected and leaves with three parameters to estimate. The first two types of cells (in grey and beige) all have sufficient data to build a volatility smile. The implied volatility for any strike of these cells can be found using this fitted SABR model.

For the third type of cells (in turquoise), there is only an implied volatility estimate at the ATM strike. We would have to assume the shape of the volatility smile is similar to another cell which is either type 1 (grey) or type 2 (beige). We can either pick a neighbouring cell, or if nothing is available close by, the cap with matching expiration date can be selected. This procedure is known as “smile-lift”.

Smile-lift can be done in a number of different ways.

  • Moneyness Adjustment
    Suppose {\sigma_u=\sigma(\epsilon_u, \tau_u, k_u)} for cell {u} with time-to-expiration of {\epsilon_u}, tenor of {\tau_u}, strike of {k_u} is the unknown volatility we want to find and cell {a} be the one with a fitted volatility smile model.

    Define relative strike {\tilde{k}}

    \displaystyle \tilde{k} = k \frac{ k_a^{ATM}}{k_u^{ATM}}

    where {k_a^{ATM}} is the ATM strike at expiration of {\epsilon_a} and tenor of {\tau_a}.

    If using Bachelier option quoting model,

    \displaystyle \sigma_u= \sigma(\epsilon_u, \tau_u, k_u^{ATM})+\sigma(\epsilon_a, \tau_a, \tilde{k})-\sigma(\epsilon_a, \tau_a, k_a^{ATM})

    If using Black option quoting model,

    \displaystyle \sigma_u= \sigma(\epsilon_u, \tau_u, k_u^{ATM})*\sigma(\epsilon_a, \tau_a, \tilde{k})/\sigma(\epsilon_a, \tau_a, k_a^{ATM})

  • SABR Lift
    Let {\alpha_a, \beta_a, \nu_a, \rho_a} be the parameters of the SABR model fitted to cell {a}. Parameter {\beta_a, \nu_a} and {\rho_a} represent the shape of the smile. To lift the volatility smile from cell {a} to cell {u}, the parameter {\beta_u, \nu_u} and {\rho_u} are set to be the same as {\beta_a, \nu_a} and {\rho_a}. {\alpha} is a volatility-like parameter. {\alpha_u} is calibrated such that the SABR model at cell {u} gives the ATM swaption volatility at {k_u^{ATM}}

It is also possible to derive a structural model by relating the SDEs of the forward swap rate to forward rates. Please refer to [2] for details.

A Worked Example

Smile-lift is a form of extrapolation with many different possible approaches. For instance, we can lift the smile from the cap volatility far away. We can also lift the smile from nearby cells with both ATM/OTM swaption quotes and take weighted average between them. There is no right or wrong but have to test against real data to tell which approach is a better method.

A worked example is shown here without any attempt to show which approach is statistically better. The target is the 2Y x 10Y (time-to-expiration x tenor) USD swaptions with different strikes on 2021-03-16. The implied volatilities of these strikes are known and will be used as a reference when comparing with the outputs generated by different smile lifting approaches.

Three different approaches are demonstrated here. In the first approach (labelled as “Cap”), the volatility smile is lifted from the caps at 2Y x 3M. In the second approach (labelled as “Swptn”), the volatility smile is lifted from the swaptions twice: first from 1Y x10Y, then from 5Y x 10Y. The volatilities are calculated from each volatility smile before computing the weighted average as {\sigma = 0.75 * \sigma_{1Y x 10Y} + 0.25* \sigma_{5Y x 10Y}}. In either approach, moneyness adjustment is carried out to lift the smile. A simple average between the first and second approach is also being calculated (labelled as “Avg”).

The comparison is as shown in the table below. The values are in Bachelier volatilities in basis point. While this is a worked example with a single comparison performed for a single date, it still gives us some idea about the magnitude of estimation error. At least for this worked example, the estimations by either the first or the second approach are not too bad with the averaging cancels out much of the residual errors.

Worked example for the volatility calculation of the 2Y x 10Y point using different smile lifting approaches

Note 1 “Interest Rate Volatility Cube: Construction and Use”, Hagan & Konikov, 2004.

Note 2 “The Perfect Smile: Filling the Gaps in the Swaption Volatility Cube”, Deloitte, 2018.


Pragmatic Note on Volatility Model When Rates Turn Negative

In the interest rate volatility market, market participants often employ two sets of models – one for quoting the market (ie map the traded option prices in volatility terms using Black model initially and migrated to shifted Black or Bachelier in recent years), another for the modelling of the underlying volatility dynamics e.g. used to model of volatility smile (using SABR and maybe Hull-White). Any model with implicit lognormal assumption will fail under zero or negative rates. As the interest rates for much of the developed world has fallen to close or below zero post 2008 global financial crisis and 2012 European Sovereign debt crisis, early models and conventions need to be adjusted. Here found some of my notes in this topic.

Changes to the Option Quotation Model

The Black model assumes log normal distribution of the forward rate with {dF = \sigma_B F dW}. It was market convention when trading rate volatility products in the 90s and 00s. The price of a European call {C} and put option {P} are

\displaystyle  C=D[F\Phi(d_1) - K\Phi(d_2)]

\displaystyle  P=D[K\Phi(-d_2) - F\Phi(d_1)]


\displaystyle  d_1 = \frac{ln(F/K)+\sigma_B^2 T/ 2}{\sigma_B \sqrt{T}}

\displaystyle  d_2=d_1- \sigma_B \sqrt{T}

{\Phi()} is the cumulative normal distribution function. {\sigma_B}, {F}, {K}, {T} are the Black volatility, forward rate, strike and the time-to-expiry of the option respectively. {D} is a discount factor proportional to the amount of derivatives being held. For example, in the case of a caplet with a notional of {N}, time interval of {\delta} between the rate reset and payment date and discount factor {df} at the payment date, {D=N*\delta*df}. In the case of swaption, {D = N*A} if we define the annuity {A} as sum of discount factor and time interval for each payment period.

When the interest rate being considered (either the forward or the strike) is very low, the solution of the Black model becomes very unstable. When either becomes zero or negative, the solution of the Black model is undefined. We can resolve this either by adopting a shifted Black model or a Bachelier (normal) model.

Solution 1: Shifted Black Model

The idea of shifted Black model is very simple. We pick a “low enough” interest rate level that we do not expect the interest rate would ever fall below (say -3%). We then add this amount to all the inputs. Though there are two main drawbacks: 1. The shifted Black volatility is depend on the shift amount. If two dealers quoting volatilities with different shift amount, conversion has to be done before levels are being compared. 2. The process to select the shift amount can be a bit arbitrary.

Solution 2: Bachelier (Normal) Model

The alternative is to use Bachelier’s century old model which assumes that the forward rate follows normal distribution {dF = \sigma_N dW}. It is also known as Normal Model. The European call and put option prices become

\displaystyle  C=D[(F-K) \Phi(d) + \sigma_N \sqrt{T} \phi(d)]

\displaystyle  P=D[(F-K) \Phi(d) + \sigma_N \sqrt{T} \phi(d)]

\displaystyle d=(F-K)/(\sigma_N \sqrt{T})

with {\phi()} being the probability density function of normal distribution.

Some quick notes on normal volatility: first, normal volatility is shift-invariant as {dF} does not depend of the forward rate. This will become relevant later on. Second, the market convention for normal volatility is to quote in bps (rather than as percent in the case of Black volatility).

Brief Review of the SABR Vol Model

SABR is a popular volatility model for interest rate products. Take swaption as an example, dealer quotes are available often for just the at-the-money and a few popular out-of-the-money strikes (say, ATM, ATM{\pm}100bp, ATM{\pm}200bp etc) for a given swaption expiry date and tenor. If we need to find the volatility at a strike different from the known values, we can use SABR as a volatility smile model to handle the interpolation.

SABR is a four-parameter model with parameters {\alpha, \beta, \nu, \rho} with {\alpha \geq 0}, {0 \leq \beta \leq 1}, {\nu \geq 0} and {-1 < \rho <1}.

\displaystyle  \begin{array}{rcl}  dF &=& \hat{\alpha} F^\beta \, dW_1 \\ d\hat{\alpha} &=& \nu \hat{\alpha} \, dW_2, \quad \hat{\alpha}(0)=\alpha \\ dW_1 dW_2 &=& \rho dt \end{array}

{\beta} is often chosen by the user instead of backing out from the data. Setting {\beta} to zero is a special case. The instantaneous change of the forward rate does not depend on its current value in this situation and this is known as a stochastic normal SABR model. {\alpha} is a volatility-like parameter and {\nu} is a vol-of-vol like parameter. {\rho} is the correlation coefficient between two sources of random noises. The effect of change different SABR parameter is shown in the series of charts below.

The effect of changing different SABR parameters to quoted Bachelier volatility. The base case assume {\alpha=0.001, \beta=0.5, \nu=0.2, \rho=0.3, fwd=0.03, t=5} and one of the parameter is being changed each time

Hagen[1] derived closed-form approximations which map the SABR parameters to either Black or Bachelier volatilities. Define {T} as the option expiry, {z} and {\chi(z)} as

\displaystyle  z = \frac{\nu}{\alpha} (fK)^{\frac{1-\beta}{2}} \log{\frac{F}{K}}

\displaystyle  \chi(z) = \log{\frac{{\sqrt{1-2\rho z+z^2}+z+\rho}}{1-\rho}}

SABR to Black Volatility:

\displaystyle   \sigma_B(F,K) = \frac{\alpha \left[ 1+\frac{(1-\beta)^2 \alpha^2}{24 (FK)^{1-\beta}}+\frac{\alpha \beta \nu \rho}{4 (FK)^{(1-\beta)/2}}+ \frac{2-3 \rho^2}{24} \nu^2 \right] T}{ (F\beta)^{(1-\beta)/2} \{1+\frac{(1-\beta)^2}{24}\log^2{\frac{F}{K}}+\frac{(1-\beta)^4}{1920}\log^4{\frac{F}{K}}\} } \frac{z}{\chi(z)} \ \ \ \ \ (1)

SABR to Bachelier Volatility:

\displaystyle  \begin{array}{rcl}  c_1 &=& \dfrac{1+\frac{1}{24}\log^2\frac{F}{K}+\frac{1}{1920}\log^4\frac{F}{K}}{1+\frac{(1-\beta)^2}{24}\log^2\frac{F}{K}+\frac{(1-\beta)^4}{1920}\log^4\frac{F}{K}} \\ c_2 &=& \left[1+\frac{-\alpha^2 \beta (2-\beta)}{24 (FK)^{1-\beta}}+\frac{\alpha \beta \nu \rho}{4 (FK)^{(1-\beta)/2}}+\frac{2-3\rho^2}{24}\nu^2 \right] T \end{array}

\displaystyle   \sigma_N(F,K) = \alpha (FK)^{\beta/2}\, c_1 \, c_2 \, \frac{z}{\chi(z)} \ \ \ \ \ (2)

Continue with our swaption example. We first calculate the implied volatilities for the list of quoted swaptions with our chosen option model. We then fit the paired strike and implied volatility list to the approximation to Eq 1 or 2 by constrained optimisation to obtain the SABR parameters.

Hague applied singular perturbation technique to derive the above approximations. For points far away from ATM strike, the solutions can deviate for not insignificant amount when compared with solutions obtained by solving the SDEs numerically (e.g. by Monte Carlo).

Changes to Vol Model

Coming back to the topic of negative rates. For those implementations with Hull-White, no adjustment is required as Hull-White assumes the forward rate to follow a normal distribution{dF = (\theta-\alpha F)\,dt+\sigma\,dW}. Negative rate would not be an issue Rates can be negative and no adjustment is required.

SABR volatility model is however affected when the rates are approaching or below zero. As {dF \propto F^\beta}, SABR model is undefined for {0<\beta \leq 1} if the rates becomes zero or negative. There are three common solutions, corresponding to setting {dF} to {F+x}, {1} and {|F|^\beta} respectively.

Solution 1: Shifted Model

Again we can pick a “low enough” interest rate level we do not expect the interest rate would ever reach. Add that amount to all the inputs (forward rate, strikes). As before, determining such adjustment can be a bit arbitrary.

Solution 2: Stochastic Normal SABR

Turning the SABR model into the stochastic normal SABR model special case by setting {\beta} to 0. In such case, term {c_1} of Eq 2 becomes 1. The log forward or log strike calculations become unnecessary. Thus it can handle negative interest rate without any further modification. However, the increment of forward rate {dF} is now independent to its current value. For some, it is arguable whether this is conceptually appropriate [2].

Solution 3: Modified Models e.g. Free SABR

Antonov [3] modifies the SDE by taking the absolute value of the forward rate: {dF = \hat{\alpha} |F|^\beta dW_1}. It introduces a fairly sharp peak in for the probability density around zero. It can be explained as the market’s natural tendency to price high chance that the interest rate would hover not below zero. By now, most would agree the crucial role of the central banks in driving the short term rate to negative. A case in point, the short end of the Euro curve has been below zero (around -25 bps or lower) for a number of years since 2016. The market expectation is likely to peak around this negative ECB policy rate. There is no flexibility for this model to show the pdf peak down below.

FreePDF (blue solid). Graph is from [3]

Note 1 “Managing Smile Risk”, Hagan, Kumar, Lesniewski & Woodward, Wilmott Magazine, 2002.

Note 2 “Stability of the SABR model”, Deloitte, 2016.

Note 3 “The Free Boundary SABR: Natural Extension to Negative Rates”, Antonov, Konikov & Spector, published in SSRN, 2015

Nelson-Siegel Yield Curve Model

(Yield curves are obtained by bootstrapping the interest rate information contained in a range of risk-free/ near risk-free fixed income instruments (deposit rate, LIBOR, FRA, interest rate futures, interest rates wap, OIS swap, government bond…).  Rather than treating each data point as separate, many are more interested in the term structure of the yield curve. Nelson-Siegel (and its extension Nelson-Seigel-Svensson) exponential components framework is one of the most popular yield curve models.  The forward rates are readily available once a Nelson-Siegel model is obtained.  As shown by Diebold & Li, the three time-varying components in Nelson-Siegel can be interpreted as factors corresponding to level, slope and curvature.   These factors have also been shown by Diebold & Li to have some forecasting power. We will go through the meaning of various components of Nelson-Siegelmodel, its implementation and other alternatives in yield curve modelling. ` Continue reading “Nelson-Siegel Yield Curve Model”

Nelson Siegel Model – Python Source Code

This program implements Nelson-Siegel and Nelson-Siegel-Svensson Yield Curve models.  Grid-based OLS is chosen as the parameter estimation algorithm.  Last update: change OLS to weighted OLS to improve model fitting performance.
  • Author: David Y
  • Date of release: 2019-11-13
  • Date of last update: 2019-12-01
  • Version: 1.1.0
  • License: BSD
  • Language: Python (tested in python 3.7.1)

click here to download