Support

US equity options volume by venue

Overview

This example will use the Historical client to retrieve data from the entire US equity options market and compare volume across execution venues.

We'll use the OHLCV-1m schema and look at data over a 30-minute window. This example could be modified to look at the entire session by changing the start and end variables, or by using the OHLCV-1d schema.

The OPRA datafeed provides consolidated options data for the 18 US equity options venues. The publisher_id field indicates which venue the record is associated with.

Using this information, we will create a table and plot similar to the data found in Cboe's Market Volume Summary report.

See also
See also

For a full list of the OPRA venues, see the OPRA documentation.

Example

import databento as db import matplotlib.pyplot as plt from matplotlib.patches import Patch # Set parameters dataset = "OPRA.PILLAR" start = "2025-03-26T14:00" end = "2025-03-26T14:30" # Create a historical client client = db.Historical(key="$YOUR_API_KEY") # Request OHLCV-1m data for ALL_SYMBOLS and convert to DataFrame df = client.timeseries.get_range( dataset=dataset, schema="ohlcv-1m", symbols="ALL_SYMBOLS", start=start, end=end, ).to_df() # Aggregate volume by venue df = df.groupby("publisher_id", as_index=False)["volume"].sum() df["percentage"] = df["volume"] / df["volume"].sum() * 100 # Rename publisher_id and columns for readability publishers = client.metadata.list_publishers() venue_name_map = {x["publisher_id"]: db.Publisher.from_int(x["publisher_id"]).venue.description for x in publishers} df["publisher_id"] = df["publisher_id"].map(venue_name_map) df = df.rename(columns={"publisher_id": "Venue", "volume": "Volume", "percentage": "% of Total"}) # Calculate volume by group and sort df["Group"] = df["Venue"].str.split(" ").str[0] df["Group Volume"] = df.groupby("Group")["Volume"].transform("sum") df = df.sort_values(by=["Group Volume", "Volume"], ascending=[False, False]) df = df[["Group", "Venue", "Volume", "% of Total"]] print(df.set_index(["Group", "Venue"]).to_string(float_format="%0.2f")) # Now, let's plot this data fig, ax = plt.subplots(figsize=(14, 6)) group_handles = [] # Legend handles for group_idx, group in enumerate(df["Group"].unique()): group_data = df[df["Group"] == group] # Create handle for plot legend group_pct = group_data["% of Total"].sum() group_handles.append(Patch(facecolor=f"C{group_idx}", label=f"{group}: {group_pct:.2f}%")) last_venue_pct = 0 for i, (_, venue_data) in enumerate(group_data.iterrows()): venue_pct = venue_data["% of Total"] # Used as height for each venue section # Add section for venue bar = ax.bar( x=group, height=venue_pct, bottom=last_venue_pct, color=f"C{group_idx}", alpha=1.0 - i * 0.15, ) # Add the venue label ax.text( x=group_idx, y=last_venue_pct + venue_pct / 2, s=" ".join(venue_data["Venue"].split(" ")[:2]), ha="center", va="center", ) last_venue_pct += venue_pct ax.legend(handles=group_handles) ax.set_title("U.S. Options Market Volume") ax.set_ylabel("% of Total Volume") plt.tight_layout() plt.show() 
 Volume % of Total Group Venue Cboe Cboe Options 954511 14.47 Cboe EDGX Options 381901 5.79 Cboe BZX Options 261275 3.96 Cboe C2 Options 152628 2.31 Nasdaq Nasdaq PHLX 435190 6.60 Nasdaq ISE 381951 5.79 Nasdaq Options 327166 4.96 Nasdaq GEMX 272005 4.12 Nasdaq MRX 182480 2.77 Nasdaq BX Options 105090 1.59 NYSE NYSE American Options 865360 13.12 NYSE Arca Options 664865 10.08 MIAX MIAX Options 447819 6.79 MIAX Emerald 230339 3.49 MIAX Pearl 201093 3.05 MIAX Sapphire 124162 1.88 BOX BOX Options 386105 5.85 MEMX MEMX Options 222973 3.38 

Options venues volume