exponenta event banner

Кредитный риск контрагента и CVA

В этом примере показано, как вычислить одностороннюю корректировку кредитной стоимости (оценки) для банка, имеющего портфель ванильных процентных свопов с несколькими контрагентами. CVA является ожидаемой потерей по внебиржевому контракту или портфелю контрактов из-за дефолта контрагента. CVA для конкретного контрагента определяется как сумма за все моменты времени дисконтированного ожидаемого риска в каждый момент, умноженная на вероятность того, что контрагент по умолчанию в этот момент, все умножены на 1 минус коэффициент восстановления. Формула CVA представляет собой:

CVA = (1-R) ∫0TdiscEE (t) dPD (t)

Где R - восстановление, discEE дисконтированная ожидаемая экспозиция в момент времени t, и PD распределение вероятности по умолчанию.

Ожидаемый риск риска рассчитывается путем предварительного моделирования многих будущих сценариев факторов риска для данного контракта или портфеля. Факторами риска могут быть процентные ставки, как в этом примере, но они будут отличаться в зависимости от портфеля и могут включать валютные ставки, цены на акции или товары или что-либо, что повлияет на рыночную стоимость контрактов. После моделирования достаточного набора сценариев контракт или портфель можно оценить на ряд будущих дат для каждого сценария. Результатом является матрица, или «куб», значений контракта.

Эти цены преобразуются в риски убытков после учета договоров обеспечения, которые могут существовать у банка, а также соглашений о взаимозачете, как в этом примере, когда стоимость нескольких договоров может компенсировать друг друга, снижая их общий риск убытков.

Значения договора для каждого сценария дисконтируются для вычисления дисконтированных рисков убытков. Дисконтированные ожидаемые риски убытков могут затем вычисляться простым средним из дисконтированных рисков убытков на каждую дату моделирования.

Наконец, вероятности дефолта контрагента обычно извлекаются из рыночных котировок кредитного дефолтного свопа (CDS), и CVA для контрагента может быть вычислен в соответствии с вышеприведенной формулой. Предположим, что дефолт контрагента не зависит от его риска (отсутствие риска неправильного пути).

Этот пример демонстрирует портфель ванильных процентных свопов с целью расчета CVA для конкретного контрагента.

Читать портфолио свопов

Портфель свопов близок к нулю в момент времени t = 0. Каждый своп связан с контрагентом и может быть или не быть включен в соглашение о взаимозачете.

% Read swaps from spreadsheet
swapFile = 'cva-swap-portfolio.xls';
swaps = readtable(swapFile,'Sheet','Swap Portfolio');
swaps.LegType = [swaps.LegType ~swaps.LegType];
swaps.LegRate = [swaps.LegRateReceiving swaps.LegRatePaying];
swaps.LegReset = ones(size(swaps,1),1);

numSwaps = size(swaps,1);

Дополнительные сведения о параметрах подкачки для CounterpartyID и NettingID, см. creditexposures. Дополнительные сведения о параметрах подкачки для Principal, Maturity, LegType, LegRate, LatestFloatingRate, Period, и LegReset, см. swapbyzero.

Создание RateSpec на основе кривой процентных ставок

Settle = datenum('14-Dec-2007');

Tenor = [3 6 12 5*12 7*12 10*12 20*12 30*12]';
ZeroRates = [0.033 0.034 0.035 0.040 0.042 0.044 0.048 0.0475]';

ZeroDates = datemnth(Settle,Tenor);
Compounding = 2;
Basis = 0;
RateSpec = intenvset('StartDates', Settle,'EndDates', ZeroDates, ...
    'Rates', ZeroRates,'Compounding',Compounding,'Basis',Basis);

figure;
plot(ZeroDates, ZeroRates, 'o-');
xlabel('Date');
datetick('keeplimits');
ylabel('Zero rate');
grid on;
title('Yield Curve at Settle Date');

Figure contains an axes. The axes with title Yield Curve at Settle Date contains an object of type line.

Задать изменяемые параметры моделирования

Можно изменить количество моделируемых сценариев процентных ставок. В этом примере даты моделирования сначала становятся более частыми, а затем реже.

% Number of Monte Carlo simulations
numScenarios = 1000;

