Categories of complex market data

Prev Next

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.

Complex market data has a dedicated Complex Market Data (CMD) Store. See how to load complex market data into LUSID.

Summary of categories

Category

marketDataType field

What you supply

Used by

Can create in the web app?

Interest rate curve (discounting or projection)

DiscountFactorCurveData
YieldCurveData

Dates and discount factors (to create DiscountFactorCurveData), or calibration instruments and their quotes (to create 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

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

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

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

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

EquityVolSurfaceData

Equity options and their quoted volatilities

Equity options valued with an option model, for example BlackScholes or Bachelier

✅

FX volatility surface

FxVolSurfaceData

FX options and their quoted volatilities

FX options valued with an option model

✅

Interest rate volatility cube

IrVolCubeData

Swaptions and their quoted volatilities

Swaptions valued with BlackScholes or Bachelier

API or Luminesce only

Constant volatility surface

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 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)

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.

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.

  • 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.

  • 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.

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.

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

Using complex market data in scenarios

Scenarios let you shift market data and see the effect on a valuation. A scenario can shift interest rate curves (by currency and, optionally, curve name), CDS credit spread curves (by ticker), inflation curves (by index, by shifting the swap quotes and rebuilding the curve) and volatility surfaces. It cannot shift FX forward curves or equity curves, and it never shifts historical fixings.

Scenarios find curves by the same names as recipes do, so consistent naming makes your scenarios reliable as well as your valuations.