exponenta event banner

Моделирование коррелированных значений по умолчанию с помощью Copulas

В этом примере исследуется, как моделировать коррелированные значения контрагента по умолчанию с использованием многофакторной модели копулы.

Потенциальные потери оцениваются для портфеля контрагентов, учитывая их подверженность при дефолте, вероятность дефолта и потери по информации о дефолте. 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-копулой аналогичны результатам с гауссовой копулой. Пять - это очень низкое количество степеней свободы, и, следовательно, результаты показывают поразительные различия. Кроме того, эти результаты подчеркивают, что потенциал экстремальных потерь очень чувствителен к выбору копулы и количеству степеней свободы.

См. также

| | | | |

Связанные примеры

Подробнее