Cap & Floor pricing: stripping the basics

When comparing to other vanilla derivatives, Cap/Floor pricing offers an additional complexity, as it does not involve a single volatility number. Indeed a Cap/Floor can be broken down into a strip of forward starting options over a floating rate and each one of these options (called Caplet/Floorlet) should be priced with a different volatility. However, Caplet/Floorlet volatilities are not quoted directly on the market. We will typically have Cap/Floor quoted for a range of strikes and expiries over liquid floating rates (e.g. brokers are quoting EUR Cap/Floor volatilities over 3M and 6M Euribor).

The main challenges are then the following:

  • To produce Caplet/Floorlet prices consistent with current levels of Cap/Floor volatilities and therefore be able to re-price the market.
  • To be able to “rebase” volatilities when pricing Cap/Floor over not quoted floating rates according to multiple curves framework (e.g. Cap/Floor over 1M or 12M Euribor).

In the following article we will examine the two previous points according to the simplest method (i.e. 1 dimensional solving) and Normalization of volatilities. We will propose a VBA sample spreadsheet with the discussed algorithm.

Additional stripping methods can be found in [1] and [2].

  1. Pricing the Caplets

For the sake of simplicity we will only dwell on the Cap pricing formula. A Cap struck at K with can be priced as a discounted sum of caplets:




Each caplet is weighted by the year-fraction YF_{t{i-1},t_{i}} and by the Discount-Factor DF^D^C(T_{i}). The latter will be interpolated over the Discount Curve; it could be a Libor-based curve or an OIS curve depending on the market quotations (major currencies offer OIS and Libor discounting).

Each caplet will depend on the level of the Forward Rate Fwd(t_{0},t_{i-1},t_{i}) between the start and end date of the period. It will also rely on the caplet volatility between start and end date \sigma(K,t_{i-1,i}), struck at a given level K.

The Caplet can be priced with the famous Black & Scholes formula (when using lognormal volatilities) or with the Bachelier model (when using normal volatilities). We will only consider the Bachelier model as t, indeed in a low rates environment Normal volatilities have become the market standard (mainly for EUR, CHF and Scandinavian currencies).

Then any caplet can be priced following the Bachelier pricing formula:


Caplet(t_{0},t_{i-1}-t_{0},Fwd(t_{0},t_{i-1},t_{i}),K,\sigma(K,t_{i-1,i})) = [Fwd(t_{0},t_{i-1},t_{i})-K].N(d)+\sigma(K,t_{i-1,i}).\sqrt{t_{i-1}-t_{0}}.n(d)


With N(d) the cumulative normal distribution function and n(d) the normal density function.

With d=\frac{Fwd(t_{0},t_{i-1},t_{i})-K}{\sigma(K,t_{i-1,i}).\sqrt{t_{i-1}}}


Here the main challenge is to be able to find Fwd(t_{0},t_{i-1},t_{i}) and \sigma(K,t_{i-1,i}).

The Forward Rate Fwd(t_{0},t_{i-1},t_{i}) can be calculated such as:

Fwd(t_{0},t_{i-1},t_{i}) = (\frac{DF^F^w^d(t_{i-1})}{DF^F^w^d(t_{i})}-1).\frac{1}{yf_{t_{i-1},t_{i}}}


The DF^F^w^d will be interpolated over the adequate Forward Curve, it can be OIS or Libor-Discounting depending on the Market quotations (OIS-Discounted Forward Curve will be calculated according to the Multiple Curves framework as described in a previous article).

The prevailing volatility \sigma(K,t_{i-1,i}) is trickier to derive as it is not available directly. On the Cap/Floor Market we only have a limited number of data that includes Cap/Floor volatilities or premiums. Unfortunately, Caplet volatilities are not quoted, in other words Libor volatilities cannot be observed directly (except for the reduced set of Options on Libor Futures).

To make things more complicated, some Caps & Floors are not always quoted over the same Libor, for example EUR Cap/Floor are quoted over 3M Euribor up to 2Y Maturity and then over 6M Euribor. This means that we will have to switch from one underlying to another using proxy methods. This will be discussed more in details in the 2nd part.

  1. Deriving the Caplet volatilities

Since we cannot observe directly Libor volatilities for a single option on the market we will have to extract these volatilities from the available instruments.

