Main Content

Valuing an Existing CDS Contract

This example shows how to compute the current value, or mark-to-market, of an existing CDS contract. The current value is the amount of money the contract holder would receive (if positive) or pay (if negative) to unwind the contract.

The upfront of the contract is the current value expressed as a fraction of the notional amount of the contract, and it is commonly used to quote market values.

The value of existing CDS contracts is obtained with cdsprice. By default, cdsprice treats contracts as long positions. Whether a contract position is long or short is determined from a protection standpoint, that is, long means that protection was bought, and short means protection was sold. In the following code, an existing CDS contract pays a premium that is lower than current market conditions. The price is positive, as expected, since it would be more costly to buy the same type of protection today.

Settle = '17-Jul-2009';   % Valuation date for the CDS
MarketDates = datenum({'20-Sep-10','20-Sep-11','20-Sep-12','20-Sep-14', ...
'20-Sep-16'});
MarketSpreads = [140 175 210 265 310]';
MarketData = [MarketDates MarketSpreads];

ZeroDates = datenum({'17-Jan-10','17-Jul-10','17-Jul-11','17-Jul-12', ...
'17-Jul-13','17-Jul-14'});
ZeroRates = [1.35 1.43 1.9 2.47 2.936 3.311]'/100;
ZeroData = [ZeroDates ZeroRates];

[ProbData,HazData] = cdsbootstrap(ZeroData,MarketData,Settle);

Maturity2 = '20-Sep-2012';
Spread2 = 196;
 
[Price,AccPrem,PaymentDates,PaymentTimes,PaymentCF] = cdsprice(ZeroData, ...
ProbData,Settle,Maturity2,Spread2);
 
fprintf('Dirty Price: %8.2f\n',Price+AccPrem);
Dirty Price: 56872.94
fprintf('Accrued Premium: %8.2f\n',AccPrem);
Accrued Premium: 15244.44
fprintf('Clean Price: %8.2f\n',Price);
Clean Price: 41628.50
fprintf('\nPayment Schedule:\n\n');
Payment Schedule:
fprintf('Date \t\t Time Frac \t Amount\n');
Date 		 Time Frac 	 Amount
for k = 1:length(PaymentDates)
   fprintf('%s \t %5.4f \t %8.2f\n',datestr(PaymentDates(k)), ...
      PaymentTimes(k),PaymentCF(k));
end
20-Sep-2009 	 0.1806 	 35388.89
20-Dec-2009 	 0.2528 	 49544.44
20-Mar-2010 	 0.2500 	 49000.00
20-Jun-2010 	 0.2556 	 50088.89
20-Sep-2010 	 0.2556 	 50088.89
20-Dec-2010 	 0.2528 	 49544.44
20-Mar-2011 	 0.2500 	 49000.00
20-Jun-2011 	 0.2556 	 50088.89
20-Sep-2011 	 0.2556 	 50088.89
20-Dec-2011 	 0.2528 	 49544.44
20-Mar-2012 	 0.2528 	 49544.44
20-Jun-2012 	 0.2556 	 50088.89
20-Sep-2012 	 0.2556 	 50088.89

Also, you can use cdsprice to value a portfolio of CDS contracts. In the following code, a simple hedged position with two vanilla CDS contracts, one long, one short, with slightly different spreads is priced in a single call and the value of the portfolio is the sum of the returned prices.

[Price2,AccPrem2] = cdsprice(ZeroData,ProbData,Settle, ...
repmat(datenum(Maturity2),2,1),[Spread2;Spread2+3], ...
'Notional',[1e7; -1e7]);

fprintf('Contract \t Dirty Price \t Acc Premium \t  Clean Price\n');
Contract 	 Dirty Price 	 Acc Premium 	  Clean Price
fprintf('    Long \t $ %9.2f \t $ %9.2f \t $ %9.2f \t\n', ...
   Price2(1)+AccPrem2(1), AccPrem2(1), Price2(1));
    Long 	 $  56872.94 	 $  15244.44 	 $  41628.50 	
fprintf('   Short \t $ %8.2f \t $ %8.2f \t $ %8.2f \t\n', ...
   Price2(2)+AccPrem2(2), AccPrem2(2), Price2(2));
   Short 	 $ -48185.88 	 $ -15477.78 	 $ -32708.11 	
fprintf('Mark-to-market of hedged position: $ %8.2f\n',sum(Price2)+sum(AccPrem2));
Mark-to-market of hedged position: $  8687.06

See Also

| | |

Topics