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

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

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

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

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

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

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

Наконец, вероятности значения по умолчанию контрагента обычно выводятся из рыночных котировок кредитного дефолтного свопа (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');

Установите изменяемые параметры симуляции

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

% 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

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

Обратитесь к Калибрующей Белой как оболочка Модели Используя пример Данных о Рынке в Руководстве Пользователей 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));

Вычислите Марка, чтобы продать цены подкачки

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

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

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

% 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));

Визуализируйте симулированную стоимость портфеля

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

% 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')

Вычислите воздействие контрагентом

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

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

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

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

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

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

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

Контракты Аннеттеда обозначаются с помощью NaN в NettingID вектор. Воздействие контракта unnetted равно рыночной стоимости контракта, если это имеет положительное значение, в противном случае это - нуль.

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

[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')

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

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

  • 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')

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

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')

Обесцененные воздействия

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

% 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')

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

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

Вероятность по умолчанию для данного контрагента подразумевается текущими распространениями рынка 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')

Расчет 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_2T_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;

Ссылки

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

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

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