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

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

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

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

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

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

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

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

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

Чтение портфолио Swap

Портфель свопов близок к нулю значения в момент 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

Setup модели Hull-White с одним фактором

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

dr=[θ(t)-ar]dt+σdz

где

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

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

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

  • dz: Процесс Вайнера (стандартный нормальный процесс)

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

θ(t)=Ft(0,t)+aF(0,t)+σ22a(1-e-2at)

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

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

После моделирования пути короткой скорости сгенерируйте полную кривую выражения на каждую дату симуляции с помощью формулы:

R(t,T)=-1(T-t)lnA(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)-14a3σ2(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

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

Для получения дополнительной информации о калибровке однофакторной модели Hull-White см. Пример калибровки модели корпуса-белого с использованием рыночных данных в Руководстве по Financial Instruments Toolbox™ пользователям.

Alpha = 0.2;
Sigma = 0.015;

hw1 = HullWhite1F(RateSpec,Alpha,Sigma);

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

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

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

Поскольку даты симуляции не соответствуют датам денежного потока свопов (где сбрасываются плавающие ставки), оценка последнего плавающего курса с 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)=max{Vi(t),0}

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

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

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

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

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

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

Контрактам, включенным в соглашение о сетке, соединили их значения вместе и могут возместить друг друга. Смотрите ссылки для получения дополнительной информации об вычислении риска от mark-to-market контрактных значений.

[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%) распределения воздействия на любую конкретную будущую дату (также называемый Пиковым Воздействием (PE))

  • 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(approx)=(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.

См. также

| | |

Похожие темы

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