В этом примере показано, как вычислить доллар США нейтрализация 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) с помощью соответствующих ссылочных данных об уровне.
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