Examples and tutorials
Options
Equity options: Introduction
Options on futures: Introduction
All options with a given underlying
Join options with underlying prices
US equity options volume by venue
Resample US equity options NBBO
Estimate implied volatility
Get symbols for 0DTE options
Calculate daily statistics for equity options
Historical data
Request a large number of symbols
Programmatic batch downloads
Best bid, best offer, and midprice
Custom OHLCV bars from trades
Join schemas on instrument ID
Plot a candlestick chart
Calculate VWAP and RSI
End-of-day pricing and portfolio valuation
Benchmark portfolio performance
Market halts, volatility interrupts, and price bands
Resample OHLCV from 1-minute to 5-minute
Algorithmic trading
A high-frequency liquidity-taking strategy
Build prediction models with machine learning
Execution slippage and markouts
Matching engine latencies
Using messaging rates as a proxy for implied volatility
Mean reversion and portfolio optimization
Pairs trading based on cointegration
Build a real-time stock screener
Core concepts
Venues and datasets
CME Globex MDP 3.0
Cboe BYX Depth
Cboe BYZ Depth
Cboe EDGA Depth
Cboe EDGX Depth
Databento US Equities Basic
Databento US Equities Mini
Databento US Equities Summary
Eurex Exchange
European Energy Exchange
ICE Endex iMpact
ICE Europe Commodities iMpact
ICE Europe Financials iMpact
ICE Futures US iMpact
IEX TOPS
MEMX Memoir
MIAX Depth of Market
Nasdaq Basic with NLS Plus
Nasdaq TotalView-ITCH
NYSE American Integrated
NYSE Arca Integrated
NYSE Texas Integrated
NYSE National Trades and BBO
NYSE Integrated
OPRA Pillar
Corporate actions
Adjustment factors
Security master
API Reference
Resources
Release notes
C++
0.42.0 - 2025-08-19
0.41.0 - 2025-08-12
0.40.0 - 2025-07-29
0.39.1 - 2025-07-22
0.39.0 - 2025-07-15
0.38.2 - 2025-07-01
0.38.1 - 2025-06-25
0.38.0 - 2025-06-10
0.37.1 - 2025-06-03
0.37.0 - 2025-06-03
0.36.0 - 2025-05-27
0.35.1 - 2025-05-20
0.35.0 - 2025-05-13
0.34.2 - 2025-05-06
0.34.1 - 2025-04-29
0.34.0 - 2025-04-22
0.33.0 - 2025-04-15
0.32.1 - 2025-04-07
0.32.0 - 2025-04-02
0.31.0 - 2025-03-18
0.30.0 - 2025-02-11
0.29.0 - 2025-02-04
0.28.0 - 2025-01-21
0.27.0 - 2025-01-07
0.26.0 - 2024-12-17
0.25.0 - 2024-11-12
0.24.0 - 2024-10-22
0.23.0 - 2024-09-25
0.22.0 - 2024-08-27
0.21.0 - 2024-07-30
0.20.1 - 2024-07-16
0.20.0 - 2024-07-09
0.19.1 - 2024-06-25
0.19.0 - 2024-06-04
0.18.1 - 2024-05-22
0.18.0 - 2024-05-14
0.17.1 - 2024-04-08
0.17.0 - 2024-04-01
0.16.0 - 2024-03-01
0.15.0 - 2024-01-16
0.14.1 - 2023-12-18
0.14.0 - 2023-11-23
0.13.1 - 2023-10-23
0.13.0 - 2023-09-21
0.12.0 - 2023-08-24
0.11.0 - 2023-08-10
0.10.0 - 2023-07-20
0.9.1 - 2023-07-11
0.9.0 - 2023-06-13
0.8.0 - 2023-05-16
0.7.0 - 2023-04-28
0.6.1 - 2023-03-28
0.6.0 - 2023-03-24
0.5.0 - 2023-03-13
0.4.0 - 2023-03-02
0.3.0 - 2023-01-06
0.2.0 - 2022-12-01
0.1.0 - 2022-11-07
Python
0.63.0 - 2025-09-02
0.62.0 - 2025-08-19
0.61.0 - 2025-08-12
0.60.0 - 2025-08-05
0.59.0 - 2025-07-15
0.58.0 - 2025-07-08
0.57.1 - 2025-06-17
0.57.0 - 2025-06-10
0.56.0 - 2025-06-03
0.55.1 - 2025-06-02
0.55.0 - 2025-05-29
0.54.0 - 2025-05-13
0.53.0 - 2025-04-29
0.52.0 - 2025-04-15
0.51.0 - 2025-04-08
0.50.0 - 2025-03-18
0.49.0 - 2025-03-04
0.48.0 - 2025-01-21
0.47.0 - 2024-12-17
0.46.0 - 2024-12-10
0.45.0 - 2024-11-12
0.44.1 - 2024-10-29
0.44.0 - 2024-10-22
0.43.1 - 2024-10-15
0.43.0 - 2024-10-09
0.42.0 - 2024-09-23
0.41.0 - 2024-09-03
0.40.0 - 2024-08-27
0.39.3 - 2024-08-20
0.39.2 - 2024-08-13
0.39.1 - 2024-08-13
0.39.0 - 2024-07-30
0.38.0 - 2024-07-23
0.37.0 - 2024-07-09
0.36.3 - 2024-07-02
0.36.2 - 2024-06-25
0.36.1 - 2024-06-18
0.36.0 - 2024-06-11
0.35.0 - 2024-06-04
0.34.1 - 2024-05-21
0.34.0 - 2024-05-14
0.33.0 - 2024-04-16
0.32.0 - 2024-04-04
0.31.1 - 2024-03-20
0.31.0 - 2024-03-05
0.30.0 - 2024-02-22
0.29.0 - 2024-02-13
0.28.0 - 2024-02-01
0.27.0 - 2024-01-23
0.26.0 - 2024-01-16
0.25.0 - 2024-01-09
0.24.1 - 2023-12-15
0.24.0 - 2023-11-23
0.23.1 - 2023-11-10
0.23.0 - 2023-10-26
0.22.1 - 2023-10-24
0.22.0 - 2023-10-23
0.21.0 - 2023-10-11
0.20.0 - 2023-09-21
0.19.1 - 2023-09-08
0.19.0 - 2023-08-25
0.18.1 - 2023-08-16
0.18.0 - 2023-08-14
0.17.0 - 2023-08-10
0.16.1 - 2023-08-03
0.16.0 - 2023-07-25
0.15.2 - 2023-07-19
0.15.1 - 2023-07-06
0.15.0 - 2023-07-05
0.14.1 - 2023-06-16
0.14.0 - 2023-06-14
0.13.0 - 2023-06-02
0.12.0 - 2023-05-01
0.11.0 - 2023-04-13
0.10.0 - 2023-04-07
0.9.0 - 2023-03-10
0.8.1 - 2023-03-05
0.8.0 - 2023-03-03
0.7.0 - 2023-01-10
0.6.0 - 2022-12-02
0.5.0 - 2022-11-07
0.4.0 - 2022-09-14
0.3.0 - 2022-08-30
HTTP API
0.35.0 - TBD
0.34.1 - 2025-06-17
0.34.0 - 2025-06-09
0.33.0 - 2024-12-10
0.32.0 - 2024-11-26
0.31.0 - 2024-11-12
0.30.0 - 2024-09-24
0.29.0 - 2024-09-03
0.28.0 - 2024-06-25
0.27.0 - 2024-06-04
0.26.0 - 2024-05-14
0.25.0 - 2024-03-26
0.24.0 - 2024-03-06
0.23.0 - 2024-02-15
0.22.0 - 2024-02-06
0.21.0 - 2024-01-30
0.20.0 - 2024-01-18
0.19.0 - 2023-10-17
0.18.0 - 2023-10-11
0.17.0 - 2023-10-04
0.16.0 - 2023-09-26
0.15.0 - 2023-09-19
0.14.0 - 2023-08-29
0.13.0 - 2023-08-23
0.12.0 - 2023-08-10
0.11.0 - 2023-07-25
0.10.0 - 2023-07-06
0.9.0 - 2023-06-01
0.8.0 - 2023-05-01
0.7.0 - 2023-04-07
0.6.0 - 2023-03-10
0.5.0 - 2023-03-03
0.4.0 - 2022-12-02
0.3.0 - 2022-08-30
0.2.0 - 2021-12-10
0.1.0 - 2021-08-30
Raw API
0.6.4 - TBD
0.6.3 - 2025-09-07
0.6.2 - 2025-08-02
0.6.1 - 2025-06-29
0.6.0 - 2025-05-24
0.5.6 - 2025-04-06
0.5.5 - 2024-12-01
0.5.4 - 2024-10-02
0.5.3 - 2024-10-02
0.5.1 - 2024-07-24
2024-07-20
2024-06-25
0.5.0 - 2024-05-25
0.4.6 - 2024-04-13
0.4.5 - 2024-03-25
0.4.4 - 2024-03-23
0.4.3 - 2024-02-13
0.4.2 - 2024-01-06
0.4.0 - 2023-11-08
0.3.0 - 2023-10-20
0.2.0 - 2023-07-23
0.1.0 - 2023-05-01
Rust
0.33.1 - TBD
0.33.0 - 2025-08-19
0.32.0 - 2025-08-12
0.31.0 - 2025-07-30
0.30.0 - 2025-07-22
0.29.0 - 2025-07-15
0.28.0 - 2025-07-01
0.27.1 - 2025-06-25
0.27.0 - 2025-06-10
0.26.2 - 2025-06-03
0.26.1 - 2025-05-30
0.26.0 - 2025-05-28
0.25.0 - 2025-05-13
0.24.0 - 2025-04-22
0.23.0 - 2025-04-15
0.22.0 - 2025-04-01
0.21.0 - 2025-03-18
0.20.0 - 2025-02-12
0.19.0 - 2025-01-21
0.18.0 - 2025-01-08
0.17.0 - 2024-12-17
0.16.0 - 2024-11-12
0.15.0 - 2024-10-22
0.14.1 - 2024-10-08
0.14.0 - 2024-10-01
0.13.0 - 2024-09-25
0.12.1 - 2024-08-27
0.12.0 - 2024-07-30
0.11.4 - 2024-07-16
0.11.3 - 2024-07-09
0.11.2 - 2024-06-25
0.11.1 - 2024-06-11
0.11.0 - 2024-06-04
0.10.0 - 2024-05-22
0.9.1 - 2024-05-15
0.9.0 - 2024-05-14
0.8.0 - 2024-04-01
0.7.1 - 2024-03-05
0.7.0 - 2024-03-01
0.6.0 - 2024-01-16
0.5.0 - 2023-11-23
0.4.2 - 2023-10-23
0.4.1 - 2023-10-06
0.4.0 - 2023-09-21
0.3.0 - 2023-09-13
0.2.1 - 2023-08-25
0.2.0 - 2023-08-10
0.1.0 - 2023-08-02
Data
2025-08-26
2025-08-05
2025-07-25
2025-07-06
2025-07-01
2025-06-27
2025-06-17
2025-06-10
2025-05-20
2025-05-07
2025-04-05
2025-04-01
2025-03-13
2025-02-26
2025-02-01
2025-01-15
2024-12-14
2024-12-03
2024-12-02
2024-10-22
2024-10-24
2024-07-05
2024-06-25
2024-06-18
2024-05-07
2024-01-18
2023-11-17
2023-10-04
2023-08-29
2023-07-23
2023-05-01
2023-04-28
2023-03-07
Collapse all
Examples and tutorials
Options
Calculate daily statistics for equity options
Overview
In this example, we'll use the Historical client to calculate volume and open interest statistics for an equity options chain.
First, we'll use the definition schema, which contains instrument definitions and properties, to get information such as expiration
, strike_price
, and instrument_class
.
Next, we'll use the OHLCV-1d schema to get the total volume for each option.
Finally, we'll use the statistics schema to request open interest statistics.
OPRA publishes start-of-day open interest statistics before the regular trading hours (RTH) open at 9:30 ET.
Example
import datetime as dt
from zoneinfo import ZoneInfo
import databento as db
import matplotlib.pyplot as plt
import pandas as pd
from matplotlib.patches import Patch
from matplotlib.ticker import MaxNLocator
def get_volume_data(
client: db.Historical,
dataset: str,
symbol: str,
date: dt.date,
) -> pd.DataFrame:
"""Get volume data for all options for a given symbol."""
volume_df = client.timeseries.get_range(
dataset=dataset,
symbols=f"{symbol}.OPT",
schema="ohlcv-1d",
stype_in="parent",
start=date,
).to_df()
return volume_df.groupby("symbol")["volume"].sum().reset_index()
def get_oi_data(
client: db.Historical,
dataset: str,
symbol: str,
date: dt.date,
) -> pd.DataFrame:
"""Get open interest data for all options for a given symbol."""
# Start-of-day open interest is published before the RTH open at 9:30 ET
end_time = dt.time(9, 30, 0, tzinfo=ZoneInfo("America/New_York"))
stats_df = client.timeseries.get_range(
dataset=dataset,
symbols=f"{symbol}.OPT",
schema="statistics",
stype_in="parent",
start=date,
end=dt.datetime.combine(date, end_time),
).to_df()
stats_df = stats_df[stats_df["stat_type"] == db.StatType.OPEN_INTEREST]
stats_df = stats_df.drop_duplicates("symbol", keep="last")
stats_df["open_interest"] = stats_df[stats_df["stat_type"] == db.StatType.OPEN_INTEREST]["quantity"]
return stats_df[["open_interest", "symbol"]]
def get_definition_data(
client: db.Historical,
dataset: str,
symbol: str,
date: dt.date,
) -> pd.DataFrame:
"""Get definition data for all options for a given symbol."""
def_df = client.timeseries.get_range(
dataset=dataset,
symbols=f"{symbol}.OPT",
schema="definition",
stype_in="parent",
start=date,
).to_df()
def_df["days_to_expiration"] = (def_df["expiration"] - def_df.index.normalize()).dt.days
def_df["expiration"] = def_df["expiration"].dt.normalize().dt.date
return def_df[["symbol", "strike_price", "instrument_class", "expiration", "days_to_expiration"]]
def plot_oi_by_strike(
df: pd.DataFrame,
expiration_date: dt.date,
) -> None:
df = df[df["expiration"] == expiration_date]
trade_date = df["trade_date"].iloc[0]
days_to_expiration = df["days_to_expiration"].iloc[0]
df_strikes = df.groupby(["strike_price", "instrument_class"])["open_interest"].sum().unstack()
# Plot bar chart
fig, ax = plt.subplots(figsize=(14, 6))
df_strikes.plot(
ax=ax,
kind="bar",
xlabel="Strike price",
ylabel="Open interest",
)
# Adjust X ticks and labels
ax.xaxis.set_major_locator(MaxNLocator(15))
ax.set_xticklabels(ax.get_xticklabels(), rotation=45, ha="right")
# Set title and legend
ax.set_title(f"{symbol} open interest \n {trade_date} ({days_to_expiration} DTE)")
ax.legend(handles=[Patch(facecolor="C0", label="Call"), Patch(facecolor="C1", label="Put")])
plt.tight_layout()
plt.show()
# Set parameters
dataset = "OPRA.PILLAR"
symbol = "NVDA"
start = dt.date(2025, 8, 19)
# Create a historical client
client = db.Historical("$YOUR_API_KEY")
# Get strike price, expiration, and instrument class in the definition schema
def_df = get_definition_data(client, dataset, symbol, start)
# Volume from the OHLCV-1d schema
volume_df = get_volume_data(client, dataset, symbol, start)
# Start-of-day open interest is published in the morning in the statistics schema
stats_df = get_oi_data(client, dataset, symbol, start)
# Merge different schemas together
df = def_df.merge(volume_df, on="symbol", how="left")
df = df.merge(stats_df, on="symbol", how="left")
df["trade_date"] = start
df["volume"] = df["volume"].fillna(0).astype(int)
df["open_interest"] = df["open_interest"].fillna(0).astype(int)
# Print out top 10 contracts by open interest
print(df.nlargest(10, "open_interest").to_string(index=False))
# Plot open interest by expiration date
plot_oi_by_strike(df, dt.date(2025, 8, 22))
Result
You could use the resulting data to filter for the contracts with the highest open interest. Additionally, you could plot the open interest distribution for a given expiration.
symbol strike_price instrument_class expiration days_to_expiration volume open_interest trade_date
NVDA 250919C00160000 160.0 C 2025-09-19 31 52206 173864 2025-08-19
NVDA 260618P00075000 75.0 P 2026-06-18 303 1 109796 2025-08-19
NVDA 250919C00170000 170.0 C 2025-09-19 31 4636 106760 2025-08-19
NVDA 250822C00185000 185.0 C 2025-08-22 3 158486 102111 2025-08-19
NVDA 250919C00185000 185.0 C 2025-09-19 31 61860 101843 2025-08-19
NVDA 250919C00190000 190.0 C 2025-09-19 31 59766 92379 2025-08-19
NVDA 250822C00190000 190.0 C 2025-08-22 3 46489 91666 2025-08-19
NVDA 250919C00165000 165.0 C 2025-09-19 31 759 90851 2025-08-19
NVDA 250919C00175000 175.0 C 2025-09-19 31 5862 85548 2025-08-19
NVDA 260116C00100000 100.0 C 2026-01-16 150 161 85414 2025-08-19