Этот пример показывает, как анализировать индексированные инфляцией инструменты с помощью Toolbox™ Financial Financial Instruments Toolbox™.
Хотя индексируемые по инфляции облигации имеют большие изменения в проекте, например, продолжительность задержки индексации, большинство индексируемых по инфляции облигаций теперь имеют трехмесячную задержку. Они также индексируются капиталом, то есть основной капитал облигации индексируется на инфляцию. Поэтому купонная ставка облигации является постоянной, но фактические купонные выплаты варьируются, поскольку основной капитал облигации индексируется на инфляцию.
В частности, индексация выполняется при следующем соотношении:
где - уровень индекса потребительских цен (или эквивалентная мера цены) на момент выпуска облигации и является ссылка ИПЦ.
Как правило, вы вычисляете путем интерполяции между данными индекса известной кривой индекс-инфляция. Чтобы вычислить денежные потоки для облигации с индексацией инфляции, вы просто вычислите соответствующие ссылочные ИПЦ и коэффициент индекса.
Рыночное соглашение по индексируемым по инфляции облигациям состоит в том, чтобы котировать цену и выражение с помощью фактического (то есть нескорректированного) купона, что означает, что ваша котировка является реальной ценой и выражением. Чтобы получить реальную цену и выражение, можно использовать функции Financial Toolbox™ bndprice
и bndyield
. Для примера:
Price = 124 + 9/32; Settle = datetime(2009,9,28); Coupon = .03375; Maturity = datetime(2032,4,15); RealYield = bndyield(Price,Coupon,Settle,Maturity); disp(['Real Yield: ', num2str(RealYield*100) '%'])
Real Yield: 2.0278%
С появлением рынка облигаций с индексацией инфляции реальные кривые могут быть построены подобно номинальным кривым. Используя доступные рыночные данные, можно создать реальную кривую и сравнить ее с номинальной кривой.
Обратите внимание, что одна эмиссия связана с задержкой индексации облигаций. Как указывалось ранее, обычно задержка индексации составляет три месяца, что означает, что компенсация инфляции на самом деле не соответствует сроку погашения или купонным платежам облигации. В то время как Андерсон и Слит [1] обсуждают подход к устранению этого несоответствия, для этого примера задержка просто отмечается.
Можно использовать fitNelsonSiegel
and
fitSvensson
функции в Financial Instruments Toolbox™ для создания parametercurve
объекты, которые соответствуют моделям Нельсона-Зигеля и Свенссона реальным и номинальным кривым выражения в США. Модель Нельсона-Сигеля обычно накладывает ограничения на параметры модели, чтобы гарантировать, что процентные ставки всегда положительны. Однако реальные процентные ставки могут быть отрицательными, что означает, что эти ограничения Нельсона-Сигела не используются в случае ниже.
% Load the data. load usbond_02Sep2008 Settle = datetime(2008, 9, 2); NominalTimeToMaturity = yearfrac(Settle,NominalMaturity); TIPSTimeToMaturity = yearfrac(Settle,TIPSMaturity); % Compute the yields. NominalYield = bndyield(NominalPrice,NominalCoupon,Settle,NominalMaturity); TIPSYield = bndyield(TIPSPrice,TIPSCoupon,Settle,TIPSMaturity); % Plot the yields. scatter(NominalTimeToMaturity,NominalYield*100,'r'); hold on; scatter(TIPSTimeToMaturity,TIPSYield*100,'b'); % Fit the real yield curve using fitNelsonSiegel. nInst = numel(TIPSCoupon); TIPSBonds(nInst,1) = fininstrument.FinInstrument; for ii=1:nInst TIPSBonds(ii) = fininstrument("FixedBond",'Maturity',TIPSMaturity(ii),... 'CouponRate',TIPSCoupon(ii)); end TIPSNelsonSiegel = fitNelsonSiegel(Settle,TIPSBonds,TIPSPrice);
Local minimum possible. lsqnonlin stopped because the final change in the sum of squares relative to its initial value is less than the value of the function tolerance.
% Fit the nominal yield curve using fitSvensson. nInst = numel(NominalCoupon); NominalBonds(nInst,1) = fininstrument.FinInstrument; for ii=1:nInst NominalBonds(ii) = fininstrument("FixedBond",'Maturity',NominalMaturity(ii),... 'CouponRate',NominalCoupon(ii)); end NominalSvensson = fitSvensson(Settle,NominalBonds,NominalPrice);
Solver stopped prematurely. lsqnonlin stopped because it exceeded the function evaluation limit, options.MaxFunctionEvaluations = 6.000000e+02.
% Plot the nominal and real yield curves. PlotDates = (Settle+calmonths(1):calmonths(1):Settle+calyears(30)-1)'; PlotTimeToMaturity = yearfrac(Settle,PlotDates); TIPSNelsonSiegelZeroRates = zerorates(TIPSNelsonSiegel,PlotDates); TIPSNelsonSiegelParYields = zero2pyld(TIPSNelsonSiegelZeroRates,PlotDates,Settle, ... 'InputCompounding', -1, 'OutputCompounding', 2); NominalSvenssonZeroRates = zerorates(NominalSvensson,PlotDates); NominalSvenssonParYields = zero2pyld(NominalSvenssonZeroRates,PlotDates,Settle, ... 'InputCompounding', -1, 'OutputCompounding', 2); plot(PlotTimeToMaturity,NominalSvenssonParYields*100,'r') plot(PlotTimeToMaturity,TIPSNelsonSiegelParYields*100,'b') hold off; title('Nominal and Real Yield Curves for US Data, September 2, 2008') xlabel('Time (Years)') ylabel('Yield (%)') legend({'Nominal yields','TIPS yields','Svensson fit to nominal yields',... 'Nelson-Siegel fit to TIPS yields'},'location','southeast')
% Create an inflation-rate curve by subtracting the real curve from the % nominal curve. InflationRateCurve = ratecurve("zero", Settle, PlotDates, ... NominalSvenssonZeroRates - TIPSNelsonSiegelZeroRates); figure plot(PlotTimeToMaturity, zero2pyld(... zerorates(InflationRateCurve, PlotDates), PlotDates, Settle, ... 'InputCompounding', -1, 'OutputCompounding', 2)*100,'b'); title('Inflation-Rate Curve for US Data, September 2, 2008') xlabel('Time (Years)') ylabel('Inflation Rate (%)') legend({'Inflation-rate curve computed from bond yields'},'location','southeast')
На рынке также наблюдался рост деривативов, связанных с инфляцией. Одними из наиболее ликвидно торгуемых производных по инфляции являются нулевые купонные инфляционные свопы (ZeroCouponInflationSwap
) и инфляционные свопы год к году (YearYearInflationSwap
).
При обмене инфляцией с нулевым купоном плательщик инфляции соглашается выплатить темп инфляции на срок (отставание на определенную сумму), усугубленный количеством лет. Приемник инфляции обычно платит фиксированную ставку, снова усугубляемую тенором инструмента. В начале обмена инфляцией с нулевым купоном фиксированная ставка устанавливается на прогнозируемый уровень инфляции на срок действия свопа. Эта ставка называется «безубыточным темпом свопа инфляции», и она котируется на рынке [6].
Используя обозначение из Hurd и Relleen, вы вычисляете скорость как:
где t - текущее время, T - тенор, а L - задержка. [5]
При погашении фактические денежные потоки свопа инфляции с нулевым купоном:
где
является условным обозначением ссылки для свопа.
- фиксированный уровень инфляции.
- количество лет для срока службы свопа.
- индекс инфляции на дату погашения с некоторой задержкой (для примера, трех месяцев).
- индекс инфляции на дату начала с некоторой задержкой (для примера, трех месяцев).
Несмотря на то, что денежный поток с фиксированной опорой может отличаться от фактического денежного потока с инфляционной оплатой на сроке погашения, фиксированный безубыточный курс инфляционного свопа с нулевым купоном инфляционного свопа представляет собой прогнозируемый уровень инфляции для тенора свопа на начальном этапе. Вы можете создать кривую инфляции из серии обменных ставок нулевого купона, начиная с той же даты и заканчивая в разные даты. Здесь даты уже скорректированы с соответствующей задержкой индексации, чтобы упростить обозначение:
где
- ссылочный номер индекса инфляции безубыточности для даты погашения .
- базовое значение индекса инфляции для начальной даты .
- безубыточный уровень инфляции для свопа инфляции с нулевым купоном со сроком погашения .
Вы можете получить свою кривую инфляции это с помощью inflationbuild
функция для создания inflationcurve
объект. Как создать inflationcurve
из ставок свопов с нулевым купоном, сначала определите базовую дату инфляции и соответствующее базовое значение индекса инфляции.
% Define the base inflation date and index value for the inflation-index % curve. BaseDate = datetime(2020,6,1); BaseIndexValue = 100;
Затем определите ставки свопов с нулевым купоном и соответствующие даты погашения, уже скорректированные с соответствующей задержкой индексации.
% Define the zero-coupon inflation swap rates and maturity dates.
ZCISTimes = (calyears([1 2 3 4 5 7 10 20 30]))';
ZCISRates = [0.42 0.54 0.76 0.87 0.92 1.39 1.71 2.01 2.46]'./100
ZCISRates = 9×1
0.0042
0.0054
0.0076
0.0087
0.0092
0.0139
0.0171
0.0201
0.0246
ZCISDates = BaseDate + ZCISTimes
ZCISDates = 9x1 datetime
01-Jun-2021
01-Jun-2022
01-Jun-2023
01-Jun-2024
01-Jun-2025
01-Jun-2027
01-Jun-2030
01-Jun-2040
01-Jun-2050
При ценообразовании производных по инфляции и создании кривых инфляции, учет сезонности может быть критическим фактором. Ставки свопов с нулевым купоном обычно имеют сроки, которые увеличиваются в целом ряде лет. В результате кривая инфляции типично строится из ставок свопов с нулевым купоном на ежегодном базисный. Однако при расчете значений индекса инфляции для месячных периодов, которые не являются целым числом лет, можно внести сезонные корректировки, чтобы отразить сезонные шаблоны инфляции в течение года. Эти 12 ежемесячных сезонных ставок в год и они складываются до нуля, чтобы гарантировать, что совокупные сезонные корректировки будут обнуляться каждый год. В inflationbuild
функции и inflationcurve
объект, вы определяете эти сезонные ставки используя 'Seasonality'
аргумент пары "имя-значение" и они внутренне исправлены, чтобы убедиться, что они прибавляют к нулю.
% Define the 12 monthly seasonal rates. % % Months: % Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec % 1 2 3 4 5 6 7 8 9 10 11 12 % Seasonal Rates (percent): % -6.34 -3.00 -1.34 3.34 5.34 3.66 8.66 5.66 -2.34 -2.66 -4.66 -6.32 SeasonalRates = [-6.34 -3.00 -1.34 3.34 5.34 3.66 8.66 5.66 -2.34 -2.66 -4.66 -6.32]./100
SeasonalRates = 1×12
-0.0634 -0.0300 -0.0134 0.0334 0.0534 0.0366 0.0866 0.0566 -0.0234 -0.0266 -0.0466 -0.0632
% Build an inflation-index curve from zero-coupon inflation swap rates. myInflationCurve = inflationbuild(BaseDate, BaseIndexValue, ... ZCISDates, ZCISRates, 'Seasonality', SeasonalRates)
myInflationCurve = inflationcurve with properties: Basis: 0 Dates: [10x1 datetime] InflationIndexValues: [10x1 double] ForwardInflationRates: [9x1 double] Seasonality: [12x1 double]
Как только вы создали inflationcurve
объект, вычислите значения индекса инфляции для каждого месяца с помощью indexvalues
.
% Compute the inflation-index values.
IndexPlotDates = (BaseDate:calmonths(1):BaseDate+calyears(10))';
IndexPlotValues = indexvalues(myInflationCurve, IndexPlotDates);
Чтобы визуализировать сезонные шаблоны инфляции, которые происходят в течение каждого года, постройте графики вычисленных значений индекса инфляции.
% Plot the inflation-index curve. figure; plot(IndexPlotDates, IndexPlotValues) hold on; plot(myInflationCurve.Dates(1:8), myInflationCurve.InflationIndexValues(1:8), 'o') hold off; title('Inflation-Index Curve Built from Zero-Coupon Inflation Swaps (ZCIS)') xlabel('Years') ylabel('Inflation-Index Values') legend({'Interpolated inflation-index values','ZCIS inflation-index values'},'location','northwest')
С inflationcurve
созданный объект, можно оценить индексируемые инфляцией инструменты, такие как свопы инфляции с нулевым купоном (ZeroCouponInflationSwap
), инфляционные свопы год к году (YearYearInflationSwap
) и индексируемые по инфляции облигации (InflationBond
).
Во-первых, создайте ratecurve
объект, использующий ratecurve
.
Settle = datetime(2020,9,25); Type = "zero"; ZeroTimes = [calmonths(6) calyears([1 2 3 4 5 7 10 20 30])]'; ZeroRates = [0.0043 0.0051 0.0062 0.0072 0.0096 0.0121 0.0172 0.0241 0.0302 0.0308]'; ZeroDates = Settle + ZeroTimes; ZeroCurve = ratecurve('zero',Settle,ZeroDates,ZeroRates)
ZeroCurve = ratecurve with properties: Type: "zero" Compounding: -1 Basis: 0 Dates: [10x1 datetime] Rates: [10x1 double] Settle: 25-Sep-2020 InterpMethod: "linear" ShortExtrapMethod: "next" LongExtrapMethod: "previous"
Использование ratecurve
и inflationcurve
объекты как входы, создайте Inflation
объект прейскуранта с использованием finpricer
.
outPricer = finpricer("Inflation",'DiscountCurve',ZeroCurve,'InflationCurve',myInflationCurve)
outPricer = Inflation with properties: DiscountCurve: [1x1 ratecurve] InflationCurve: [1x1 inflationcurve]
Создайте InflationBond
инструмент с использованием fininstrument
.
IssueDate = datetime(2020,9,20); Maturity = datetime(2025,9,20); CouponRate = 0.023; InflationBond = fininstrument("InflationBond",'IssueDate',IssueDate,'Maturity',Maturity,'CouponRate',CouponRate)
InflationBond = InflationBond with properties: CouponRate: 0.0230 Period: 2 Basis: 0 Principal: 100 DaycountAdjustedCashFlow: 0 Lag: 3 BusinessDayConvention: "actual" Holidays: NaT EndMonthRule: 1 IssueDate: 20-Sep-2020 FirstCouponDate: NaT LastCouponDate: NaT Maturity: 20-Sep-2025 Name: ""
Здесь задержка индексации по умолчанию составляет три месяца, и дата выпуска облигации 20-Sep-2020
. Первая дата на кривой инфляции ценника должна быть на или раньше 20-Jun-2020
оценить этот инструмент. В этом примере первая дата на кривой инфляции ценника 01-Jun-2020
.
Цена за InflationBond
инструмент при помощи price
функция для Inflation
цена.
InflationBondPrice = price(outPricer, InflationBond)
InflationBondPrice = 110.1314
Этот пример основан на следующих статьях и журналах:
[1] Андерсона Н. и Дж. Слита. Новые оценки реальных и номинальных кривых выражения Великобритании. Банк Англии, рабочий документ 126, 2001.
[2] Бриго, Д. и Ф. Меркурио. Модели процентной ставки - теория и практика: с улыбкой, инфляцией и кредитом. Спрингер, 2006.
[3] Диакон, М., А. Дерри, и Д. Мирфендерески. Индексируемые по инфляции ценные бумаги: облигации, свопы и другие производные. Wiley Finance, 2004.
[4] Gurkaynak, R.S., B.P. Sack, and J.H. Wright. «Кривая выражения СОВЕТЫ и компенсация инфляции». Рабочий документ ФЕДС № 2008-05, октябрь 2008 года.
[5] Херд, М. и Дж. Реллин. «Новая информация от инфляционных свопов и индексных облигаций». Ежеквартальный бюллетень, весна 2006.
[6] Керкхоф, Дж. «Объяснение производных от инфляции». Lehman Brothers, 2005.
fininstrument
| finpricer
| indexvalues
| Inflation
| InflationBond
| inflationbuild
| inflationcurve
| ratecurve
| YearYearInflationSwap
| ZeroCouponInflationSwap