Views:

A recipe has a pricing section that you must populate if you wish to change the default pricing model LUSID provides for each instrument type:

Instrument typeDefault pricing modelEffect of model
Bond, FxForwardConstantTimeValueOfMoneyFor a bond, just sums the remaining coupons and the principal.
All other typesSimpleStaticMultiples the number of units held by the market price on the valuation date.

You can change the default for any instrument type except Equity to provide a more suitable or sophisticated result. You can even conditionally select different pricing models for the same instrument type.

Note: The combination of instrument type and pricing model impacts the quantity and quality of market data required. Find out more about this

For each instrument type whose pricing model you wish to change, specify a vendor model rule in the modelRules array of the pricing section of your recipe. Consider the following example, of three vendor model rules to change the default models for bonds, FxForwards and equity options (all others are left unchanged):

For information on all the fields and allowed values in a vendor model rule, examine the API documentation (expand the configurationRecipe/pricing/modelRules section). The following table summarises core fields:

Vendor model rule fieldStatusExplanation
supplierMandatoryDefaults to Lusid to use built-in pricing models. Do not change this value unless you want to use a pricing model from a 3rd party vendor.
modelNameMandatoryIf supplier is Lusid, must be one of the model names listed here.
instrumentTypeMandatoryIf supplier is Lusid, must be one of the instrument types listed here.
addressKeyFiltersOptionalConditionally selects different pricing models for the same instrument type.
modelOptionsOptional

Configures pricing models for certain instrument types. If instrumentType is:
 

  • FxForward, choose FxForwardModelOptions.
  • FundingLeg, choose FundingLegOptions.
  • EquityOption or EquitySwap, choose EquityModelOptions.

For all other instrument types, omit this field to use the default value of EmptyModelOptions.
 

Note: If you are valuing a fund of funds portfolio and want to ‘look through’ to value holdings in child portfolios, choose IndexModelOptions.
 

For more information on the option fields available, examine the API documentation (expand the modelOptions section) and select the type from the dropdown:

Selecting different pricing models for the same instrument type

You can conditionally select pricing models based on custom properties added to instruments, on instrument features, or both.

For example, you might want to specify that:

  • American FX option contracts are valued using the BjerksundStensland1993 pricing model. See the code snippet in red below.
  • European FX option contracts sourced from Bloomberg are valued using the BlackScholes pricing model. See the code snippet in blue below.
  • European FX option contracts sourced from UBS are valued using the Discounting pricing model. See the code snippet in green below.

To do this, specify multiple vendor model rules for the same instrument type and distinguish them using the addressKeyFilters field:

  • The left field must reference the 3 stage key of either a property or a feature. In the example below, Instrument/FX/DataProvider is a property added to instruments of type FxOption to record the original data provider, while Instrument/Features/ExerciseType is a feature key referencing one of the available exercise types for FX option contracts in LUSID.
  • The operator field must either be eq or neq.
  • The right field must be a string value on which to match, with a resultValueType of ResultValueString. Note this means only properties with an underlying data type of String are currently supported.

Note: Vendor model rules are processed in the order they are specified in a recipe. The first matching rule found is used. Instruments that do not match any rules fall back to using the default pricing model for the instrument type, which is SimpleStatic for FX option contracts.

"pricing": {
"modelRules": [{
  "supplier": "Lusid",
  "instrumentType": "FxOption",
  "addressKeyFilters": [{
    "left": "Instrument/Features/ExerciseType",
    "operator": "eq",
    "right": {
      "value": "American",
      "resultValueType": "ResultValueString"
    }
  }],
  "modelName": "BjerksundStensland1993"
},
{
  "supplier": "Lusid",
  "instrumentType": "FxOption",
  "addressKeyFilters": [{
    "left": "Instrument/Features/ExerciseType",
    "operator": "eq",
    "right": {
      "value": "European",
      "resultValueType": "ResultValueString"
    }
  },
  {
    "left": "Instrument/FX/DataProvider",
    "operator": "eq",
    "right": {
      "value": "Bloomberg",
      "resultValueType": "ResultValueString"
    }
  }],
  "modelName": "BlackScholes"
},
{
  "supplier": "Lusid",
  "instrumentType": "FxOption",
  "addressKeyFilters": [{
    "left": "Instrument/Features/ExerciseType",
    "operator": "eq",
    "right": {
      "value": "European",
      "resultValueType": "ResultValueString"
    }
  },
  {
    "left": "Instrument/FX/DataProvider",
    "operator": "eq",
    "right": {
      "value": "UBS",
     "resultValueType": "ResultValueString"
    }
  }],
  "modelName": "Discounting"
}],
...

For a more detailed demonstration of conditional pricing model selection, examine this Jupyter Notebook.