Price Multiple CDS Option Instruments Using CDS Black Model and CDS Black Pricer
This example shows the workflow to price multiple CDSOption
instruments using a CDSBlack
model and a CDSBlack
pricer.
Create ratecurve
Object
Create a ratecurve
object using ratecurve
.
Settle = datetime(2021,9,20);
ZeroTimes = [calmonths(6) calyears([1 2 3 4 5 7 10 20 30])];
ZeroRates = [0.0052 0.0055 0.0061 0.0073 0.0094 0.0119 0.0168 0.0222 0.0293 0.0307]';
ZeroDates = Settle + ZeroTimes;
ZeroCurve = ratecurve("zero", Settle, ZeroDates ,ZeroRates)
ZeroCurve = ratecurve with properties: Type: "zero" Compounding: -1 Basis: 0 Dates: [10x1 datetime] Rates: [10x1 double] Settle: 20-Sep-2021 InterpMethod: "linear" ShortExtrapMethod: "next" LongExtrapMethod: "previous"
Create defprobcurve
Object
Create a defprobcurve
object using defprobcurve
.
DefProbTimes = [calmonths(6) calyears([1 2 3 4 5 7 10 20 30])]; DefaultProbabilities = [0.005 0.007 0.01 0.015 0.026 0.04 0.077 0.093 0.15 0.20]'; ProbDates = Settle + DefProbTimes; DefaultProbCurve = defprobcurve(Settle, ProbDates, DefaultProbabilities)
DefaultProbCurve = defprobcurve with properties: Settle: 20-Sep-2021 Basis: 2 Dates: [10x1 datetime] DefaultProbabilities: [10x1 double]
Create CDS
Instrument Object
Use fininstrument
to create an underlying CDS
instrument object.
ContractSpreadBP = 0; % Contractual spread is determined on ExerciseDate CDS = fininstrument("CDS",'Maturity',datetime(2027,9,20),'ContractSpread',ContractSpreadBP)
CDS = CDS with properties: ContractSpread: 0 Maturity: 20-Sep-2027 Period: 4 Basis: 2 RecoveryRate: 0.4000 BusinessDayConvention: "actual" Holidays: NaT PayAccruedPremium: 1 Notional: 10000000 Name: ""
Create CDSOption
Instrument Objects
Use fininstrument
to create multiple CDSOption
instrument objects.
ExerciseDate = datetime(2021, 12, 20); Strikes = [30:2:90]'; PayerCDSOptions = fininstrument("CDSOption",'Strike',Strikes,'ExerciseDate',ExerciseDate,'OptionType',"call",'CDS',CDS)
PayerCDSOptions=31×1 object
16x1 CDSOption array with properties:
OptionType
Strike
Knockout
AdjustedForwardSpread
ExerciseDate
CDS
Name
⋮
ReceiverCDSOptions = fininstrument("CDSOption",'Strike',Strikes,'ExerciseDate',ExerciseDate,'OptionType',"put",'CDS',CDS)
ReceiverCDSOptions=31×1 object
16x1 CDSOption array with properties:
OptionType
Strike
Knockout
AdjustedForwardSpread
ExerciseDate
CDS
Name
⋮
Price CDSOption
Instruments
Assuming a flat volatility structure across strikes, first use finmodel
to create a CDSBlack
model object. Then use finpricer
to create a CDSBlack
pricer object. Use price
to compute the prices for the CDSOption
instruments.
SpreadVolatility = 0.3; CDSOptionModel = finmodel("CDSBlack",'SpreadVolatility',SpreadVolatility)
CDSOptionModel = CDSBlack with properties: SpreadVolatility: 0.3000
CDSOptionpricer = finpricer("analytic",'Model',CDSOptionModel,'DiscountCurve',ZeroCurve,'DefaultProbabilityCurve',DefaultProbCurve)
CDSOptionpricer = CDSBlack with properties: Model: [1x1 finmodel.CDSBlack] DiscountCurve: [1x1 ratecurve] DefaultProbabilityCurve: [1x1 defprobcurve]
PayerPrices = price(CDSOptionpricer,PayerCDSOptions)
PayerPrices = 31×1
171.7269
160.6802
149.6346
138.5931
127.5648
116.5716
105.6576
94.8983
84.4061
74.3266
⋮
ReceiverPrices = price(CDSOptionpricer,ReceiverCDSOptions)
ReceiverPrices = 31×1
0.0000
0.0003
0.0016
0.0070
0.0256
0.0794
0.2123
0.4999
1.0547
2.0221
⋮
Plot CDS Option Prices
Plot the payer and receiver CDS option prices.
figure; plot(Strikes, PayerPrices, '--', Strikes, ReceiverPrices) title('CDS Option Pricing') xlabel('Option Strike (Basis Points)') ylabel('Option Premium (Basis Points)') legend('Payer CDS Options','Receiver CDS Options','Location','best')