Most pricing models have model options that change how they behave: where an FX forward rate comes from, how an equity forward is projected, whether a bond quoted at a market price still reports interest rate risk, and so on.
Setting the right options lets you match an external valuation, unlock risk metrics, or reflect how your desk actually thinks about an instrument, without changing the model itself.
How model options work
A recipe has a pricing section that we strongly recommend you use to change the default pricing models.
At the same time, you can set model options in the modelOptions object of a vendor model rule. Each rule names an instrument type and a pricing model; the options then fine-tune that model for that instrument type, for example:
"pricing": {
"modelRules": [
{
"supplier": "Lusid",
"modelName": "BlackScholes",
"instrumentType": "EquityOption",
"modelOptions": {
"modelOptionsType": "EquityModelOptions",
"equityForwardProjectionType": "FlatForwardCurveFromSpot"
}
}
]
}Note the following:
The
modelOptionsTypefield identifies the kind of options. It's mandatory, and each kind has its own set of fields. If you include a kind of option, you must set its mandatory fields, or LUSID rejects the recipe.Options belong to a model, not just an instrument type. For example,
HullWhiteModelOptionsonly has an effect when the rule's model isHullWhite1F. The tables below show which models read each kind of option.Omitting
modelOptionsuses the model's defaults. This is the same as setting"modelOptionsType": "EmptyModelOptions", which has no other fields. The defaults are listed for each kind of option below, and they're not always the same across models.LUSID ignores options that don't match the model. If you set (for example)
EquityModelOptionson aBondLookupPricerrule, LUSID doesn't report an error; it values the instrument using the model's defaults. LUSID does still check that the option values themselves are valid. Check the tables below to make sure your options and model go together.
Summary of model options
| Use it to... | Pricing models | Instrument types |
|---|---|---|---|
Choose where the forward FX rate comes from, whether to discount, and whether to value in your report currency. |
|
| |
Choose how the forward price of the underlying equity is projected. |
|
| |
Choose whether to value future funding coupons or just the interest accrued so far. |
|
| |
Look through a fund to value its constituents, and choose how they're scaled. | Any model valid for the instrument type (for | Any instrument with a look-through portfolio, for example a | |
Value from a price with no accrued interest calculation, or treat a swap price as an offset from par. |
| Any instrument valued by | |
Get interest rate and credit spread risk for a bond you value at its market price. |
|
| |
Calibrate the interest rate model used to value callable and puttable bonds, and control its risk measures. |
|
| |
Choose whether a bond forward is valued from its quoted price or modelled from the deliverable bond. |
|
| |
Report a loan or deposit at its accrued interest only. |
|
|
FxForwardModelOptions
Use these options to choose the market data an FX forward is valued from. For example, you can value from an FX forward curve rather than from interest rate curves, value without discounting to match an administrator, or value every forward in a third currency using forward rather than spot rates.
Field | Values | Default if | Description |
|---|---|---|---|
|
|
| Where the forward rate comes from. See the market data table below. Only has an effect under |
|
|
|
|
|
|
| Set to |
|
|
| Optional. With |
If you include FxForwardModelOptions in a rule, you must set forwardRateObservableType, discountingMethod and convertToReportCcy, otherwise LUSID rejects the recipe. Use Invalid to keep a field's default.
Where the forward rate comes from
| Forward rate | Market data required (in addition to the spot rate, |
|---|---|---|
| Implied from the spot rate and the interest rate curves of the two currencies. | Discount curves for both currencies in the Complex Market Data Store, for example |
| Read from an FX forward curve at the forward's maturity date. | An FX forward curve in the Complex Market Data Store, |
| The spot rate plus forward points. One point is 0.0001, or 0.01 for a currency pair involving JPY. | A quote in the Quote Store with an |
| Read as an outright forward rate. | A quote in the Quote Store with an |
Note: Forward points and forward rate quotes are keyed by the forward's exact maturity date. LUSID doesn't interpolate between them, so you need a quote for every maturity date in your portfolio. If you hold forwards with many different maturities, an FX forward curve is usually easier to maintain.
Using named models instead
Under the Discounting model, these options give exactly the same results as the named FX forward models:
|
|
|
|---|---|---|
|
|
|
|
|
|
|
|
|
The named models fix the forward rate source and the discounting method, so they ignore forwardRateObservableType and discountingMethod. They still read convertToReportCcy and allowSpotFallbackForReportCcy.
The ConstantTimeValueOfMoney model also ignores forwardRateObservableType and discountingMethod. It values both legs at the spot rate, with no forward rate and no discounting, so it isn't the same as the undiscounted models above.
Valuing in a report currency
How convertToReportCcy behaves depends on where the forward rate comes from. Say you hold a GBP/USD forward and report in EUR:
FxForwardCurveorForwardRate: LUSID values the forward using EUR/GBP and EUR/USD forward rates, and discounts on the EUR discount curve. The spot rate doesn't affect the result. You need the EUR/GBP and EUR/USD forward curves or quotes, and the EUR discount curve.ForwardPoints: as above, but the EUR/GBP and EUR/USD forward rates are built from spot rates plus points, so spot rates still affect the result.RatesCurveorInvalid: settingconvertToReportCcytotruemakes no difference. LUSID converts at the spot rate.
If a report currency forward rate is missing, the valuation fails with a market data error naming the missing item, for example FxForwards.EUR.GBP.FxFwdCurve. Set allowSpotFallbackForReportCcy to true to convert at spot instead.
{
"supplier": "Lusid",
"modelName": "Discounting",
"instrumentType": "FxForward",
"modelOptions": {
"modelOptionsType": "FxForwardModelOptions",
"forwardRateObservableType": "FxForwardCurve",
"discountingMethod": "ConstantTimeValueOfMoney",
"convertToReportCcy": true
}
}For more information on valuing FX forwards, see Modelling FxForwards in LUSID.
EquityModelOptions
Use these options to choose how LUSID projects the forward price of the underlying equity. Projecting from the interest rate curve is the textbook approach. Keeping the forward flat at spot, or supplying your own curve of forward prices, can match a counterparty's or administrator's valuation, or reflect expected dividends.
Field | Values | Description |
|---|---|---|
|
|
|
The default if you omit modelOptions depends on the instrument type and model:
Instrument type | Pricing model | Default |
|---|---|---|
|
|
|
|
|
|
|
|
|
Note: The same underlying can therefore have a different forward price in an equity option than in a CFD or equity swap, unless you set this option explicitly. Under
ConstantTimeValueOfMoney,ForwardProjectedFromRatesCurveandFlatForwardCurveFromSpotgive the same result, because that model doesn't use an interest rate curve.
If you include EquityModelOptions in a rule, you must set equityForwardProjectionType.
{
"supplier": "Lusid",
"modelName": "Discounting",
"instrumentType": "ContractForDifference",
"modelOptions": {
"modelOptionsType": "EquityModelOptions",
"equityForwardProjectionType": "ForwardProjectedFromRatesCurve"
}
}FundingLegModelOptions
Use this option to choose how much of a funding leg (for example, the funding leg of an equity swap held as a separate position) LUSID values. You can value the full remaining schedule of coupons, or just the interest accrued so far, which some funds prefer for reporting because it doesn't depend on assumptions about future notional.
Field | Values | Default if | Description |
|---|---|---|---|
|
|
|
|
If you include FundingLegModelOptions in a rule, you must set expectedFundingLegNotional.
For example, for a 1,000,000 notional leg paying EURIBOR 3M plus 50bp, valued 45 days into a 3 month coupon with rates at 3%:
Pricing model |
|
|
|---|---|---|
| 35,486.11 (all remaining coupons) | 4,375.00 (interest accrued to date) |
| 34,732.90 | 4,358.85 (interest accrued to date, discounted from the payment date) |
Valuation/Accrued is 4,375.00 either way.
{
"supplier": "Lusid",
"modelName": "Discounting",
"instrumentType": "FundingLeg",
"modelOptions": {
"modelOptionsType": "FundingLegModelOptions",
"expectedFundingLegNotional": "Zero"
}
}Note: A funding leg takes its notional from your holding, so you must value it in a portfolio. Book the transaction with the
Transaction/default/RequiresFundingLegHistoryproperty set totrue.
IndexModelOptions
Use these options to look through an instrument to the portfolio it represents, for example to value a ‘fund of funds’ portfolio at the level of the underlying holdings, or to expand an index into its constituents. You can choose how LUSID scales the constituents to the size of your holding.
Field | Values | Description |
|---|---|---|
|
| Mandatory. How LUSID scales the child portfolio's holdings to the size of your holding. See the table below. |
| Object with | Optional. The scope and code of a relationship definition between instruments and portfolios. Use this to nominate the child portfolio with a relationship, rather than hard-coding it in the instrument's |
If you omit modelOptions, LUSID doesn't look through the instrument, and values it from its price, unless the rule's model is InlinedIndex, which looks through using Sum.
| How LUSID scales the child holdings | Example: you hold 10 units of a fund priced at 40 (value 400). The child holds a long position worth +3,000 and a short worth −1,000. |
|---|---|---|
| Scales every holding by the same factor, so the child holdings add up to the value of your holding. Short positions stay short. | Factor 400 / 2,000 = 0.2. Long +600, short −200. Total 400. |
| Scales by the value of your holding divided by the sum of the absolute values of the child holdings. Every holding is reported with a positive value, including short positions. | Factor 400 / 4,000 = 0.1. Long +300, short +100. Total 400. |
| Multiplies the child holdings by the number of units you hold, ignoring the fund's price. The total doesn't necessarily equal the value of your holding. | Long +30,000, short −10,000. Total 20,000. |
LUSID scales units, PV and accrued interest by the same factor.
Note the following:
Sumfails if the child portfolio has a net value of zero (for example, longs and shorts that cancel out, or an empty portfolio), with the error "Unable to perform lookthrough scaling for portfolio… with zero net value".AbsoluteSumworks when longs and shorts cancel out.Unityreturns no rows at all for an empty child portfolio, so the holding silently disappears from your valuation.For
SumandAbsoluteSum, you can choose what LUSID shares out. TheconservedQuantityForLookthroughExpansionpricing option controls this:PV(the default), orExposure. For example, useExposureif the child holds futures, whose exposure is much larger than their PV. See Recipes: Changing default recipe options.IndexModelOptionsworks with any model that's valid for the instrument type. For aSimpleInstrument, that'sSimpleStaticorInlinedIndex. For other instrument types with a look-through portfolio, such as aBond, LUSID shares out the value calculated by the rule's model.LUSID values the child holdings using the same recipe as the parent.
{
"supplier": "Lusid",
"modelName": "SimpleStatic",
"instrumentType": "SimpleInstrument",
"modelOptions": {
"modelOptionsType": "IndexModelOptions",
"portfolioScaling": "Sum"
}
}SimpleModelOptions
Use these options when you want LUSID to value an instrument purely from the price you supply. You can switch off the accrued interest calculation, so LUSID doesn't ask for fixings it doesn't need. If your swap marks are quoted around par, you can have LUSID read them that way.
Field | Values | Default if | Description |
|---|---|---|---|
|
|
| Set to |
|
|
| Set to |
Note: With
priceIsParOffset, the scale factor is the par value. A price of101loaded with a scale factor of1is read as 100 times par, and the PV is wrong by a factor of 10,000. Load swap prices quoted per 100 with no scale factor or a scale factor of100.
Note: The direction of the swap doesn't change the sign of the value LUSID takes from the price. Quote a swap from the point of view of the position you hold.
{
"supplier": "Lusid",
"modelName": "SimpleStatic",
"instrumentType": "InterestRateSwap",
"modelOptions": {
"modelOptionsType": "SimpleModelOptions",
"assumeAccruedIsZero": true,
"priceIsParOffset": true
}
}For more information, see Modelling interest rate swaps in LUSID.
BondLookupModelOptions
The BondLookupPricer pricing model values a bond at its market price. Because the price doesn't depend on any curve, by default LUSID reports interest rate risk such as Risk/Rates/Pv01 as zero, with an explanation in the Aggregation/Errors column, and no credit spread risk.
Use these options to get interest rate and credit spread risk, such as Pv01, key rate durations and CS01, for a bond you value from market data. LUSID does this by valuing the bond off the discount curve at a constant spread over it.
Field | Values | Default if | Description |
|---|---|---|---|
|
|
| Mandatory. Set to |
|
|
| Where the spread comes from. See the table below. Only used if |
|
|
| Only used if |
| Positive number |
| The total width of the spread bump used to calculate |
|
|
| For a callable |
The spread comes from the following sources, in order of preference:
| 1. Credit spread curve for the bond | 2. | 3. Neither |
|---|---|---|---|
| Used, but you must also load a | Used. | The valuation fails. |
| Used. | Used. | LUSID works out the spread from the bond's market price, so the PV equals the market value. |
Note: With
workoutset toNextCall, the PV is unchanged if LUSID works out the spread from the market price. If you load a credit spread curve orZSpreadquote, LUSID values the bond's cashflows to the call date at that spread, so the PV changes.
Note: LUSID loads a
ZSpreadquote using a market data rule with a quote type ofRate. Order this rule after the rule for the bond's price (quote typePrice). If theRaterule comes first, any bond in the same recipe that you value withoutspreadAnchoredRiskfails, because LUSID picks up itsZSpreadquote as its price.
{
"supplier": "Lusid",
"modelName": "BondLookupPricer",
"instrumentType": "Bond",
"modelOptions": {
"modelOptionsType": "BondLookupModelOptions",
"spreadAnchoredRisk": true,
"spreadAnchorSource": "SolvedFromPrice"
}
}For more information, see Modelling vanilla fixed-rate bonds in LUSID and How does LUSID assess risk?.
HullWhiteModelOptions
The HullWhite1F pricing model values callable and puttable bonds on an interest rate lattice, so the value of the call or put is reflected in the PV and risk.
Use these options to calibrate the model to your own view of rates volatility, shock that volatility for scenarios, and control how option-adjusted risk measures are calculated. All fields are optional. If you omit modelOptions, LUSID uses the defaults below.
Field | Default | Description |
|---|---|---|
|
| How quickly short-term rates revert to the curve. Must be greater than zero. |
|
| The volatility of short-term rates, as an absolute rate ( |
| None | Overrides |
| None | Overrides |
|
| Multiplies whichever volatility applies. Use it to shock volatility in a scenario, for example |
|
| The number of time steps in the lattice. More steps are more accurate but slower. |
| None | Sets the lattice density per year instead of a fixed number of steps, so long-dated bonds get more steps. If you set this, LUSID ignores |
| None | Caps the size of the lattice for any one bond, to limit calculation time. LUSID declines a bond that would exceed it, with an error giving the size needed. |
|
| The parallel curve shift used to calculate |
|
| The total width of the spread bump used to calculate |
|
| The maturity buckets for |
|
| Set to |
|
| Set to |
|
| Set to |
{
"supplier": "Lusid",
"modelName": "HullWhite1F",
"instrumentType": "ComplexBond",
"modelOptions": {
"modelOptionsType": "HullWhiteModelOptions",
"meanReversion": 0.03,
"volatilityByCurrency": { "USD": 0.01, "EUR": 0.007 }
}
}Note: Volatility and mean reversion are model options rather than market data, so LUSID doesn't report volatility risk for them. Use
volatilityMultiplierin a scenario instead.
Note:
Analytic/OASand the effective measures need a market price for the bond. If you request any of them and the price is missing, the whole row fails, including the PV. If you load anOASquote (quote typeRate), order its market data rule after the rule for the bond's price.
BondForwardModelOptions
Use this option to choose how a bond forward is valued. Valuing from the quoted contract price is simple, but gives no interest rate risk. Modelling the forward from the deliverable bond gives you the full curve risk of the position.
Field | Values | Description |
|---|---|---|
|
|
|
Projection type | What the value depends on | Interest rate risk |
|---|---|---|
| The forward contract's price quote. | None. LUSID reports that risk can't be calculated. |
| The deliverable bond's market price, the agreed price, and the discount curve up to settlement. | Carry only: curve risk up to the settlement date. |
| As above, but the deliverable bond is valued off the curve at its | The bond's own curve risk, which is typically much larger. |
Note the following:
A
BondForwardrule using theDiscountingmodel must includeBondForwardModelOptionswithbondForwardProjectionTypeset, otherwise LUSID rejects the recipe. Values are case-sensitive.BondForwardisn't supported byConstantTimeValueOfMoney. UnderSimpleStatic, LUSID ignores these options and values from the contract's price quote.The deliverable must be a mastered
BondorComplexBondin the same currency as the forward. You must master theBondForwardtoo and value it in a portfolio, rather than valuing it on its own.LUSID looks up the forward contract's own price quote by its LUID, so you need a market data rule for
Quote.LusidInstrumentId.*.DeliverableSpreadAnchoredToQuoterequires aZSpreadquote for the deliverable. A credit spread curve doesn't replace it.Order the
Pricerule before theRaterule for theZSpreadquote. If theRaterule comes first,ForwardProjectedFromFundingCurvereads theZSpreadquote as the deliverable's price, and the valuation is wrong, with no error.
{
"supplier": "Lusid",
"modelName": "Discounting",
"instrumentType": "BondForward",
"modelOptions": {
"modelOptionsType": "BondForwardModelOptions",
"bondForwardProjectionType": "ForwardProjectedFromFundingCurve"
}
}FlexibleLoanPricerOptions
Use this option to report a standalone loan or deposit at the interest accrued so far, rather than including a clean value. This is common practice for private credit.
Field | Values | Default if | Description |
|---|---|---|---|
|
|
| Mandatory. Set to |
For example, a 1,000,000 loan at 5% drawn on 1 January and valued on 1 July has a PV of 1,024,794.52 by default, and 24,794.52 (the accrued interest) with setCleanPVToZero set to true.
{
"supplier": "Lusid",
"modelName": "FlexibleLoanPricer",
"instrumentType": "FlexibleLoan",
"modelOptions": {
"modelOptionsType": "FlexibleLoanPricerOptions",
"setCleanPVToZero": true
}
}