Вычислите нейтрализацию LIBOR

В этом примере показано, как вычислить доллар США нейтрализация LIBOR. Регуляторы и промышленные группы рекомендовали, чтобы переход фирм далеко от Лондонского международного банка предложил уровень (LIBOR) и подготовился заменять их на ночные Альтернативные Ссылочные Уровни (ARRs). Что происходит с контрактами с отвлеченным значением триллионов долларов, если они обращаются к сравнительному тесту, который больше не существует? Если сравнительный тест LIBOR больше не публикуется, ссылки на ту исходную ставку должны измениться, и исходные ставки “отступают” к новому сравнительному тесту в контрактах. Например, если 30-летний инструмент с плавающей ставкой с трехмесячным купоном на основе уровня LIBOR будет создан в 2 008 и истечет в 2 038, то уровень должен будет измениться в 2 023, потому что в 2 023, публикация уровня LIBOR постоянно прекращается. Чтобы вычислить трехмесячные купонные платежи после 2023, необходимо использовать нейтрализацию LIBOR. Этот пример основан на Протоколе ISDA® 2020 IBOR Fallbacks.

Распространите корректировки

Используйте корректировки распространения от веб-сайта ISDA® при Прекращении LIBOR и Ударе на Протокол Нейтрализаций.

Adjustment = [.00644 .03839 .11448 .18456 .26161 .42826 .71513]'/100;
TenorLabel = ["ON","1W","1M","2M","3M","6M","12M"]';
Tenors = [caldays(1) calweeks(1) calmonths([1 2 3 6 12])];
SpreadAdjustmentTable = table(TenorLabel,Adjustment);
nTenors = height(SpreadAdjustmentTable);

Данные в качестве примера

Запустите этот пример с помощью следующих данных в качестве примера.

RateRecordDate = datetime(2021,2,26);
RateTenor = "1M";
ARR_DC = 360;

Получите расчетную дату

Используйте RateRecordDate и Tenors вычислить CalculationDate.

CalculationDate = RateRecordDate + Tenors(RateTenor == TenorLabel);
if ~isbusday(CalculationDate)
    CalculationDate = busdate(CalculationDate);
end

Получите исторические данные

В данном примере исторические данные трудно закодированы. Однако можно также использовать Datafeed Toolbox™ с Экономическими данными Федеральной резервной системы (FRED®), чтобы получить исторические данные.

getFredData = false;
if getFredData
    ARR_ID = 'SOFR';
    c = fred;
    c.DataReturnFormat = 'timetable';
    c.DatetimeType = 'datetime';
    FredData = fetch(c,ARR_ID,RateRecordDate,CalculationDate);
    SOFRData = FredData.Data{1};
    SOFRData(isnan(SOFRData{:,1}),:) = [];
else
    SOFRRates = [0.01 0.02 0.04 0.04 0.02 0.02 0.02 0.02 0.02 0.01 ...
        0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01 0.01]';
    SOFRDates = busdays(RateRecordDate,CalculationDate);
    SOFRData = timetable(SOFRDates,SOFRRates);
end

Вычислите корректировку распространения

Получите корректировку распространения из SpreadAdjustmentTable.

SpreadAdj = Adjustment(RateTenor == TenorLabel);

Вычислите ARR

Вычислите альтернативный ссылочный уровень (ARR) с помощью соответствующих ссылочных данных об уровне.

tau = days(diff(SOFRData.Properties.RowTimes))/ARR_DC;
relRate = SOFRData{1:end-1,1};
CompRate = prod(1 + tau.*1/100.*relRate) - 1;
ARR = ARR_DC/days(CalculationDate - RateRecordDate)*CompRate;
ARR = round(ARR,7);

Вычислите уровень нейтрализации

FallbackRate сумма ARR и SpreadAdj.

FallbackRate = ARR + SpreadAdj
FallbackRate = 0.0013