Let’s take a concrete example; we would like to price a 3Y Cap struck at 0.5% over 6M Euribor. We will have to price a series of 6 Caplets and then we will need 6 different volatilities. We will proceed as follows:

  • We assume that we have volatilities for the 0.5% Strike for maturities 1Y, 18M, 2Y and 3Y (this is generally the case for EUR).
  • We assume that the volatility is a piecewise constant function of time, i.e. that it is constant between two quoted points.
  • We start with the nearest instruments, i.e. the spot starting caplet with 6M maturity, since the volatility is constant between spot and 1Y, it will be priced with the 1Y volatility such as:


  • Let’s now price the 1Y forward starting caplet with 6M maturity. We are lucky for this one as we assume the 18M volatility is quoted (this is the case for some contributors on EUR). Since the 1Y and 18M Cap volatilities are quoted assuming no arbitrage opportunity we can build the forward starting caplet as the difference of the two such as :

Caplet(1Y, 1Y6M)=Cap(1Y,6M)-Cap(1Y)

The previous equation will yield a premium and then we will be able to solve a single volatility for such premium by using a Newton-Raphson or bisection method.

We can apply the same method for the 1Y6M forward starting caplet to get the volatility.

  • We can now move to the 2Y forward starting caplet. The main issue here is that we do not have 2Y6M Cap volatility quoted on the market, so we are assuming for the sake of simplicity that the volatility remains constant between 2Y and 3Y Caps. Therefore we will use the following formula:

Caplet(2Y, 2Y6M)=Cap(2Y,6M)-Cap(2Y)

With \sigma_{Cap}(0.5,t_{0,2Y6M})=\sigma_{Cap}(0.5,t_{0,3Y}). We could also use an interpolation method such as linear or cubic spline to get the 2Y6M Cap volatility.

Finally we solve the 2Y forward starting caplet volatility as previously and ultimately we can compute the last caplet (2Y6M forward starting) following the same method.

Several remarks arise from the previous algorithm:

  • In some situations the forward starting caplet’s premium can be negative or too low to solve the caplet volatility. Typically it can occur when using a different basis (i.e. Libor tenor) when switching from one cap to another (especially when using Black volatilities where volatilities on shorter basis can be much higher than longer basis).
  • In our example Caps are quoted over 3M Euribor for 1Y, 18M and 2Y maturities and then over 6M Euribor. When using directly 3M Euribor Cap volatilities to price a 6M Euribor Cap without any adjustments we assume implicitly that 3M Volatilities are following the same dynamic as 6M (i.e. that they trade with a 100% correlation). This is actually an assumption implying that the curve will be only subject to parallel moves, ruling out any possibility of curve steepening.
  • Obviously the piecewise constant interpolation method can lead to some local arbitrage opportunities (on an interpolated caplet), when using a different method we can see that we will get a different volatility, the only constraint being repricing “globally” the cap through the 1-dimensional solver.
  1. Rebasing the volatilities

So far we were only discussing about stripping the volatilities for a given floating rate tenor without any consideration for the tenor dimension. As we said in the introduction, only a limited set of caps & floors are quoted on the market and they are only based on limited tenors. For the EUR market, what should we do if we were to price caps & floors over 1M or 1Y Euribor or caps & floors over USD 1Y Libor that typically embedded in ARMs (Mortage Back Securities with adjustable rates)?

One popular technique that will be described here is the volatility rebasing, it consists in adjusting the volatility used as input (e.g. the 3M or 6M vol) into a 1M or 1Y using the Swap Rate or Forward Rate equivalence. In other we could either adjust the cap & floor volatilities or the caplet & floorlet volatilities respectively.

In cap & floor adjustment case, the volatilities would be converted before stripping them into caplet & floorlet volatilities while in the second case we would adjust the caplet & floorlet volatilities directly.

Both methods are relying on the following (simple) formulas if were to switch from 6M to 1M.


  • Caplet-adjusted volatilities:

The caplet adjustment formula comes from the assumption that caplet’s price volatilities are constant across tenors. Our starting point will be to find the caplet’s price volatilities. This can be done with Hull & White model that gives the pricing method for European Bond option. Since a caplet is equivalent to an option on a ZC Bond, we can apply the following formula:


\sigma^6^M_{caplet price}(t_{0},t_{i-1},t_{i})=\sigma_{HW}.\frac{1-e^{-\alpha.yf_{t_{i-1},t_{i}}}}{\alpha }.\sqrt{\frac{1-e^{-2\alpha(t_{i}-t_{0})}}{2\alpha }}


Since we assumed that caplet’s price volatilites are constant from one tenor to another we have the following equivalence:


