Modelling inflation-linked bonds in LUSID

Prev Next

You can model an inflation-linked bond contract as an instrument of type InflationLinkedBond in LUSID. See all supported instruments.

Note LUSID has other instrument types for different kinds of bond:

Kind of bond

LUSID instrument type

More information

Inflation-linked

InflationLinkedBond

Continue reading this article.

Fixed rate with regular coupons (only the first can be irregular)
Zero coupon

Bond

Read this dedicated article.

Fixed rate with irregular coupons (other than the first)
Floating rate
Fixed-to-floating rate
Municipal
Callable
Puttable
Sinkable
Convertible

ComplexBond

Read this dedicated article.

Mortgage-backed security (MBS)

Read this dedicated article.

Mastering an instrument

There are numerous methods you can use to master an instrument of type InflationLinkedBond in the LUSID Security Master.

Some fields are common to all types of instrument, such as an intuitive name, the requirement to specify a set of identifiers, and the facility to store extra information as properties.

Fields in the economic definition object are specific to InflationLinkedBond. For more information on these fields, consult the schema, or select InflationLinkedBond from the definition dropdown in the API documentation:


For example, the following call to the UpsertInstruments API masters a bond in a custom instrument scope using a FIGI unique identifier. Note the fields specified below are the minimum required to master an instrument of type InflationLinkedBond:

curl -X POST "https://<your-domain>.lusid.com/api/api/instruments?scope=mycustominstrscope"
   -H "Content-Type: application/json-patch+json"
   -H "Authorization: Bearer <your-API-access-token>"
   -d '{
  "request_id_1": {
    "name": "UKT 0 â…œ 10/22/26",
    "identifiers": {"Figi": {"value": "BBG00ZF1T8P5"}},
    "definition": {
      "instrumentType": "InflationLinkedBond",
      "startDate": "2016-10-22T10:00:00.0000000+00:00",
      "maturityDate": "2026-10-22T10:00:00.0000000+00:00",
      "domCcy": "GBP",
      "couponRate": 0.00375,
      "principal": 1,
      "calculationType": "Standard",
      "flowConventions": {
        "currency": "GBP",
        "paymentFrequency": "6M",
        "dayCountConvention": "Actual365",
        "rollConvention": "22",
        "businessDayConvention": "NoAdjustment"
      },
      "inflationIndexConventions": {
        "inflationIndexName": "UKRPI",
        "currency": "GBP",
        "observationLag": "3M"
      },
      "tradingConventions": {
        "priceScaleFactor": 100
      }
    }
  }
}'

Note the following:

  • The instrumentType must be InflationLinkedBond.

  • The domCcy field must be an ISO 4217 currency code (and likewise all currency fields in nested objects).

  • The startDate should be the accrual start date; that is, the date from which interest is calculated.

  • The maximum maturityDate is 31 December 2140.

  • The couponRate should be expressed as a decimal rather than a percentage, so a bond paying:

    • 10% should have a couponRate of 0.1

    • 2.5% should have a couponRate of 0.025

    • 0.375% should have a couponRate of 0.00375.

  • The principal can be any number, but we advise setting it to 1 to unitise the security and specifying the face or purchase amount on the transaction.

  • The calculationType defaults to Standard, suitable for modern UK Gilts with monthly inflation fixings. You may need to change this for certain kinds of bond, which impacts the quantity and quality of market data required. More information.

  • The flowConventions object stores all the information necessary to determine coupon periods, accrued interest amounts and payment dates:

    • The paymentFrequency field can be any tenor, in this case 6M to signify twice yearly. Supported day count conventions.

    • The rollConvention field should count back from maturity, so in this case 22 for a bond maturing on 22 October, which means the coupon dates are 22 October and 22 April each year. More information on roll and business day conventions. Note business days in LUSID are determined by holiday calendars.

    • The accrualDateAdjustment field is optional and defaults to Adjusted. This is suitable for European treasury bonds but for US treasury bonds we recommend Unadjusted.

    • The settleDays field in a flow convention is deprecated, and resetDays is ignored for inflation-linked bonds. The scope and code fields can be ignored unless you are loading a flow convention from a library.

  • The inflationIndexConventions object identifies a reference index to look up fixings:

    • The inflationIndexName should be an intuitive string that enables LUSID to look up fixing(s) in the Quote Store each time an accrued interest calculation is required. More information.

    • The currency should be the same as the domCcy.

    • The observationLag must be a tenor with a unit of M for months, for example 3M.

    • The inflationFrequency defaults to a tenor of 1M but can be set to 3M for Australian or NZ bonds, in which case the flow convention paymentFrequency must also be set to 3M.

  • If you omit the exDividendDays field, a bond has no ex-dividend period.

  • If you omit the roundingConventions array, no rounding conventions are applied at the instrument level.

  • If you do not specify a stubType, the first and last coupon periods are expected to be regular. More information coming soon.

  • The tradingConventions.priceScaleFactor field is set to 100 so bond prices can be expressed as a percentage of par without scaling every quote loaded into LUSID.

