Анализ индексируемых по инфляции инструментов

Этот пример показывает, как анализировать индексированные инфляцией инструменты с помощью Toolbox™ Financial Financial Instruments Toolbox™.

Вычисление реальных цен и выражений для индексируемых по инфляции облигаций

Хотя индексируемые по инфляции облигации имеют большие изменения в проекте, например, продолжительность задержки индексации, большинство индексируемых по инфляции облигаций теперь имеют трехмесячную задержку. Они также индексируются капиталом, то есть основной капитал облигации индексируется на инфляцию. Поэтому купонная ставка облигации является постоянной, но фактические купонные выплаты варьируются, поскольку основной капитал облигации индексируется на инфляцию.

В частности, индексация выполняется при следующем соотношении:

IndexRatio=CPIRefCPIBase

где CPIBase - уровень индекса потребительских цен (или эквивалентная мера цены) на момент выпуска облигации и CPIRef является ссылка ИПЦ.

Как правило, вы вычисляете CPIRef путем интерполяции между данными индекса известной кривой индекс-инфляция. Чтобы вычислить денежные потоки для облигации с индексацией инфляции, вы просто вычислите соответствующие ссылочные ИПЦ и коэффициент индекса.

Рыночное соглашение по индексируемым по инфляции облигациям состоит в том, чтобы котировать цену и выражение с помощью фактического (то есть нескорректированного) купона, что означает, что ваша котировка является реальной ценой и выражением. Чтобы получить реальную цену и выражение, можно использовать функции 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')

Figure contains an axes. The axes with title Nominal and Real Yield Curves for US Data, September 2, 2008 contains 4 objects of type scatter, line. These objects represent Nominal yields, TIPS yields, Svensson fit to nominal yields, Nelson-Siegel fit to TIPS yields.

% 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')

Figure contains an axes. The axes with title Inflation-Rate Curve for US Data, September 2, 2008 contains an object of type line. This object represents Inflation-rate curve computed from bond yields.

Построение кривых инфляции из свопов инфляции с нулевым купоном

На рынке также наблюдался рост деривативов, связанных с инфляцией. Одними из наиболее ликвидно торгуемых производных по инфляции являются нулевые купонные инфляционные свопы (ZeroCouponInflationSwap) и инфляционные свопы год к году (YearYearInflationSwap).

При обмене инфляцией с нулевым купоном плательщик инфляции соглашается выплатить темп инфляции на срок (отставание на определенную сумму), усугубленный количеством лет. Приемник инфляции обычно платит фиксированную ставку, снова усугубляемую тенором инструмента. В начале обмена инфляцией с нулевым купоном фиксированная ставка устанавливается на прогнозируемый уровень инфляции на срок действия свопа. Эта ставка называется «безубыточным темпом свопа инфляции», и она котируется на рынке [6].

Используя обозначение из Hurd и Relleen, вы вычисляете скорость как:

(1+Rateswap)T=(1+Inflationt-L,t+T-L)T

где t - текущее время, T - тенор, а L - задержка. [5]

При погашении фактические денежные потоки свопа инфляции с нулевым купоном:

FixedLeg=N×[(1+k)M-1]

InflationLeg=N×[I(TM)I0-1]

где

  • Nявляется условным обозначением ссылки для свопа.

  • k - фиксированный уровень инфляции.

  • M- количество лет для срока службы свопа.

  • I(TM)- индекс инфляции на дату погашения с некоторой задержкой (для примера, трех месяцев).

  • I0 - индекс инфляции на дату начала с некоторой задержкой (для примера, трех месяцев).

Несмотря на то, что денежный поток с фиксированной опорой может отличаться от фактического денежного потока с инфляционной оплатой на сроке погашения, фиксированный безубыточный курс инфляционного свопа с нулевым купоном инфляционного свопа представляет собой прогнозируемый уровень инфляции для тенора свопа на начальном этапе. Вы можете создать кривую инфляции из серии обменных ставок нулевого купона, начиная с той же даты и заканчивая в разные даты. Здесь даты уже скорректированы с соответствующей задержкой индексации, чтобы упростить обозначение:

I(0,T1Y)=I(T0)(1+b(0;T0,T1Y))T1Y-T0

I(0,T2Y)=I(T0)(1+b(0;T0,T2Y))T2Y-T0

I(0,T3Y)=I(T0)(1+b(0;T0,T3Y))T3Y-T0

...

I(0,Ti)=I(T0)(1+b(0;T0,Ti))Ti-T0

где

  • I(0,Ti) - ссылочный номер индекса инфляции безубыточности для даты погашения Ti.

  • I(T0) - базовое значение индекса инфляции для начальной даты T0.

  • b(0;T0,Ti) - безубыточный уровень инфляции для свопа инфляции с нулевым купоном со сроком погашения Ti.

Вы можете получить свою кривую инфляции это с помощью 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')

Figure contains an axes. The axes with title Inflation-Index Curve Built from Zero-Coupon Inflation Swaps (ZCIS) contains 2 objects of type line. These objects represent Interpolated inflation-index values, ZCIS inflation-index values.

Индексируемые инфляцией ценовые инструменты с помощью кривой инфляции

С 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.

См. также

| | | | | | | | |

Похожие темы