Fixing Optionlet Stripping Inputs: Quote Units and Index Tenor
Summary
This troubleshooting account describes a failed attempt to bootstrap an optionlet volatility surface from cap and floor volatility data with QuantLibXL. The failure appeared during optionlet volatility calculation, with a root search unable to bracket a solution and an unexpectedly high displayed at-the-money rate.
The resolution identifies two input mismatches: the market figures were percentages and needed conversion by dividing by 100, and the Ibor index supplied to the stripper needed a one-year tenor rather than the six-month tenor used. The example shows how quote scaling and index conventions can cause apparently numerical or rate-fixing problems during volatility-surface construction. It is a specific diagnostic report, not a general guide to bootstrapping, and it does not discuss calibration choices or broader validation of the resulting surface.
Key ideas
- Confirm whether volatility quotes are expressed as percentages and convert them to the units expected by the library.
- Match the Ibor index tenor to the convention required by the optionlet stripper.
- A root-bracketing failure can stem from inconsistent input units or index settings.
- Unexpected at-the-money rates can be a symptom of setup mismatches rather than a solver defect.
Tags
Full text
# QuantLibXL - Optionlet bootstrapping failure
# QuantLibXL - Optionlet bootstrapping failure
I am trying to bootstrap the Optionlet volatility surface from a Cap/Floor volatility surface using QuantLibXL. To be specific, the data is from ICAP:
```
STK ATM 0 0.25 0.5 [...]
1Y 0.31 77.95 81.9 71.8
18M 0.34 83.08 89.2 76.6
2Y 0.37 86.03 96.2 80.1
[...]
```
Now, I can set up without errors `qlCapFloorVolTermSurface`, and `qlOptionletStripper1`, but when I trigger the actual computation, e.g., with `qlOptionletStripper1CapFloorVolatilities`, I get the error
```
qlOptionletStripper1CapFloorVolatilities - could not bootstrap optionlet
type: Put
strike: 25.000000 %
atm: 1.311340 %
price: 0.125286
annuity: 0.501145
expiry: March 22nd, 2017
error: root not bracketed f[0,24] -> [-1.3213e-002, -1]
```
I understand that the root searching algorithm cannot find a solution in the specified range, but what can one do here in practice? Have I missed something?
Additional info:
- The optionlet stripper takes as argument an IborIndex, for which I am using an Euribor object with an `qlInterpolatedYieldCurve` on a composite yield curve called "(45) - Euro" in Bloomberg.
- Strangely, the ATM rate indicated in the output does not at all match what it should be, namely according to the optionletstripper1.cpp: atmOptionletRate_[i] = iborIndex_->fixing(optionletDates_[i]);
The fixing at March 22nd, 2017 retrieved with qlYieldTSZeroRate, is 0.60310%, not 1.311340%. Any ideas?
## Answer by LCC (score 2, accepted)
https://quant.stackexchange.com/a/10822
Answering my own question:
- All the indicated numbers as obtained from ICAP need to be divided by 100, as they are percentages
- The `OptionletStripper1` takes an IborIndex, which should have a tenor equal to 1Y. I had set it to 6M, and that seemed to cause problems
Ouch!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.