Pricing Floating-Rate Bonds with Coupon-Specific Caps and Floors
Summary
The document outlines a QuantLibXL workflow for valuing a floating-rate bond whose cap and floor strikes vary by coupon. It recommends supplying a strike for each coupon to the floating-rate bond, then pricing the bond with a bond engine. An Ibor coupon pricer using the Black approach handles the embedded option features and takes an optionlet volatility input.
For that volatility input, the response describes building a cap-floor volatility term surface from market data and using an optionlet stripper to derive optionlet volatilities. A stripped-optionlet adapter makes the stripper output compatible with the coupon pricer. The suggested market-data source is ICAP, and the index tenor must match the tenor represented by the volatility quotes. This is a practical setup outline rather than a complete implementation: it does not show spreadsheet formulas, calibration details, or validation results. The question’s initial concern about relative versus absolute volatility quotes is resolved by an update stating that the quotes in question were absolute.
Key ideas
- Assign cap and floor strikes coupon by coupon when constructing the floating-rate bond.
- Use a bond engine for bond valuation and a Black-based Ibor coupon pricer for the option features.
- Build a cap-floor volatility term surface and strip it to obtain optionlet volatility inputs.
- Adapt the stripped optionlets to the volatility structure expected by the coupon pricer.
- Match the Ibor index tenor to the tenor underlying the market volatility data.
Tags
Full text
# Pricing a bond with variable strike collar with QuantLibXL # Pricing a bond with variable strike collar with QuantLibXL 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. ## Answer by LCC (score 3, accepted) https://quant.stackexchange.com/a/10820 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
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.