Skip to content
All library documents

Calibrating SABR to Normal and Lognormal Volatility Quotes

Article Quant Q&A · Author: Phil-ZXX

Summary

The document addresses fitting SABR to market volatility smiles quoted in normal and lognormal conventions. It distinguishes the volatility convention used to translate SABR prices into implied volatility: normal market quotes should be compared with normal implied volatilities, while lognormal quotes require lognormal implied volatilities. Comparing normal quotes with a lognormal-volatility definition can create an apparent calibration failure even when the model setup is otherwise reasonable.

For the normal case, the answer refers to an approximation from the Hagan SABR formula and describes fitting parameters by minimizing squared differences between model and market quotes across strikes. It emphasizes that normal volatilities are commonly expressed in basis points per annum, so quote scaling must be handled correctly. The example is presented as simple and unoptimized, and the discussion does not establish that every poor fit is a units error; implementation, market data shape, and model limitations can still matter.

Key ideas

  • Market and model volatilities must use the same normal or lognormal convention during calibration.
  • A mismatched implied-volatility definition can make a sound calibration appear poor.
  • Normal volatility quotes may be expressed in basis points per annum and require correct scaling.
  • SABR parameters can be fitted by minimizing squared errors across strikes.
  • A calibration example based on an approximation does not rule out other data or implementation issues.

Tags

Full text
# SABR Calibration: Normal vs Log-Normal Market Data


# SABR Calibration: Normal vs Log-Normal Market Data












This question is about getting some clarification as to how to understand market quotes for normal & log-normal vols together with certain model assumptions.

So let us define

- $C_{BS}(F_0,K,T,\sigma,\beta)=\mathbb{E}[(F_T-K)^+]\quad \text{with}\quad dF_t=\sigma F_t^\beta dW_t$$

- $C_{SABR}(F_0,K,T,\sigma_0,\beta,\nu,\rho)=\mathbb{E}[(F_T-K)^+]$ $$\text{with}\quad dF_t=\sigma_t F_t^\beta dW_t,\quad \sigma_t=\nu \sigma_t dZ_t,\quad dW_tdZ_t = \rho dt$$

And for any given combination of $F_0,K,T,\sigma_0,\beta,\nu,\rho$ the SABR-implied vol $v_{SABR}$ is the quantity such that the following relationship holds

$$C_{BS}(F_0,K,T,v_{SABR},1) = C_{SABR}(F_0,K,T,\sigma_0,\beta,\nu,\rho)$$

See http://www.math.ku.dk/~rolf/SABR.pdf right-hand side of page 89.

Now let us assume that for a fixed expiry/tenor we are given a set of volatility market quotes:

Ideally, I want to calibrate the SABR model to it. So when I set $\beta=1$ and calibrate $\sigma_0,\nu,\rho$ to the log-normal vols, I get a very nice fit:

However, when I set $\beta=0$ and calibrate $\sigma_0,\nu,\rho$ to the normal vols, I get a very poor fit:

So I have two questions:

- Is my definition of the SABR vol $v_{SABR}$ correct? For example, would $$C_{BS}(F_0,K,T,v_{SABR},\beta) = C_{SABR}(F_0,K,T,\sigma_0,\beta,\nu,\rho)$$ perhaps be more correct? Note that the difference here is the $\beta$ in $C_{BS}$ as opposed to having a 1 there.

- Is maybe my normal vol market data of an atypical shape causing SABR to only find a poor fit? Or is my SABR implementation faulty?

## Answer by math (score 7, accepted)

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

I think you did something wrong in translating the input to numerics. As pointed out by dm63 normal vols are quoted in basis points.

Using equation A.67a) from the Hagan paper you linked we see (setting $\beta = 0$)

$$\sigma_N(K) = \alpha\frac{\xi}{x(\xi)}\left[1+\frac{2-3\rho^2}{24}\nu^2\tau_{exp}\right]$$

where $\tau_{exp} = 0.25$ in your example and

$$\xi = \frac{\nu}{\alpha}(f-K)$$ $$x(\xi) = \log{\left(\frac{\sqrt{1-2\rho\xi+\xi^2}-\rho+\xi}{1-\rho}\right)}$$

I've implemented a very simple (not at all optimized) code just as an example:

```
                                        #maket data
iVol <- c(46.6,49.8,52.3,55.2,58.8,62.8,72,92.2)/10000
strike <- c(0.298,0.798,1.048,1.298,1.548,1.798,2.298,3.298)/100
exp <- 0.25
atmF <- 1.298/100
                                        #object function

f.obj <- function(x,strike,iVol,exp,atmF)
    {
        return(1/length(strike)*sum((iVol-sigma.hat(x,strike,atmF,exp))^2))
    }

# approximatino using formula A.67a) in Hagan paper

sigma.hat <- function(x,strike,atmF,exp)
    {
                                        #x[1] = alpha
                                        #x[2] = nu
                                        #x[3] = rho

        xi <- x[2]/x[1]*(atmF-strike)
        x.xi <- log(((sqrt(1-2*x[3]*xi+xi^2)-x[3]+xi)/(1-x[3])))
        ret <- ifelse(abs(strike-atmF)<10^(-4), x[1]*(1+((2-3*x[3]^2)/(24))*x[2]^2*exp),x[1]*((xi)/(x.xi))*(1+((2-3*x[3]^2)/(24))*x[2]^2*exp))
        return(ret)
    }

                                        # fit the model

sol1 <- nlm(f.obj, c(atmF, 0.1, 0.5), strike = strike, iVol = iVol, exp= exp, atmF = atmF)$estimate
sol2 <- nlm(f.obj, c(atmF,sol1[2],sol1[3]),strike = strike, iVol = iVol, exp = exp, atmF = atmF)$estimate
sol1
sol2

x.seq <- seq(0.9*min(strike),1.1*max(strike),0.001)
y.seq <- sigma.hat(sol2,x.seq,atmF,exp)*10000

plot(100*x.seq,y.seq,type="l",col="red",xlab = "Strike", ylab = "implied Vol", main = "Sabr Normal model")
points(100*strike,iVol*10000,col="blue")
```

leading to the following fit:

## Answer by dm63 (score 0)

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

I think (1) is the issue. You need to compare market normal vols to normal vols implied by the sabr model. (2) is not the issue - these vols look reasonable.

By the way we express normal vols in bp per annum, not percent!

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.