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?


1 Answer 1


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



Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.