% Compute monthly simulation dates, then quarterly dates later.
simulationDates = datemnth(Settle,0:12);
simulationDates = [simulationDates datemnth(simulationDates(end),3:3:74)]';
numDates = numel(simulationDates);

Вычислить плавающие даты сброса

Для каждой даты моделирования вычислите предыдущую плавающую дату сброса для каждого свопа.

floatDates = cfdates(Settle-360,swaps.Maturity,swaps.Period);
swaps.FloatingResetDates = zeros(numSwaps,numDates);
for i = numDates:-1:1
    thisDate = simulationDates(i);
    floatDates(floatDates > thisDate) = 0;
    swaps.FloatingResetDates(:,i) = max(floatDates,[],2);
end

Настройка однофакторной модели Корпус-белый

Фактором риска, моделируемым для оценки контрактов, является нулевая кривая. В этом примере структура срока процентной ставки моделируется с использованием однофакторной модели Халл-Уайт. Это модель короткой ставки и определяется как:

dr = [start( t) -ar] dt + startdz

где

  • dr: Изменение в короткой ставке после небольшого изменения во времени, dt

  • a: Средняя скорость реверсии

  • λ: Волатильность короткого курса

  • dz: процесс Вайнера (стандартный обычный процесс)

  • (t): Функция дрейфа, определяемая как:

(t) = Ft (0, t) + aF (0, t) + (1-e-2at)

F (0, t): Мгновенная скорость передачи в момент времени t

Ft (0, t): Частная производная F по времени

После моделирования пути короткой ставки создайте полную кривую доходности на каждую дату моделирования по формуле:

R (t, T) = -1 (T-t) 1nA (t, T) + 1 (T-t) B (t, T) r (t)

lnA (t, T) = lnP (0,T) P (0, t) + B (t, T) F (0, t) -14a3start2 (e-aT-e-at) 2 (e2at-1)

B (t, T) = 1-e-a (T-t) a

R (t, T): Нулевая скорость в момент времени t для периода T-t

P (t, T): Цена нулевой купонной облигации в момент t, которая платит один доллар в момент T

Каждый сценарий содержит структуру полного срока, движущуюся вперед во времени, смоделированную в каждую из выбранных нами дат моделирования.

Отошлите к Калибрующей Белой как корпус Модели Используя пример Данных о Рынке в Финансовых инструментах Руководство Пользователей Toolbox™ для получения дополнительной информации о Белой как корпус калибровке с одной факторной моделью.

Alpha = 0.2;
Sigma = 0.015;

hw1 = HullWhite1F(RateSpec,Alpha,Sigma);

Моделирование сценариев

Для каждого сценария смоделируйте будущую кривую процентных ставок на каждую дату оценки с использованием однофакторной модели процентных ставок Hull-White.

% Use reproducible random number generator (vary the seed to produce
% different random scenarios).
prevRNG = rng(0, 'twister');

dt = diff(yearfrac(Settle,simulationDates,1));
nPeriods = numel(dt);
scenarios = hw1.simTermStructs(nPeriods, ...
    'nTrials',numScenarios, ...
    'deltaTime',dt);

% Restore random number generator state
rng(prevRNG);

% Compute the discount factors through each realized interest rate
% scenario.
dfactors = ones(numDates,numScenarios);
for i = 2:numDates
    tenorDates = datemnth(simulationDates(i-1),Tenor);
    rateAtNextSimDate = interp1(tenorDates,squeeze(scenarios(i-1,:,:)), ...
        simulationDates(i),'linear','extrap');
    % Compute D(t1,t2)
    dfactors(i,:) = zero2disc(rateAtNextSimDate, ...
        repmat(simulationDates(i),1,numScenarios),simulationDates(i-1),-1,3);
end
dfactors = cumprod(dfactors,1);

Проверка сценария

Создайте график поверхности эволюции кривой доходности для определенного сценария.

i = 20;
figure;
surf(Tenor, simulationDates, scenarios(:,:,i))
axis tight
datetick('y','mmmyy'); 
xlabel('Tenor (Months)');
ylabel('Observation Date');
zlabel('Rates');
ax = gca;
ax.View = [-49 32];
title(sprintf('Scenario %d Yield Curve Evolution\n',i));