\frac{\sigma^6^M_{caplet price}(t_{0},t_{i-1},t_{i})}{(1-e^{-\alpha.yf_{t_{i-1},t_{i}}})}=\frac{\sigma^1^M_{caplet price}(t_{0},t_{j-1},t_{j})}{(1-e^{-\alpha.yf_{t_{j-1},t_{j}}})}


Such as the volatility of the 1M Euribor Caplet price is:


\sigma^1^M_{caplet price}(t_{0},t_{j-1},t_{j})=\sigma^6^M_{caplet price}(t_{0},t_{i-1},t_{i}).\frac{(1-e^{-\alpha.yf_{t_{j-1},t_{j}}})}{(1-e^{-\alpha.yf_{t_{i-1},t_{i}}})}


The equivalent caplet Black volatility could be implied by plugging Caplet price volatility into HW Cap price formula and find the equivalent Black volatility. The latter would require a solver.

Moreover, since the Black volatility is lognormal, we would have to convert it into Normal volatility (for instance thanks to Hagan’s approximation formula) to get the final value.

Another technique is to use a Bond modified duration approximation where the Bond Price sensitivity is linked to the Bond modified duration:


\frac{\delta P}{P}\approx -MD.\delta y


We assume that the same equivalence prevails between caplet’s price volatility and caplet’s Black volatility (here applied on the 6M Euribor volatility):


\sigma^6^M_{caplet price}(t_{0},t_{i-1},t_{i})=yf_{t_{i-1},t_{i}}.Fwd_{6M}(t_{0},t_{i-1},t_{i}).\sigma^6^M_{caplet Black}(t_{0},t_{i-1},t_{i})


Where the modified duration of a floating rate is equal to the year-fraction applied over the period so:


-MD\approx yf_{t_{i-1},t_{i}}


With P the Bond price and y the Bond yield.

Finally when using the previous Caplet Price equivalence to switch from one tenor to another, we end up with the following equation to imply the 1M Euribor volatility:


\sigma^1^M_{caplet Black}(t_{0},t_{j-1},t_{j})=\frac{\sigma^6^M_{caplet Black}(t_{0},t_{i-1},t_{i}).Fwd_{6M}(t_{0},t_{i-1},t_{i})}{Fwd_{1M}(t_{0},t_{j-1},t_{j})}.\frac{yf_{t_{i-1},t_{i}}}{yf_{t_{j-1},t_{j}}}.\frac{(1-e^{-\alpha.yf_{t_{j-1},t_{j}}})}{(1-e^{-\alpha.yf_{t_{i-1},t_{i}}})}



  • Cap-adjusted volatilities:

With the cap-adjusted method we assume that the cap volatilities times the equivalent swap rate are equivalent from one underlying Libor to another.


\sigma^6^M_{Cap}(t_{0},t_{N}).SwapRate_{6M}(t_{0},t_{N}) = \sigma^1^M_{Cap}(t_{0},t_{N}).SwapRate_{1M}(t_{0},t_{N})




\sigma^1^M_{Cap}(t_{0},t_{N}) = \frac{\sigma^6^M_{Cap}(t_{0},t_{N}).SwapRate_{6M}(t_{0},t_{N})}{SwapRate_{1M}(t_{0},t_{N})}


Where SwapRate_{6M} is the 6M Swap Rate with t_{N} maturity.


In either case Forward Rates and Swap Rates should be priced using the appropriate slice of the Rate Surface (including the OIS-discounting if the quotations are assumed to be collateralized).

Several remarks can be drawn from the previous formulas:

  • If the forward curve is in contango situation then the Forward/Swap Rates ratio will be greater than 1, which implies that volatilities of the short-term tenors (here 1M) will be greater than the longer-term volatilities. This case has been observed when caps & floors over USD 1M Libor were quoted.
  • The adjustment is purely static from one tenor to another, in other words we assume that all the tenors of the curve are driven by the random factor. Put differently the correlation between the tenors is equal to 1 (this is the assumption of 1-factor models).


In a forthcoming post we will provide a VBA spreadsheet with caplet stripping method described in this article and we will discuss the efficiency of the rebasing methods.



[1] Pat Hagan, Michael Konikov, 2004 “Interest Rate Volatility Cube: Construction And Use”.

[2] OpenGamma Quantitative Research,2014 “Eight ways to strip your caplets: An introduction to caplet stripping.”


← Previous post

Next post →


  1. Thank you for sharing this great work and i’d like to have the VBA spreadsheet with caplet stripping method.

    Thanks again

  2. Pretty proud of you folks. Happy to note that you folks have done so much of effort to put these stuff in public domain.

Leave a Reply