Pricing a CDS Index Option
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. This example demonstrates 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:
where
S is the spread.
RPV01 is the risky present value of a basis point (see cdsrpv01).
t is the valuation date.
is the option expiry date.
T is the CDS maturity date.
To capture the exercise decision correctly for CDS index options, you can use the knockout form of the Black's model and adjust the forward spread to incorporate the FEP as follows
with FEP defined as
where
R is the recovery rate.
Z is the discount factor.
Q is the survival probability.
In cdsoptprice
, the forward spread adjustment is made with the AdjustedForwardSpread
parameter. When computing the adjusted forward spread, you 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)
ProbData = 61×2
105 ×
7.3504 0.0000
7.3507 0.0000
7.3510 0.0000
7.3513 0.0000
7.3516 0.0000
7.3519 0.0000
7.3522 0.0000
7.3525 0.0000
7.3529 0.0000
7.3531 0.0000
7.3534 0.0000
7.3537 0.0000
7.3540 0.0000
7.3544 0.0000
7.3547 0.0000
⋮
Compute the spot and forward RPV01s, which will be used later in the computation of the adjusted forward spread. For this purpose, you can use cdsrpv01
.
% RPV01(t,T)
RPV01_CDSMaturity = cdsrpv01(ZeroCurve,ProbData,Settle,CDSMaturity)
RPV01_CDSMaturity = 4.7853
% RPV01(t,t_E,T) RPV01_OptionExpiryForward = cdsrpv01(ZeroCurve,ProbData,Settle,CDSMaturity,... 'StartDate',OptionMaturity)
RPV01_OptionExpiryForward = 4.5971
% RPV01(t,t_E) = RPV01(t,T) - RPV01(t,t_E,T)
RPV01_OptionExpiry = RPV01_CDSMaturity - RPV01_OptionExpiryForward
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)
Spread_OptionExpiry = 139.9006
% S(t,T) Spread_CDSMaturity = cdsspread(ZeroCurve,ProbData,Settle,CDSMaturity,... 'Period',Period,'Basis',Basis,'BusDayConvention',BusDayConvention,... 'PayAccruedPremium',true,'recoveryrate',Recovery)
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
See Also
cdsoptprice
| cdsspread
| cdsrpv01
| CDSOption