Этот пример исследует, как моделировать коррелированые значения по умолчанию контрагента с помощью мультифакторной модели связки.
Возможные потери оцениваются для портфеля контрагентов, учитывая их воздействие в значении по умолчанию, вероятности по умолчанию и потере, данной информацию по умолчанию. Объект creditDefaultCopula
используется, чтобы смоделировать стоимость кредита каждого должника со скрытыми переменными. Скрытые переменные состоят из серии взвешенных базовых факторов кредита, а также, особенного фактора кредита каждого должника. Скрытые переменные сопоставлены с состоянием должника не по умолчанию или по умолчанию для каждого сценария на основе их вероятности значения по умолчанию. Меры по портфельному риску, вклады риска на уровне контрагента и информация о сходимости симуляции поддерживаются в объекте creditDefaultCopula
.
Этот пример также исследует чувствительность мер по риску к типу связки (Гауссова связка по сравнению с t связкой) используемый для симуляции.
Портфель содержит 100 контрагентов и их связанные кредитные риски в значении по умолчанию (EAD
), вероятность значения по умолчанию (PD
) и потеря, данная значение по умолчанию (LGD
). Используя объект creditDefaultCopula
, можно моделировать значения по умолчанию и потери по некоторому фиксированному периоду времени (например, один год). EAD
, PD
и входные параметры LGD
должны быть характерны для горизонта определенного времени.
В этом примере каждый контрагент сопоставлен на два базовых, приписывают факторам набор весов. Переменная Weights2F
является матрицей NumCounterparties-by-3
, где каждая строка содержит веса для одного контрагента. Первые два столбца являются весами для двух факторов кредита, и последний столбец является особенными весами для каждого контрагента. Корреляционная матрица для двух базовых факторов также обеспечивается в этом примере (FactorCorr2F
).
load CreditPortfolioData.mat whos EAD PD LGD Weights2F FactorCorr2F
Name Size Bytes Class Attributes EAD 100x1 800 double FactorCorr2F 2x2 32 double LGD 100x1 800 double PD 100x1 800 double Weights2F 100x3 2400 double
Инициализируйте объект creditDefaultCopula
с информацией о портфеле и факторной корреляцией.
rng('default'); cc = creditDefaultCopula(EAD,PD,LGD,Weights2F,'FactorCorrelation',FactorCorr2F); % Change the VaR level to 99%. cc.VaRLevel = 0.99; disp(cc)
creditDefaultCopula with properties: Portfolio: [100x5 table] FactorCorrelation: [2x2 double] VaRLevel: 0.9900 UseParallel: 0 PortfolioLosses: []
cc.Portfolio(1:5,:)
ans = 5x5 table ID EAD PD LGD Weights __ ______ _________ ____ ____________________ 1 21.627 0.0050092 0.35 0.35 0 0.65 2 3.2595 0.060185 0.35 0 0.45 0.55 3 20.391 0.11015 0.55 0.15 0 0.85 4 3.7534 0.0020125 0.35 0.25 0 0.75 5 5.7193 0.060185 0.35 0.35 0 0.65
Моделируйте мультифакторную модель с помощью функции simulate
. По умолчанию Гауссова связка используется. Эта функция внутренне сопоставляет реализованные скрытые переменные с состояниями по умолчанию и вычисляет соответствующие потери. После симуляции объект creditDefaultCopula
заполняет свойства PortfolioLosses
и CounterpartyLosses
с результатами симуляции.
cc = simulate(cc,1e5); disp(cc)
creditDefaultCopula with properties: Portfolio: [100x5 table] FactorCorrelation: [2x2 double] VaRLevel: 0.9900 UseParallel: 0 PortfolioLosses: [1x100000 double]
Функция portfolioRisk
возвращает меры по риску для общего распределения портфеля потерь, и опционально, их соответствующие доверительные интервалы. О подверженном риску значения (VaR) и подверженном риску значения условном выражении (CVaR) сообщают в наборе уровня в свойстве VaRLevel
для объекта creditDefaultCopula
.
[pr,pr_ci] = portfolioRisk(cc); fprintf('Portfolio risk measures:\n'); disp(pr) fprintf('\n\nConfidence intervals for the risk measures:\n'); disp(pr_ci)
Portfolio risk measures: EL Std VaR CVaR ______ ______ ______ ______ 24.774 23.693 101.57 120.22 Confidence intervals for the risk measures: EL Std VaR CVaR ________________ ________________ ________________ _______________ 24.627 24.92 23.589 23.797 100.65 102.82 119.1 121.35
Посмотрите на распределение потерь портфеля. Ожидаемая потеря (EL), VaR и CVaR отмечены как вертикальные строки. Экономический капитал, данный различием между VaR и EL, показывается заштрихованной областью между EL и VaR.
histogram(cc.PortfolioLosses) title('Portfolio Losses'); xlabel('Losses ($)') ylabel('Frequency') hold on % Overlay the risk measures on the histogram. xlim([0 1.1 * pr.CVaR]) plotline = @(x,color) plot([x x],ylim,'LineWidth',2,'Color',color); plotline(pr.EL,'b'); plotline(pr.VaR,'r'); cvarline = plotline(pr.CVaR,'m'); % Shade the areas of expected loss and economic capital. plotband = @(x,color) patch([x fliplr(x)],[0 0 repmat(max(ylim),1,2)],... color,'FaceAlpha',0.15); elband = plotband([0 pr.EL],'blue'); ulband = plotband([pr.EL pr.VaR],'red'); legend([elband,ulband,cvarline],... {'Expected Loss','Economic Capital','CVaR (99%)'},... 'Location','north');
Найдите риск концентрации в портфеле с помощью функции riskContribution
. riskContribution
возвращает вклад каждого контрагента к портфелю EL и CVaR. Эти аддитивные вклады суммируют к соответствующей общей мере по портфельному риску.
rc = riskContribution(cc);
% Risk contributions are reported for EL and CVaR.
rc(1:5,:)
ans = 5x5 table ID EL Std VaR CVaR __ _________ __________ _______ _________ 1 0.038604 0.02495 0.10482 0.12868 2 0.067068 0.036472 0.17378 0.24527 3 1.2527 0.62684 2.0384 2.3103 4 0.0023253 0.00073407 0 0.0026274 5 0.11766 0.042185 0.27028 0.26223
Найдите самых опасных контрагентов их вкладами CVaR.
[rc_sorted,idx] = sortrows(rc,'CVaR','descend'); rc_sorted(1:5,:)
ans = 5x5 table ID EL Std VaR CVaR __ _______ ______ ______ ______ 89 2.261 2.2158 8.1095 9.2257 22 1.5672 1.8293 6.275 7.4602 66 0.85227 1.4063 6.3827 7.2691 16 1.6236 1.5011 5.8949 7.1083 96 1.3331 1.6339 7.3678 6.9669
Постройте подверженность контрагента и вклады CVaR. Контрагенты с самыми высокими вкладами CVaR построены в красном и оранжевом цвете.
figure; pointSize = 50; colorVector = rc_sorted.CVaR; scatter(cc.Portfolio(idx,:).EAD, rc_sorted.CVaR,... pointSize,colorVector,'filled') colormap('jet') title('CVaR Contribution vs. Exposure') xlabel('Exposure') ylabel('CVaR Contribution') grid on
Используйте функцию confidenceBands
, чтобы исследовать сходимость симуляции. По умолчанию о группах уверенности CVaR сообщают, но полосы уверенности для мер по всему риску поддерживаются с помощью дополнительного аргумента RiskMeasure
.
cb = confidenceBands(cc);
% The confidence bands are stored in a table.
cb(1:5,:)
ans = 5x4 table NumScenarios Lower CVaR Upper ____________ ______ ______ ______ 1000 113.92 124.76 135.59 2000 111.02 117.74 124.45 3000 113.58 118.97 124.36 4000 113.06 117.44 121.81 5000 114.38 118.99 123.6
Постройте полосы уверенности, чтобы видеть, как быстро оценки сходятся.
figure; plot(... cb.NumScenarios,... cb{:,{'Upper' 'CVaR' 'Lower'}},... 'LineWidth',2); title('CVaR: 95% Confidence Interval vs. # of Scenarios'); xlabel('# of Scenarios'); ylabel('CVaR + 95% CI') legend('Upper Band','CVaR','Lower Band'); grid on
Найдите, что необходимое количество сценариев достигает особой ширины полос уверенности.
width = (cb.Upper - cb.Lower) ./ cb.CVaR; figure; plot(cb.NumScenarios,width * 100,'LineWidth',2); title('CVaR: 95% Confidence Interval Width vs. # of Scenarios'); xlabel('# of Scenarios'); ylabel('Width of CI as %ile of Value') grid on % Find point at which the confidence bands are within 1% (two sided) of the % CVaR. thresh = 0.02; scenIdx = find(width <= thresh,1,'first'); scenValue = cb.NumScenarios(scenIdx); widthValue = width(scenIdx); hold on plot(xlim,100 * [widthValue widthValue],... [scenValue scenValue], ylim,... 'LineWidth',2); title('Scenarios Required for Confidence Interval with 2% Width');
Переключение на t связку увеличивает корреляцию по умолчанию между контрагентами. Это приводит к более толстому распределению хвоста потерь портфеля, и в более высоких возможных потерях в подчеркнутых сценариях.
Повторно выполните симуляцию с помощью t связки и вычислите новые меры по портфельному риску. Степени свободы по умолчанию (dof) для t связки равняются пяти.
cc_t = simulate(cc,1e5,'Copula','t'); pr_t = portfolioRisk(cc_t);
Смотрите, как портфельный риск изменяется с t связкой.
fprintf('Portfolio risk with Gaussian copula:\n'); disp(pr) fprintf('\n\nPortfolio risk with t copula (dof = 5):\n'); disp(pr_t)
Portfolio risk with Gaussian copula: EL Std VaR CVaR ______ ______ ______ ______ 24.774 23.693 101.57 120.22 Portfolio risk with t copula (dof = 5): EL Std VaR CVaR ______ ______ ______ ______ 24.924 38.982 186.33 251.38
Сравните потери хвоста каждой модели.
% Plot the Gaussian copula tail. figure; subplot(2,1,1) p1 = histogram(cc.PortfolioLosses); hold on plotline(pr.VaR,[1 0.5 0.5]) plotline(pr.CVaR,[1 0 0]) xlim([0.8 * pr.VaR 1.2 * pr_t.CVaR]); ylim([0 1000]); grid on legend('Loss Distribution','VaR','CVaR') title('Portfolio Losses with Gaussian Copula'); xlabel('Losses ($)'); ylabel('Frequency'); % Plot the t copula tail. subplot(2,1,2) p2 = histogram(cc_t.PortfolioLosses); hold on plotline(pr_t.VaR,[1 0.5 0.5]) plotline(pr_t.CVaR,[1 0 0]) xlim([0.8 * pr.VaR 1.2 * pr_t.CVaR]); ylim([0 1000]); grid on legend('Loss Distribution','VaR','CVaR'); title('Portfolio Losses with t Copula (dof = 5)'); xlabel('Losses ($)'); ylabel('Frequency');
Риск хвоста измеряет VaR, и CVaR значительно выше используют t связку с пятью степенями свободы. Корреляции по умолчанию выше с t связками, поэтому существует больше сценариев где несколько значений по умолчанию контрагентов. Количество степеней свободы играет значительную роль. Для очень высоких степеней свободы результаты с t связкой подобны результатам с Гауссовой связкой. Пять очень небольшое число степеней свободы и, последовательно, результаты показывают поразительные различия. Кроме того, эти результаты подсвечивают, что потенциал за экстремальные потери очень чувствителен к выбору связки и количества степеней свободы.
confidenceBands
| creditDefaultCopula
| getScenarios
| portfolioRisk
| riskContribution
| simulate