Providing the request is successful, the response:

  • Confirms the globally-unique LUID for the instrument;

  • Generates extra fields that are stored as part of the instrument definition and can be filtered on;

  • Supplies default values for fields not explicitly specified in the request:

{
  "scope": "mycustominstrscope",
  "lusidInstrumentId": "LUID_00003GVU",
  "name": "UKT 0 â…œ 10/22/26",
  "identifiers": {
    "LusidInstrumentId": "LUID_00003GVU",
    "Figi": "BBG00ZF1T9P5"
  },
  "properties": [],
  "instrumentDefinition": {
    "startDate": "2016-10-22T00:00:00.0000000+00:00",
    "maturityDate": "2026-10-22T00:00:00.0000000+00:00",
    "flowConventions": {
      "currency": "GBP",
      "paymentFrequency": "6M",
      "dayCountConvention": "Actual365",
      "rollConvention": "22",
      "paymentCalendars": [],
      "resetCalendars": [],
      "settleDays": 0,
      "resetDays": 0,
      "leapDaysIncluded": true,
      "accrualDateAdjustment": "Adjusted",
      "businessDayConvention": "None",
      "accrualDayCountConvention": "Actual365"
    },
    "inflationIndexConventions": {
      "inflationIndexName": "UKRPI",
      "currency": "GBP",
      "observationLag": "3M",
      "inflationInterpolation": "Linear",
      "inflationFrequency": "1M",
      "inflationRollDay": 1
    },
    "couponRate": 0.00375,
    "identifiers": {},
    "calculationType": "Standard",
    "indexPrecision": 5,
    "principal": 1,
    "principalProtection": true,
    "stubType": "ShortFront",
    "roundingConventions": [],
    "tradingConventions": {
      "priceScaleFactor": 100,
      "minimumOrderSize": 0,
      "minimumOrderIncrement": 0
    },
    "instrumentType": "InflationLinkedBond"
  },
  "state": "Active",
  "assetClass": "Inflation",
  "domCcy": "GBP",
  "relationships": [],
  "dataModelMembership": {
    "membership": []
  },
  ...
}

Providing inflation fixings

LUSID must have access to inflation fixings (resets) in order to perform almost any operation on a portfolio holding an InflationLinkedBond.

Note the precise quantity and quality of market data required depends on a bond’s calculationType. More information.

Loading fixings into the LUSID Quote Store

Consider the example of a UK Gilt linked to UKRPI with a calculationType of Standard and the following inflationIndexName in its instrument definition:

"inflationIndexConventions": {
  "inflationIndexName": "UKRPI",
   ...
}

The following call to the UpsertQuotes API loads two fixings for 1 September and 1 October 2023 at midnight UTC into a MyFixings quote scope:

