www.gusucode.com > fininst 案例源码程序 matlab代码 > fininst/FirstToDefaultSwapsExample.m
%% First-to-Default Swaps % % This example shows how to price first-to-default (FTD) swaps under the % homogeneous loss assumption. % % A first-to-default swap is an instrument that pays a predetermined amount % when (and if) the first of a basket of credit instruments defaults. The % credit instruments in the basket are usually bonds. If we assume that the % loss amount following a credit event is the same for all credits in the % basket, we are under the _homogeneous loss_ assumption. This assumption % makes models simpler, because any default in the basket triggers the same % payment amount. This example is an implementation of the pricing % methodology for these instruments, as described in O'Kane [2]. There are % two steps in the methodology: a) Compute the survival probability for the % basket numerically; b) Use this survival curve and standard single-name % credit-default swap (CDS) functionality to find FTD spreads and to price % existing FTD swaps. % Copyright 2010-2014 The MathWorks, Inc. %% Fit Probability Curves to Market Data % % Given CDS market quotes for each issuer in the basket, use |cdsbootstrap| % to calibrate individual default probability curves for each issuer. % Interest rate curve 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]; % CDS spreads % Each row in MarketSpreads corresponds to a different issuer; each % column to a different maturity date (corresponding to MarketDates) MarketDates = datenum({'20-Sep-10','20-Sep-11','20-Sep-12','20-Sep-14',... '20-Sep-16'}); MarketSpreads = [ 160 195 230 285 330; 130 165 205 260 305; 150 180 210 260 300; 165 200 225 275 295]; % Number of issuers equals number of rows in MarketSpreads nIssuers = size(MarketSpreads,1); % Settlement date Settle = datenum('17-Jul-2009'); %% % In practice, the time axis is discretized and the FTD survival curve is % only evaluated at grid points. We use one point every three months. To % request that |cdsbootstrap| returns default probability values over the % specific grid points we want, use the optional argument 'ProbDates'. We % add the original standard CDS market dates to the grid, otherwise the % default probability information on those dates would be interpolated % using the two closest dates on the grid, and the prices on market dates % would be inconsistent with the original market data. ProbDates = union(MarketDates,daysadd(Settle,360*(0.25:0.25:8),1)); nProbDates = length(ProbDates); DefProb = zeros(nIssuers,nProbDates); for ii = 1:nIssuers MarketData = [MarketDates MarketSpreads(ii,:)']; ProbData = cdsbootstrap(ZeroData,MarketData,Settle,... 'ProbDates',ProbDates); DefProb(ii,:) = ProbData(:,2)'; end %% % These are the calibrated default probability curves for each credit in % the basket. figure plot(ProbDates',DefProb) datetick title('Individual Default Probability Curves') ylabel('Cumulative Probability') xlabel('Date') %% Determine Latent Variable Thresholds % % Latent variables are used in different credit risk contexts, with % different interpretations. In some contexts, a latent variable is a proxy % for a _change in the value of assets_, and the domain of this variable is % binned, with each bin corresponding to a credit rating. The bins limits, % or thresholds, are determined from credit migration matrices. In our % context, the latent variable is associated to a _time to default_, and % the thresholds determine bins in a discretized time grid where defaults % may occur. %% % Formally, if the time to default of a particular issuer is denoted by % $\tau$, and we know its default probability function $P(t)$, a latent % variable $A$ and corresponding thresholds $C(t)$ satisfy % % $$Pr ( \tau \leq t ) = P(t) = Pr (A \leq C(t))$$ % % or % % $$Pr ( s \leq \tau \leq t ) = P(t) - P(s) = Pr (C(s) \leq A \leq C(t))$$ % % These relationships make latent variable approaches convenient for both % simulations and analytical derivations. Both $P(t)$ and $C(t)$ are % functions of time. % % The choice of a distribution for the variable $A$ determines the % thresholds $C(t)$. In the standard latent variable model, the variable % $A$ is chosen to follow a standard normal distribution, from which % % $$C(t) = \Phi^{-1} (P(t))$$ % % where $\Phi$ is the cumulative standard normal distribution. %% % Use the previous formula to determine the _default-time thresholds_, or % simply _default thresholds_, corresponding to the default probabilities % previously obtained for the credits in the basket. DefThresh = norminv(DefProb); %% Derive Survival Curve for the Basket % % Following O'Kane [2], we use a one-factor latent variable model to derive % expressions for the survival probability function of the basket. % % Given parameters $\beta_i$ for each issuer $i$, and given independent % standard normal variables $Z$ and $\epsilon_i$, the one-factor latent % variable model assumes that the latent variable $A_i$ associated to % issuer $i$ satisfies % % $$A_i = \beta_i * Z + \sqrt{1-\beta_i^2} * \epsilon_i$$ % % This induces a correlation between issuers $i$ and $j$ of $\beta_i % \beta_j$. All latent variables $A_i$ share the common factor $Z$ as a % source of uncertainty, but each latent variable also has an idiosyncratic % source of uncertainty $\epsilon_i$. The larger the coefficient $\beta_i$, % the more the latent variable resembles the common factor $Z$. %% % Using the latent variable model, we derive an analytic formula for the % survival probability of the basket. % % The probability that issuer $i$ survives past time $t_j$, in other words, % that its default time $\tau_i$ is greater than $t_j$ is % % $$Pr ( \tau_i > t_j ) = 1 - Pr ( A_i \leq C_i(t_j) )$$ % % where $C_i(t_j)$ is the default threshold computed above for issuer $i$, % for the $j$-th date in the discretization grid. %% % Conditional on the value of the one-factor $Z$, the probability that all % issuers survive past time $t_j$ is % % $$Pr (\mbox{No defaults by time } t_j | Z )$$ % $$= Pr ( \tau_i > t_j \mbox{ for all } i | Z )$$ % $$= \prod_i [ 1 - Pr (A_i \leq C_i(t_j) | Z) ]$$ % % where the product is justified because all the $\epsilon_i$'s are % independent. Therefore, conditional on $Z$, the $A_i$'s are independent. %% % The unconditional probability of no defaults by time $t_j$ is the % integral over all values of $Z$ of the previous conditional probability % % $$Pr ( \mbox{No defaults by time } t_j )$$ % $$= \int_Z \prod_i [1 - Pr (A_i \leq C_i(t_j) | Z)] \phi(Z) dZ$$ % % with $\phi(Z)$ the standard normal density. % % By evaluating this one-dimensional integral for each point $t_j$ in the % grid, we get a discretization of the survival curve for the whole basket, % which is the FTD survival curve. %% % The latent variable model can also be used to simulate default times, % which is the back engine of many pricing methodologies for credit % instruments. Loeffler and Posch [1], for example, estimate the survival % probability of a basket via simulation. In each simulated scenario a time % to default is determined for each issuer. With some bookkeeping, the % probability of having the first default on each bucket of the grid can be % estimated from the simulation. The simulation approach is also discussed % in O'Kane [2]. Simulation is very flexible and applicable to many credit % instruments. However, analytic approaches are preferred, when available, % because they are much faster and more accurate than simulation. %% % To compute the FTD survival probabilities in our example, we set all % betas to the square root of a target correlation. Then we loop over all % dates in the time grid to compute the one dimensional integral that gives % the survival probability of the basket. % % Regarding implementation, the conditional survival probability as a % function of a scalar |Z| would be % % condProb=@(Z)prod(normcdf((-DefThresh(:,jj)+beta*Z)./sqrt(1-beta.^2))); % % However, the integration function we use requires that the function % handle of the integrand accepts vectors. Although a loop around the % scalar version of the conditional probability would work, it is far more % efficient to vectorize the conditional probability using |bsxfun|. beta = sqrt(0.25)*ones(nIssuers,1); FTDSurvProb = zeros(size(ProbDates)); for jj = 1:nProbDates % vectorized conditional probability as a function of Z vecCondProb = @(Z)prod(normcdf(bsxfun(@rdivide,... -repmat(DefThresh(:,jj),1,length(Z))+bsxfun(@times,beta,Z),... sqrt(1-beta.^2)))); % truncate domain of normal distribution to [-5,5] interval FTDSurvProb(jj) = integral(@(Z)vecCondProb(Z).*normpdf(Z),-5,5); end FTDDefProb = 1-FTDSurvProb; %% % Compare the FTD probability to the default probabilities of the % individual issuers. figure plot(ProbDates',DefProb) datetick hold on plot(ProbDates,FTDDefProb,'LineWidth',3) datetick hold off title('FTD and Individual Default Probability Curves') ylabel('Cumulative Probability') xlabel('Date') %% Find FTD Spreads and Price Existing FTD Swaps % % Under the assumption that all instruments in the basket have the same % recovery rate, or homogeneous loss assumption (see O'Kane in References), % we get the spread for the FTD swap using the |cdsspread| function, but % passing the FTD probability data just computed. Maturity = MarketDates; ProbDataFTD = [ProbDates, FTDDefProb]; FTDSpread = cdsspread(ZeroData,ProbDataFTD,Settle,Maturity); %% % Compare the FTD spreads with the individual spreads. figure plot(MarketDates,MarketSpreads') datetick hold on plot(MarketDates,FTDSpread,'LineWidth',3) hold off title('FTD and Individual CDS Spreads') ylabel('FTD Spread (bp)') xlabel('Maturity Date') %% % An existing FTD swap can be priced with |cdsprice|, using the same FTD % probability. Maturity0 = MarketDates(1); % Assume maturity on nearest market date Spread0 = 540; % Spread of existing FTD contract % Assume default values of recovery and notional FTDPrice = cdsprice(ZeroData,ProbDataFTD,Settle,Maturity0,Spread0); fprintf('Price of existing FTD contract: %g\n',FTDPrice) %% Analyze Sensitivity to Correlation % % To illustrate the sensitivity of the FTD spreads to model parameters, we % calculate the market spreads for a range of correlation values. corr = [0 0.01 0.10 0.25 0.5 0.75 0.90 0.99 1]; FTDSpreadByCorr = zeros(length(Maturity),length(corr)); FTDSpreadByCorr(:,1) = sum(MarketSpreads)'; FTDSpreadByCorr(:,end) = max(MarketSpreads)'; for ii = 2:length(corr)-1 beta = sqrt(corr(ii))*ones(nIssuers,1); FTDSurvProb = zeros(length(ProbDates)); for jj = 1:nProbDates % vectorized conditional probability as a function of Z condProb = @(Z)prod(normcdf(bsxfun(@rdivide,... -repmat(DefThresh(:,jj),1,length(Z))+bsxfun(@times,beta,Z),... sqrt(1-beta.^2)))); % truncate domain of normal distribution to [-5,5] interval FTDSurvProb(jj) = integral(@(Z)condProb(Z).*normpdf(Z),-5,5); end FTDDefProb = 1-FTDSurvProb; ProbDataFTD = [ProbDates, FTDDefProb]; FTDSpreadByCorr(:,ii) = cdsspread(ZeroData,ProbDataFTD,Settle,Maturity); end %% % The FTD spreads lie in a band between the sum and the maximum of % individual spreads. As the correlation increases to one, the FTD spreads % decrease towards the maximum of the individual spreads in the basket (all % credits default together). As the correlation decreases to zero, the FTD % spreads approach the sum of the individual spreads (independent credits). figure legends = cell(1,length(corr)); plot(MarketDates,FTDSpreadByCorr(:,1),'k:') legends{1} = 'Sum of Spreads'; datetick hold on for ii = 2:length(corr)-1 plot(MarketDates,FTDSpreadByCorr(:,ii),'LineWidth',3*corr(ii)) legends{ii} = ['Corr ' num2str(corr(ii)*100) '%']; end plot(MarketDates,FTDSpreadByCorr(:,end),'k-.') legends{end} = 'Max of Spreads'; hold off title('FTD Spreads for Different Correlations') ylabel('FTD Spread (bp)') xlabel('Maturity Date') legend(legends,'Location','NW') %% % For short maturities and small correlations, the basket is effectively % independent (the FTD spread is very close to the sum of individual % spreads). The correlation effect becomes more significant for longer % maturities. % % Here is an alternative visualization of the dependency of FTD spreads on % correlation. figure surf(corr,MarketDates,FTDSpreadByCorr) datetick('y') ax = gca; ax.YDir = 'reverse'; view(-40,10) title('FTD Spreads for Different Correlations and Maturities') xlabel('Correlation') ylabel('Maturity Date') zlabel('FTD Spread (bp)') %% References % % [1] Loeffler, Gunter and Peter Posch, _Credit risk modeling using Excel % and VBA_, Wiley Finance, 2007. % % [2] O'Kane, Dominic, _Modelling single-name and multi-name Credit % Derivatives_, Wiley Finance, 2008. %