Synthetic Collateralized Debt Obligation. More...
#include <qle/instruments/syntheticcdo.hpp>
Inheritance diagram for SyntheticCDO:Classes | |
| class | arguments |
| class | engine |
| CDO base engine. More... | |
| class | results |
Public Member Functions | |
| SyntheticCDO (const QuantLib::ext::shared_ptr< QuantExt::Basket > &basket, Protection::Side side, const Schedule &schedule, Rate upfrontRate, Rate runningRate, const DayCounter &dayCounter, BusinessDayConvention paymentConvention, bool settlesAccrual=true, const QuantLib::CreditDefaultSwap::ProtectionPaymentTime protectionPaymentTime=QuantLib::CreditDefaultSwap::ProtectionPaymentTime::atDefault, Date protectionStart=Date(), Date upfrontDate=Date(), boost::optional< Real > notional=boost::none, Real recoveryRate=Null< Real >(), const DayCounter &lastPeriodDayCounter=DayCounter()) | |
| const QuantLib::ext::shared_ptr< QuantExt::Basket > & | basket () const |
| bool | isExpired () const override |
| Rate | fairPremium () const |
| Rate | fairUpfrontPremium () const |
| Rate | premiumValue () const |
| Rate | protectionValue () const |
| Real | premiumLegNPV () const |
| Real | protectionLegNPV () const |
| Real | recoveryRate () const |
| Returns the recovery rate for fixed recovery CDO, otherwise returns Null<Real>() | |
| Real | remainingNotional () const |
| Real | leverageFactor () const |
| const Date & | maturity () const |
| Last protection date. | |
| Real | implicitCorrelation (const std::vector< Real > &recoveries, const Handle< YieldTermStructure > &discountCurve, Real targetNPV=0., Real accuracy=1.0e-3) const |
| std::vector< Real > | expectedTrancheLoss () const |
| Size | error () const |
| void | setupArguments (PricingEngine::arguments *) const override |
| void | fetchResults (const PricingEngine::results *) const override |
Synthetic Collateralized Debt Obligation.
The instrument prices a mezzanine CDO tranche with loss given default between attachment point \( D_1\) and detachment point \( D_2 > D_1 \).
For purchased protection, the instrument value is given by the difference of the protection value \( V_1 \) and premium value \( V_2 \),
\[ V = V_1 - V_2. \]
The protection leg is priced as follows:
\[ Pay(L) = min (D_1, LGD) - min (D_2, LGD) = \left\{ \begin{array}{lcl} \displaystyle 0 &;& LGD < D_1 \\ \displaystyle LGD - D_1 &;& D_1 \leq LGD \leq D_2 \\ \displaystyle D_2 - D_1 &;& LGD > D_2 \end{array} \right. \]
\[ V_1 \:=\: \sum_{i=1}^N (E_i - E_{i-1}) \cdot d_i \]
where \( d_i\) is the discount factor at time/date \( t_i \)The premium is paid on the protected notional amount, initially \( D_2 - D_1. \) This notional amount is reduced by the expected protection payments \( E_i \) at times \( t_i, \) so that the premium value is calculated as
\[ V_2 =m \, \cdot \sum_{i=1}^N \,(D_2 - D_1 - E_i) \cdot \Delta_{i-1,i}\,d_i \]
where \( m \) is the premium rate, \( \Delta_{i-1, i}\) is the day count fraction between date/time \( t_{i-1}\) and \( t_i.\)
The construction of the portfolio loss distribution \( E_i \) is based on the probability bucketing algorithm described in
John Hull and Alan White, "Valuation of a CDO and nth to default CDS without Monte Carlo simulation", Journal of Derivatives 12, 2, 2004
The pricing algorithm allows for varying notional amounts and default termstructures of the underlyings.
| SyntheticCDO | ( | const QuantLib::ext::shared_ptr< QuantExt::Basket > & | basket, |
| Protection::Side | side, | ||
| const Schedule & | schedule, | ||
| Rate | upfrontRate, | ||
| Rate | runningRate, | ||
| const DayCounter & | dayCounter, | ||
| BusinessDayConvention | paymentConvention, | ||
| bool | settlesAccrual = true, |
||
| const QuantLib::CreditDefaultSwap::ProtectionPaymentTime | protectionPaymentTime = QuantLib::CreditDefaultSwap::ProtectionPaymentTime::atDefault, |
||
| Date | protectionStart = Date(), |
||
| Date | upfrontDate = Date(), |
||
| boost::optional< Real > | notional = boost::none, |
||
| Real | recoveryRate = Null< Real >(), |
||
| const DayCounter & | lastPeriodDayCounter = DayCounter() |
||
| ) |
If the notional exceeds the basket inception tranche notional, the cdo is leveraged by that factor.
| Real remainingNotional | ( | ) | const |
Total outstanding tranche notional, not wiped out
| Real leverageFactor | ( | ) | const |
The number of times the contract contains the portfolio tranched notional.
| Real implicitCorrelation | ( | const std::vector< Real > & | recoveries, |
| const Handle< YieldTermStructure > & | discountCurve, | ||
| Real | targetNPV = 0., |
||
| Real | accuracy = 1.0e-3 |
||
| ) | const |
The Gaussian Copula LHP implied correlation that makes the contract zero value. This is for a flat correlation along time and portfolio loss level.
| std::vector<Real> expectedTrancheLoss | ( | ) | const |
Expected tranche loss for all payment dates