В этом примере показано, как вычислить одностороннюю корректировку кредитной стоимости (оценки) для банка, имеющего портфель ванильных процентных свопов с несколькими контрагентами. CVA является ожидаемой потерей по внебиржевому контракту или портфелю контрактов из-за дефолта контрагента. CVA для конкретного контрагента определяется как сумма за все моменты времени дисконтированного ожидаемого риска в каждый момент, умноженная на вероятность того, что контрагент по умолчанию в этот момент, все умножены на 1 минус коэффициент восстановления. Формула CVA представляет собой:
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.
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
Фактором риска, моделируемым для оценки контрактов, является нулевая кривая. В этом примере структура срока процентной ставки моделируется с использованием однофакторной модели Халл-Уайт. Это модель короткой ставки и определяется как:
dt + startdz
где
: Изменение в короткой ставке после небольшого изменения во времени,
: Средняя скорость реверсии
: Волатильность короткого курса
: процесс Вайнера (стандартный обычный процесс)
Функция дрейфа, определяемая как:
1-e-2at)
t): Мгновенная скорость передачи в t
t): Частная производная F по времени
После моделирования пути короткой ставки создайте полную кривую доходности на каждую дату моделирования по формуле:
) B (t, T) r (t)
e-aT-e-at) 2 (e2at-1)
T-t) a
T): Нулевая скорость в t для периода T-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));

Для каждого сценария портфель свопа оценивается на каждую будущую дату моделирования. Цены вычисляются с использованием функции аппроксимации цены, 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));

Постройте график общей стоимости портфеля для каждого сценария моделирования. По мере того, как каждый сценарий движется вперед во времени, значения контрактов перемещаются вверх или вниз в зависимости от того, как изменяется смоделированная структура срока процентной ставки. По мере приближения свопов к сроку погашения их стоимость начнет приближаться к нулю, поскольку совокупная стоимость всех оставшихся денежных потоков будет уменьшаться после каждой даты денежного потока.
% 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 является максимумом стоимости контракта (Vi) и 0:
t), 0}
И риск убытков для конкретного контрагента является просто суммой отдельных рисков убытков по контракту:
t), 0}
Однако при наличии соглашений о взаимозачете договоры агрегируются и могут компенсировать друг друга. Таким образом, общий риск убытков по всем договорам в соглашении о взаимозачете составляет:
, 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')

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

Визуализация профилей воздействия для конкретного контрагента.
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):
dPD (t)
Где R - восстановление, discEE дисконтированная ожидаемая экспозиция в момент времени t, и PD распределение вероятности по умолчанию. Это предполагает, что воздействие не зависит от дефолта (отсутствие риска неправильного пути), а также предполагает, что воздействие было получено с использованием вероятности нейтрального риска.
Аппроксимировать интеграл конечной суммой по датам оценки следующим образом:
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;

Пыхтин, Майкл и Стивен Чжу, Руководство по моделированию кредитного риска контрагента, GARP, июль/август 2007, выпуск 37, стр. 16-22.
Пыхтин, Майкл и Дэн Розен, ценовой риск контрагента на уровне торговли и CVA, 2010.
Базель II: https://www.bis.org/publ/bcbs128.pdf стр. 256.
cdsbootstrap | cdsprice | cdsrpv01 | cdsspread