Recent Posts

Saturday, January 27, 2018

Primer: Indexation Calculations For Inflation-Linked Bonds

Although it is nice to think of inflation-linked bonds as providing a return in real terms, any detailed analysis needs to understand how the indexation calculations work. For Canadian model linkers (as opposed the early U.K. design), we can think of the bond as being priced in another currency, while all cash flows occur in the local currency. The CPI index that is used in the indexation calculation is the exchange rate between the currencies, with a daily interpolation between monthly values.

Daily Interpolation

If one wants a high level understanding of an inflation-linked bond, one can say that all cash flows associated by the bond are multiplied by an indexation factor, which converts the "real" price to "nominal." These cash flows include:
  • the amount paid for the bond;
  • accrued interest;
  • coupon cash flows;
  • proceeds of sale;
  • redemption value if held to maturity.
At a high level, we can think of the indexation factor as the ratio of the value of the CPI index at the valuation date divided by the value of the CPI index at the date of issue. (I am referring to the price index used in the bond calculations as the CPI as a shorthand; in some countries, it may be another index.) Please note that the following statements are only roughly correct; the rest of the article explains the added factors to take into account.

Let us take a 30-year Canadian Real Return Bond issued in December 2018. Example (simplified!) indexation values include the following.
  • At issuance, the indexation factor is the CPI(December 2018) divided by CPI(December 2018) which always equals 1. This means that the nominal price for the bond on the day of issuance (at auction) would equal the real price.
  • The coupon payment in December 2019 would equal the coupon rate times the principal amount held times the indexation factor, which equals CPI(December 2019) divided by CPI(December 2018). This factor is equal to 1 plus the one-year inflation rate.
  • The principal payment on December 2048 would use the indexation factor CPI(December 2048) divided by CPI(December 2018). This factor is equal to (1+i)^30, where i is the annualised 30-year inflation rate.
As can be seen, the principal value is (roughly!) rising in line with the inflation rate, as expected.

However, there are two problems with this simplified approach.
  1. Cash flows can occur on any working day, and we need to avoid pathological behaviour that results from this. We cannot associate the indexation factor for the month to the whole month, as that would imply that the indexation factor would be unchanged during the month, and jump from the last working  day to the first working day of the month. Large known one-day price jumps create a very high money market equivalent yield (since a 1% jump in working day can correspond to over 365% annualised, depending on the money market convention). We need to smooth the indexation factor changes over the month.
  2. CPI data are not available in real time; we only receive a monthly figure in a later month. Since it would be impossible to back-date payment amounts, we need to work with data from an earlier month (introduce a calculation lag). For Canadian bonds, the value is based on linearly interpolating the values from two and three months ago.* For example, values in December are based on interpolating the monthly CPI values for September and October.
If we want to think about monthly inflation rates, they show up with a 2-month lag under this system. For example, imagine that the CPI index is unchanged at 100 for all months up until September, and then the index jumps to 101 in October. The indexation factor would flat at 100 for all days until the end of November. However, after December 1, the indexation factor starts rising toward 101 (which it reaches on January 1). This means that the 1% monthly increase shows up as (1% divided by 31) steps daily during the month.

This calculation lag implies that these bonds cannot protect you from a hyperinflation. The usual technical definition of a hyperinflation is an inflation rate of greater than 50% per month. A two-month calculation lag in a hyperinflation would still imply a devastating loss of purchasing power. For this reason, we need to be careful about assertions that index-linked providing a guaranteed real rate of return. That said, deviations from an ideal real-time CPI index would not be significant under normal conditions (modulo the issue of seasonality in the CPI).

In practice, one annoying property of these bonds is that each uses a index ratio that is rebased to 1 at the date of issuance of the bond. Although that makes the evolution of that particular bond's valuation easier to understand, it has the side effect that if one has a portfolio of these bonds, each one has a different indexation ratio (absent the special case of two such bonds issued on the same day). In effect, each bond has its own unique exchange rate for calculations.


Assume that the CPI index evolves as follows.
  • September 2017: 100.0
  • October 2017: 100.0
  • November 2017: 101.0
  • December 2017: 102.0
The daily CPI index evolves as follows. (Note that the index ratio of a particular bond at a date is the ratio of the daily CPI at that date divided by the daily CPI index at the date of issue of the bond. For example, for any bond issued in December 2017, the index ratio is the daily CPI value shown divided by 100.0.)
We see that the daily CPI is flat at 100 during December 2017, as it based on interpolating the September and October CPI figures. (Note that the date axis are floating point numbers, rather than pretty month labels. The charts in this article was generated by the script in the simplepricers module; described in the appendix to this article.)

