I am trying to price a floating rate bond with a capped and floored interest rate. The strikes of the caps and floors vary, but are known in advance.

I am trying to do this with QuantLibXL, but I am having trouble at every step. I would appreciate if you could just comment on my general approach, then I will try to fill the gaps.

My current approach is to use qlFloatingRateBond and pass it a range of strikes (one for each coupon) for both Caps and Floors arguments. Then I imagine I have to use qlBlackCapFloorEngine as pricing engine, is that right?

The latter needs then an OptionletVolatilityStructure, which I strip from a swaption vol cube using qlOptionletStripper1. The issue I have here is that AFAIK Bloomberg’s VCUB returns only Cap volatilities for each option tenor relative to the ATM strike, while qlOptionletStripper1 wants "absolute" ones. What do you suggest here? Update: The volatilities returned are in fact not relative to the ATM strike, but absolute.

Thank you very much.


1 Answer 1


Answering my own question:

  • use qlFloatingRateBond and pass it a range of strikes (one for each coupon) for both Caps and Floors arguments
  • use BondEngine as pricing engine
  • use IborCouponPricer with Type argument equal to "IborByBlack" as coupon pricer - This pricer also takes an OptionletVolatilitySurface as input
  • the OptionletVolatilitySurface can be created by an OptionletStripper1 from a CapFloorVolTermSurface, (NB. We have to use the StrippedOptionletAdapter to mold the OptionletStripper1 object into an OptionletVolatilitySurface)
  • create a CapFloorVolTermSurface with data, e.g., from ICAP (on Bloomberg terminals, these can be found in VOLS), making sure that the IborIndex argument has the same tenor as the input data, i.e., 1Y

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.