# QuantLib_SyntheticCDO man page

SyntheticCDO — Synthetic Collateralized Debt Obligation.

## Synopsis

`#include <ql/experimental/credit/syntheticcdo.hpp>`

Inherits **Instrument**.

### Classes

classengineCDObase engine.

### Public Member Functions

SyntheticCDO(const boost::shared_ptr<Basket> &basket, Protection::Side side, constSchedule&schedule,RateupfrontRate,RaterunningRate, constDayCounter&dayCounter,BusinessDayConventionpaymentConvention, boost::optional<Real> notional=boost::none)

const boost::shared_ptr<Basket> &basket() const

boolisExpired() const

returns whether the instrument might have value greater than zero.Rate fairPremium() constRate fairUpfrontPremium() constRate premiumValue() constRate protectionValue() constReal premiumLegNPV() constReal protectionLegNPV() constReal remainingNotional() constReal leverageFactor() const

constDate&maturity() const

Last protection date.Real implicitCorrelation(const std::vector<Real> &recoveries, constHandle<YieldTermStructure> &discountCurve,RealtargetNPV=0.,Realaccuracy=1.0e-3) constDisposable< std::vector<Real> >expectedTrancheLoss() constSize error() const

voidsetupArguments(PricingEngine::arguments *) const

voidfetchResults(const PricingEngine::results *) const

### Additional Inherited Members

## Detailed Description

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. ].PP The protection leg is priced as follows:

- ·
- Build the probability distribution for volume of defaults $ L $ (before recovery) or Loss Given Default $ LGD = (1-r)L $ at times/dates $ t_i, i=1, ..., N$ (premium schedule times with intermediate steps)
- ·
- Determine the expected value $ E_i = E_{t_i}left[Pay(LGD)right] $ of the protection payoff $ Pay(LGD) $ at each time $ t_i$ where [ 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 \
_{isplaystyle D_2 - D_1 &;& LGD > D_2 \nd{array} right. ]} - ·
- The protection value is then calculated as [ 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 ].PP 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.

## Constructor & Destructor Documentation

## Member Function Documentation

### 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.

### Disposable<std::vector<Real> > expectedTrancheLoss () const

Expected tranche loss for all payment dates

### void setupArguments (PricingEngine::arguments *) const [virtual]

When a derived argument structure is defined for an instrument, this method should be overridden to fill it. This is mandatory in case a pricing engine is used.

Reimplemented from **Instrument**.

### void fetchResults (const PricingEngine::results * r) const [virtual]

When a derived result structure is defined for an instrument, this method should be overridden to read from it. This is mandatory in case a pricing engine is used.

Reimplemented from **Instrument**.

## Author

Generated automatically by Doxygen for QuantLib from the source code.

## Referenced By

fairUpfrontPremium(3), implicitCorrelation(3), leverageFactor(3) and SyntheticCDO(3) are aliases of QuantLib_SyntheticCDO(3).