curl -X POST "https://<your-domain>.lusid.com/api/api/quotes/MyFixings"
  -H "Authorization: Bearer <your-API-access-token>"
  -H "Content-Type: application/json-patch+json"
  -d '{
    "Quote-0001": {
      "quoteId": {
        "quoteSeriesId": {
          "provider": "Lusid",
          "instrumentIdType": "ClientInternal",
          "instrumentId": "UKRPI",
          "quoteType": "Index",
          "field": "mid"
        },
        "effectiveAt": "2023-09-01"
      },
      "metricValue": {
        "value": 378.4, "unit": "none"
      }
    },
    "Quote-0002": {
      "quoteId": {
        "quoteSeriesId": {
          "provider": "Lusid",
          "instrumentIdType": "ClientInternal",
          "instrumentId": "UKRPI",
          "quoteType": "Index",
          "field": "mid"
        },
        "effectiveAt": "2023-10-01"
      },
      "metricValue": {
        "value": 377.8, "unit": "none"
      }
    }
  }'

For general information on loading fixings into the Quote Store, see this article. Note the following about this example:

  • Both fixings are loaded into a quote scope (specified in the URL) that is only used for fixings, to avoid clashes.

  • The instrumentIdType of each fixing must be ClientInternal.

  • The instrumentId must be the inflationIndexName specified in the bond's inflation index convention, in this case UKPRI.

  • The provider is set to Lusid and the field to mid, to avoid validation errors.

  • The quoteType is Index. Note bonds with other calculation types require fixings with different quote types.

  • The effectiveAt must be the first day of a month at midnight UTC. Note bonds with other calculation types require fixings at different cadences.

Creating a suitable recipe

Your recipe must have a market data rule able to locate these fixings, for example:

"market": {
  "marketRules": [
    {
      "key": "Inflation.InflationIndex.UKRPI",
      "dataScope": "MyFixings",
      "supplier": "Lusid",
      "quoteType": "Index",
      "field": "mid"
    },
    ...
  ]
},

For general information on recipes, start with this article. Note the following:

  • The key should have a prefix of Inflation.InflationIndex and a suffix of the bond's inflationIndexName. Note bonds with other calculation types have different recipe key requirements for fixings.

  • The dataScope must match the quote scope into which fixings were loaded.

  • The other fields must match their respective quote fields exactly (values are case-sensitive).

Registering the recipe with portfolios

You must register the recipe with every portfolio in which you intend to hold an InflationLinkedBond. See how to do this.

You can use the same recipe for valuation operations if you wish.

Booking a transaction to establish a position

The process of booking a transaction in an InflationLinkedBond is the same as for a vanilla fixed-rate bond.

Valuing your position

The basic process of valuing a portfolio containing an InflationLinkedBond is the same as for a vanilla fixed-rate bond. We recommend switching to the dedicated BondLookupPricer pricing model in your recipe.

Note the quantity and quality of market data required depends on a bond’s calculation type. LUSID must be able to locate in the Quote Store:

  • A market price for the valuation date, which may be clean, dirty or 'half-dirty’ (the price includes the inflation ratio but does not include accrued interest);

  • Fixings at a particular cadence:

Calculation type

Typical use case

Market data

Price

Fixings

Recipe key to locate fixings

Standard

UK Gilts post-2005

A clean price (quoteType of Price)

Monthly. 1st of each month at midnight UTC (quoteType of Index)

Inflation.InflationIndex.*

StandardAccruedOnly

UK Gilts pre-2005

A ‘half-dirty’ price (quoteType of Price)

Quarterly

Australian and NZ bonds

A clean price (quoteType of Price)

Quarterly. 1st of each publication month at midnight UTC (quoteType of Index)

Ratio

US TIPS

A clean price (quoteType of Price)

Daily (quoteType of Ratio)

Inflation.InflationRatio.*

RatioAccruedOnly

A ‘half-dirty’ price (quoteType of Price)

Brazil

Brazilian bonds

A dirty price (quoteType of DirtyPrice)

Monthly. 15th of each month at midnight UTC (quoteType of Index)

Inflation.InflationIndex.*

Assumption resets (quoteType of InflationAssumption)

Inflation.InflationAssumption.*

Monitoring the lifecycle of the instrument

The process of handling instrument events for an InflationLinkedBond is the same as for a vanilla fixed-rate bond.