TobyHey Paul,the pricing is a bit ambiguous as there are many different definitions how to price a cash settled swaption. Here's a link to my (essentially same) question:
http://sourceforge.net/p/quantlib/mailman/message/31940415/
2014-08-29 12:02 GMT+02:00 Paul Giltinan <[hidden email]>:
------------------------------------------------------------------------------Hi,I have a question about the pricing of cash-settled swaptions using QuantLib::BlackSwaptionEngine.The BlackSwaptionEngine calculates the annuity term for cash-settled swaptions by constructing a temporary discount curve from the forward swap rate (see row 118 of blackswaptionengine.cpp). However, this curve is then assigned the same reference date as the regular discount curve, which means that the discounting occurs all the way to the evaluation date.According to Mercurio (http://www.fabiomercurio.it/cashsettled_note.pdf, equation (3)), this discounting should only be applied as far as the cash settlement date of the swaption. I therefore propose a fix which changes the reference date of the aforementioned swap-implied discount curve and thus implements the pricing formula suggested by Mercurio.If there are no objections I can provide a patch to fix this (code segment below).Kind regards,Paul GiltinanCurrent implementation
case Settlement::Cash: { const Leg& fixedLeg = swap.fixedLeg(); boost::shared_ptr<FixedRateCoupon> firstCoupon = boost::dynamic_pointer_cast<FixedRateCoupon>(fixedLeg[0]); DayCounter dayCount = firstCoupon->dayCounter(); Real fixedLegCashBPS = CashFlows::bps(fixedLeg, InterestRate(atmForward, dayCount, Compounded, Annual), false, discountCurve_->referenceDate()) ; annuity = std::fabs(fixedLegCashBPS/basisPoint); break; }
Proposed Change
case Settlement::Cash: { const Leg& fixedLeg = swap->fixedLeg(); boost::shared_ptr<FixedRateCoupon> firstCoupon = boost::dynamic_pointer_cast<FixedRateCoupon>(fixedLeg[0]); DayCounter dayCount = firstCoupon->dayCounter(); Date swapStartDate = firstCoupon->accrualStartDate(); Real fixedLegCashBPS = CashFlows::bps(fixedLeg, InterestRate(atmForward, dayCount, Compounded, Annual), false, swapStartDate); annuity = discountCurve_->discount(swapStartDate) * std::fabs(fixedLegCashBPS/basisPoint); break; }
Slashdot TV.
Video for Nerds. Stuff that matters.
http://tv.slashdot.org/
_______________________________________________
QuantLib-users mailing list
[hidden email]
https://lists.sourceforge.net/lists/listinfo/quantlib-users
Free forum by Nabble | Edit this page |