Skip to main content

Introduction to options

This topic explains how OpenDataDSL holds exchange traded options data, and how you read it as option chains, as timeseries of a single option, and filtered to the options your company holds.


What is options data?​

An option gives the holder the right, but not the obligation, to buy (a call) or sell (a put) an underlying future at a set price (the strike) up to an expiry date. An exchange settles thousands of them every day: for each maturity (tenor) of the underlying future there is a row of strikes, each with a call and a put.

For each option, the exchange publishes values such as:

ValueExample propertyWhat it is
Settlement priceSETTLEMENT_PRICEThe official closing price of the option
Implied volatilityOPTION_VOLATILITYThe volatility that makes the pricing model give the settlement price
DeltaDELTA_FACTORHow much the option price moves for a move in the underlying
Open interestOPEN_INTERESTThe number of open contracts
VolumeTOTAL_VOLUMEThe number of contracts traded that day

How options data is stored​

Options data is stored as events, one event for each ondate, tenor, call or put, and strike. For example, the ICE Endex EUA futures options are in the event list ICE.NDEX.EFO:OPTIONS in the common database, and the September 2026 85 call settled on the 16th September 2026 is this event:

{
_id: 'ICE.NDEX.EFO:OPTIONS:ID_2026M09_85_C_20260916000000',
eventtime: ISODate('2026-09-16T00:00:00.000Z'),
eventstart: ISODate('2026-09-01T00:00:00.000Z'),
eventend: ISODate('2026-09-30T00:00:00.000Z'),
absolute: '2026M09',
relative: 'M00',
expiry: '2026-09-23',
STRIKE_PRICE: 85,
CONTRACT_TYPE: 'C',
SETTLEMENT_PRICE: 0.91,
OPTION_VOLATILITY: 22.0791,
DELTA_FACTOR: 0.4662,
OPEN_INTEREST: 3695,
TOTAL_VOLUME: 200,
...
}

The event time is the ondate, absolute and relative are the tenor, and STRIKE_PRICE and CONTRACT_TYPE say which option it is.


Options built from events​

Rather than storing a copy of the data, you define an EventOptions data item that says which events to use, in the same way as an EventCurve builds a forward curve from events. When you read it for an ondate, the options are built from the events of that day:

o = EventOptions("ICE.NDEX.EFO:OPTIONS")
o.source = "common"
NGE = Object()
NGE.id = "NGE.EUA"
NGE.OPTIONS = o
save NGE

eua = ${data:"NGE.EUA:OPTIONS:2026-09-16"}
print eua["2026M09"][85].call.SETTLEMENT_PRICE

The result is an Options variable: a list of tenors in delivery order, each with an option chain, a table with one row per strike and the call and put values side by side:

StrikeCall settleCall volCall deltaPut settlePut volPut delta
805.2024.100.91
850.9122.080.46621.0522.50-0.5338
905.0021.00-0.95

A strike only has a call or a put when the exchange published one.


Ways to read options data​

IdExampleWhat you get
optionsNGE.EUA:OPTIONSThe ondates the options can be built for
options:dateNGE.EUA:OPTIONS:2026-09-16The option chains for that ondate
options:LNGE.EUA:OPTIONS:LThe latest option chains
options:tenor:strike:C or PNGE.EUA:OPTIONS:2026M09:85:CA timeseries of one option's main value (settlement price), one value per ondate
options:tenor:strike:C or P:columnNGE.EUA:OPTIONS:2026M09:85:C:OPTION_VOLATILITYA timeseries of one option's column

Traded options​

Most users do not need the whole exchange: they need the options their company holds. A positions view is an EventOptions that also points at your own position events. It returns only the maturities, strikes and sides you hold, with the market values for the ondate plus your position volume and traded price. See Traded options.


Where next​