Relating Normal and Lognormal Volatility in Swaption Pricing
Summary
The document addresses why a normal-model swaption price may appear too high when compared with a lognormal Black-model price. The response identifies a likely source of the mismatch: normal and lognormal volatilities use different scales and cannot be inserted interchangeably. Around the money, it gives an example in which a 30% lognormal volatility corresponds approximately to a 0.60% normal volatility, with normal volatility commonly quoted in basis points.
For an approximate conversion, the response relates normal volatility to the underlying swap rate multiplied by Black volatility. For a more accurate comparison, it recommends converting the Black-model price into a normal implied volatility, or using a direct approximation. The relationship is presented as a practical approximation rather than a universal exact conversion, so differences in rates, moneyness, and model conventions can matter. The document does not inspect the full implementation, so it does not establish whether the formulas contain additional coding or convention errors.
Key ideas
- Normal and lognormal volatilities have different scales and quoting conventions.
- Comparing prices requires volatilities that are consistent with each model.
- Near the money, normal volatility is approximately the swap rate multiplied by Black volatility.
- A price inversion or more detailed approximation can improve the volatility conversion.
- The volatility conversion alone does not rule out other implementation or convention errors.
Tags
Full text
# Normal Black-Scholes model for swaptions isn't working properly
# Normal Black-Scholes model for swaptions isn't working properly
I just wrote two functions in Matlab which calculates the swaption prices based on the Lognormal model and on the Normal model, although I have the idea that the Normal model is wrong because the swaption price is (I think) too high.
Hereby the Lognormal function in Matlab:
```
function [Receiver, Payer] = BlackSwaptionModel(K,S,Bvol,Time,Reonia,TenorSwap)
d1 = (log(S/K) + 1/2*Bvol^2*Time) / (Bvol*sqrt(Time));
d2 = d1 - (Bvol * sqrt(Time));
Receiver = ((1-1/(1+S)^(TenorSwap)) / S) * exp(-Reonia*Time) * (S*normcdf(d1) - K*normcdf(d2)); %Value receiver swaption Black Model
Payer = ((1-1/(1+S)^(TenorSwap)) / S) * exp(-Reonia*Time) * (K*normcdf(-d2) - S*normcdf(-d1)); % Value payer swaption Black Model
end
```
Plus the Normal model function in Matlab:
```
function [Receiver, Payer] = NormalSwaptionModel(K,S,Nvol,Time,Reonia,TenorSwap)
d1 = (S-K) / (Nvol * sqrt(Time));
d2 = -(S-K) / (Nvol * sqrt(Time));
Receiver = Nvol * sqrt(Time) * (d1*normcdf(d1) + normpdf(d1)) * ((1-1/(1+S)^(TenorSwap)) / S) * exp(-Reonia*Time);
Payer = Nvol * sqrt(Time) * (d2*normcdf(d2) + normpdf(d2)) * ((1-1/(1+S)^(TenorSwap)) / S) * exp(-Reonia*Time);
end
```
Could anybody see what's going wrong here. Thanks.
## Answer by jaehyukchoi49 (score 1)
https://quant.stackexchange.com/a/32491
> The vols do not have the same order of magnitude. To get an idea, at the money, a 30% lognormal vol can correspond to a 0.60% normal vol. Normal vols are usually quoted in bps = 0.01%.
The approximate relation should be
Nvol = S * Bvol
If you want to be more accurate, you can invert the price obtained from the BS model into the normal implied volatility. See here for direct approximation https://quant.stackexchange.com/a/32489/26559 .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.