Figure contains an axes. The axes with title Scenario 20 Yield Curve Evolution contains an object of type surface.

Вычислительная марка для рыночных цен свопа

Для каждого сценария портфель свопа оценивается на каждую будущую дату моделирования. Цены вычисляются с использованием функции аппроксимации цены, hswapapprox. В приложениях CVA часто используются упрощенные функции аппроксимации при расчете цен на контракты из-за требований к производительности этих симуляций Monte Carlo.

Поскольку даты моделирования не соответствуют датам денежного потока свопов (где плавающие курсы сбрасываются), оцените последнюю плавающую ставку с 1-летней ставкой (все свопы имеют период 1 год), интерполированной между ближайшими моделируемыми кривыми курса.

Затем цены свопа агрегируются в «куб» значений, который содержит все будущие значения контракта на каждую дату моделирования для каждого сценария. Результирующий куб цен контрактов представляет собой трехмерную матрицу, где каждая строка представляет дату моделирования, каждый столбец - контракт, а каждая «страница» - другой смоделированный сценарий.

% Compute all mark-to-market values for this scenario. Use an
% approximation function here to improve performance.
values = hcomputeMTMValues(swaps,simulationDates,scenarios,Tenor);

Проверка цен сценариев

Создайте график эволюции всех цен свопа для определенного сценария.

i = 32;
figure;
plot(simulationDates, values(:,:,i));
datetick;
ylabel('Mark-To-Market Price');
title(sprintf('Swap prices along scenario %d', i));

Figure contains an axes. The axes with title Swap prices along scenario 32 contains 30 objects of type line.

Визуализация смоделированных значений портфеля

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

% View portfolio value over time
figure;
totalPortValues = squeeze(sum(values, 2));
plot(simulationDates,totalPortValues);
title('Total MTM Portfolio Value for All Scenarios');
datetick('x','mmmyy')
ylabel('Portfolio Value ($)')
xlabel('Simulation Dates')

Figure contains an axes. The axes with title Total MTM Portfolio Value for All Scenarios contains 1000 objects of type line.

Вычислить риск по контрагенту

Воздействие конкретного контракта (i) в момент времени t является максимумом стоимости контракта (Vi) и 0:

Ei (t) = макс. {Vi (t), 0}

И риск убытков для конкретного контрагента является просто суммой отдельных рисков убытков по контракту:

Ecp (t) =∑Ei (t) =∑max{Vi (t), 0}

Однако при наличии соглашений о взаимозачете договоры агрегируются и могут компенсировать друг друга. Таким образом, общий риск убытков по всем договорам в соглашении о взаимозачете составляет:

Ena (t) =max{∑Vi (t), 0}

Вычислите эти риски убытков для всего портфеля, а также каждого контрагента на каждую дату моделирования с помощью creditexposures функция.

Незасчитанные контракты указываются с помощью NaN в NettingID вектор. Подверженность незасчитанному договору равна рыночной стоимости договора, если он имеет положительную стоимость, в противном случае она равна нулю.

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

[exposures, expcpty] = creditexposures(values,swaps.CounterpartyID, ...
    'NettingID',swaps.NettingID);

Постройте график общей подверженности портфелю для каждого сценария в нашем моделировании. Аналогично графику стоимости договора, риски убытков для каждого сценария будут приближаться к нулю по мере созревания свопов.

% View portfolio exposure over time
figure;
totalPortExposure = squeeze(sum(exposures,2));
plot(simulationDates,totalPortExposure);
title('Portfolio Exposure for All Scenarios');
datetick('x','mmmyy')
ylabel('Exposure ($)')
xlabel('Simulation Dates')

Figure contains an axes. The axes with title Portfolio Exposure for All Scenarios contains 1000 objects of type line.

Профили воздействия

