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

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

Потенциальные потери оцениваются для портфеля контрагентов, учитывая их подверженность дефолту, вероятность дефолта и потерю, учитывая информацию о дефолте. A creditDefaultCopula объект используется для моделирования кредитоспособности каждого должника с латентными переменными. Скрытые переменные состоят из ряда взвешенных базовых кредитных факторов, а также, идиосинкратического кредитного фактора каждого должника. Скрытые переменные отображаются в состояние по умолчанию или без ограничений для каждого сценария на основе их вероятности дефолта. Меры портфельного риска, взносы в риск на уровне контрагента и информация о сходимости симуляции поддерживаются в creditDefaultCopula объект.

Этот пример также исследует чувствительность мер риска к типу копулы (Гауссова копула от t копула), используемой для симуляции.

Загрузка и изучение данных портфеля

Портфель содержит 100 контрагентов и связанные с ними кредитные риски по умолчанию (EAD), вероятность дефолта (PD), и потеря при дефолте (LGD). Использование creditDefaultCopula объект, можно моделировать значения по умолчанию и потери за определенный фиксированный период времени (для примера, один год). The EAD, PD, и LGD входы должны быть специфичными для определенного временного горизонта.

В этом примере каждый контрагент сопоставлен с двумя базовыми кредитными факторами с набором весов. The 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]

The 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 Копул

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

См. также

| | | | |

Похожие примеры

Подробнее о