В этом примере показано, как вычислить одностороннюю корректировку кредитного значения (оценки) (CVA) для банка, имеющего портфель ванильных процентных ставок свопов с несколькими контрагентами. CVA - это ожидаемый убыток от внебиржевого контракта или портфеля контрактов из-за дефолта контрагента. CVA для конкретного контрагента определяется как сумма по всем точкам времени дисконтированного ожидаемого риска в каждый момент, умноженная на вероятность того, что контрагент по умолчанию в этот момент времени, все умноженные на 1 минус коэффициент возмещения. Формула CVA:
Где 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
.
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
Коэффициент риска, который моделируется как значение контрактов, является нулевой кривой. В данном примере вы моделируете структуру терминов процентной ставки с помощью однофакторной модели Халла-Уайта. Это модель короткой скорости и определяется как:
где
: Изменение короткого курса после небольшого изменения времени,
: Средняя скорость реверсии
:: Волатильность короткого курса
: Процесс Вайнера (стандартный нормальный процесс)
: Функция дрейфа, определяемая как:
: Мгновенная скорость передачи в момент времени
: Частная производная от относительно времени
После моделирования пути короткой скорости сгенерируйте полную кривую выражения на каждую дату симуляции с помощью формулы:
: Нулевая ставка в то время на период
: Цена нулевой купонной облигации в то время который платит один доллар в то время
Каждый сценарий содержит полную срочную структуру, двигающуюся вперед во времени, смоделированную в каждую из выбранных нами дат симуляции.
Для получения дополнительной информации о калибровке однофакторной модели 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));
Для каждого сценария портфель свопов оценивается на каждую будущую дату симуляции. Цены вычисляются с помощью функции приближения цены, 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));
Постройте график общего значения портфеля для каждого сценария симуляции. Когда каждый сценарий движется вперед во времени, значения контрактов перемещаются вверх или вниз в зависимости от изменения смоделированной структуры терминов процентной ставки. Когда свопы приближаются к сроку погашения, их значения начинают приближаться к нулю, поскольку совокупная стоимость всех оставшихся денежных потоков будет уменьшаться после каждой даты денежного потока.
% 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
:
И риск для конкретного контрагента является просто суммой отдельных рисков договора:
Однако при наличии соглашений о взаимозачете контракты агрегируются вместе и могут компенсировать друг друга. Поэтому общая подверженность всех контрактов в соглашении о взаимозачете:
Вычислите эти риски для всего портфеля, а также для каждого контрагента на каждую дату симуляции с помощью 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')
Несколько профилей риска полезны при анализе потенциальной будущей подверженности банка контрагенту. Здесь можно вычислить несколько (без скидки) профилей риска на контрагента, а также для всего портфеля.
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):
Где R
является ли восстановление, discEE
дисконтированное ожидаемое воздействие в момент t и PD
значение по умолчанию распределение вероятностей. Это предполагает, что воздействие не зависит от дефолта (нет неправильного риска), а также принимает, что воздействия были получены с использованием нейтральных к риску вероятностей.
Аппроксимируйте интеграл с конечной суммой за даты оценки как:
где 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