The IR curve generation config

Table of Contents

1. Summary

An ir_curve_generation_config describes how to synthesise one interest rate curve. It is declared in ores.synthetic.api/domain/ir_curve_generation_config.hpp, it hangs under a market_data_generation_config through config_id, and its instrument grid and its short-rate parameters are two separate sets of child rows.

2. Detail

2.1. What identifies the curve

  • currency_code, a soft foreign key to currencies.
  • index_family, a fixed lower-case token such as sofr, estr or euribor. It is the short token and not the full ORE or ISDA code, because currency_code already carries the currency half of that pair.
  • tenor, which names the floating-rate index's tenor for a term family such as libor or euribor. It is empty for the overnight families, which have no tenor dimension. The literal "FOMC" is valid only for sofr.
  • role, which is discount, projection or self_discounting, with self_discounting as the default. The vocabulary is intrinsic to this record, so it is a plain check constraint and not a lookup table.
  • provider_code, the provider whose curve this config simulates. The vendor instrument of each pillar comes from the catalogue under that provider.

The FOMC tenor is the meeting-dated variant of one currency and index pair. Its pillars start on meeting dates, so each of them has its own start in the series it lands in. The config row keeps its own natural key, so it does not collide with the standard curve's empty-tenor row. What a feed owns is the series, not the row; see the collision rule below.

2.2. The composite validation

The currency_code and index_family pair is validated as a whole by a hand-written composite trigger against overnight_index_convention and ibor_index_convention. Those rows key on the currency plus the upper-case index family. The codegen single-argument validation mechanism cannot express a two-column lookup, which is why the trigger is written by hand.

tenor is a soft foreign key to the tenor catalogue and is not validated in the database. It is resolved at the application layer, matching the precedent set by the template entry's own tenor columns.

2.3. The process and its parameters

process_type references yield_curve_process_type.code, a real foreign key. The engine's parameters are not columns on this row. Each parameter is an ir_curve_generation_config_process_parameter_value row, joined at feed start onto the yield_curve_process_parameter_definition catalogue. Adding an engine or a parameter is therefore seed data and not a schema change. See The IR curve template and its parameters and The yield curve process type catalogue.

2.4. The initial rate

price_source holds only "fixed": the curve starts from its stored initial_rate value row. No public source the installation catalogues fixes a short rate today, so the fixed rate is the stated fallback for every curve. When a public source covers a curve, the curve takes a "fixing" path the way The FX spot generation config does. No curve reads a dated reference observation as its start.

2.5. The collision rule

enabled and auto_start carry the same meaning as they do on the FX spot config. Starting a curve generator is refused when another generator already runs that serves one of the same vendor instruments. The pillars of the curve are built from currency_code and the index tenor, so two configs of one currency and index tenor serve the same instruments whatever their index_family or their role. The role says how a consumer uses the curve, and the oresmd grammar does not hold it; see oresmd: ORE Studio Market Data URI. Switching a running generator is a Stop followed by a Start.

2.6. The fact the code shape does not show

The curve is named by the config and not discovered from the key. The series it publishes into are built from currency_code and the index tenor in one place, and The IR curve producer describes how they appear in the stored data.

description carries prose on purpose. It records what regime the curve targets, and for a discontinued index such as USD LIBOR it records that the curve is historical and why it is still offered.

3. See also

Emacs 29.3 (Org mode 9.6.15)