--- title: "Categories of complex market data" slug: "categories-of-complex-market-data" updated: 2026-10-27T13:59:53Z published: 2026-10-27T13:59:53Z canonical: "support.lusid.com/categories-of-complex-market-data" --- > ## Documentation Index > Fetch the complete documentation index at: https://support.lusid.com/llms.txt > Use this file to discover all available pages before exploring further. # Categories of complex market data Complex market data is the structured market data LUSID needs to value most instruments beyond a simple price lookup: interest rate curves for discounting and projecting cashflows, FX forward curves, credit spread curves, inflation curves, equity forward curves, volatility surfaces and so on. The categories you need depend on the instruments you value and the pricing models you choose. [Find out what market data your valuation requires](/v1/docs/what-market-data-does-my-valuation-require). Complex market data has a dedicated Complex Market Data (CMD) Store. [See how to load complex market data into LUSID](/v1/docs/how-do-i-upload-an-object-to-the-complex-market-data-store). ## Summary of categories | **Category** | `marketDataType` field | **What you supply** | **Used by** | **Can create in the web app?** | | --- | --- | --- | --- | --- | | [Interest rate curve](/v1/docs/categories-of-complex-market-data#interest-rate-curves) (discounting or projection) | `DiscountFactorCurveData` `YieldCurveData` | Dates and discount factors (for `DiscountFactorCurveData`), or calibration instruments and their quotes (for `YieldCurveData`), from which LUSID builds the curve | Any pricing model that discounts cashflows or projects floating rates, for example `Discounting` for bonds, swaps and FX forwards | ✅ | | [FX forward curve](/v1/docs/categories-of-complex-market-data#fx-forward-curves) | `FxForwardCurveData` `FxForwardPipsCurveData` `FxForwardTenorCurveData` `FxForwardTenorPipsCurveData` `FxForwardCurveByQuoteReference` | Forward rates or forward points, by date or by tenor, or references to quotes in the Quote Store | FX forwards valued with `ForwardFromCurve` or `ForwardFromCurveUndiscounted` | ✅ (tenor-based types only) | | [Credit spread curve](/v1/docs/categories-of-complex-market-data#credit-spread-curves) | `CreditSpreadCurveData` | Par spreads by tenor or maturity, and a recovery rate | Credit default swaps; bonds valued with `BondLookupPricer` using spread-anchored risk | API or Luminesce only | | [Inflation curve](/v1/docs/categories-of-complex-market-data#inflation-curves) | `InflationCurveData` | Zero-coupon inflation swaps and their quoted rates, from which LUSID builds the curve | `InflationForward` for inflation swaps, inflation legs and inflation-linked bonds | API or Luminesce only | | [Equity curve](/v1/docs/categories-of-complex-market-data#equity-curves) | `EquityCurveByPricesData` | Forward prices by date | Equity options, equity swaps and CFDs that project forward prices from a curve | API or Luminesce only | | [Equity volatility surface](/v1/docs/categories-of-complex-market-data#volatility-surfaces) | `EquityVolSurfaceData` | Equity options and their quoted volatilities | Equity options valued with an option model, for example `BlackScholes` or `Bachelier` | ✅ | | [FX volatility surface](/v1/docs/categories-of-complex-market-data#volatility-surfaces) | `FxVolSurfaceData` | FX options and their quoted volatilities | FX options valued with an option model | ✅ | | [Interest rate volatility cube](/v1/docs/categories-of-complex-market-data#volatility-surfaces) | `IrVolCubeData` | Swaptions and their quoted volatilities | Swaptions valued with `BlackScholes` or `Bachelier` | API or Luminesce only | | [Constant volatility surface](/v1/docs/categories-of-complex-market-data#volatility-surfaces) | `ConstantVolatilitySurface` | A single volatility that applies to every strike and expiry | The same option models, in place of a full surface or cube | API or Luminesce only | ## How LUSID names and finds complex market data LUSID identifies each object in the CMD Store by the scope you upload it to, plus a `marketDataId` made up of a `provider`, an optional `priceSource`, an `effectiveAt` date and a `marketAsset`, which is the object's name. When you run a valuation, each pricing model declares the market data it needs, for example a GBP discount curve. LUSID turns each requirement into a key such as `Rates.GBP.GBPOIS` and looks for a [market data rule](/v1/docs/recipes-locating-market-data#more-information-on-the-key-field) in your recipe whose `key` matches. The rule tells LUSID which scope, provider and price source to search. LUSID then looks for an object whose `marketAsset` is the key without its first part, with full stops replaced by forward slashes, so `Rates.GBP.GBPOIS` becomes `GBP/GBPOIS`. This means the name you give an object must follow the syntax for its category exactly. If it does not, LUSID cannot find the object and reports missing market data for the valuation. | **Category** | **Recipe** `key` field | `marketAsset` **field syntax** | `marketAsset` **field example** | | --- | --- | --- | --- | | Discount curve | `Rates.<Ccy>.<FundingCurve>` | `<Ccy>/<FundingCurve>` | `GBP/GBPOIS` | | Projection curve | `Rates.<Ccy>.<Tenor>.<IndexName>` | `<Ccy>/<Tenor>/<IndexName>` | `GBP/1D/SONIA` | | FX forward curve | `FxForwards.<DomCcy>.<FgnCcy>.FxFwdCurve` | `<DomCcy>/<FgnCcy>/FxFwdCurve` | `EUR/USD/FxFwdCurve` | | Credit spread curve for a CDS | `Credit.<Ticker>.<Ccy>.<Seniority>.<RestructuringType>` | `<Ticker>/<Ccy>/<Seniority>/<RestructuringType>` | `FF667M/USD/SNR/MR` | | Credit spread curve for a bond | `Credit.CreditSpreadCurve` or `Credit.CreditSpreadCurve.<IdentifierType>` | `CreditSpreadCurve/<Identifier>` | `CreditSpreadCurve/BOND123` (with `Credit.CreditSpreadCurve.ClientInternal`) | | Inflation curve | `Inflation.InflationCurve.<IndexName>` | `InflationCurve/<IndexName>` | `InflationCurve/UKRPI` | | Equity curve | `EquityCurve.EquityCurveByPrices.<IdentifierType>.<Code>` | `EquityCurveByPrices` (see [Equity curves](/docs/categories-of-complex-market-data#equity-curves)) | `EquityCurveByPrices` | | Equity volatility surface | `EquityVol.<Code>.<Ccy>.<N-or-LN>` | `<Code>/<Ccy>/<N-or-LN>` | `AAPL/USD/LN` | | FX volatility surface | `FxVol.<DomCcy>.<FgnCcy>.<N-or-LN>` | `<DomCcy>/<FgnCcy>/<N-or-LN>` | `GBP/USD/N` | | Interest rate volatility cube | `IrVol.<Ccy>.<N-or-LN>` | `<Ccy>/<N-or-LN>` | `USD/LN` | | Constant volatility surface | The key of the surface or cube it replaces | The name of the surface or cube it replaces | `USD/LN` | The parts of each name come from the instrument and the recipe: - `<Ccy>` is the currency of the cashflows. `<FundingCurve>` is `<Ccy>OIS` (for example `GBPOIS`) unless the recipe pricing option `fundingCurveByCurrency` names a different curve for that currency, such as a collateral curve `GBPOIS-USDCOLL`. Keep `OIS` in the name of every discount curve. - `<Tenor>` and `<IndexName>` come from the index convention on the floating leg, for example `1D` and `SONIA`. - `<N-or-LN>` is `N` for normal volatilities, used by `Bachelier`, or `LN` for lognormal volatilities, used by `BlackScholes` and other Black-Scholes-type models. - A rule's `key` can use wildcards. For example, `Rates.*.*` matches every discount curve and `Rates.*.*.*` matches every projection curve. - A rule's `mask` overrides the `marketAsset` LUSID searches for. [Find out more about market data rules](/v1/docs/recipes-locating-market-data#summary-of-fields-in-a-market-data-rule). ## Interest rate curves You can supply an interest rate curve in either of two ways: - `DiscountFactorCurveData`: you supply a `baseDate`, a list of `dates` and the matching `discountFactors`. LUSID rescales the curve to your valuation date. [Find out more about discount factor curves](/v1/docs/using-discount-factor-curves-in-lusid). - `YieldCurveData`: you supply a `baseDate`, a list of calibration `instruments` and one market quote for each, in `quotes`. LUSID builds (bootstraps) a curve that reprices every instrument to its quote. The instruments can be `InterestRateSwap`, `ForwardRateAgreement`, `Bond` or `TermDeposit`; a term deposit must start on the base date. By default, LUSID discounts a yield curve's calibration instruments on the curve being built. To discount them on a separate curve (a dual-curve build), set `fundingCurveName`. For example, `EUROIS` discounts on the `EUR/EUROIS` curve, which your recipe must also be able to find. Both types can act as a discount curve or a projection curve; the name decides which. If LUSID needs a projection curve and your recipe cannot find one, it projects floating rates from the discount curve instead. ## FX forward curves Choose the FX forward curve type that matches the way your data is quoted: | **Type** | **Points by** | **Values** | | --- | --- | --- | | `FxForwardCurveData` | Date | Outright forward rates | | `FxForwardPipsCurveData` | Date | Forward points (pips) | | `FxForwardTenorCurveData` | Tenor | Outright forward rates | | `FxForwardTenorPipsCurveData` | Tenor | Forward points (pips) | | `FxForwardCurveByQuoteReference` | Tenor | References to quotes in the Quote Store, which LUSID reads when it builds the curve | - For the pips types, LUSID adds the forward points to the FX spot rate, so your recipe must also be able to find the spot rate in the Quote Store. The optional `pipMultiplier` converts points into a rate; it defaults to 0.01 when the foreign currency is JPY and 0.0001 otherwise. - For the tenor types, you can supply `calendars` (each with a `calendarCode` and `spotDays`) and a `spotDaysCalculationType` (`SingleCalendar` by default, or `UnionCalendars`) to control how LUSID turns tenors into dates. [Find out more about tenors](/v1/docs/specifying-tenors-in-lusid). - To add points to an existing FX forward curve, you can call the `UpsertAppendComplexMarketData` API. ## Credit spread curves A `CreditSpreadCurveData` object holds a `baseDate`, a currency (`domCcy`), par `spreads` by `tenors` or `maturities`, and a `recoveryRate`. You can also set a `referenceDate` from which LUSID resolves the tenors; it defaults to the base date. LUSID uses credit spread curves in two ways, and each has its own naming syntax: - **Credit default swaps**: name the curve after the CDS's ticker, currency, seniority and restructuring type, for example `FF667M/USD/SNR/MR`. - **Bonds**: when you value a bond with `BondLookupPricer` using spread-anchored risk, LUSID looks for one curve per bond, named `CreditSpreadCurve/<Identifier>`. The identifier is the bond's LUSID Instrument ID (LUID) unless you add an identifier type to the rule key, for example `Credit.CreditSpreadCurve.ClientInternal`. A CDS-style rule such as `Credit.*.*.*.*` does not match a bond's curve. [Find out more about valuing bonds](/v1/docs/modelling-fixed-rate-vanilla-bonds-in-lusid). ## Inflation curves You do not supply projected index values for an inflation curve. Instead, you describe the curve the way the market quotes it: a set of zero-coupon inflation swaps and their quoted rates. LUSID builds the forward index curve from them. The swaps are inputs to the curve only; you do not need to hold them in a portfolio. An `InflationCurveData` object holds a `buildDate`, a list of `instruments` (which must be `InflationSwap`) and one quote for each, in `quotes`. The swaps must: - Be zero-coupon, start on the build date and share the same index conventions. - Have contiguous annual maturities starting at one year: 1Y, 2Y, 3Y and so on. - Have quotes of type `Rate`. LUSID also reads historical index fixings from the Quote Store, so your recipe needs a rule for the `Inflation.InflationIndex.<IndexName>` quotes as well as the curve. Optionally, you can supply exactly 12 `seasonalFactors`, one for each month from January, to adjust the curve for seasonality. Each factor must be positive and together they must sum to 12. Seasonal factors are not available for quarterly indices. You can also set `outputType` to `Level` (the default) or `Ratio`. LUSID uses an inflation curve to value inflation swaps, inflation legs and inflation-linked bonds with the `InflationForward` model. You do not need one to value nominal bonds. ## Equity curves An `EquityCurveByPricesData` object holds a `baseDate`, a list of future `dates` and the forward `prices` for those dates. LUSID uses it for equity options, equity swaps and CFDs when the recipe's equity model options set `equityForwardProjectionType` to `EquityCurveByPrices`. The other settings, `FlatForwardCurveFromSpot` and `ForwardProjectedFromRatesCurve`, project forward prices from the spot price and do not need an equity curve. > **Note**: LUSID looks for an equity curve named `EquityCurveByPrices` whatever the underlying, so by default every equity shares one curve. The `key` of a market data rule can't pick out one underlying: LUSID ignores the identifier type and code in a key such as `EquityCurve.EquityCurveByPrices.RIC.AAPL`, so that rule applies to every equity. To give an underlying its own curve, add a rule to the recipe's `specificRules` array instead. Its `dependencySourceFilter` selects the instruments on that underlying, for example by an instrument property, and its `mask` gives the name of that underlying's curve, for example `AAPL/EquityCurveByPrices`. [Find out more about specific rules](/v1/docs/recipes-locating-market-data#overriding-market-data-rules-for-particular-instruments). ## Volatility surfaces Equity volatility surfaces, FX volatility surfaces and interest rate volatility cubes share the same shape. Each holds a `baseDate`, a list of option `instruments` and one quote for each, in `quotes`. The instruments set the strike and expiry of each point, and must be `EquityOption`, `FxOption` or `InterestRateSwaption` respectively. Each quote is a `LogNormalVol` or a `NormalVol`. The quote type, the `N` or `LN` in the name, and the pricing model must all agree: lognormal for `BlackScholes` and other Black-Scholes-type models, normal for `Bachelier`. If you only have a single volatility, upload a `ConstantVolatilitySurface` instead. It holds a `baseDate` (in UTC), an `assetType` of `EquityVol`, `FxVol` or `IrVol`, and a positive `volatility`. LUSID always treats it as lognormal, so use it only with lognormal models, and give it the name of the lognormal surface or cube it replaces, for example `USD/LN`. ## Curve options Interest rate curves, FX forward curves, credit spread curves, equity curves and inflation curves accept an optional `marketDataOptions` object of type `CurveOptions`. It controls how LUSID reads values between and beyond the points you supply. Volatility surfaces do not accept curve options. | **Field** | **Values** | **Default** | | --- | --- | --- | | `interpolationType` | `LinearOnRates`, `LinearOnLogOfRates`, `LinearOnDiscountFactors`, `LinearOnLogDiscountFactors`, `PiecewiseLinearForward`, `MonotoneConvex`, `LinearOnLogProbability` (credit spread curves only) | `LinearOnRates` | | `frontExtrapolationType` `backExtrapolationType` | `None`, `Flat`, `Linear` | `Flat` | | `dayCountConvention` | Any day count convention | `Act360` |