The rise in the CPI index in November 2017 results in the daily index rising in January 2018.

The chart above shows the annualised rate of change of the daily index. It zooms off to about 12.6% in January, and then 26.5% in February. If we want to think in terms of inflation rates, we see that the jump in the 1-month inflation rate in the November monthly figure (when it went from 100.0 to 101.0) translates to positive carry in the month of January. This means that if we want to think about the effect on carry, it is only a two-month lag -- not three. It takes three months to fully reach the new level of the CPI, but you pick up the effect of the carry in the month ahead.

The very high annualised inflation rates in this example are not that far-fetched; the CPI index used for indexation is not seasonally adjusted, and is headline inflation (including energy). Having a jump of about 1% on monthly basis is not that extreme, yet the annualised inflation rate of 12.6% dwarfs modern money market rates. This highly variable inflation compensation in the short term makes index-linked bonds an extremely unreliable money market instrument, and explains why there is no appetite to issue index-linked paper at money market maturities.

One may also note that the annualised inflation rate during the months of January and February are not perfectly flat. This is because the daily index is linearly interpolated, whereas a flat annualised inflation rate would imply an exponential fit between the endpoints. This effect is small, but we would also need to add in the fact that money market quote conventions differ from simple mathematical quote conventions. This means we could not exactly calculate nominal equivalent returns from inflation rates and the quoted indexed yield on the linker.

Appendix: Simple Pricing Module

One difficulty with fixed income calculations is that if we want to work with traded instruments and quoted data, we need to follow the various quote conventions that are used in the associated market. Having fixed quote conventions is important: it allows traders to negotiate in yield terms, and the agreed yield can be exactly translated to a final settlement price. If there were ambiguity in the definition of the bond yield, the two back offices could end up disagreeing on the transaction price. However, these quote conventions make it difficult to do illustrative calculations when writing tutorial material.

Textbooks and financial theory quite often get around this by using a simplified yield calculation formalism. Real world pricers will translate market conventions to the theoretical equivalent, using them under the hood. I decided to reinvent the wheel, and develop a small library of simplified functions that I will use for illustrative pricers - the open source Python SimplePricers module, available at The code is designed to be straightforward, so that interested readers could replicate them if necessary in whatever programming language they use. The objective is not to build a financial software library, but just have a single location where I put all my example code. This way, I do not have to waste time writing out equations: if the reader wants the details, they are available in the code.

I bring this up because in my writings about inflation-linked bonds, I want to illustrate calculations using the SimplePricers module. The issue is that we run into the ugliness associated with the calendar. The number of days in the year is variable, and bond cash flows are diverted from weekends and holidays depending on the calendar convention used in each jurisdiction. For simple bond calculations, we can ignore the calendar. For example, we can look at a hypothetical bond that matures in exactly 10 years, without worrying whether that is a weekend or not. Unfortunately, we need some notion of calendar dates to relate to inflation indexation.

In order to keep things simple, the package uses a simplified calendar of 12 months, each with 30 days (and no notion of weekends or holidays) -- a 360 day year. The date itself is just a real (decimal) number, with the integer component representing the year, and the fractional part corresponding to the day of the year. (In most computer representations of dates, a real number is also used, but the integer part represents the number of days from a fixed start date. If we were modelling loan shark financial calculations that are day-based, such a representation might be useful.)

"January 1" (the first day of the first month) corresponds to an offset of 0.0, and then each day increases the offset by 1/360, with "December 30" (the last day of the year) is 359/360.


* The index calculation is described as:
The reference CPI for the first day of any calendar month is the CPI for the third preceding calendar month. For example, the reference CPI for December 1 in any year will be the CPI for September in that year (which will be published in October of that year).
 Bank of Canada Review, referenced at:

(c) Brian Romanchuk 2018


  1. This comment has been removed by a blog administrator.

  2. This comment has been removed by a blog administrator.


Note: Posts are manually moderated, with a varying delay. Some disappear.

The comment section here is largely dead. My Substack or Twitter are better places to have a conversation.

Given that this is largely a backup way to reach me, I am going to reject posts that annoy me. Please post lengthy essays elsewhere.