Этот пример показывает, как вычислить одностороннее значение кредита (оценка) корректировка (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 год), интерполированный между самыми близкими моделируемыми кривыми уровня.
Цены подкачки затем агрегированы в "куб" значений, который содержит все будущие договорные стоимости в каждую дату симуляции каждого сценария. Получившийся куб договорных цен является 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
:
И воздействие для конкретного контрагента является просто суммой отдельных воздействий контракта:
В присутствии соглашений о сетке, однако, контракты агрегированы вместе и могут сместить друг друга. Поэтому сумма обязательств всех контрактов в соглашении о сетке:
Вычислите эти воздействия для целого портфеля, а также каждого контрагента в каждую дату симуляции с помощью функции 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) формула:
Где 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 = $2228.36 CVA for counterparty 2 = $2487.60 CVA for counterparty 3 = $920.39 CVA for counterparty 4 = $5478.50 CVA for counterparty 5 = $5859.30
figure; bar(CVA); title('CVA for each counterparty'); xlabel('Counterparty'); ylabel('CVA $'); grid on;
Pykhtin, Майкл, и Стивен Чжу, Руководство по Моделированию Кредитного риска Контрагента, GARP, июль/август 2007, выпуск 37, стр 16-22.
Pykhtin, Майкл и Дэн Розен, оценивая риск контрагента на торговом уровне и CVA, 2010.
Базель II: страница 256 https://www.bis.org/publ/bcbs128.pdf.