Main Content

This example shows how to price CDS index options
by using `cdsoptprice`

with the forward spread adjustment.
Unlike a single-name CDS, a CDS portfolio index contains multiple
credits. When one or more of the credits default, the corresponding
contingent payments are made to the protection buyer but the contract
still continues with reduced coupon payments. Considering the fact
that the CDS index option does not cancel when some of the underlying
credits default before expiry, one might attempt to price CDS index
options using the Black's model for non-knockout single-name CDS option.
However, Black's model in this form is not appropriate for pricing
CDS index options because it does not capture the exercise decision
correctly when the strike spread (*K*) is very high,
nor does it ensure put-call parity when (*K*) is
not equal to the contractual spread (O'Kane, 2008).

However, with the appropriate modifications, Black's model for
single-name CDS options used in `cdsoptprice`

can
provide a good approximation for CDS index options. While there are
some variations in the way the Black's model is modified for CDS index
options, they usually involve adjusting the forward spread *F*,
the strike spread *K*, or both. Here we describe
the approach of adjusting the forward spread only. In the Black's
model for single-name CDS options, the forward spread *F* is
defined as:

$$F=S(t,{t}_{E},T)=\frac{S(t,T)RPV01(t,T)-S(t,{t}_{E})RPV01(t,{t}_{E})}{RPV01(t,{t}_{E},T)}$$

where

*S* is the spread.

*RPV01* is the risky present value of a basis
point (see `cdsrpv01`

).

*t* is the valuation date.

*t _{E}* is the option expiry
date.

*T* is the CDS maturity date.

To capture the exercise decision correctly for CDS index options,
we use the knockout form of the Black's model and adjust the forward
spread to incorporate the *FEP* as follows:

$${F}_{Adj}=F+\frac{FEP}{RPV01(t,{t}_{E},T)}$$

with *FEP* defined as

$$FEP=(1-R)Z(t,{t}_{E})(1-Q(t,{t}_{E}))$$

where

*R* is the recovery rate.

*Z* is the discount factor.

*Q* is the survival probability.

In `cdsoptprice`

, forward spread adjustment
can be made with the `AdjustedForwardSpread`

parameter.
When computing the adjusted forward spread, we can compute the spreads
using `cdsspread`

and the RPV01s using `cdsrpv01`

.

Set up the data for the CDS index, its option, and zero curve. The underlying is a 5-year CDS index maturing on 20-Jun-2017 and the option expires on 20-Jun-2012. A flat index spread is assumed when bootstrapping the default probability curve.

% CDS index and option data Recovery = .4; Basis = 2; Period = 4; CDSMaturity = datenum('20-Jun-2017'); ContractSpread = 100; IndexSpread = 140; BusDayConvention = 'follow'; Settle = datenum('13-Apr-2012'); OptionMaturity = datenum('20-Jun-2012'); OptionStrike = 140; SpreadVolatility = .69; % Zero curve data MM_Time = [1 2 3 6]'; MM_Rate = [0.004111 0.00563 0.00757 0.01053]'; MM_Dates = daysadd(Settle,30*MM_Time,1); Swap_Time = [1 2 3 4 5 6 7 8 9 10 12 15 20 30]'; Swap_Rate = [0.01387 0.01035 0.01145 0.01318 0.01508 0.01700 0.01868 ... 0.02012 0.02132 0.02237 0.02408 0.02564 0.02612 0.02524]'; Swap_Dates = daysadd(Settle,360*Swap_Time,1); InstTypes = [repmat({'deposit'},size(MM_Time));repmat({'swap'},size(Swap_Time))]; Instruments = [repmat(Settle,size(InstTypes)) [MM_Dates;Swap_Dates] [MM_Rate;Swap_Rate]]; ZeroCurve = IRDataCurve.bootstrap('zero',Settle,InstTypes,Instruments); % Bootstrap the default probability curve assuming a flat index spread. MarketData = [CDSMaturity IndexSpread]; ProbDates = datemnth(OptionMaturity,(0:5*12)'); ProbData = cdsbootstrap(ZeroCurve, MarketData, Settle, 'ProbDates', ProbDates);

Compute the spot and forward RPV01s, which will be used
later in the computation of the adjusted forward spread. For this
purpose, we can use `cdsrpv01`

.

% RPV01(t,T) RPV01_CDSMaturity = cdsrpv01(ZeroCurve,ProbData,Settle,CDSMaturity) % RPV01(t,t_E,T) RPV01_OptionExpiryForward = cdsrpv01(ZeroCurve,ProbData,Settle,CDSMaturity,... 'StartDate',OptionMaturity) % RPV01(t,t_E) = RPV01(t,T) - RPV01(t,t_E,T) RPV01_OptionExpiry = RPV01_CDSMaturity - RPV01_OptionExpiryForward

RPV01_CDSMaturity = 4.7853 RPV01_OptionExpiryForward = 4.5971 RPV01_OptionExpiry = 0.1882

Compute the spot spreads using `cdsspread`

.

% S(t,t_E) Spread_OptionExpiry = cdsspread(ZeroCurve,ProbData,Settle,OptionMaturity,... 'Period',Period,'Basis',Basis,'BusDayConvention',BusDayConvention,... 'PayAccruedPremium',true,'recoveryrate',Recovery) % S(t,T) Spread_CDSMaturity = cdsspread(ZeroCurve,ProbData,Settle,CDSMaturity,... 'Period',Period,'Basis',Basis,'BusDayConvention',BusDayConvention,... 'PayAccruedPremium',true,'recoveryrate',Recovery)

Spread_OptionExpiry = 139.9006 Spread_CDSMaturity = 140.0000

The spot spreads and RPV01s are then used to compute the forward spread.

% F = S(t,t_E,T) ForwardSpread = (Spread_CDSMaturity.*RPV01_CDSMaturity - ... Spread_OptionExpiry.*RPV01_OptionExpiry)./RPV01_OptionExpiryForward

ForwardSpread = 140.0040

Compute the front-end protection (FEP).

FEP = 10000*(1-Recovery)*ZeroCurve.getDiscountFactors(OptionMaturity)*ProbData(1,2)

FEP = 26.3108

Compute the adjusted forward spread.

AdjustedForwardSpread = ForwardSpread + FEP./RPV01_OptionExpiryForward

AdjustedForwardSpread = 145.7273

Compute the option prices using `cdsoptprice`

with
the adjusted forward spread. Note again that the `Knockout`

parameter
should be set to be `true`

because the FEP was already
incorporated into the adjusted forward spread.

[Payer,Receiver] = cdsoptprice(ZeroCurve, ProbData, Settle, OptionMaturity, ... CDSMaturity, OptionStrike, SpreadVolatility,'Knockout',true,... 'AdjustedForwardSpread', AdjustedForwardSpread,'PayAccruedPremium',true); fprintf(' Payer: %.0f Receiver: %.0f \n',Payer,Receiver);

Payer: 92 Receiver: 66

`cdsoptprice`

| `cdsrpv01`

| `cdsspread`