Несколько профилей риска убытков полезны при анализе потенциального будущего риска убытков банка для контрагента. Здесь можно вычислить несколько (без дисконтирования) профилей риска убытков для каждого контрагента, а также для всего портфеля.

  • PFE (Потенциальная будущая экспозиция): высокий процентиль (95%) распределения экспозиций на любую конкретную будущую дату (также называемый пиковой экспозицией (ПЭ))

  • MPFE (Максимальная потенциальная будущая экспозиция): Максимальная PFE на все даты

  • EE (Ожидаемое воздействие): Среднее (среднее) распределение воздействия на каждую дату

  • EPE (Ожидаемое положительное воздействие): Средневзвешенное значение по времени ожидаемого воздействия

  • EffEE (Эффективная ожидаемая экспозиция): Максимальная ожидаемая экспозиция в любое время, t или в предыдущий раз

  • EffEPE (Эффективное ожидаемое положительное воздействие): Средневзвешенное значение эффективного ожидаемого воздействия

Дополнительные определения см., например, в документе Базель II в ссылках.

% Compute entire portfolio exposure
portExposures = sum(exposures,2);

% Compute exposure profiles for each counterparty and entire portfolio
cpProfiles = exposureprofiles(simulationDates,exposures);
portProfiles = exposureprofiles(simulationDates,portExposures);

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

% Visualize portfolio exposure profiles
figure;
plot(simulationDates,portProfiles.PFE, ...
    simulationDates,portProfiles.MPFE * ones(numDates,1), ...
    simulationDates,portProfiles.EE, ...
    simulationDates,portProfiles.EPE * ones(numDates,1), ...
    simulationDates,portProfiles.EffEE, ...
    simulationDates,portProfiles.EffEPE * ones(numDates,1));
legend({'PFE (95%)','Max PFE','Exp Exposure (EE)','Time-Avg EE (EPE)', ...
    'Max past EE (EffEE)','Time-Avg EffEE (EffEPE)'})

datetick('x','mmmyy')
title('Portfolio Exposure Profiles');
ylabel('Exposure ($)')
xlabel('Simulation Dates')

Figure contains an axes. The axes with title Portfolio Exposure Profiles contains 6 objects of type line. These objects represent PFE (95%), Max PFE, Exp Exposure (EE), Time-Avg EE (EPE), Max past EE (EffEE), Time-Avg EffEE (EffEPE).

Визуализация профилей воздействия для конкретного контрагента.

cpIdx = find(expcpty == 5);
figure;
plot(simulationDates,cpProfiles(cpIdx).PFE, ...
    simulationDates,cpProfiles(cpIdx).MPFE * ones(numDates,1), ...
    simulationDates,cpProfiles(cpIdx).EE, ...
    simulationDates,cpProfiles(cpIdx).EPE * ones(numDates,1), ...
    simulationDates,cpProfiles(cpIdx).EffEE, ...
    simulationDates,cpProfiles(cpIdx).EffEPE * ones(numDates,1));
legend({'PFE (95%)','Max PFE','Exp Exposure (EE)','Time-Avg EE (EPE)', ...
    'Max past EE (EffEE)','Time-Avg EffEE (EffEPE)'})

datetick('x','mmmyy','keeplimits')
title(sprintf('Counterparty %d Exposure Profiles',cpIdx));
ylabel('Exposure ($)')
xlabel('Simulation Dates')

Figure contains an axes. The axes with title Counterparty 5 Exposure Profiles contains 6 objects of type line. These objects represent PFE (95%), Max PFE, Exp Exposure (EE), Time-Avg EE (EPE), Max past EE (EffEE), Time-Avg EffEE (EffEPE).

Дисконтированные риски убытков

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

% Get discounted exposures per counterparty, for each scenario
discExp = zeros(size(exposures));
for i = 1:numScenarios
    discExp(:,:,i) = bsxfun(@times,dfactors(:,i),exposures(:,:,i));
end

% Discounted expected exposure
discProfiles = exposureprofiles(simulationDates,discExp, ...
    'ProfileSpec','EE');

Постройте график дисконтированных ожидаемых рисков для совокупного портфеля, а также для каждого контрагента.

% Aggregate the discounted EE for each counterparty into a matrix
discEE = [discProfiles.EE];

% Portfolio discounted EE
figure;
plot(simulationDates,sum(discEE,2))
datetick('x','mmmyy','keeplimits')
title('Discounted Expected Exposure for Portfolio');
ylabel('Discounted Exposure ($)')
xlabel('Simulation Dates')

Figure contains an axes. The axes with title Discounted Expected Exposure for Portfolio contains an object of type line.

