Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Serializable configuration

Configuration records the observations and construction rules needed to rebuild a market. Rust uses Serde for the native types, Python accepts typed definitions and supported dictionaries, and Excel constructors create the corresponding native configurations. Applications load and save these inputs using their own file conventions.

Observations and curve membership

The quote-record form combines one reference date with identifier/level records:

{
  "reference_date": "2026-02-24",
  "quotes": [
    {"identifier": "FixedRateDeposit_USD_SOFR_1D", "mid": 0.04},
    {"identifier": "OIS_USD_SOFR_1Y", "mid": 0.042, "bid": 0.0419, "ask": 0.0421}
  ]
}

Rust deserializes this as QuoteStoreRecords and converts with QuoteStore::try_from. The selected Level is consumed consistently by construction/calibration. Fixing JSON separately maps index names to dated rate arrays. No file-level quote reference date substitutes for an observation’s actual fixing date.

Examples often wrap a vector of curve configurations in {"curve_specs":[...]}. That wrapper belongs to their loader; the native configuration is one entry:

{
  "market_index": "SOFR",
  "day_counter": "Actual360",
  "interpolator": "LogLinear",
  "enable_extrapolation": true,
  "quotes": ["FixedRateDeposit_USD_SOFR_1D", "OIS_USD_SOFR_1Y"]
}

Missing optional fields use native defaults. The quote identifiers determine whether a curve calibrates instrument prices or interpolates zero rates or discount factors directly. All numeric observations belong in the quote store:

[
  {
    "market_index": {"Other": "FUNDINGSPREAD"},
    "day_counter": "Actual360",
    "interpolator": "Linear",
    "quotes": ["ZeroRate_EUR_FUNDINGSPREAD_0D", "ZeroRate_EUR_FUNDINGSPREAD_1Y", "ZeroRate_EUR_FUNDINGSPREAD_5Y"]
  },
  {
    "market_index": {"Other": "COSTOFFUNDS"},
    "base_index": "EURIBOR12m",
    "spread_index": {"Other": "FUNDINGSPREAD"}
  }
]

The quote store supplies the funding spread values, such as 0.005, 0.0075 and 0.01, under those identifiers. Pillars can use tenors or ISO dates. The benchmark curve must also be configured. Composite components must share their reference date and day counter; dependency resolution is independent of list order. A composite cannot also supply quote identifiers.

Credit configurations additionally need currency, discount index, recovery and CDS quote membership. They construct survival rather than discount factors. Volatility configurations select market identity, Black/Normal convention, smile coordinates, source quotes and extrapolation policy. Reject is the default; use explicit Flat only when that continuation is intended.

Typed models and calibration sources

Models use externally tagged variants rather than arbitrary strings. Fixed Hull–White parameters, for example, are:

{
  "HullWhite": {
    "alpha": 0.1,
    "parameter_source": {"Fixed": {"sigma": 0.01}}
  }
}

LGM uses lambda and Gaussian sigma. Brownian motion uses lognormal volatility and optional dividend rate. A calibrated parameter source replaces Fixed with a source and semantic basket:

{
  "Calibrated": {
    "source": {"Surface": {"market_index": "SOFR"}},
    "calibration_basket": {
      "expiries": ["1Y", "2Y"],
      "tenors": ["3M"],
      "strike": "Atm"
    }
  }
}

The source volatility configuration owns quote membership. The basket selects contracts already available there; absent requested coordinates are errors, not instructions to fabricate an interpolated calibration contract.

PricerConfiguration selects an instrument family, implementation and model assignments. Swaptions can select HullWhiteClosedForm; callable bonds select TreeBased or BackwardFourierEvolution with numerical grids. Direct Rust callers still construct the concrete pricer. A simulation configuration separately supplies index, model, paths, seed, horizon, frequency and time basis.

XVA, CSA and payoff inputs

XvaEngineConfig contains rate-model definitions/driver mappings, FX definitions and path/grid controls. CsaTerms contains legal-group collateral, margin, credit and funding assumptions. Specify these agreement inputs separately from the rate model. See Netting and collateral for field precedence and timing limits.

A scripted-product input is an ordered array of date/source pairs:

[
  {
    "event_date": "2027-03-09",
    "script": "deal = 0; deal pays 1000 on \"2027-06-09\" in \"USD\";"
  }
]

Deserialize it as Vec<CodedEvent> and parse an EventStream; source strings do not bypass language or date validation.

Across these types, dates use YYYY-MM-DD, periods use forms such as 3M and 5Y, and enum spelling follows canonical native variants. Standard MarketIndex variants serialize as strings; structured forms include {"Collateral":["CLP","USD"]}, {"Credit":"NAME"} and {"Equity":"AAPL"}. A supported Python string conversion is not necessarily an alias accepted by a serialized Rust enum.

Historical snapshot archives preserve complete native construction inputs using this discipline. They exclude runtime AD state, fixing histories and binding-only registrations. Preserve those external assumptions separately when recording a reproducible valuation.