My goal is to build a volatility surface for caps on a 3M index implied from SABR model. I have a set of cap normal volatilities for a range of strikes (4%, 6%, 8%, 10% and ATM) and maturities (1, 2, 3, 4 and 5 years) as an input data:
As a first step I want to do what is known as a caplet volatility stripping -- find spot volatilities of individual caplets constituting caps that allow one to reprice a cap with a given flat volatility as a sum of individual caplets with corresponding spot volatilities. I found this paper and made an attempt to apply the bootstrapping method explained on page 5 there to all strikes except the ATM. This is the result that I got:
These are two plots of the resulting interpolated caplets volatility surface from two angles:
I'm too inexperienced in quantitative finance and don't have any senior colleagues to ask so I'm not sure whether my result makes any sense. The shape of the stripped surface seems too ragged and irregular to me.
- Is it possible to have all volatility smiles pointing to a one direction (the biggest volatility values are observed for 10% strike) except for a 3 year tenor (the biggest volatility value is observed for 4% strike in that case)?
- Is it possible for a volatility term structure to have several (more than one) peak values?
- As far as I understood it is crucial to have several tenors for a fixed strike in the bootstrapping method, so it doesn't incorporate ATM quotes (at least it definitely don't incorporate them in my implementation). Am I right there? Will the absence of ATM quotes affect the calibration of the SABR model on a stripped caplets volatility surface?
The last but not least, but are there any already implemented caplet volatility stripping functions or libraries in Python which are easy to use for a newbie? I had to code my own implementation of bootstrapping method from scratch because I don't have time to learn something as sophisticated as QuantLib framework (although I know this is the right and professional way to do things). I came across something for Matlab and Java, but I need to stick to Python for my job needs.
I can share the swap curve values that I use for projection and discounting (I'm working in the one curve framework) if someone would try to verify my results and let me known how the correct caplet volatility surface should look like. I can also share my Python code if needed.