% Counterparty discounted EE
figure;
plot(simulationDates,discEE)
datetick('x','mmmyy','keeplimits')
title('Discounted Expected Exposure for Each Counterparty');
ylabel('Discounted Exposure ($)')
xlabel('Simulation Dates')

Figure contains an axes. The axes with title Discounted Expected Exposure for Each Counterparty contains 5 objects of type line.

Калибровка вероятности кривой дефолта для каждого контрагента

Вероятность дефолта для данного контрагента подразумевается текущими рыночными спредами CDS контрагента. Используйте функцию cdsbootstrap для создания кумулятивной вероятности дефолта на каждую дату моделирования.

% Import CDS market information for each counterparty
CDS = readtable(swapFile,'Sheet','CDS Spreads');
disp(CDS);
        Date         cp1    cp2    cp3    cp4    cp5
    _____________    ___    ___    ___    ___    ___

    {'3/20/2008'}    140     85    115    170    140
    {'3/20/2009'}    185    120    150    205    175
    {'3/20/2010'}    215    170    195    245    210
    {'3/20/2011'}    275    215    240    285    265
    {'3/20/2012'}    340    255    290    320    310
CDSDates = datenum(CDS.Date);
CDSSpreads = table2array(CDS(:,2:end));

ZeroData = [RateSpec.EndDates RateSpec.Rates];

% Calibrate default probabilities for each counterparty
DefProb = zeros(length(simulationDates), size(CDSSpreads,2));
for i = 1:size(DefProb,2)
    probData = cdsbootstrap(ZeroData, [CDSDates CDSSpreads(:,i)], ...
        Settle, 'probDates', simulationDates);
    DefProb(:,i) = probData(:,2);
end

% Plot of the cumulative probability of default for each counterparty.
figure;
plot(simulationDates,DefProb)
title('Default Probability Curve for Each Counterparty');
xlabel('Date');
grid on;
ylabel('Cumulative Probability')
datetick('x','mmmyy')
ylabel('Probability of Default')
xlabel('Simulation Dates')

Figure contains an axes. The axes with title Default Probability Curve for Each Counterparty contains 5 objects of type line.

Вычисление CVA

Формула корректировки кредитной стоимости (оценки) (CVA):

CVA = (1-R) ∫0TdiscEE (t) dPD (t)

Где R - восстановление, discEE дисконтированная ожидаемая экспозиция в момент времени t, и PD распределение вероятности по умолчанию. Это предполагает, что воздействие не зависит от дефолта (отсутствие риска неправильного пути), а также предполагает, что воздействие было получено с использованием вероятности нейтрального риска.

Аппроксимировать интеграл конечной суммой по датам оценки следующим образом:

CVA (приблизительно) = (1-R) ∑i=2ndiscEE (ti) (PD (ti) -PD (ti-1))

где t_1 сегодняшняя дата, t_2, ...,t_n будущих дат оценки.

Предположим, что информация CDS соответствует контрагенту с индексом cpIdx. Расчетный CVA является текущей рыночной стоимостью нашего кредитного риска для контрагента cpIdx. Для этого примера установите скорость восстановления на уровне 40%.

Recovery = 0.4;
CVA = (1-Recovery) * sum(discEE(2:end,:) .* diff(DefProb));
for i = 1:numel(CVA)
    fprintf('CVA for counterparty %d = $%.2f\n',i,CVA(i));
end
CVA for counterparty 1 = $2229.38
CVA for counterparty 2 = $2498.71
CVA for counterparty 3 = $918.96
CVA for counterparty 4 = $5521.83
CVA for counterparty 5 = $5883.77
figure;
bar(CVA);
title('CVA for each counterparty');
xlabel('Counterparty');
ylabel('CVA $');
grid on;

Figure contains an axes. The axes with title CVA for each counterparty contains an object of type bar.

Ссылки

  1. Пыхтин, Майкл и Стивен Чжу, Руководство по моделированию кредитного риска контрагента, GARP, июль/август 2007, выпуск 37, стр. 16-22.

  2. Пыхтин, Майкл и Дэн Розен, ценовой риск контрагента на уровне торговли и CVA, 2010.

  3. Базель II: https://www.bis.org/publ/bcbs128.pdf стр. 256.

См. также

| | |

Связанные темы

Внешние веб-сайты