--- title: "Modelling exchange-traded options in LUSID" slug: "modelling-exchange-traded-options-in-lusid" updated: 2026-06-17T13:53:17Z published: 2026-06-17T13:53:17Z canonical: "support.lusid.com/modelling-exchange-traded-options-in-lusid" --- > ## 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. # Modelling exchange-traded options in LUSID You can model an exchange-traded options contract as an instrument of type `ExchangeTradedOption` in LUSID. [See all supported instruments](/v1/docs/what-instruments-does-lusid-support). > **Note**: See also this article on [instrument events](/v1/docs/handling-lifecycle-events-for-exchangetradedoption-instruments) and these Jupyter Notebook implementations for [cash-settled options](https://github.com/finbourne/finbourne-notebooks/blob/main/V3/features/instrument-events/ExchangeTradedOption-(cash-settlement)-and-instrument-events.ipynb) and [physically-settled options](https://github.com/finbourne/finbourne-notebooks/blob/main/V3/features/instrument-events/ExchangeTradedOption-(physical-settlement)-and-instrument-events.ipynb). ## Mastering an instrument There are [numerous tools](/v1/docs/how-do-i-master-an-instrument) you can use to master an `ExchangeTradedOption` in the LUSID Security Master. Some fields are common to all types of instrument, such as an intuitive `name`, the [requirement to specify a set](/v1/docs/understanding-instrument-identifiers) of `identifiers`, and the facility to [store extra information](/v1/docs/properties) as `properties`. Fields in the economic `definition` object are specific to `ExchangeTradedOption`. For more information on these fields, select **ExchangeTradedOption** from the **definition** dropdown in the [UpsertInstruments](https://www.lusid.com/docs/api/lusid/endpoints/instruments/UpsertInstruments) API reference: ![](https://cdn.document360.io/d575ad81-c0ed-4980-bbd1-d59ac5c3de82/Images/Documentation/image(448).png?sv=2026-02-06&spr=https&st=2026-11-09T06%3A00%3A25Z&se=2026-11-09T07%3A00%3A25Z&sr=c&sp=r&sig=wq3e4oo3i1IFHYNFfDD%2F2njs1PlLWqMAm0UzddUXadM%3D) ### Specifying the underlying instrument If the asset underlying an `ExchangeTradedOption` is: - An [equity](/v1/docs/modelling-equities-in-lusid) or an [exchange-traded future](/v1/docs/modelling-exchange-traded-futures-and-options-in-lusid), the recommended approach is to master it as a separate, dedicated instrument in LUSID and provide a reference to a `MasteredInstrument`. If you do this, [instrument events](/v1/docs/handling-lifecycle-events-for-exchangetradedoption-instruments) are available. See the rest of this article for more information. - A bond, interest rate, index, commodity or any other type of asset, the only option is to provide an inline definition as part of the `ExchangeTradedOption`. Instrument events are not available. ### Mastering an `ExchangeTradedOption` instrument The following example masters a European call option on BMW shares that is itself already mastered as an instrument of type `Equity` in LUSID: ```json curl -X POST 'https://mydomain.lusid.com/api/api/instruments?scope=MyCustomInstrScope'   -H 'Content-Type: application/json-patch+json'   -H 'Authorization: Bearer myAPIAccessToken'   -d '{"upsert-request-1": {    "name": "BMW GR Equity OMON",    "identifiers": {"ClientInternal": {"value": "ETO_BMW_2024-03-21_European_Physical_Call"}},    "definition": {      "instrumentType": "ExchangeTradedOption",      "startDate": "2025-01-01T00:00:00.0000000+00:00",      "contractDetails": {        "domCcy": "EUR",        "strike": 80,        "contractSize": 100,        "country": "DE",        "deliveryType": "Physical",        "description": "BMW GR Equity OMON",        "exchangeCode": "Eurex",        "exerciseDate": "2025-03-21T00:00:00.0000000+00:00",        "exerciseType": "European",        "optionCode": "BMW",        "optionType": "Call",        "underlying": {          "instrumentType": "MasteredInstrument",          "identifiers": {"Instrument/default/Isin": "DE0005190003"}        },        "underlyingCode": "MyIDForBMWQuotes"      },      "contracts": 1,      "refSpotPrice": 0    }  } }' ``` Note the following: - The `ExchangeTradedOption` instrument is mastered in a [custom instrument scope](/v1/docs/understanding-instrument-scopes) (specified in the URL). - Its `identifiers` object is set to reference a `ClientInternal` [unique identifier](/v1/docs/what-are-unique-and-non-unique-identifiers). - `startDate` is a mandatory field but note it is not subsequently used by LUSID. - `contractSize` is set to the number of underlying units per contract as specified by the exchange. - `deliveryType` can be `Physical` (if you intend to take delivery of the underlying) or `Cash`. - `exerciseType` can be `American` or `European`. - `optionType` can be `Put` or `Call`. - The `underlying` object must either: - Have the `underlying.instrumentType` field set to `MasteredInstrument` if the underlying is already mastered in LUSID as an `Equity` or a `Future`, and the `underlying.identifiers` object set to an identifier for that instrument, in this case an ISIN. Note the underlying must reside in the same instrument scope as the `ExchangeTradedOption`, or else in the `default` instrument scope. Instrument events are available. - Be populated with a full inline economic definition if the underlying is any other type of asset. Note instrument events are not available. - `underlyingCode` can be set to any intuitive string that represents a market data identifier for the underlying instrument in the LUSID Quote Store (required for [valuation](/v1/docs/modelling-exchange-traded-options-in-lusid#valuing-your-position)). - `contracts` should be set to `1` and the amount bought or sold specified on the transaction. - `refSpotPrice` should be set to `0` unless otherwise directed by FINBOURNE Technical Support. Providing the request is successful, the response: - Confirms the globally-unique [LUID](/v1/docs/what-is-a-lusid-instrument-id-or-luid) of the `ExchangeTradedOption` instrument (in this case `LUID_00003E8Z`). - Confirms the LUID of the underlying `MasteredInstrument` providing LUSID is able to resolve it correctly (in this case `LUID_00003E90`). If not, the [unknown instrument](/v1/docs/what-is-the-unknown-instrument-or-luid-zzzzzzzz) is returned. - Generates extra fields that are stored as part of the instrument definition and can be [filtered on](/v1/docs/filtering-information-retrieved-from-lusid). - Supplies default values for fields not explicitly specified in the request: ```json {  "values": {    "upsert-request-1": {      "scope": "MyCustomInstrScope",      "lusidInstrumentId": "LUID_00003E8Z",      "name": "BMW GR Equity OMON",      "identifiers": {        "ClientInternal": "ETO_BMW_2024-03-21_European_Physical_Call",        "LusidInstrumentId": "LUID_00003E8Z"      },      "properties": [],      "instrumentDefinition": {        "startDate": "2025-01-01T00:00:00.0000000+00:00",        "contractDetails": {          "domCcy": "EUR",          "strike": 80,          "contractSize": 100,          "country": "DE",          "deliveryType": "Physical",          "description": "BMW GR Equity OMON",          "exchangeCode": "Eurex",          "exerciseDate": "2025-03-21T00:00:00.0000000+00:00",          "exerciseType": "European",          "optionCode": "BMW",          "optionType": "Call",          "underlying": {            "identifiers": {              "Instrument/default/Isin": "DE0005190003"            },            "masteredDomCcy": "EUR",            "masteredInstrumentType": "Equity",            "masteredLusidInstrumentId": "LUID_00003E90",            "masteredName": "BMW",            "masteredScope": "MyCustomInstrScope",            "masteredAssetClass": "Equities",            "instrumentType": "MasteredInstrument"          },          "underlyingCode": "MyIDForBMWQuotes",          "deliveryDays": 0,          "businessDayConvention": "F",          "settlementCalendars": []        },        "contracts": 1,        "refSpotPrice": 0,        "tradingConventions": {          "priceScaleFactor": 1,          "minimumOrderSize": 0,          "minimumOrderIncrement": 0        },        "instrumentType": "ExchangeTradedOption"      },      "state": "Active",      "assetClass": "Unknown",      "domCcy": "EUR",      "relationships": []    }  },  ... } ``` ## Booking a transaction to establish a position Once an `ExchangeTradedOption` instrument is mastered, you can [book a transaction](/v1/docs/how-do-i-create-or-update-a-transaction) to record the acquisition of a number of contracts in a particular [transaction portfolio](/v1/docs/what-is-a-transaction-portfolio), for example: ```json curl -X POST 'https://mydomain.lusid.com/api/api/transactionportfolios/MyPortfolioScope/MyPortfolioCode/transactions/$batchUpsert?successMode=Partial&preserveProperties=true'  -H 'Content-Type: application/json-patch+json'  -H 'Authorization: Bearer myAPIAccessToken'  -d '{  "transactionRequest-1": {    "transactionId": "my_option_purchase_001",    "type": "BuyETO",    "instrumentIdentifiers": {"Instrument/default/LusidInstrumentId": "LUID_00003E8Z"},    "transactionDate": "2025-01-14T00:00:00.0000000+00:00",    "settlementDate": "2024-01-15T00:00:00.0000000+00:00",    "units": 1000,    "transactionPrice": {      "price": 3.13,      "type": "Price"    },    "totalConsideration": {      "amount": 0,      "currency": "EUR"    },    "properties": {      "Transaction/MyProperties/TradeCommission": {        "key": "Transaction/MyProperties/TradeCommission",        "value": {          "metricValue": {            "value": 170,            "unit": "EUR"          }        }      }    }  } }' ``` Note the following: - The `type` field invokes a custom `BuyETO` [transaction type](/v1/docs/what-is-a-transaction-type) to confer a particular economic impact (see below). - The `units` field specifies the number of contracts. - The `transactionPrice` object records the market price of the options contract (not the underlying). This is used by LUSID to automatically calculate gross consideration (see below). - The `totalConsideration` object: - Sets the settlement currency to `EUR`. - Specifies a cost of `0` to enable LUSID to automatically derive total consideration (see below). - The trade commission for entering into the contract is recorded as a [custom property](/v1/docs/properties). > **Note**: This example assumes the transaction, settlement and portfolio currencies are all the same. If not, you can [specify exchange rates](/v1/docs/transactions-and-exchange-rates). You might create a `BuyETO` transaction type as follows: ```json curl -X PUT 'https://mydomain.lusid.com/api/api/transactionconfiguration/types/default/BuyETO?scope=default'  -H 'Content-Type: application/json-patch+json'  -H 'Authorization: Bearer myAPIAccessToken'  -d '{  "aliases": [    {      "type": "BuyETO",      "description": "Transaction type for option purchases",      "transactionClass": "Basic",      "transactionRoles": "AllRoles",      "isDefault": false    }  ],  "movements": [    {      "name": "Increase units by number purchased",      "movementTypes": "StockMovement",      "side": "Side1",      "direction": 1    },    {      "name": "Decrease cash by total cost of purchase, including commission",      "movementTypes": "CashCommitment",      "side": "Side2",      "direction": -1    }  ],  "calculations": [    {      "type": "Txn:GrossConsideration"    },    {      "type": "DeriveTotalConsideration",      "formula": "Txn:GrossConsideration + Properties[Transaction/MyProperties/TradeCommission]"    }  ] }' ``` Note the following: - The `StockMovement` [movement](/v1/docs/what-is-a-movement) sets the units of the holding to the number purchased in the transaction. - The `CashCommitment` movement decreases a cash balance by the total consideration. - The `Txn:GrossConsideration` [transaction type calculation](/v1/docs/what-is-a-transaction-type-calculation#txngrossconsideration) automatically calculates gross consideration (amount before fees) as `(units * price * contracts * contract size) / scale factor`, and stores the result in the `Transaction/default/GrossConsideration` system property: `(1000 * 3.13 * 1 * 100) / 1 = 313,000` - The `DeriveTotalConsideration` transaction type calculation automatically calculates the `totalConsideration.amount` field according to the given formula, which in this case sums gross consideration and commission: `313,000 + 170 = 313,170` ### Confirming positions You can [generate a holdings report](/v1/docs/how-do-i-generate-a-holdings-report) to see the impact of the transaction on security and cash holdings, for example: ![](https://cdn.document360.io/d575ad81-c0ed-4980-bbd1-d59ac5c3de82/Images/Documentation/image(452).png?sv=2026-02-06&spr=https&st=2026-11-09T06%3A00%3A25Z&se=2026-11-09T07%3A00%3A25Z&sr=c&sp=r&sig=wq3e4oo3i1IFHYNFfDD%2F2njs1PlLWqMAm0UzddUXadM%3D) ### Auditing LUSID’s transaction type calculations You can examine the [output transaction](/v1/docs/input-and-output-transactions) automatically generated by LUSID to audit calculated amounts, for example: ![](https://cdn.document360.io/d575ad81-c0ed-4980-bbd1-d59ac5c3de82/Images/Documentation/image(453).png?sv=2026-02-06&spr=https&st=2026-11-09T06%3A00%3A25Z&se=2026-11-09T07%3A00%3A25Z&sr=c&sp=r&sig=wq3e4oo3i1IFHYNFfDD%2F2njs1PlLWqMAm0UzddUXadM%3D) ## Valuing your position To value your position, work through our [valuation checklist](/v1/docs/valuation-checklist). | **Pricing model** | **Notes** | | --- | --- | | `SimpleStatic` | **Recommended**. This is the default. Calculates PV according to the formula `price / scaling factor * units * contract size`. Requires a market price uploaded to the LUSID Quote Store for both: - The `ExchangeTradedOption` instrument. - The underlying instrument. See below for an example. | For example, to value a position in the European call option on BMW shares defined above using `SimpleStatic`: 1. [Load two market prices](/v1/docs/how-do-i-upload-a-market-price-or-fx-spot-rate-to-the-quote-store) into the LUSID Quote Store for the valuation date, in this case 11 February 2025: ```json curl -X POST 'https://mydomain.lusid.com/api/api/quotes/MyOptionQuotes'  -H 'Authorization: Bearer myAPIAccessToken'  -H 'Content-Type: application/json-patch+json'  -d '{    "Quote-0001": {      "quoteId": {        "quoteSeriesId": {          "provider": "Lusid",          "instrumentIdType": "LusidInstrumentId",          "instrumentId": "LUID_00003E8Z",          "quoteType": "Price",          "field": "mid"        },        "effectiveAt": "2025-02-11T00:00:00Z"      },      "metricValue": {        "value": 3.15, "unit": "EUR"      }    },    "Quote-0002": {      "quoteId": {        "quoteSeriesId": {          "provider": "Lusid",          "instrumentIdType": "LusidInstrumentId",          "instrumentId": "MyIDForBMWQuotes",          "quoteType": "Price",          "field": "mid"        },        "effectiveAt": "2025-02-11T00:00:00Z"      },      "metricValue": {        "value": 82, "unit": "EUR"      }    }  }' ``` Note the following: - The first price is for the `ExchangeTradedOption` instrument and the second for the underlying `Equity` instrument. - Both are encapsulated in a `MyOptionQuotes` quote scope (specified in the URL). - The `instrumentIdType` field is `LusidInstrumentId`. - The `instrumentId` field for: - The `ExchangeTradedOption` instrument is its LUID. - The underlying `Equity` instrument is the `underlyingCode` specified in the `ExchangeTradedOption` instrument definition, in this case `MyIDForBMWQuotes`. 2. [Create a recipe](/v1/docs/how-do-i-create-or-generate-a-recipe) to locate this market data, for example: ```json curl -X POST 'https://mydomain.lusid.com/api/api/recipes'  -H 'Content-Type: application/json-patch+json'  -H 'Authorization: Bearer myAPIAccessToken'  -d '{  "configurationRecipe": {    "scope": "MyRecipes",    "code": "MyBasicRecipe",    "market": {      "marketRules": [        {          "key": "Quote.LusidInstrumentId.*",          "dataScope": "MyOptionQuotes",          "supplier": "Lusid",          "quoteType": "Price",          "field": "mid"        }      ]    }  } }' ``` Note the following: - The `key` field has a prefix of `Quote.LusidInstrumentId.` and a suffix of `*` (wildcard) to find prices keyed by both LUID and `underlyingCode`. - The `dataScope` field matches the quote scope in which prices are encapsulated in the LUSID Quote Store. - The other fields match their respective quote fields exactly (values are case-sensitive). 3. [Generate a valuation report](/v1/docs/how-do-i-perform-a-valuation) with appropriate metrics, for example: ![](https://cdn.document360.io/d575ad81-c0ed-4980-bbd1-d59ac5c3de82/Images/Documentation/image(454).png?sv=2026-02-06&spr=https&st=2026-11-09T06%3A00%3A25Z&se=2026-11-09T07%3A00%3A25Z&sr=c&sp=r&sig=wq3e4oo3i1IFHYNFfDD%2F2njs1PlLWqMAm0UzddUXadM%3D) ## Assessing risk For more on how LUSID calculates exposure, see [this article](/v1/docs/how-does-lusid-calculate-exposure). LUSID supports both analytic and bump and valuation mechanisms for assessing risk; [contact Technical Support](https://www.finbourne.com/contact) if you need more information. ## Monitoring the lifecycle of the instrument An `ExchangeTradedOption` has a maturity date specified when you master that instrument. If you do not exercise the option on or before that date, the instrument ‘expires’. Providing the underlying is an `Equity` or a `Future`, an `ExchangeTradedOption` is tightly integrated into LUSID’s [instrument event framework](/v1/docs/understanding-instrument-lifecycle-events-emitted-by-lusid). Note that other underlyings do not support instrument events. To enable this you must: 1. Register a recipe with every portfolio holding an `ExchangeTradedOption`. 2. Create transaction types to determine the economic impact of the transactions automatically generated by `ExchangeTradedOption` events. **Required reading**: [Handling instrument events for options](/v1/docs/handling-lifecycle-events-for-exchangetradedoption-instruments) | **Instrument event** | Event emission criteria | **If emitted, effect of LUSID default transaction template** | | --- | --- | --- | | `OptionExerciseCashEvent` | This event is not automatically emitted by LUSID. If your holding is in the money, it can be triggered by loading an event instruction, providing the `ExchangeTradedOption` is defined as cash-settled. | One transaction is automatically generated with the realised gain. | | `OptionExercisePhysicalEvent` | This event is not automatically emitted by LUSID. If your holding is in the money, it can be triggered by loading an event instruction, providing the `ExchangeTradedOption` is defined as physically-settled. | Two transactions are automatically generated, one for the `ExchangeTradedOption` and the other for the underlying instrument. | | `ExpiryEvent` | This event is automatically emitted by LUSID on the expiry date, but only if either `OptionExerciseCashEvent` or `OptionExercisePhysicalEvent` has not been triggered. | One transaction is automatically generated setting the option holding to zero and realising a loss. | ### Manually loading settlement transactions If you do not want to or cannot enable instrument lifecycle events you can continue to monitor upcoming cashflows using **Dashboards > CashLadder** in the LUSID web app, or by calling the [GetPortfolioCashLadder](https://www.lusid.com/docs/api/lusid/endpoints/transaction-portfolios/GetPortfolioCashLadder) API directly. You can call the [GetUpsertablePortfolioCashFlows](https://www.lusid.com/docs/api/lusid/endpoints/transaction-portfolios/GetUpsertablePortfolioCashFlows) API to return imminent cashflows as upsertable DTOs ready to manually load into LUSID as input transactions.