В этом примере исследуется, как моделировать коррелированные значения контрагента по умолчанию с использованием многофакторной модели копулы.
Потенциальные потери оцениваются для портфеля контрагентов, учитывая их подверженность при дефолте, вероятность дефолта и потери по информации о дефолте. A 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.876 23.778 102.4 121.28
Confidence intervals for the risk measures:
EL Std VaR CVaR
________________ ________________ ________________ ________________
24.729 25.023 23.674 23.883 101.19 103.5 120.13 122.42
Посмотрите на распределение портфельных потерь. Ожидаемые потери (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.036031 0.022762 0.083828 0.13625
2 0.068357 0.039295 0.23373 0.24984
3 1.2228 0.60699 2.3184 2.3775
4 0.002877 0.00079014 0.0024248 0.0013137
5 0.12127 0.037144 0.18474 0.24622
Найдите самых рискованных контрагентов по их вкладу в CVaR.
[rc_sorted,idx] = sortrows(rc,'CVaR','descend'); rc_sorted(1:5,:)
ans =
5x5 table
ID EL Std VaR CVaR
__ _______ ______ ______ ______
89 2.2647 2.2063 8.2676 8.9997
96 1.3515 1.6514 6.6157 7.7062
66 0.90459 1.474 6.4168 7.5149
22 1.5745 1.8663 6.0121 7.3814
16 1.6352 1.5288 6.3404 7.3462
Постройте график рисков контрагента и взносов 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 106.7 121.99 137.28
2000 109.18 117.28 125.38
3000 114.68 121.63 128.58
4000 114.02 120.06 126.11
5000 114.77 120.36 125.94
Постройте график доверительных полос, чтобы увидеть, как быстро сходятся оценки.
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 compula увеличивает корреляцию по умолчанию между контрагентами. Это приводит к более жесткому распределению потерь портфеля и более высоким потенциальным потерям в напряженных сценариях.
Повторно запустите моделирование, используя t compula, и вычислите новые показатели риска портфеля. Степень свободы (dof) по умолчанию для t-копулы равна пяти.
cc_t = simulate(cc,1e5,'Copula','t'); pr_t = portfolioRisk(cc_t);
Посмотрите, как меняется риск портфеля с помощью t copula.
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.876 23.778 102.4 121.28
Portfolio risk with t copula (dof = 5):
EL Std VaR CVaR
______ ______ ______ ______
24.808 38.749 186.08 250.59
Сравните потери хвоста каждой модели.
% 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 copulas, поэтому существует больше сценариев, где несколько контрагентов по умолчанию. Значительную роль играет количество степеней свободы. Для очень высоких степеней свободы результаты с t-копулой аналогичны результатам с гауссовой копулой. Пять - это очень низкое количество степеней свободы, и, следовательно, результаты показывают поразительные различия. Кроме того, эти результаты подчеркивают, что потенциал экстремальных потерь очень чувствителен к выбору копулы и количеству степеней свободы.
confidenceBands | creditDefaultCopula | getScenarios | portfolioRisk | riskContribution | simulate