Data dictionary
Field-level reference for every table Masscrest delivers.
Scope and attribution. US single stocks and ETFs options. Flow attributed per print to retail, institutional, and market maker. Metrics per cohort: buy, sell, net (in shares equivalent), premium, and greek-adjusted notional (delta, gamma, vega).
Universe and coverage. ~4,000 tickers (full universe of listed US stocks + ETFs), including delisted tickers.
History. 2019-11-10 to T-1. PIT, FIGI-based identifiers with mapping table. T+1 delivery before US trading session starts.
Granularity.
- Daily aggregated by composite FIGI + call/put
- 10-minute aggregated by composite FIGI + call/put
- Per-contract (expiry + strike + call/put) daily or 10-min
Delivery.
- Programmatic via GCS: S3 compatible or warehouse-native grants (Snowflake, Databricks, BigQuery)
- REST API
- MCP server for LLM-consumable workflows
Investor segmentation
| Cohort | Description |
|---|---|
| Institutional | Long-only, long/short, market-neutral, long-biased, multi-strat and other equity hedge funds; mutual funds, sovereign and endowment funds, family offices and other asset managers; proprietary trading desks, banks and dealers trading on behalf of customers. |
| Retail | Global self-directed retail traders (not investment advisors or private-banking clients). |
| Interdealer / market maker | ~99% of trades take place against a market maker, so this cohort sits opposite Institutional and Retail flows. Interdealer trades are between dealers, typically to offset greek exposure. |
Three layers of data aggregation
- Option flow by contract: buy, sell, and net trading imbalance for every listed contract, expressed in shares, premium, and greek-adjusted notional (delta, gamma, vega).
- Option flow by underlying ticker: the same trading imbalance aggregated to the underlying root symbol × callput.
- Signal: proprietary indicator of abnormal net options positioning (delta, gamma, vega exposure).
| Surface | Grain | Daily | 10-min |
|---|---|---|---|
| Option flow by contract | (date, figi, callput, strike, expiration) | yes | yes |
| Option flow by underlying ticker | (date, figi, callput) | yes | yes |
| Option flow grouped (sector / industry / ...) | (date, group_key, callput) | yes | no |
| Signal per underlying | (date, figi, callput) | yes | no |
| Signal grouped (sector / industry / ...) | (date, group_key, callput) | yes | no |
Typical use cases
- Chase institutional flow. See where hedge funds and asset managers are building or unwinding positions.
- Spot retail-vs-institutional divergences. Identify names where the two cohorts sit on opposite sides.
- Trade the optionality dimension. Separate directional bets from vega and gamma positioning.
- Layer market narrative on price action. Explain why a name moved when the tape alone doesn't tell you: accumulation ahead of a break, capitulation into a bottom.
- Control for flow in factor models. A signal orthogonal to price and volume. Wire it in as a regression control alongside conventional risk factors.
Delivery & availability
Daily datasets are keyed on US-equity trading dates and delivered one calendar day later (Friday's data lands Saturday).
Cadence
- Frequency: T+1. Data for trading day T is delivered on calendar day T+1 (Friday's data lands Saturday).
- Publish window: 01:00 to 05:00 ET on the calendar day after the trading date (window floats with DST).
option_flows_01_day
What it is
One row per unique option contract that traded on the session, keyed on (date, traded_symbol, callput, strikeprice, expirationdate). Each row carries buy / sell / net triples for retail (_r), institutional (_i), and market maker (_m), expressed four ways: contract count (_qty), dollar premium (_premium), and greek-weighted USD notional (_delta, _gamma, _vega).
Why it exists
The contract-grain view is where you see who's actually on which side of a specific position. Underlying-level aggregates are good for sector or cross-stock work, but questions like "is the institutional buyer in TSLA Jan 300 calls leaning in on a specific expiry?" or "is the put-side flow concentrated in the 20-delta wings?" only answer at this grain. This table is the base: the underlying rollups and the signal tables are summations of it.
How to use it
Filter on the dimensions that matter: date + figi (join via contract_id_mapping) + callput + the strike / expiry range. For a time series on one specific contract, resolve to contract_id once via contract_id_mapping and filter on that so your series survives corporate actions.
Three conventions to internalise before summing:
net_* = buy_* − sell_*. Delta notionals are naturally signed by option type (calls +, puts −) sonet_*_deltaalready carries directional lean._i + _r + _m ≈ 0on the notional columns, row by row (up to rounding and floor flow). Market-maker legs absorb the customer imbalance by construction.qtyis the trade count. Summing the six cohort legs (buy_r + sell_r + buy_i + sell_i + buy_m + sell_m) double-counts the MM leg and inflates volume by about 30 to 35 percent.
floor_* holds exchange-floor / broker-committed prints that Masscrest does not side-classify. Reported for volume completeness; do not include in buy / sell / net logic.
Examples
Reading institutional lean on a single strike. TSLA 2025-01-17 300 call on 2024-11-15: pull the one row keyed (2024-11-15, TSLA, C, 300, 2025-01-17). net_i_delta positive and large relative to qty × last_underprice × last_delta means institutional buyers are dominating the demand for that contract that day.
Reconstructing per-cohort premium across a split. NVDA Jan 2025 500 call across the June 2024 10-for-1 split: join contract_id_mapping on (traded_symbol, expirationdate, callput, traded_strikeprice) with a PIT clamp, then sum net_i_premium by contract_id. The resulting series runs clean across the ex-date even though the row keys differ pre and post split.
Context columns
Each row carries last_* columns (underprice, fwd_underprice, price, iv, delta, gamma, vega) observed at the last trade of the session. Useful as an end-of-day mark for the contract. Null when the contract had no trades in the session (rare at this grain, but can happen on open-position rows pulled from inventory).
- Grain:
(date, traded_symbol, callput, strikeprice, expirationdate)
Fields
| field_name | type | unit | grain | description | provenance | timing_lag | history_start | null_semantics | example |
|---|---|---|---|---|---|---|---|---|---|
date | Date | trading day (UTC) | (date, traded_symbol, callput, strikeprice, expirationdate) | Session date. US equity trading calendar. | exchange | T+1 | 2019-11-10 | never null | 2026-07-24 |
traded_symbol | LowCardinality(String) | ticker | (date, traded_symbol, callput, strikeprice, expirationdate) | Symbol (no-dot form: BRKB, not BRK.B). Numerated forms (WOLF1, XOM2) appear when a corporate action generates two series with different shares deliverable (typically reverse split, mergers, etc). Join key to contract_id_mapping for traded_underlying / contract_id / adj_shares_deliverable / figi. | exchange | T+1 | 2019-11-10 | never null | AAPL |
callput | LowCardinality(String) | option type | (date, traded_symbol, callput, strikeprice, expirationdate) | 'C' (call) or 'P' (put). | exchange | T+1 | 2019-11-10 | never null | C |
strikeprice | Float64 | USD | (date, traded_symbol, callput, strikeprice, expirationdate) | Contract strike price, in the deliverable equity's price units. Not split-adjusted at this grain; join to contract_id_mapping for cumulative_split_factor if you need a current-share-equivalent strike. | exchange | T+1 | 2019-11-10 | never null | 215.00 |
expirationdate | Date | boundary | (date, traded_symbol, callput, strikeprice, expirationdate) | Contract expiration date (US equity calendar). | exchange | T+1 | 2019-11-10 | never null | 2026-08-15 |
dte | Int64 | days | (date, traded_symbol, callput, strikeprice, expirationdate) | Days to expiry: expirationdate − date (calendar days). 0 on the expiry-day trading session; can be negative on late prints of already-expired contracts (rare). | derived | T+1 | 2019-11-10 | never null | 22 |
last_underprice | Nullable(Float64) | USD | (date, traded_symbol, callput, strikeprice, expirationdate) | Underlying spot price observed at the last option trade of the session. Not split-adjusted (contemporaneous mark). | exchange | T+1 | 2019-11-10 | null when the contract has no trades in the session | 224.31 |
last_fwd_underprice | Nullable(Float64) | USD | (date, traded_symbol, callput, strikeprice, expirationdate) | Forward price on the underlying, adjusted for dividends and the risk-free rate. Not adjusted for splits. | derived | T+1 | 2019-11-10 | null when the contract has no trades in the session | 224.68 |
last_price | Nullable(Float64) | USD | (date, traded_symbol, callput, strikeprice, expirationdate) | Last traded option price on the session. Per-contract price (not scaled by adj_shares_deliverable). | exchange | T+1 | 2019-11-10 | null when the contract has no trades in the session | 9.42 |
last_iv | Nullable(Float64) | annualised vol (0.30 = 30%) | (date, traded_symbol, callput, strikeprice, expirationdate) | Implied volatility at the last trade of the session, fit against last_fwd_underprice and last_price. | derived | T+1 | 2019-11-10 | null when the contract has no trades / IV inversion fails | 0.2418 |
last_delta | Nullable(Float64) | delta per contract | (date, traded_symbol, callput, strikeprice, expirationdate) | Contract delta at the last trade of the session. Signed by option type (calls +, puts −). | derived | T+1 | 2019-11-10 | null when the contract has no trades in the session | 0.5620 |
last_gamma | Nullable(Float64) | gamma per contract | (date, traded_symbol, callput, strikeprice, expirationdate) | Contract gamma at the last trade of the session. | derived | T+1 | 2019-11-10 | null when the contract has no trades in the session | 0.0184 |
last_vega | Nullable(Float64) | vega per contract | (date, traded_symbol, callput, strikeprice, expirationdate) | Contract vega at the last trade of the session (dollar P&L per 1 vol point change). | derived | T+1 | 2019-11-10 | null when the contract has no trades in the session | 0.2712 |
qty | Int64 | contracts | (date, traded_symbol, callput, strikeprice, expirationdate) | Total unique traded contract volume for the session (each print contributes its quantity once; m_qty is not double-counted). | exchange | T+1 | 2019-11-10 | 0 on no-volume rows (present only when other fields exist) | 1_842 |
buy_r_qty / sell_r_qty / net_r_qty | Int64 | contracts | (date, traded_symbol, callput, strikeprice, expirationdate) | Retail buy / sell / net contract count. net = buy − sell. | model | T+1 | 2019-11-10 | 0 when no qualifying retail flow | 241 |
buy_r_premium / sell_r_premium / net_r_premium | Float64 | USD | (date, traded_symbol, callput, strikeprice, expirationdate) | Retail dollar premium paid on buys, received on sells, and their net. Signed on net. Scaled by adj_shares_deliverable (deliverable-adjusted). | model | T+1 | 2019-11-10 | 0.0 when no qualifying retail flow | 312_040.0 |
buy_r_delta / sell_r_delta / net_r_delta | Float64 | USD | (date, traded_symbol, callput, strikeprice, expirationdate) | Retail buy / sell / net flow as USD notional × delta (deliverable-adjusted). Naturally signed by option type (calls +, puts −); net = buy − sell. Positive net = net long-delta demand from retail on this contract. | model | T+1 | 2019-11-10 | 0.0 when no qualifying retail flow | -38_720.55 |
buy_r_gamma / sell_r_gamma / net_r_gamma | Float64 | USD | (date, traded_symbol, callput, strikeprice, expirationdate) | Retail buy / sell / net flow as USD-notional-converted gamma (dollar notional multiplied by the per-contract gamma, deliverable-adjusted). | model | T+1 | 2019-11-10 | 0.0 when no qualifying retail flow | 12_450.30 |
buy_r_vega / sell_r_vega / net_r_vega | Float64 | USD | (date, traded_symbol, callput, strikeprice, expirationdate) | Retail buy / sell / net flow as USD-notional-converted vega (deliverable-adjusted). | model | T+1 | 2019-11-10 | 0.0 when no qualifying retail flow | 88_012.40 |
buy_i_qty / sell_i_qty / net_i_qty | Int64 | contracts | (date, traded_symbol, callput, strikeprice, expirationdate) | Institutional buy / sell / net contract count. Same convention as retail. | model | T+1 | 2019-11-10 | 0 when no qualifying institutional flow | 987 |
buy_i_premium / sell_i_premium / net_i_premium | Float64 | USD | (date, traded_symbol, callput, strikeprice, expirationdate) | Institutional dollar premium buy / sell / net (deliverable-adjusted). | model | T+1 | 2019-11-10 | 0.0 when no qualifying institutional flow | 1_120_338.55 |
buy_i_delta / sell_i_delta / net_i_delta | Float64 | USD | (date, traded_symbol, callput, strikeprice, expirationdate) | Institutional buy / sell / net flow as USD notional × delta (deliverable-adjusted). Naturally signed; positive net = net long-delta demand from the institutional class on this contract. | model | T+1 | 2019-11-10 | 0.0 when no qualifying institutional flow | 892_310.00 |
buy_i_gamma / sell_i_gamma / net_i_gamma | Float64 | USD | (date, traded_symbol, callput, strikeprice, expirationdate) | Institutional buy / sell / net flow as USD-notional-converted gamma (deliverable-adjusted). | model | T+1 | 2019-11-10 | 0.0 when no qualifying institutional flow | 41_882.70 |
buy_i_vega / sell_i_vega / net_i_vega | Float64 | USD | (date, traded_symbol, callput, strikeprice, expirationdate) | Institutional buy / sell / net flow as USD-notional-converted vega (deliverable-adjusted). | model | T+1 | 2019-11-10 | 0.0 when no qualifying institutional flow | 312_048.80 |
buy_m_qty / sell_m_qty / net_m_qty | Int64 | contracts | (date, traded_symbol, callput, strikeprice, expirationdate) | Market-maker buy / sell / net contract count. Includes the residual absorption of customer (retail + institutional) net imbalance on the opposite side, so the row-level accounting identity _i + _r + _m ≈ 0 holds by construction on the notionals. | model | T+1 | 2019-11-10 | 0 when no qualifying market-maker flow | -1_098 |
buy_m_premium / sell_m_premium / net_m_premium | Float64 | USD | (date, traded_symbol, callput, strikeprice, expirationdate) | Market-maker dollar premium buy / sell / net (deliverable-adjusted). Mirror of _i + _r on the same row up to floor / rounding. | model | T+1 | 2019-11-10 | 0.0 when no qualifying market-maker flow | -1_432_378.65 |
buy_m_delta / sell_m_delta / net_m_delta | Float64 | USD | (date, traded_symbol, callput, strikeprice, expirationdate) | Market-maker buy / sell / net flow as USD notional × delta (deliverable-adjusted). Mirror of _i + _r on the same row. | model | T+1 | 2019-11-10 | 0.0 when no qualifying market-maker flow | -853_590.00 |
buy_m_gamma / sell_m_gamma / net_m_gamma | Float64 | USD | (date, traded_symbol, callput, strikeprice, expirationdate) | Market-maker buy / sell / net flow as USD-notional-converted gamma (deliverable-adjusted). | model | T+1 | 2019-11-10 | 0.0 when no qualifying market-maker flow | -54_333.00 |
buy_m_vega / sell_m_vega / net_m_vega | Float64 | USD | (date, traded_symbol, callput, strikeprice, expirationdate) | Market-maker buy / sell / net flow as USD-notional-converted vega (deliverable-adjusted). | model | T+1 | 2019-11-10 | 0.0 when no qualifying market-maker flow | -400_172.00 |
floor_qty | Int64 | contracts | (date, traded_symbol, callput, strikeprice, expirationdate) | Total floor-executed contract count (direct-negotiation outcry trades on the exchange floor). No directional classification provided; reported for volume completeness. | exchange | T+1 | 2019-11-10 | 0 when no floor prints | 24 |
floor_premium | Float64 | USD | (date, traded_symbol, callput, strikeprice, expirationdate) | Total floor-executed dollar premium (deliverable-adjusted). No directional classification provided; reported for volume completeness. | exchange | T+1 | 2019-11-10 | 0.0 when no floor prints | 24_120.0 |
floor_delta | Float64 | USD | (date, traded_symbol, callput, strikeprice, expirationdate) | Total floor-executed USD notional × delta (deliverable-adjusted). No directional classification provided; reported for volume completeness. Naturally signed by option type. | exchange | T+1 | 2019-11-10 | 0.0 when no floor prints | 13_492.20 |
floor_gamma | Float64 | USD | (date, traded_symbol, callput, strikeprice, expirationdate) | Total floor-executed USD-notional-converted gamma (deliverable-adjusted). No directional classification provided; reported for volume completeness. | exchange | T+1 | 2019-11-10 | 0.0 when no floor prints | 1_842.10 |
floor_vega | Float64 | USD | (date, traded_symbol, callput, strikeprice, expirationdate) | Total floor-executed USD-notional-converted vega (deliverable-adjusted). No directional classification provided; reported for volume completeness. | exchange | T+1 | 2019-11-10 | 0.0 when no floor prints | 9_820.60 |
Reconstructing figi / adj_shares_deliverable from flat files
REST and MCP responses already carry figi, contract_id, traded_underlying, adj_shares_deliverable, and cumulative_split_factor on every row. The flat-file parquet drops them to keep file sizes small. Rebuild with a single PIT join to contract_id_mapping:
SELECT
f.*,
m.traded_underlying,
m.contract_id,
m.adj_shares_deliverable,
m.cumulative_split_factor,
m.underlying_figi AS figi
FROM option_flows_01_day AS f
INNER JOIN contract_id_mapping AS m
ON m.traded_symbol = f.traded_symbol
AND m.expirationdate = f.expirationdate
AND m.callput = f.callput
AND m.traded_strikeprice = f.strikeprice
AND m.phase_start <= f.date
AND m.phase_end >= f.date
Join stock_mapping on (underlying_figi, date BETWEEN phase_start AND phase_end) for underlying metadata (sector, industry, isEtf, isAdr, companyName).
option_flows_10_min
What it is
The 10-minute sibling of option_flows_01_day. One row per unique option contract that traded within the bucket, keyed on (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate). Same cohort split and same metric families (_qty, _premium, _delta, _gamma, _vega across retail / institutional / MM), just resolved at 10-minute cadence instead of session-level.
Why it exists
Intraday matters when the question is about timing. Did the institutional accumulation front-run a specific headline? Did retail buy into the top of a move or chase a breakout? Session-level aggregates smear those entries. 10-minute buckets are the shortest grain Masscrest publishes and are the native cadence of the intraday flow story.
How to use it
Same convention as option_flows_01_day (buy / sell / net, net_* = buy_* − sell_*, cohort identity _i + _r + _m ≈ 0, signed delta notionals). Add the ten_min_timeframe dimension to your filter / join / group-by. Join to px_10_min on (date, ten_min_timeframe, figi) for the matching price context; both sides use the same bucket convention.
REST cap: 30-day request window per call. For multi-year intraday history pull parquet from gs://prod-us-option-tenmin-contract/option_flows/v0/10_min/.
Bucket boundary convention
ten_min_timeframe is the end of the 10-minute bucket, stored as a naive New York wall-clock DateTime. Bucket covers (ten_min_timeframe − 10 min, ten_min_timeframe]. First RTH bucket ends at 09:40:00, last at 16:00:00 (39 buckets per full session).
Examples
Front-running a headline. An M&A rumour hits at 11:12 ET. Filter (date, figi='<target>') across buckets 11:10:00 through 11:30:00. If net_i_delta on OTM calls spikes above the prior 90-minute average before the newswire print at 11:15, that's a timing signal.
Earnings-afternoon put flow. Day before earnings, pull (date, figi, callput='P') across buckets 15:00:00 to 16:00:00. Rising net_r_qty into the close on short-dated puts flags retail hedging (or chasing) activity ahead of the print.
- Grain:
(date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate)
Fields
| field_name | type | unit | grain | description | provenance | timing_lag | history_start | null_semantics | example |
|---|---|---|---|---|---|---|---|---|---|
date | Date | trading day (UTC) | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Session date. US equity trading calendar. | exchange | T+1 | 2019-11-10 | never null | 2026-07-24 |
ten_min_timeframe | DateTime | NY wall-clock, bucket close | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | End timestamp of the 10-min bucket (naive NY-time). Bucket covers (ten_min_timeframe − 10 min, ten_min_timeframe]. | exchange | T+1 | 2019-11-10 | never null | 2026-07-24 09:40:00 |
traded_symbol | LowCardinality(String) | ticker | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Symbol (no-dot form: BRKB, not BRK.B). Numerated forms (WOLF1, XOM2) appear when a corporate action generates two series with different shares deliverable (typically reverse split, mergers, etc). Join key to contract_id_mapping for traded_underlying / contract_id / adj_shares_deliverable / figi. | exchange | T+1 | 2019-11-10 | never null | AAPL |
callput | LowCardinality(String) | option type | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | 'C' (call) or 'P' (put). | exchange | T+1 | 2019-11-10 | never null | C |
strikeprice | Float64 | USD | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Contract strike price, in the deliverable equity's price units. Not split-adjusted at this grain; join to contract_id_mapping for cumulative_split_factor if you need a current-share-equivalent strike. | exchange | T+1 | 2019-11-10 | never null | 215.00 |
expirationdate | Date | boundary | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Contract expiration date (US equity calendar). | exchange | T+1 | 2019-11-10 | never null | 2026-08-15 |
dte | Int64 | days | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Days to expiry: expirationdate − date (calendar days). 0 on the expiry-day trading session. | derived | T+1 | 2019-11-10 | never null | 22 |
last_underprice | Nullable(Float64) | USD | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Underlying spot at the last option trade within the bucket. Not split-adjusted. | exchange | T+1 | 2019-11-10 | null when the contract has no trades in the bucket | 224.10 |
last_fwd_underprice | Nullable(Float64) | USD | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Forward price on the underlying, adjusted for dividends and the risk-free rate. Not adjusted for splits. | derived | T+1 | 2019-11-10 | null when the contract has no trades in the bucket | 224.48 |
last_price | Nullable(Float64) | USD | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Last traded option price in the bucket. Per-contract price (not scaled by adj_shares_deliverable). | exchange | T+1 | 2019-11-10 | null when the contract has no trades in the bucket | 9.38 |
last_iv | Nullable(Float64) | annualised vol (0.30 = 30%) | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Implied volatility at the last trade of the bucket. | derived | T+1 | 2019-11-10 | null when the contract has no trades / IV inversion fails | 0.2418 |
last_delta | Nullable(Float64) | delta per contract | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Contract delta at the last trade of the bucket. Signed by option type. | derived | T+1 | 2019-11-10 | null when the contract has no trades in the bucket | 0.5620 |
last_gamma | Nullable(Float64) | gamma per contract | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Contract gamma at the last trade of the bucket. | derived | T+1 | 2019-11-10 | null when the contract has no trades in the bucket | 0.0184 |
last_vega | Nullable(Float64) | vega per contract | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Contract vega at the last trade of the bucket. | derived | T+1 | 2019-11-10 | null when the contract has no trades in the bucket | 0.2712 |
qty | Int64 | contracts | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Total unique traded contract volume in the bucket. | exchange | T+1 | 2019-11-10 | 0 on no-volume rows | 184 |
buy_r_qty / sell_r_qty / net_r_qty | Int64 | contracts | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Retail buy / sell / net contract count within the bucket. | model | T+1 | 2019-11-10 | 0 when no qualifying retail flow | 24 |
buy_r_premium / sell_r_premium / net_r_premium | Float64 | USD | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Retail dollar premium buy / sell / net for the bucket (deliverable-adjusted). | model | T+1 | 2019-11-10 | 0.0 when no qualifying retail flow | 31_204.0 |
buy_r_delta / sell_r_delta / net_r_delta | Float64 | USD | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Retail buy / sell / net flow as USD notional × delta (deliverable-adjusted). Naturally signed by option type; positive net = net long-delta demand from retail on this contract in the bucket. | model | T+1 | 2019-11-10 | 0.0 when no qualifying retail flow | -3_872.55 |
buy_r_gamma / sell_r_gamma / net_r_gamma | Float64 | USD | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Retail buy / sell / net flow as USD-notional-converted gamma (deliverable-adjusted). | model | T+1 | 2019-11-10 | 0.0 when no qualifying retail flow | 1_245.30 |
buy_r_vega / sell_r_vega / net_r_vega | Float64 | USD | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Retail buy / sell / net flow as USD-notional-converted vega (deliverable-adjusted). | model | T+1 | 2019-11-10 | 0.0 when no qualifying retail flow | 8_801.40 |
buy_i_qty / sell_i_qty / net_i_qty | Int64 | contracts | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Institutional buy / sell / net contract count for the bucket. | model | T+1 | 2019-11-10 | 0 when no qualifying institutional flow | 98 |
buy_i_premium / sell_i_premium / net_i_premium | Float64 | USD | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Institutional dollar premium buy / sell / net (deliverable-adjusted). | model | T+1 | 2019-11-10 | 0.0 when no qualifying institutional flow | 112_034.55 |
buy_i_delta / sell_i_delta / net_i_delta | Float64 | USD | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Institutional buy / sell / net flow as USD notional × delta (deliverable-adjusted). Positive net = net long-delta demand from the institutional class on this contract in the bucket. | model | T+1 | 2019-11-10 | 0.0 when no qualifying institutional flow | 89_231.00 |
buy_i_gamma / sell_i_gamma / net_i_gamma | Float64 | USD | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Institutional buy / sell / net flow as USD-notional-converted gamma (deliverable-adjusted). | model | T+1 | 2019-11-10 | 0.0 when no qualifying institutional flow | 4_188.70 |
buy_i_vega / sell_i_vega / net_i_vega | Float64 | USD | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Institutional buy / sell / net flow as USD-notional-converted vega (deliverable-adjusted). | model | T+1 | 2019-11-10 | 0.0 when no qualifying institutional flow | 31_204.80 |
buy_m_qty / sell_m_qty / net_m_qty | Int64 | contracts | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Market-maker buy / sell / net contract count for the bucket. Includes the residual absorption of customer (retail + institutional) net imbalance on the opposite side. | model | T+1 | 2019-11-10 | 0 when no qualifying market-maker flow | -108 |
buy_m_premium / sell_m_premium / net_m_premium | Float64 | USD | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Market-maker dollar premium buy / sell / net (deliverable-adjusted). Mirror of _i + _r on the same row up to floor / rounding. | model | T+1 | 2019-11-10 | 0.0 when no qualifying market-maker flow | -143_237.65 |
buy_m_delta / sell_m_delta / net_m_delta | Float64 | USD | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Market-maker buy / sell / net flow as USD notional × delta (deliverable-adjusted). Mirror of _i + _r on the same row. | model | T+1 | 2019-11-10 | 0.0 when no qualifying market-maker flow | -85_359.00 |
buy_m_gamma / sell_m_gamma / net_m_gamma | Float64 | USD | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Market-maker buy / sell / net flow as USD-notional-converted gamma (deliverable-adjusted). | model | T+1 | 2019-11-10 | 0.0 when no qualifying market-maker flow | -5_433.30 |
buy_m_vega / sell_m_vega / net_m_vega | Float64 | USD | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Market-maker buy / sell / net flow as USD-notional-converted vega (deliverable-adjusted). | model | T+1 | 2019-11-10 | 0.0 when no qualifying market-maker flow | -40_017.20 |
floor_qty | Int64 | contracts | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Total floor-executed contract count within the bucket (direct-negotiation outcry trades on the exchange floor). No directional classification provided; reported for volume completeness. | exchange | T+1 | 2019-11-10 | 0 when no floor prints | 4 |
floor_premium | Float64 | USD | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Total floor-executed dollar premium within the bucket (deliverable-adjusted). No directional classification provided; reported for volume completeness. | exchange | T+1 | 2019-11-10 | 0.0 when no floor prints | 4_120.0 |
floor_delta | Float64 | USD | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Total floor-executed USD notional × delta within the bucket (deliverable-adjusted). No directional classification provided; reported for volume completeness. Naturally signed. | exchange | T+1 | 2019-11-10 | 0.0 when no floor prints | 2_349.20 |
floor_gamma | Float64 | USD | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Total floor-executed USD-notional-converted gamma within the bucket (deliverable-adjusted). No directional classification provided; reported for volume completeness. | exchange | T+1 | 2019-11-10 | 0.0 when no floor prints | 184.10 |
floor_vega | Float64 | USD | (date, ten_min_timeframe, traded_symbol, callput, strikeprice, expirationdate) | Total floor-executed USD-notional-converted vega within the bucket (deliverable-adjusted). No directional classification provided; reported for volume completeness. | exchange | T+1 | 2019-11-10 | 0.0 when no floor prints | 982.60 |
underlying_option_flows_01_day
What it is
Daily option flow aggregated per underlying × callput. One row per (date, figi, callput) with callput ∈ {'C', 'P', 'CP'}. Same cohort split as the contract-grain table (retail _r, institutional _i, market-maker _m) with the same four metric families, but all strikes and expirations collapsed into a single number per side.
Why it exists
Most flow questions aren't about one specific contract. "Is retail bullish on NVDA today?" / "Did institutions rotate into Energy puts this week?" need the total call-side and put-side demand on the name, not one strike at a time. This table is that collapse, done server-side with the correct per-contract deliverable multiplier baked in so you can plot a time series without joining anything else.
How to use it
Filter on (date, figi, callput). Three conventions to internalise:
- Units are pre-multiplied.
_shares=Σ (qty × adj_shares_deliverable)in underlying-share equivalents._premiumand the greeks are USD notionals, deliverable-adjusted. Nocontract_id_mappingjoin needed. - Cohort identity
_i + _r + _m ≈ 0holds row by row on the notionals. MM legs absorb customer imbalance. - The CP row is a pre-computed differential, not a sum of C and P. See "The CP row" below for the convention per column family.
Price and metadata aren't baked in: join px_01_day (plus split_factors for adjustment) and stock_mapping on figi.
No contract-level filters here (no dte, no abs_delta). For those, use option_flows_01_day at contract grain.
Examples
Retail bullishness on NVDA. Filter (date='2024-11-15', figi=<NVDA>, callput='CP') and read net_r_delta. Positive means retail net long delta on NVDA across the whole option chain that session (calls bought minus puts bought, net of sells, after delta-weighting).
Weekly institutional rotation into Energy puts. Join stock_mapping on figi to get sector, filter sector='Energy' and callput='P', sum net_i_premium across the FIGIs for each date in the window. Compare the 5-day sum against the prior 5-day sum.
- Grain:
(date, figi, callput)
Fields
| field_name | type | unit | grain | description | provenance | timing_lag | history_start | null_semantics | example |
|---|---|---|---|---|---|---|---|---|---|
date | Date | trading day (UTC) | (date, figi, callput) | Session date. US equity trading calendar. | exchange | T+1 | 2019-11-10 | never null | 2026-07-24 |
figi | String(12) | identifier | (date, figi, callput) | Composite FIGI for the underlying. Join key to stock_mapping, px_01_day, split_factors. | exchange | n/a | 2019-11-10 | never null | BBG000MM2P62 |
traded_underlying | String | ticker | (date, figi, callput) | Listed equity ticker on date. Dotted dual-class form (BRK.B). | exchange | T+1 | 2019-11-10 | never null | AAPL |
callput | String(2) | option type | (date, figi, callput) | 'C' (call side), 'P' (put side), or 'CP' (call-vs-put differential row). | exchange | T+1 | 2019-11-10 | never null | C |
n_contracts | UInt32 | contracts | (date, figi, callput) | Distinct option contracts that traded on this underlying × callput on date. | exchange | T+1 | 2019-11-10 | 0 on no-volume days | 184 |
total_shares | Float64 | underlying-share equivalents | (date, figi, callput) | Sum of all traded contract volume converted to underlying-share equivalents (Σ qty × adj_shares_deliverable), regardless of side. | exchange | T+1 | 2019-11-10 | 0.0 on no-volume days | 2_384_100.0 |
last_underprice | Float64 | USD | (date, figi, callput) | Underlying spot price observed against the last option trade of the session. Not split-adjusted (contemporaneous mark). | exchange | T+1 | 2019-11-10 | null on no-volume days | 224.31 |
atm_iv_30d | Float64 | annualised vol (0.30 = 30%) | (date, figi, callput) | Best-effort estimate of ATM 30-day implied volatility for the underlying on this session. Not derived from a fitted volatility surface. For high-accuracy implied-volatility estimation, particularly on less liquid contracts, we recommend using specialist third-party providers. | derived | T+1 | 2019-11-10 | may be null when the figi had no option activity on the session | 0.2418 |
buy_r_shares / sell_r_shares / net_r_shares | Float64 | underlying-share equivalents | (date, figi, callput) | Retail buy / sell / net share equivalents for the (underlying, callput) row. | model | T+1 | 2019-11-10 | 0.0 when no qualifying volume | 24_100.0 |
buy_r_premium / sell_r_premium / net_r_premium | Float64 | USD | (date, figi, callput) | Retail dollar premium buy / sell / net. | model | T+1 | 2019-11-10 | 0.0 when no qualifying volume | 312_040.0 |
buy_r_delta / sell_r_delta / net_r_delta | Float64 | USD | (date, figi, callput) | Retail buy / sell / net flow as USD notional × delta for the (underlying, callput) row. Naturally signed (calls +, puts −); positive net = net long-delta demand from retail on this call/put side. | model | T+1 | 2019-11-10 | 0.0 when no qualifying volume | -3_872_000.55 |
buy_r_gamma / sell_r_gamma / net_r_gamma | Float64 | USD | (date, figi, callput) | Retail buy / sell / net flow as USD notional × gamma. | model | T+1 | 2019-11-10 | 0.0 when no qualifying volume | 1_245_030.30 |
buy_r_vega / sell_r_vega / net_r_vega | Float64 | USD | (date, figi, callput) | Retail buy / sell / net flow as USD notional × vega. | model | T+1 | 2019-11-10 | 0.0 when no qualifying volume | 8_801_240.40 |
buy_i_shares / sell_i_shares / net_i_shares | Float64 | underlying-share equivalents | (date, figi, callput) | Institutional buy / sell / net share equivalents. | model | T+1 | 2019-11-10 | 0.0 when no qualifying volume | 128_450.0 |
buy_i_premium / sell_i_premium / net_i_premium | Float64 | USD | (date, figi, callput) | Institutional dollar premium buy / sell / net. | model | T+1 | 2019-11-10 | 0.0 when no qualifying volume | 412_034.55 |
buy_i_delta / sell_i_delta / net_i_delta | Float64 | USD | (date, figi, callput) | Institutional buy / sell / net flow as USD notional × delta for the (underlying, callput) row. Positive net = net long-delta demand from the institutional class on this call/put side. | model | T+1 | 2019-11-10 | 0.0 when no qualifying volume | 89_231_000.00 |
buy_i_gamma / sell_i_gamma / net_i_gamma | Float64 | USD | (date, figi, callput) | Institutional buy / sell / net flow as USD notional × gamma. | model | T+1 | 2019-11-10 | 0.0 when no qualifying volume | 4_188_270.70 |
buy_i_vega / sell_i_vega / net_i_vega | Float64 | USD | (date, figi, callput) | Institutional buy / sell / net flow as USD notional × vega. | model | T+1 | 2019-11-10 | 0.0 when no qualifying volume | 31_200_480.80 |
buy_m_shares / sell_m_shares / net_m_shares | Float64 | underlying-share equivalents | (date, figi, callput) | Market-maker buy / sell / net share equivalents. _i + _r + _m ≈ 0 per row. | model | T+1 | 2019-11-10 | 0.0 when no qualifying volume | -130_860.0 |
buy_m_premium / sell_m_premium / net_m_premium | Float64 | USD | (date, figi, callput) | Market-maker dollar premium buy / sell / net. Mirror of _i + _r. | model | T+1 | 2019-11-10 | 0.0 when no qualifying volume | -824_067.10 |
buy_m_delta / sell_m_delta / net_m_delta | Float64 | USD | (date, figi, callput) | Market-maker buy / sell / net flow as USD notional × delta. Mirror of _i + _r. | model | T+1 | 2019-11-10 | 0.0 when no qualifying volume | -85_359_000.00 |
buy_m_gamma / sell_m_gamma / net_m_gamma | Float64 | USD | (date, figi, callput) | Market-maker buy / sell / net flow as USD notional × gamma. | model | T+1 | 2019-11-10 | 0.0 when no qualifying volume | -5_433_300.00 |
buy_m_vega / sell_m_vega / net_m_vega | Float64 | USD | (date, figi, callput) | Market-maker buy / sell / net flow as USD notional × vega. | model | T+1 | 2019-11-10 | 0.0 when no qualifying volume | -40_001_720.00 |
The CP row
callput = 'CP' is a pre-computed call-vs-put row on the same (date, figi) grain, stored alongside the 'C' and 'P' rows (not synthesised at query time). Convention per column type:
- Cohort size columns (
buy_*_shares/sell_*_shares/net_*_shares/buy_*_premium/sell_*_premium/net_*_premiumfor cohortsr,i,m): value is C − P (call side minus put side). Negative values onbuy_*/sell_*are expected on put-heavy names; the sign reflects which side is bigger. - Cohort greek columns (
buy_*_delta/sell_*_delta/net_*_deltaand the_gamma/_vegaequivalents): value is C + P. Put delta is stored negative on the'P'row, soC + Pis naturally signed (positivenet_i_deltaonCP= net long-delta demand from institutions once puts are netted). - Volume context (
n_contracts,total_shares): value is C + P (underlying-level totals across both sides). - Underlying context (
last_underprice,atm_iv_30d): same value as the'C'and'P'rows for the same(date, figi)(underlying-level, not per-side).
Read the CP row for a single call-vs-put summary per underlying per session. For gross activity split by side, read the 'C' and 'P' rows directly.
underlying_option_flows_10_min
What it is
The 10-minute sibling of underlying_option_flows_01_day. Daily option flow collapsed per underlying × callput, resolved at 10-minute cadence. One row per (date, ten_min_timeframe, figi, callput) with callput ∈ {'C', 'P', 'CP'}. Same cohort split and metric families, deliverable-multiplied at ingest.
Why it exists
The daily table answers "what happened today on this name"; this table answers "when during the day did it happen". The intraday footprint of cohort flow often matters more than the aggregate: institutional accumulation into the close looks different from the same volume at the open.
How to use it
Filter on (date, ten_min_timeframe, figi, callput). Same conventions as the daily sibling: pre-multiplied units (no contract_id_mapping join needed), _i + _r + _m ≈ 0 row-level identity, and the CP row as a pre-computed differential (see below).
Join px_10_min on (date, ten_min_timeframe, figi) for the matching price context. Both sides use the same NY-wall-clock bucket convention.
REST cap: 30-day request window per call. For multi-year intraday history pull parquet from gs://prod-us-option-tenmin-underlying/underlying_option_flows/v0/10_min/.
Bucket boundary convention
ten_min_timeframe is the end of the 10-minute bucket, stored as a naive New York wall-clock DateTime. Bucket covers (ten_min_timeframe − 10 min, ten_min_timeframe]. First RTH bucket ends at 09:40:00, last at 16:00:00.
Examples
Opening vs closing institutional flow on SPY. Pull (date, figi=<SPY>, callput='CP') for one session. Split net_i_delta into the 09:40:00 to 10:30:00 buckets (open) and 15:00:00 to 16:00:00 buckets (close) and compare. A big positive close with flat open signals mark-up / rebalancing behaviour; the inverse signals de-risking into the bell.
Headline-timing on a biotech. FDA PDUFA print lands around 14:00 ET. Filter (date, figi=<name>, callput='C') across the 13:40:00 to 14:00:00 buckets. Rising net_i_premium in the three buckets before 14:00 against zero-volume baseline is a leaked-print signal.
- Grain:
(date, ten_min_timeframe, figi, callput)
Fields
| field_name | type | unit | grain | description | provenance | timing_lag | history_start | null_semantics | example |
|---|---|---|---|---|---|---|---|---|---|
date | Date | trading day (UTC) | (date, ten_min_timeframe, figi, callput) | Session date. | exchange | T+1 | 2019-11-10 | never null | 2026-07-24 |
ten_min_timeframe | DateTime | NY wall-clock, bucket close | (date, ten_min_timeframe, figi, callput) | End timestamp of the 10-min bucket (naive NY-time). | exchange | T+1 | 2019-11-10 | never null | 2026-07-24T09:40:00 |
figi | String(12) | identifier | (date, ten_min_timeframe, figi, callput) | Composite FIGI for the underlying. | exchange | n/a | 2019-11-10 | never null | BBG000MM2P62 |
traded_underlying | String | ticker | (date, ten_min_timeframe, figi, callput) | Listed equity ticker on date. Dotted dual-class form. | exchange | T+1 | 2019-11-10 | never null | AAPL |
callput | String(2) | option type | (date, ten_min_timeframe, figi, callput) | 'C' (call side), 'P' (put side), or 'CP' (call-vs-put differential row). | exchange | T+1 | 2019-11-10 | never null | C |
n_contracts | UInt32 | contracts | (date, ten_min_timeframe, figi, callput) | Distinct option contracts traded on this underlying × callput within the bucket. | exchange | T+1 | 2019-11-10 | 0 on no-volume buckets | 48 |
total_shares | Float64 | underlying-share equivalents | (date, ten_min_timeframe, figi, callput) | Sum of all traded volume converted to share equivalents within the bucket (Σ qty × adj_shares_deliverable). | exchange | T+1 | 2019-11-10 | 0.0 on no-volume buckets | 184_500.0 |
last_underprice | Float64 | USD | (date, ten_min_timeframe, figi, callput) | Underlying spot at the last option trade within the bucket. Not split-adjusted. | exchange | T+1 | 2019-11-10 | null on no-volume buckets | 224.10 |
atm_iv_30d | Float64 | annualised vol | (date, ten_min_timeframe, figi, callput) | Best-effort estimate of ATM 30-day implied volatility for the underlying in this bucket. Not derived from a fitted volatility surface. For high-accuracy implied-volatility estimation, particularly on less liquid contracts, we recommend using specialist third-party providers. | derived | T+1 | 2019-11-10 | may be null when the figi had no option activity in the bucket | 0.2418 |
buy_r_shares / sell_r_shares / net_r_shares | Float64 | underlying-share equivalents | (date, ten_min_timeframe, figi, callput) | Retail buy / sell / net share equivalents within the bucket. | model | T+1 | 2019-11-10 | 0.0 when no qualifying volume | 2_410.0 |
buy_r_premium / sell_r_premium / net_r_premium | Float64 | USD | (date, ten_min_timeframe, figi, callput) | Retail dollar premium buy / sell / net. | model | T+1 | 2019-11-10 | 0.0 when no qualifying volume | 31_204.0 |
buy_r_delta / sell_r_delta / net_r_delta | Float64 | USD | (date, ten_min_timeframe, figi, callput) | Retail buy / sell / net flow as USD notional × delta within the bucket. Naturally signed by option type; positive net = net long-delta demand from retail on this call/put side in the bucket. | model | T+1 | 2019-11-10 | 0.0 when no qualifying volume | -387_200.55 |
buy_r_gamma / sell_r_gamma / net_r_gamma | Float64 | USD | (date, ten_min_timeframe, figi, callput) | Retail buy / sell / net flow as USD notional × gamma. | model | T+1 | 2019-11-10 | 0.0 when no qualifying volume | 124_530.30 |
buy_r_vega / sell_r_vega / net_r_vega | Float64 | USD | (date, ten_min_timeframe, figi, callput) | Retail buy / sell / net flow as USD notional × vega. | model | T+1 | 2019-11-10 | 0.0 when no qualifying volume | 880_140.40 |
buy_i_shares / sell_i_shares / net_i_shares | Float64 | underlying-share equivalents | (date, ten_min_timeframe, figi, callput) | Institutional buy / sell / net share equivalents. _i + _r + _m ≈ 0 per row. | model | T+1 | 2019-11-10 | 0.0 when no qualifying volume | 12_845.0 |
buy_i_premium / sell_i_premium / net_i_premium | Float64 | USD | (date, ten_min_timeframe, figi, callput) | Institutional dollar premium buy / sell / net. | model | T+1 | 2019-11-10 | 0.0 when no qualifying volume | 41_203.55 |
buy_i_delta / sell_i_delta / net_i_delta | Float64 | USD | (date, ten_min_timeframe, figi, callput) | Institutional buy / sell / net flow as USD notional × delta. Positive net = net long-delta demand from the institutional class on this call/put side in the bucket. | model | T+1 | 2019-11-10 | 0.0 when no qualifying volume | 8_923_100.00 |
buy_i_gamma / sell_i_gamma / net_i_gamma | Float64 | USD | (date, ten_min_timeframe, figi, callput) | Institutional buy / sell / net flow as USD notional × gamma. | model | T+1 | 2019-11-10 | 0.0 when no qualifying volume | 418_870.70 |
buy_i_vega / sell_i_vega / net_i_vega | Float64 | USD | (date, ten_min_timeframe, figi, callput) | Institutional buy / sell / net flow as USD notional × vega. | model | T+1 | 2019-11-10 | 0.0 when no qualifying volume | 3_120_080.80 |
buy_m_shares / sell_m_shares / net_m_shares | Float64 | underlying-share equivalents | (date, ten_min_timeframe, figi, callput) | Market-maker buy / sell / net share equivalents. | model | T+1 | 2019-11-10 | 0.0 when no qualifying volume | -13_086.0 |
buy_m_premium / sell_m_premium / net_m_premium | Float64 | USD | (date, ten_min_timeframe, figi, callput) | Market-maker dollar premium buy / sell / net. Mirror of _i + _r. | model | T+1 | 2019-11-10 | 0.0 when no qualifying volume | -82_406.71 |
buy_m_delta / sell_m_delta / net_m_delta | Float64 | USD | (date, ten_min_timeframe, figi, callput) | Market-maker buy / sell / net flow as USD notional × delta. Mirror of _i + _r. | model | T+1 | 2019-11-10 | 0.0 when no qualifying volume | -8_535_900.00 |
buy_m_gamma / sell_m_gamma / net_m_gamma | Float64 | USD | (date, ten_min_timeframe, figi, callput) | Market-maker buy / sell / net flow as USD notional × gamma. | model | T+1 | 2019-11-10 | 0.0 when no qualifying volume | -543_330.00 |
buy_m_vega / sell_m_vega / net_m_vega | Float64 | USD | (date, ten_min_timeframe, figi, callput) | Market-maker buy / sell / net flow as USD notional × vega. | model | T+1 | 2019-11-10 | 0.0 when no qualifying volume | -4_001_720.00 |
The CP row
callput = 'CP' is a pre-computed call-vs-put row on the same (date, ten_min_timeframe, figi) grain, stored alongside the 'C' and 'P' rows. Convention per column type:
- Cohort size columns (
buy_*_shares/sell_*_shares/net_*_shares/buy_*_premium/sell_*_premium/net_*_premiumfor cohortsr,i,m): value is C − P (call side minus put side) within the bucket. Negative values onbuy_*/sell_*are expected on put-heavy buckets. - Cohort greek columns (
buy_*_delta/sell_*_delta/net_*_deltaand the_gamma/_vegaequivalents): value is C + P. Put delta is stored negative on the'P'row, soC + Pis naturally signed. - Volume context (
n_contracts,total_shares): value is C + P (bucket totals across both sides). - Underlying context (
last_underprice,atm_iv_30d): same value as the'C'and'P'rows for the same bucket (underlying-level, not per-side).
Read the CP row for a single call-vs-put summary per underlying per bucket. For gross activity split by side, read the 'C' and 'P' rows directly.
underlying_flow_signals_01_day
What it is
The underlying-grain nets from underlying_option_flows_01_day, plus two trailing-window transforms of each metric: a 21-trading-day rolling sum (_21dma) and a 2-year rolling z-score of that sum (z_*). One row per (date, figi, callput) with callput ∈ {'C', 'P', 'CP'}.
Why it exists
Raw daily flow is noisy. The signal story is usually "flow is extreme against the stock's own history", not "flow is extreme in absolute terms". A $50M net call premium is unremarkable on SPY and a monster print on a small-cap. Normalising each raw net against its own 2-year baseline (sum first to smooth, then z-score) collapses the two onto a comparable scale and makes a quintile sort across names meaningful.
Published Masscrest research is built off this transform: the single-name spike predicate at /research/systematic-single-stock-signal and the industry-aggregated long-short performance at /research/industry-flow-signal. All fields are trailing-window only (no forward-looking data), so a row at date = D is safe to act on at close of D or open of D+1.
How to use it
Filter on (date, figi, callput). Grab the raw net, the 21dma, or the z-score depending on what question you're asking.
- Raw net (
net_i_shares,net_i_premium, etc.): one session's cohort flow. Use for single-day event studies. - 21dma (
net_i_shares_21dma, etc.): trailing 21-session sum. Smooths the one-day noise, still trailing-only. - Z-score (
z_net_i_shares_21dma, etc.): the 21dma expressed in units of its own 2-year rolling mean and standard deviation.|z| > 2is the usual "extreme vs own history" threshold.
Each row is scoped to one callput. Filter to a single callput per query or you'll triple-count. Rolling windows partition by (figi, callput) independently, so z(C) + z(P) ≠ z(CP).
The CP row
Size measures (shares, premium) on the CP row are C − P: bullish call flow minus bearish put flow, both of which express the same bullish directional conviction. Greeks (delta, gamma, vega) are C + P: these columns are already signed on the C and P rows (put delta stored negative), so a straight sum gives net book exposure. net_*_delta on the CP row is net directional demand across the whole chain.
Examples
Spike screen. Filter callput='CP' and z_net_i_premium_21dma > 2 on a given date. Returns the names where institutional call-minus-put premium flow this month is more than two standard deviations above the name's own 2-year baseline.
Cohort-divergence signal. Compare z_net_i_delta vs z_net_r_delta on the same (date, figi, callput='CP'). Opposite signs flag names where institutions and retail are positioned against each other, a setup the flagship signals validate at single-name grain.
Signal design
The calculation is deliberately simple:
_21dma= 21-trading-day rolling SUM of the raw daily net, partitioned by(figi, callput). (Named for legacy reasons: it's a sum, not a mean, but the z-score is identical either way.)z_net_*_21dma= z-score of_21dmaagainst its 2-year (504 trading day) trailing mean and sample standard deviation. Minimum 63 non-null observations in the trailing window required, else null. Rounded to 2 decimals.
Masscrest does not cap, winsorise, or otherwise regularise the output. Z-scores can reach 3 or 4 SD during earnings, M&A, and macro catalysts. Keeping the formula plain avoids overfitting to any specific regime and lets clients replicate the transform end-to-end from underlying_option_flows_01_day.
Transform chain: daily net, then 21-day trailing sum (_21dma), then z-score against the 2y rolling μ/σ of the 21dma (z_*).
Warm-up
All fields computed from 2019-11-10 forward. The 21dma needs 21 non-null daily nets; the z-score needs at least 63 non-null observations in the trailing 504-session window. Below threshold, the value is null.
- Grain:
(date, figi, callput)wherecallput ∈ {'C', 'P', 'CP'}.
Fields
| field_name | type | unit | grain | description | provenance | timing_lag | history_start | null_semantics | example |
|---|---|---|---|---|---|---|---|---|---|
date | Date | trading day (UTC) | (date, figi, callput) | Session date. US equity trading calendar. | exchange | T+1 | 2019-11-10 | never null | 2026-07-24 |
figi | String(12) | identifier | (date, figi, callput) | Composite FIGI for the underlying. Stable across ticker changes; join key to stock_mapping, px_01_day, split_factors. | exchange | n/a | 2019-11-10 | never null | BBG000MM2P62 |
underlying_ticker | String | ticker | (date, figi, callput) | Point-in-time listed equity ticker on date. Dotted dual-class form (BRK.B). Named underlying_ticker here rather than traded_underlying; the API SELECT aliases it back to traded_underlying on the wire. | exchange | T+1 | 2019-11-10 | never null | AAPL |
callput | LowCardinality(String) | enum | (date, figi, callput) | One of 'C', 'P', 'CP'. See the callput note above for the CP synthesis rule. | derived | T+1 | 2019-11-10 | never null | CP |
net_i_shares | Float64 | underlying-share equivalents | (date, figi, callput) | Institutional net share-equivalent flow for the callput bucket. Calculated as sum(net_i_qty × adj_shares_deliverable): the underlying-share equivalent of the traded contracts (standard contract = 100 shares, adjusted for corporate actions). On callput='CP' rows: C − P (bullish-conviction sign convention). | model | T+1 | 2019-11-10 | 0.0 when no qualifying institutional flow | 18_450.0 |
net_r_shares | Float64 | underlying-share equivalents | (date, figi, callput) | Retail net share-equivalent flow. Same formula (sum(net_r_qty × adj_shares_deliverable)) and CP-synthesis rule as net_i_shares. | model | T+1 | 2019-11-10 | 0.0 when no qualifying retail flow | 4_120.0 |
net_i_premium | Float64 | USD | (date, figi, callput) | Institutional net dollar premium flow. On CP rows: C − P. | model | T+1 | 2019-11-10 | 0.0 when no qualifying institutional flow | 1_820_038.55 |
net_r_premium | Float64 | USD | (date, figi, callput) | Retail net dollar premium flow. | model | T+1 | 2019-11-10 | 0.0 when no qualifying retail flow | 312_040.0 |
net_i_delta | Float64 | USD | (date, figi, callput) | Institutional net flow as USD notional × delta. Naturally signed; positive = net long-delta demand. On CP rows: C + P (delta is signed by option type; put deltas are stored negative, so a straight sum gives net directional demand). | model | T+1 | 2019-11-10 | 0.0 when no qualifying institutional flow | 12_530_000.00 |
net_r_delta | Float64 | USD | (date, figi, callput) | Retail net flow as USD notional × delta. | model | T+1 | 2019-11-10 | 0.0 when no qualifying retail flow | -870_000.00 |
net_i_gamma | Float64 | USD × gamma | (date, figi, callput) | Institutional net flow as USD notional × gamma. On CP rows: C + P (gamma is naturally signed by option type). Positive = net gamma demand. | model | T+1 | 2019-11-10 | 0.0 when no qualifying institutional flow | 84_000.0 |
net_r_gamma | Float64 | USD × gamma | (date, figi, callput) | Retail net gamma flow. | model | T+1 | 2019-11-10 | 0.0 when no qualifying retail flow | 12_100.0 |
net_i_vega | Float64 | USD × vega | (date, figi, callput) | Institutional net flow as USD notional × vega. On CP rows: C + P. Positive = net long-vol demand. | model | T+1 | 2019-11-10 | 0.0 when no qualifying institutional flow | 1_400_000.0 |
net_r_vega | Float64 | USD × vega | (date, figi, callput) | Retail net vega flow. | model | T+1 | 2019-11-10 | 0.0 when no qualifying retail flow | -210_000.0 |
net_i_shares_21dma | Float64 | underlying-share equivalents | (date, figi, callput) | Rolling sum of net_i_shares over the prior 21 trading days (inclusive of date), scoped to this callput. | derived | T+1 | 2019-11-10 | null when the trailing 21-day window has fewer than 21 non-null observations | 319_284.0 |
net_r_shares_21dma | Float64 | underlying-share equivalents | (date, figi, callput) | Rolling 21-day sum of net_r_shares. | derived | T+1 | 2019-11-10 | null when the trailing 21-day window has fewer than 21 non-null observations | 68_040.0 |
net_i_premium_21dma | Float64 | USD | (date, figi, callput) | Rolling 21-day sum of net_i_premium. | derived | T+1 | 2019-11-10 | null when the trailing 21-day window has fewer than 21 non-null observations | 25_294_500.0 |
net_r_premium_21dma | Float64 | USD | (date, figi, callput) | Rolling 21-day sum of net_r_premium. | derived | T+1 | 2019-11-10 | null when the trailing 21-day window has fewer than 21 non-null observations | 5_040_252.0 |
net_i_delta_21dma | Float64 | USD | (date, figi, callput) | Rolling 21-day sum of net_i_delta. | derived | T+1 | 2019-11-10 | null when the trailing 21-day window has fewer than 21 non-null observations | 206_220_000.0 |
net_r_delta_21dma | Float64 | USD | (date, figi, callput) | Rolling 21-day sum of net_r_delta. | derived | T+1 | 2019-11-10 | null when the trailing 21-day window has fewer than 21 non-null observations | -13_020_000.0 |
net_i_gamma_21dma | Float64 | USD × gamma | (date, figi, callput) | Rolling 21-day sum of net_i_gamma. | derived | T+1 | 2019-11-10 | null when the trailing 21-day window has fewer than 21 non-null observations | 1_512_000.0 |
net_r_gamma_21dma | Float64 | USD × gamma | (date, figi, callput) | Rolling 21-day sum of net_r_gamma. | derived | T+1 | 2019-11-10 | null when the trailing 21-day window has fewer than 21 non-null observations | 218_400.0 |
net_i_vega_21dma | Float64 | USD × vega | (date, figi, callput) | Rolling 21-day sum of net_i_vega. | derived | T+1 | 2019-11-10 | null when the trailing 21-day window has fewer than 21 non-null observations | 24_780_000.0 |
net_r_vega_21dma | Float64 | USD × vega | (date, figi, callput) | Rolling 21-day sum of net_r_vega. | derived | T+1 | 2019-11-10 | null when the trailing 21-day window has fewer than 21 non-null observations | -3_780_000.0 |
z_net_i_shares_21dma | Float64 | z-score | (date, figi, callput) | Z-score of net_i_shares_21dma against its trailing 2-year rolling mean and sample standard deviation, computed at query time. Rounded to 2 decimals on emit. | derived | T+1 | 2019-11-10 | null when the trailing 2y window has fewer than 63 non-null observations or its sample stddev is 0 | 1.34 |
z_net_r_shares_21dma | Float64 | z-score | (date, figi, callput) | Same construction as z_net_i_shares_21dma, applied to the retail 21dma. | derived | T+1 | 2019-11-10 | null when the trailing 2y window is unwarmed or its sample stddev is 0 | 0.42 |
z_net_i_premium_21dma | Float64 | z-score | (date, figi, callput) | Standardised institutional-premium 21dma vs its 2y baseline. | derived | T+1 | 2019-11-10 | null when the trailing 2y window is unwarmed or its sample stddev is 0 | 1.18 |
z_net_r_premium_21dma | Float64 | z-score | (date, figi, callput) | Standardised retail-premium 21dma vs its 2y baseline. | derived | T+1 | 2019-11-10 | null when the trailing 2y window is unwarmed or its sample stddev is 0 | -0.24 |
z_net_i_delta_21dma | Float64 | z-score | (date, figi, callput) | Standardised institutional-delta 21dma vs its 2y baseline. Masscrest's canonical "spike" predicate is z > 2 (2σ) or z > 3 (3σ) with callput = 'CP'. | derived | T+1 | 2019-11-10 | null when the trailing 2y window is unwarmed or its sample stddev is 0 | 2.08 |
z_net_r_delta_21dma | Float64 | z-score | (date, figi, callput) | Standardised retail-delta 21dma vs its 2y baseline. | derived | T+1 | 2019-11-10 | null when the trailing 2y window is unwarmed or its sample stddev is 0 | -0.55 |
z_net_i_gamma_21dma | Float64 | z-score | (date, figi, callput) | Standardised institutional-gamma 21dma vs its 2y baseline. | derived | T+1 | 2019-11-10 | null when the trailing 2y window is unwarmed or its sample stddev is 0 | 0.86 |
z_net_r_gamma_21dma | Float64 | z-score | (date, figi, callput) | Standardised retail-gamma 21dma vs its 2y baseline. | derived | T+1 | 2019-11-10 | null when the trailing 2y window is unwarmed or its sample stddev is 0 | 0.11 |
z_net_i_vega_21dma | Float64 | z-score | (date, figi, callput) | Standardised institutional-vega 21dma vs its 2y baseline. Masscrest's ≤ −3σ vega tail is historically followed by ~1.6 vol-point IV declines over 21 days. | derived | T+1 | 2019-11-10 | null when the trailing 2y window is unwarmed or its sample stddev is 0 | -1.42 |
z_net_r_vega_21dma | Float64 | z-score | (date, figi, callput) | Standardised retail-vega 21dma vs its 2y baseline. | derived | T+1 | 2019-11-10 | null when the trailing 2y window is unwarmed or its sample stddev is 0 | 0.30 |
Z-score precision
z_* fields are rounded to 2 decimals on emit. When comparing a client-side derived spike predicate (z > 2) against the rounded value, expect edge cases on low-vol names where the true unrounded z sits just under 2.00 but the rounded value equals 2.00.
CP synthesis is pre-computed, not query-time
The 'CP' rows are materialised at publish time, not derived at query time. Each (figi, callput) bucket has its own independent 21dma and 2y baseline trajectory; z_net_i_delta_21dma on the CP row is derived from CP's own trailing series, not from summing per-side z-scores.
grouped_flow_signal_01_day
What it is
Daily flow signals rolled up above the single-name level. Same transform chain as underlying_flow_signals_01_day (raw net, then 21-day trailing sum, then 2-year rolling z-score), but aggregated across groups: sector, industry, ETF, ADR, single-stock-aggregate, and market-wide. One row per (date, group_key, callput).
Why it exists
Single-name signals get noisy and hard to compare across the universe. A sector- or industry-level roll-up smooths the noise, surfaces regime shifts that show up as cross-stock coordination, and gives you a universe-level dial on the retail vs institutional gap. Masscrest's industry-aggregated long-short validation at /research/industry-flow-signal runs off this table.
How to use it
Filter on (date, group_key, callput). group_key is a single string column that holds either the canonical sector name (Technology, Financial Services, ...), the canonical industry name (Semiconductors, Software - Application, ...), or one of the four rollup literals (etf, adr, single_stock, all). The REST endpoint accepts the same values case-insensitively on group_type and echoes them back in group_key.
As with underlying_flow_signals_01_day: filter to one callput per query, and read the raw / 21dma / z-score column depending on what you're asking.
Examples
Sector-rotation scan. Pull group_type='sector', callput='CP', one trading day. Sort z_net_i_premium_21dma descending. Top rows are the sectors where institutional net premium over the trailing month is most extreme against the sector's own 2-year baseline. Compare against the bottom rows for rotation candidates.
Industry-level long/short screen. Daily cross-section on group_type='industry', callput='CP', filtered to n_figi >= 10 (drop thin-breadth days), long the top quintile of z_net_i_delta_21dma, short the bottom quintile. This is the construction the /research/industry-flow-signal validation uses.
- Grain:
(date, group_key, callput)
Group semantics
Query group_type | group_key shape (on the row) | Row count per (date, callput) | Notes |
|---|---|---|---|
sector | Canonical mixed-case sector name (e.g. Technology, Financial Services) | ~11 distinct values | Excludes ETFs and ADRs. Figis missing a sector label drop from these rows. |
industry | Canonical mixed-case industry name (e.g. Semiconductors, Software - Application) | ~150 distinct values (matches the reference industry taxonomy on stock_mapping) | Excludes ETFs and ADRs. Same drop-on-missing rule. Every industry-day is emitted (gap-free time series) with n_figi populated for downstream filtering (see "Thin-industry handling" below). |
etf | Literal string etf | 1 | Aggregate over all figis with isEtf='true' in the latest-known phase (live or delisted). |
adr | Literal string adr | 1 | Aggregate over all figis with isAdr='true' in the latest-known phase (live or delisted). |
single_stock | Literal string single_stock | 1 | Everything else (non-ETF, non-ADR). Figis missing from stock_mapping are treated as single_stock. |
all | Literal string all | 1 | Every figi in the flow universe, no filter. |
Valid sector values
The ~11 distinct group_key strings emitted when group_type = 'sector'. Case-insensitive on input; canonical mixed-case on the wire. As-of 2026-08-14 snapshot; may drift as figis are reclassified or new sectors are added.
| Sector | Description |
|---|---|
Basic Materials | Companies extracting and processing raw commodities used across the economy: metals and mining, chemicals, forestry, and construction materials. Cyclically exposed to global industrial demand. |
Communication Services | Firms that carry information or entertainment to end users: telecom carriers, media conglomerates, interactive-media platforms, publishers, and gaming. Combines legacy telecom with digital-native content. |
Consumer Cyclical | Businesses selling discretionary goods and services whose demand rises and falls with the business cycle: automakers, apparel, restaurants, travel, leisure, and specialty retail. Highly sensitive to consumer confidence. |
Consumer Defensive | Producers of everyday essentials that consumers buy regardless of the economy: packaged food, beverages, tobacco, household staples, and discount retailers. Stable revenue through downturns. |
Energy | The oil, gas, coal and related supply chain: exploration and production, refining, midstream infrastructure, and oilfield services. Tied to commodity prices and global demand cycles. |
Financial Services | Firms that intermediate capital: banks, insurers, asset managers, brokerages, exchanges, and credit-services companies. Rate-sensitive and cycle-exposed. |
Healthcare | Businesses across the health value chain: drug and biotech developers, medical-device makers, diagnostics labs, healthcare providers, health insurers, and pharma distributors. Mix of defensive demand and secular growth. |
Industrials | Capital goods and services that keep the economy moving: aerospace, defence, machinery, transportation, construction, and logistics. Cyclically exposed to capex spending. |
Real Estate | Property-owning and property-servicing companies, dominated by REITs across residential, retail, office, industrial, healthcare, and specialty sub-types. Highly interest-rate-sensitive. |
Technology | Hardware and software firms including semiconductors, application and infrastructure software, IT services, computer hardware, and consumer electronics. Growth-biased, with high cyclicality on the semiconductor side. |
Utilities | Regulated and independent providers of electricity, natural gas, water, and renewable power. Defensive cash flows, bond-like return profile. |
Valid industry values
| Industry | Description |
|---|---|
Advertising Agencies | Agencies that plan, create and place advertising across traditional and digital channels for brand and direct-response clients. |
Aerospace & Defense | Manufacturers of civil aircraft, military platforms, missiles, satellites and defence-electronics systems for governments and commercial airlines. |
Agricultural - Machinery | Producers of tractors, combines, harvesters and other equipment used in commercial farming. |
Agricultural Farm Products | Growers, processors and marketers of grains, oilseeds, produce, meat and other primary agricultural output. |
Agricultural Inputs | Suppliers of seeds, fertilisers, pesticides and other inputs consumed by farms. |
Airlines, Airports & Air Services | Passenger and cargo airlines, airport operators, ground-handling firms and other air-transport service providers. |
Aluminum | Miners, smelters and rolled-product manufacturers of aluminium. |
Apparel - Footwear & Accessories | Designers and makers of shoes, handbags, jewellery, watches and other fashion accessories. |
Apparel - Manufacturers | Companies that design and produce clothing lines under owned or licensed brands. |
Apparel - Retail | Retailers selling clothing and accessories through stores or online, including specialty and off-price chains. |
Asset Management | Firms managing pooled investment vehicles (mutual funds, ETFs, separate accounts) across broad multi-asset strategies. |
Asset Management - Bonds | Managers specialising in fixed-income mutual funds and bond ETFs. |
Asset Management - Cryptocurrency | Managers of cryptocurrency-linked funds, trusts and ETFs. |
Asset Management - Global | Managers of internationally-diversified equity and multi-asset funds. |
Asset Management - Income | Managers focused on dividend-equity and income-oriented fund products. |
Asset Management - Leveraged | Sponsors of leveraged and inverse ETFs. |
Auto - Dealerships | Retailers of new and used vehicles, plus related service, parts and financing operations. |
Auto - Manufacturers | OEMs producing passenger cars, trucks and, increasingly, electric vehicles. |
Auto - Parts | Suppliers of components, systems and modules used in vehicle assembly and aftermarket repair. |
Auto - Recreational Vehicles | Makers of RVs, motorcycles, boats and other personal-use motorised recreational vehicles. |
Banks - Diversified | Large multi-line banks combining consumer, commercial, investment-banking and wealth divisions. |
Banks - Regional | Banks concentrated in a specific geographic footprint, focused on retail deposits and commercial lending. |
Beverages - Alcoholic | Brewers, distillers and vintners producing beer, spirits and packaged alcoholic drinks at scale. |
Beverages - Non-Alcoholic | Producers of soft drinks, bottled water, juices, energy drinks and other non-alcoholic packaged beverages. |
Beverages - Wineries & Distilleries | Craft and specialty wine and spirits producers, generally smaller-scale than the mass-market alcoholic-beverage majors. |
Biotechnology | Companies developing novel therapeutics using biological processes, typically pre-commercial or single-product-focused. |
Broadcasting | Owners of TV and radio stations, local networks and syndicated content distributors. |
Business Equipment & Supplies | Manufacturers of office equipment, printers, copiers and workplace supplies. |
Chemicals | Producers of commodity petrochemicals, plastics, industrial gases and basic chemical intermediates. |
Chemicals - Specialty | Producers of higher-value differentiated chemicals used in coatings, adhesives, catalysts and formulations. |
Coal | Miners and marketers of thermal and metallurgical coal. |
Communication Equipment | Makers of network hardware, routers, switches and telecom infrastructure gear. |
Computer Hardware | Manufacturers of PCs, servers, storage systems and other computing hardware. |
Conglomerates | Multi-industry holding companies spanning several unrelated business lines. |
Construction | General contractors and construction firms building commercial, industrial and infrastructure projects. |
Construction Materials | Producers of cement, aggregates, gypsum, insulation and other bulk building materials. |
Consulting Services | Management, technology, HR and strategy consulting firms selling professional advisory services. |
Consumer Electronics | Makers of smartphones, tablets, audio devices, wearables and other consumer-facing electronic products. |
Copper | Miners and processors of copper ore and refined copper products. |
Department Stores | Multi-category retailers under a single store format spanning apparel, home and accessories. |
Discount Stores | Mass-market retailers competing primarily on price across broad general merchandise. |
Diversified Utilities | Utilities operating across multiple regulated categories (electric, gas, water) rather than a single service. |
Drug Manufacturers - General | Large pharmaceutical companies with broad marketed portfolios and multi-therapeutic pipelines. |
Drug Manufacturers - Specialty & Generic | Pharma companies focused on generic drugs, biosimilars or niche specialty therapeutic areas. |
Education & Training Services | For-profit universities, career schools, tutoring and corporate training providers. |
Electrical Equipment & Parts | Manufacturers of electrical components, motors, transformers, cables and industrial electrical systems. |
Electronic Gaming & Multimedia | Video-game publishers, developers, esports operators and interactive-entertainment firms. |
Engineering & Construction | Firms providing engineering-design and heavy-construction services for large infrastructure projects. |
Entertainment | Film, TV and content-production studios and integrated entertainment companies. |
Environmental Services | Waste-water treatment, environmental consulting and remediation service providers. |
Financial - Capital Markets | Investment banks, broker-dealers and trading firms operating in equity, fixed-income and derivatives markets. |
Financial - Conglomerates | Diversified financial holding companies spanning several finance subsectors. |
Financial - Credit Services | Consumer-finance companies, credit-card networks, payment processors and buy-now-pay-later providers. |
Financial - Data & Stock Exchanges | Exchange operators, index providers, financial-data vendors and market-infrastructure firms. |
Financial - Diversified | Miscellaneous financial-services companies that do not fit the more specific finance subsectors. |
Financial - Mortgages | Mortgage originators, servicers and secondary-market intermediaries. |
Food Confectioners | Producers of chocolate, candy, chewing gum and other confectionery products. |
Food Distribution | Wholesalers distributing food and related goods to restaurants, retailers and institutional customers. |
Furnishings, Fixtures & Appliances | Makers of home furniture, bedding, kitchen appliances and household fixtures. |
Gambling, Resorts & Casinos | Operators of casinos, integrated resorts and online-gambling platforms. |
General Transportation | Diversified transportation companies that do not fit the more specific rail, trucking or air subsectors. |
Gold | Miners and refiners of gold ore and physical gold, plus gold-focused streaming and royalty firms. |
Grocery Stores | Traditional supermarkets and grocery chains selling food and household goods. |
Hardware, Equipment & Parts | General hardware and industrial-equipment manufacturers and distributors. |
Home Improvement | Big-box home-improvement retailers and specialty tool, paint and hardware chains. |
Household & Personal Products | Manufacturers of cleaning products, personal-care items and consumer packaged household goods. |
Independent Power Producers | Non-utility power generators selling electricity into wholesale or contracted markets. |
Industrial - Distribution | Wholesalers of industrial equipment, parts, fasteners and MRO supplies. |
Industrial - Infrastructure Operations | Operators of ports, pipelines, terminals and other industrial-infrastructure assets. |
Industrial - Machinery | Manufacturers of heavy machinery for construction, mining, agriculture and industrial processes. |
Industrial - Pollution & Treatment Controls | Providers of air, water and industrial pollution-control equipment and services. |
Industrial - Specialties | Specialty industrial firms in niche categories that do not fit broader industrial subsectors. |
Industrial Materials | Producers of steel-alternatives, industrial ceramics, composites and other engineered materials. |
Information Technology Services | IT-consulting, systems-integration, outsourcing and managed-services firms. |
Insurance - Brokers | Insurance and reinsurance brokers acting as intermediaries between clients and underwriters. |
Insurance - Diversified | Multi-line insurers writing across life, P&C and other coverage types. |
Insurance - Life | Insurers focused on individual and group life insurance, plus annuity products. |
Insurance - Property & Casualty | Insurers writing property, auto, liability and other short-tail coverage. |
Insurance - Reinsurance | Firms providing insurance to primary insurers to cover concentrated or catastrophic risk. |
Insurance - Specialty | Insurers focused on niche or hard-to-place risks (marine, aviation, cyber, professional liability). |
Integrated Freight & Logistics | Multi-modal freight and logistics operators spanning trucking, rail, air and ocean. |
Internet Content & Information | Digital-content platforms, search engines, social networks and online-information providers. |
Investment - Banking & Investment Services | Full-service investment banks and firms providing M&A, underwriting and advisory services. |
Leisure | Manufacturers of leisure goods, hobby products, toys and personal-recreation equipment. |
Luxury Goods | Producers of high-end fashion, jewellery, watches, leather goods and other luxury consumer categories. |
Manufacturing - Metal Fabrication | Firms fabricating metal parts, structures and assemblies for industrial and consumer use. |
Manufacturing - Miscellaneous | Diversified manufacturers that do not fit more specific industrial subsectors. |
Manufacturing - Textiles | Producers of yarn, fabric and finished textiles for apparel and industrial applications. |
Manufacturing - Tools & Accessories | Makers of power tools, hand tools and related industrial and consumer tool accessories. |
Marine Shipping | Ocean-freight carriers operating tankers, dry-bulk vessels and container ships. |
Media & Entertainment | Diversified media conglomerates spanning television, film, publishing and digital content. |
Medical - Care Facilities | Hospital operators, nursing-home chains and specialty care-facility providers. |
Medical - Devices | Manufacturers of medical implants, surgical tools, monitoring and therapeutic devices. |
Medical - Diagnostics & Research | Clinical-diagnostics labs, life-science research tools and diagnostic-imaging providers. |
Medical - Distribution | Wholesale distributors of drugs, medical supplies and healthcare products. |
Medical - Equipment & Services | Providers of medical equipment plus related installation, maintenance and services. |
Medical - Healthcare Information Services | Health-IT firms providing electronic health records, clinical software and data-analytics platforms. |
Medical - Healthcare Plans | Managed-care organisations and health-insurance plans covering employer, individual and government populations. |
Medical - Instruments & Supplies | Manufacturers of medical instruments, consumables and disposable healthcare supplies. |
Medical - Pharmaceuticals | Broadly-focused pharmaceutical companies not classified under the more specific drug-manufacturer subsectors. |
Medical - Specialties | Specialty medical companies operating in niche healthcare categories. |
Oil & Gas Drilling | Contract drilling firms operating onshore and offshore rigs for oil-and-gas producers. |
Oil & Gas Energy | Diversified oil-and-gas firms that do not fit the more specific upstream, midstream or downstream categories. |
Oil & Gas Equipment & Services | Oilfield-services providers offering drilling, completion and reservoir-management equipment and expertise. |
Oil & Gas Exploration & Production | Upstream producers exploring for and producing crude oil and natural gas. |
Oil & Gas Integrated | Integrated majors operating across upstream, midstream and downstream oil-and-gas businesses. |
Oil & Gas Midstream | Pipelines, storage terminals and processing operators moving oil and gas from wellhead to market. |
Oil & Gas Refining & Marketing | Downstream refiners and fuel-marketing companies converting crude into gasoline, diesel and petrochemical feedstocks. |
Other Precious Metals | Miners of platinum, palladium and other precious metals not classified under gold or silver. |
Packaged Foods | Producers of branded packaged and processed foods sold through retail and foodservice channels. |
Packaging & Containers | Manufacturers of paper, plastic, glass and metal packaging for consumer and industrial products. |
Paper, Lumber & Forest Products | Producers of pulp, paper, lumber and other wood-based industrial and consumer products. |
Personal Products & Services | Personal-care product makers, beauty firms and personal-services businesses. |
Publishing | Publishers of books, newspapers, magazines and other periodical content in print and digital. |
REIT - Diversified | REITs owning property portfolios spanning multiple real-estate categories. |
REIT - Healthcare Facilities | REITs owning hospitals, medical-office buildings, senior housing and other healthcare properties. |
REIT - Hotel & Motel | REITs owning hotel, motel and hospitality properties. |
REIT - Industrial | REITs owning warehouses, logistics facilities and light-industrial properties. |
REIT - Mortgage | Mortgage REITs earning spread on residential and commercial mortgage assets rather than owning property directly. |
REIT - Office | REITs owning office buildings across urban and suburban markets. |
REIT - Residential | REITs owning apartment buildings, single-family rentals and manufactured-home communities. |
REIT - Retail | REITs owning shopping malls, strip centres and standalone retail properties. |
REIT - Specialty | REITs owning niche property types such as data centres, cell towers, self-storage and infrastructure. |
Railroads | Class I and short-line freight-rail operators plus passenger-rail companies. |
Real Estate - Development | Property developers building residential, commercial and mixed-use projects for sale or lease. |
Real Estate - Diversified | Diversified real-estate operating companies not structured as REITs. |
Real Estate - Services | Real-estate brokerages, property-management firms and title-and-appraisal services. |
Regulated Electric | Rate-regulated electric utilities serving retail customers in defined service territories. |
Regulated Gas | Rate-regulated natural-gas distribution utilities. |
Regulated Water | Rate-regulated water and wastewater utilities. |
Renewable Utilities | Utilities and power generators focused on solar, wind, hydro and other renewable-energy assets. |
Rental & Leasing Services | Firms renting equipment, vehicles and other assets to industrial and consumer customers. |
Residential Construction | Homebuilders constructing single-family homes and residential communities for sale. |
Restaurants | Restaurant operators and franchisors across quick-service, casual-dining and fine-dining categories. |
Security & Protection Services | Providers of guarding, cash-in-transit, alarm-monitoring and security-technology services. |
Semiconductors | Designers and manufacturers of integrated circuits, memory, logic chips and related semiconductor equipment. |
Shell Companies | Publicly-listed holding entities without significant operations, often SPACs or blank-check vehicles. |
Silver | Miners and refiners of silver ore and silver products. |
Software - Application | Vendors of packaged and SaaS application software for business, industry-vertical and consumer use. |
Software - Infrastructure | Vendors of infrastructure software including databases, operating systems, security and developer tools. |
Software - Services | Software-enabled services firms delivering platform-hosted business solutions. |
Solar | Manufacturers of solar panels, inverters and installers of solar-power systems. |
Specialty Business Services | Business-services firms in specialty categories (data processing, marketing services, testing, inspection). |
Specialty Retail | Retailers focused on specific product categories such as electronics, sporting goods, jewellery or auto parts. |
Staffing & Employment Services | Temporary-staffing, executive-search and human-capital-management firms. |
Steel | Integrated and mini-mill producers of carbon and specialty steel products. |
Technology Distributors | Distributors of IT hardware, software and networking products to resellers and enterprise buyers. |
Telecommunications Services | Wireless and wireline telecom carriers providing voice and data services to consumers and businesses. |
Tobacco | Cigarette manufacturers plus producers of cigars, smokeless tobacco and next-generation nicotine products. |
Travel Lodging | Hotel and lodging operators and franchisors across the value, mid-scale and luxury segments. |
Travel Services | Online travel agencies, tour operators and travel-booking platforms. |
Trucking | Long-haul and less-than-truckload freight-trucking companies. |
Uranium | Miners of uranium ore and producers of nuclear-fuel feedstock. |
Waste Management | Solid-waste collection, disposal, recycling and hazardous-waste management firms. |
Signal formula
_21dma= 21-trading-day rolling SUM of the raw group-level net, PARTITION BY(group_key, callput). (Historically shipped as a rolling mean; arithmetically equivalent for the z-score, since the sum is just the mean multiplied by 21. The distributed series is now the sum.)z_net_*_21dma= z-score of_21dmaagainst its 2-year (504 trading day) trailing mean and sample standard deviation, computed at query time. Minimum 63 non-null observations in the trailing window required, else null. Rounded to 2 decimals on emit.
Every industry-day is emitted with populated rolling / z fields. The 21dma and 2y baseline include ALL days regardless of n_figi. Thin days contribute their (smaller) raw values to the trailing window, so each industry's z is calibrated against its own historical breadth mix and populates on every day. Cross-industry z magnitudes aren't directly comparable when breadth profiles differ meaningfully; filter on n_figi at query time if comparability matters. See "Thin-industry handling" below.
Aggregate identities
single_stock + etf + adr = allper (date, callput), 0 residual.sum(sector) ≈ single_stockper (date, callput); small residual (< 1% of gross flow) attributable to single-stock figis without a sector label.- Because sector / industry exclude ETFs and ADRs,
sum(sector) ≠ all. The difference is precisely theetf + adrgross flow. Historical rollups produced before 2026-08-11 rolled ETFs+ADRs into sector; those runs have been superseded. sum(industry) ≈ single_stockper (date, callput). Every industry row (thin or full-breadth) contributes its raw flow to the sum, so this identity holds tighter than it did before 2026-08-28.
Thin-industry handling
Every group with any flow on a given date is emitted, so the time series is gap-free. Every row (thin or full-breadth) carries populated raw daily nets AND populated rolling / z fields:
n_figiis populated with the honest constituent count (visible in the response); consumers filter thin-breadth days at query time.- Raw daily nets (
net_i_shares,net_r_shares, ...,net_r_vega) are populated with the actual group sum. - Rolling / derived columns (
_21dma,z_*) are populated on every row. The 21dma and 2y baseline include ALL days regardless ofn_figi. Thin days contribute their (smaller) raw values to the trailing window and to the 2y μ/σ used to z-score. Each industry's z-score is therefore calibrated against its own historical breadth mix: a chronically-thin industry's baseline is set to its own thin-day scale, so z fires when flow is unusually large for that industry. Cross-industry z magnitudes aren't directly comparable when breadth profiles differ meaningfully (a +2σ on a 5-FIGI industry is not directly comparable to a +2σ on a 50-FIGI industry). Filter onn_figiat query time when magnitude comparability matters.
Classification is not strictly PIT
The underlying flow data is point-in-time, but each figi's sector, industry, and ETF / ADR classification uses the most recent labelling rather than the label in force at the time. META, for example, rolls up under Communication Services for its entire history even though it was classified as Technology in 2019. This keeps historical rollups comparable under a single consistent scheme as companies drift between sectors over time.
callput semantics
Every row is scoped to one callput bucket. C = calls only, P = puts only, CP = pre-computed combined view. Two rules apply on the CP row, split by metric family: size measures (shares, premium) are C − P (unsigned magnitudes, sign-flipped on puts to produce a directional bullish-minus-bearish net); greeks (delta, gamma, vega) are C + P (already signed by option type on the C and P rows, so a straight sum captures net book exposure). Rolling windows partition by (group_key, callput); each callput row has its own independent trailing 21dma and 2y baseline, so z(C) + z(P) ≠ z(CP). Filter to exactly one callput per query or triple-count.
Fields
| field_name | type | unit | grain | description | provenance | timing_lag | history_start | null_semantics | example |
|---|---|---|---|---|---|---|---|---|---|
date | Date | trading day (UTC) | (date, group_key, callput) | Session date. US equity trading calendar. | exchange | T+1 | 2019-11-10 | never null | 2026-07-24 |
group_key | LowCardinality(String) | text | key | Canonical mixed-case sector or industry name (e.g. Communication Services, Semiconductors); or the literal etf / adr / single_stock / all for the rollup branches. Single key column, the same value you pass in the REST group_type query parameter. | derived | T+1 | 2019-11-10 | never null | Technology |
callput | LowCardinality(String) | enum | key | One of C, P, CP. See the callput note above. | derived | T+1 | 2019-11-10 | never null | CP |
n_figi | Nullable(Int64) | count | (date, group_key, callput) | Number of distinct FIGIs contributing to this group-day. Every row is emitted with raw nets AND rolling / z fields populated; the 21dma and 2y baseline include all days regardless of n_figi, so each industry's z is calibrated against its own historical breadth mix. Consumers filter on n_figi at query time when z-magnitude comparability across breadth matters. Sector, etf, adr, single_stock, and all branches always carry n_figi >> 10; only certain industries can dip below. | derived | T+1 | 2019-11-10 | never null in practice | 24 |
net_i_shares | Float64 | underlying-share equivalents | (date, group_key, callput) | Institutional net share-equivalent flow, summed across every figi in this grouping. On CP rows: C − P (bullish-conviction sign convention). Populated on every emitted row (even n_figi < 10 days). | model | T+1 | 2019-11-10 | 0.0 when no qualifying institutional flow | 1_820_000.0 |
net_r_shares | Float64 | underlying-share equivalents | (date, group_key, callput) | Retail net share-equivalent flow, same CP-synthesis rule. | model | T+1 | 2019-11-10 | 0.0 when no qualifying retail flow | 412_000.0 |
net_i_premium | Float64 | USD | (date, group_key, callput) | Institutional net dollar premium flow. | model | T+1 | 2019-11-10 | 0.0 when no qualifying institutional flow | 182_000_000.0 |
net_r_premium | Float64 | USD | (date, group_key, callput) | Retail net dollar premium flow. | model | T+1 | 2019-11-10 | 0.0 when no qualifying retail flow | 31_000_000.0 |
net_i_delta | Float64 | USD | (date, group_key, callput) | Institutional net USD × delta flow. On CP rows: C + P (delta is signed by option type; put deltas are stored negative). Positive = net long-delta demand across the grouping. | model | T+1 | 2019-11-10 | 0.0 when no qualifying institutional flow | 1_250_000_000.0 |
net_r_delta | Float64 | USD | (date, group_key, callput) | Retail net USD × delta flow. | model | T+1 | 2019-11-10 | 0.0 when no qualifying retail flow | -87_000_000.0 |
net_i_gamma | Float64 | USD × gamma | (date, group_key, callput) | Institutional net USD × gamma. On CP rows: C + P. | model | T+1 | 2019-11-10 | 0.0 when no qualifying institutional flow | 8_400_000.0 |
net_r_gamma | Float64 | USD × gamma | (date, group_key, callput) | Retail net USD × gamma. | model | T+1 | 2019-11-10 | 0.0 when no qualifying retail flow | 1_210_000.0 |
net_i_vega | Float64 | USD × vega | (date, group_key, callput) | Institutional net USD × vega. On CP rows: C + P. Positive = net long-vol demand across the grouping. | model | T+1 | 2019-11-10 | 0.0 when no qualifying institutional flow | 140_000_000.0 |
net_r_vega | Float64 | USD × vega | (date, group_key, callput) | Retail net USD × vega. | model | T+1 | 2019-11-10 | 0.0 when no qualifying retail flow | -21_000_000.0 |
net_*_21dma | Float64 | (matches base metric) | (date, group_key, callput) | 21-trading-day rolling SUM of the corresponding raw net, scoped to this (group_key, callput). Ten of these, one per raw metric. | derived | T+1 | 2019-11-10 | null when the trailing 21-day window has fewer than 21 non-null observations | (varies by metric) |
z_net_*_21dma | Float64 | z-score | (date, group_key, callput) | Z-score of the corresponding 21dma against its trailing 2-year (504-session) rolling mean and sample standard deviation, computed at query time. Rounded to 2 decimals on emit. Masscrest's canonical spike predicate for the group-level table is z_net_i_delta_21dma > 2 AND callput = 'CP' (or > 3 for 3σ), same rule as the underlying-level table. Ten of these. | derived | T+1 | 2019-11-10 | null when the trailing 2y window is unwarmed or its sample stddev is 0 | (varies) |
px_01_day
What it is
Daily OHLCV for the US single-stock and ETF universe. One row per (date, traded_underlying). Prices are unadjusted (contemporaneous print values).
Why it exists
You can't build a clean option-flow story without a matching price context. Masscrest ships the same daily close used internally for signal construction, keyed to the same ticker / FIGI layer as the flow tables, so there's no cross-vendor join drift between flow and price.
How to use it
The table isn't exposed directly over REST or MCP. The adjusted price columns (adj_close, adj_open, adj_volume, total_turnover) are LEFT-joined onto the underlying_option_flows endpoints: pass traded_underlying=<TICKER> and callput='CP' to get_underlying_option_flows_daily (MCP) or GET /v0/underlying_option_flows/01_day (REST) and you get one row per date with prices attached to the flow payload.
For bulk historical pulls, the parquet is fanned out across the daily buckets your plan includes: gs://prod-us-option-daily-underlying/px_data/v0/01_day/, gs://prod-us-option-daily-contract/px_data/v0/01_day/, or the trial subset at gs://trial-us-option-daily-underlying/px_data/v0/01_day/.
Unadjusted semantics
Prices and volume are unadjusted. To compute split-adjusted series (safe cross-split returns, share-count normalisation, historical strike comparisons), join to split_factors on figi with date BETWEEN valid_from AND valid_to and apply cum_split_factor. Keeping the two sides separate lets you reload px_01_day and split_factors independently and gives you an explicit knob when you need to invert an adjustment.
- Grain:
(date, traded_underlying)
Fields
| field_name | type | unit | grain | description | provenance | timing_lag | history_start | null_semantics | example |
|---|---|---|---|---|---|---|---|---|---|
date | Date | trading day (UTC) | (date, traded_underlying) | Session date. US equity trading calendar. | exchange | T+1 | 2019-11-10 | never null | 2026-07-24 |
traded_underlying | String | ticker | (date, traded_underlying) | Point-in-time listed ticker on date. Dotted dual-class form (BRK.B). Use the (ticker, date) pair as the join key; the same ticker can be recycled across entities over time, so resolve to figi via stock_mapping before any long-horizon series work. | exchange | T+1 | 2019-11-10 | never null | BRK.B |
open | Float64 | USD | (date, traded_underlying) | Session opening print (unadjusted, contemporaneous). No split adjustment applied. | exchange | T+1 | 2019-11-10 | null on non-trading days for the underlying (delistings, halts) | 223.85 |
close | Float64 | USD | (date, traded_underlying) | Session closing print (unadjusted, contemporaneous). No split adjustment applied. | exchange | T+1 | 2019-11-10 | null on non-trading days for the underlying | 224.31 |
volume | Float64 | shares | (date, traded_underlying) | Session share volume (unadjusted, contemporaneous). No split adjustment applied (a share count on a pre-split day is a real economic quantity that doesn't rescale post-split). | exchange | T+1 | 2019-11-10 | null on non-trading days | 52_308_400.0 |
turnover | Float64 | USD | (date, traded_underlying) | Dollar turnover of the underlying on date (sum(price × volume) across all intraday prints). Dollar amounts are unit-invariant across splits. | exchange | T+1 | 2019-11-10 | null on non-trading days | 11_724_390_012.0 |
px_10_min
What it is
10-minute OHLCV bars for the US single-stock and ETF universe. Same universe and join key as px_01_day, one row per (date, ten_min_timeframe, traded_underlying). Prices unadjusted.
Why it exists
Intraday flow is only useful against intraday price. Shipping the bars directly off the same feed keeps the flow and price sides in lockstep at the 10-minute cadence so bucket joins are clean.
How to use it
Not exposed directly. The adjusted price columns (adj_close, adj_open, adj_volume, total_turnover) are LEFT-joined onto get_underlying_option_flows_10min (MCP), intraday_flow_day (MCP fat tool for a single symbol × single day), and GET /v0/underlying_option_flows/10_min (REST). The join emits one row per (date, ten_min_timeframe, figi) with prices attached.
For bulk historical pulls, parquet lives on the 10-min bucket your plan includes: gs://prod-us-option-tenmin-underlying/px_data/v0/10_min/ or gs://prod-us-option-tenmin-contract/px_data/v0/10_min/.
Bucket boundary convention
ten_min_timeframe is the end of the 10-minute bucket, stored as a naive New York wall-clock DateTime. Bucket covers (ten_min_timeframe − 10 min, ten_min_timeframe]. First RTH bucket ends at 09:40:00, last at 16:00:00 (39 buckets per full session). On-boundary 1-minute bars (e.g. 10:00:00 close) land in the closing bucket, not the opening bucket of the next.
Coverage
Regular trading hours only (09:30 to 16:00 ET). No pre-market, no after-hours. Halted sessions produce no rows for the halted intervals.
Unadjusted semantics
Prices and volume are unadjusted. To compute split-adjusted series join to split_factors on figi with date BETWEEN valid_from AND valid_to and apply cum_split_factor. Keeping the two sides separate lets you reload px_10_min and split_factors independently and gives you an explicit knob when you need to invert an adjustment.
- Grain:
(date, ten_min_timeframe, traded_underlying)
Fields
| field_name | type | unit | grain | description | provenance | timing_lag | history_start | null_semantics | example |
|---|---|---|---|---|---|---|---|---|---|
ten_min_timeframe | DateTime | NY wall-clock, bucket close | (date, ten_min_timeframe, traded_underlying) | End timestamp of the 10-min bucket (naive NY-time). Bucket covers (ten_min_timeframe − 10 min, ten_min_timeframe]. | exchange | T+1 | 2019-11-10 | never null | 2026-07-24 09:40:00 |
date | Date | trading day (UTC) | (date, ten_min_timeframe, traded_underlying) | Session date. US equity trading calendar. | exchange | T+1 | 2019-11-10 | never null | 2026-07-24 |
traded_underlying | String | ticker | (date, ten_min_timeframe, traded_underlying) | Point-in-time listed ticker on date. Dotted dual-class form. Use (ticker, date) as the join key; resolve to figi via stock_mapping for any long-horizon series work. | exchange | T+1 | 2019-11-10 | never null | AAPL |
open | Float64 | USD | (date, ten_min_timeframe, traded_underlying) | Unadjusted price of the first 1-minute bar in the bucket. The source 1-minute feed carries open and close only (no high/low), so bar-internal high/low is not available at this grain. | exchange | T+1 | 2019-11-10 | null when the underlying has no trading activity in the bucket | 223.90 |
close | Float64 | USD | (date, ten_min_timeframe, traded_underlying) | Unadjusted price of the last 1-minute bar in the bucket. | exchange | T+1 | 2019-11-10 | null when the underlying has no trading activity in the bucket | 224.02 |
volume | Float64 | shares | (date, ten_min_timeframe, traded_underlying) | Underlying share volume within the bucket. Unadjusted (contemporaneous). | exchange | T+1 | 2019-11-10 | null when the underlying has no trading activity | 1_204_812.0 |
turnover | Float64 | USD | (date, ten_min_timeframe, traded_underlying) | Dollar turnover of the underlying within the bucket. Dollar amounts are unit-invariant across splits. | exchange | T+1 | 2019-11-10 | null when the underlying has no trading activity | 270_881_400.0 |
stock_mapping
What it is
A lookup table from FIGI to listed ticker, with company name, sector, industry, and ETF / ADR flags attached. One row per contiguous period during which a given FIGI traded under a given ticker.
Why it exists
Tickers move. Companies rename themselves, merge, get taken private, delist. Tickers get recycled. A sector breakdown or historical PnL series keyed on the ticker alone is wrong whenever one of those events happens. Masscrest pins everything to FIGI (the stable company identifier) first and resolves the ticker as a function of the date. This table is where that resolution lives.
How to use it
Join to any flow or price table on figi with date BETWEEN phase_start AND phase_end. That gives you the ticker, company name, sector, industry, and flags that were true on that trading day. If you want a single row per entity today, filter phase_end = '2099-12-31' (the open-phase sentinel).
Examples
Facebook to Meta. One company, one FIGI (BBG000MM2P62), two rows. FB from inception through 2022-06-08, META from 2022-06-09 onward. A flow query joined on this FIGI returns a clean history across the rename with no manual ticker-swap logic.
XOM restructure. On 2026-07-07 Exxon reorganised into ExxonMobil Holdings. Same traded_underlying='XOM', new FIGI. Two rows with different FIGIs under the same ticker. A query filtered by traded_underlying='XOM' returns both; the PIT join on date picks the right one for each trading day.
Quirks
- ETFs.
sectorandindustrydescribe the fund's issuer entity (typicallyFinancial Services), not the underlying exposure. For ETF-aggregate flow use theetfrollup ongrouped_flow_signal_01_day. - ADRs.
sectorandindustrydescribe the foreign company's actual business. HDB isFinancial Services(HDFC Bank), BABA isConsumer Cyclical(Alibaba). Filter onisAdrif you need to separate US-domiciled sector totals from foreign ADRs. - Rollup already clean. The served
grouped_flow_signal_01_dayrollup excludes ETFs and ADRs from its sector / industrygroup_keys and routes them to their ownetfandadrbuckets. The two quirks above only matter when joiningstock_mappingdirectly.
Fields
| field_name | type | unit | grain | description | provenance | timing_lag | history_start | null_semantics | example |
|---|---|---|---|---|---|---|---|---|---|
traded_underlying | String | ticker | (figi, traded_underlying, phase_start) | Point-in-time listed ticker during [phase_start, phase_end]. Dotted dual-class form (BRK.B). | exchange | n/a | 2019-11-10 | never null | FB |
figi | String(12) | identifier | (figi, traded_underlying, phase_start) | Composite FIGI for the underlying entity. Stable across ticker changes. | exchange | n/a | n/a | never null | BBG000NDYB67 |
phase_start | Date | boundary | (figi, traded_underlying, phase_start) | First trading date this (ticker, figi) pair was active. 2019-11-10 is a "no constraint" sentinel for entities with unknown pre-history. | exchange | n/a | n/a | never null | 2012-05-18 |
phase_end | Date | boundary | (figi, traded_underlying, phase_start) | Last trading date this (ticker, figi) pair was active. 2099-12-31 sentinel means the phase is currently open (still trading under this ticker today). | exchange | n/a | n/a | never null | 2022-06-08 |
companyName | String | name | (figi, traded_underlying, phase_start) | Registered legal / operating name for the entity during this phase. | exchange | daily refresh | n/a | null when no vendor record is available for the phase | Meta Platforms, Inc. |
sector | String | sector | (figi, traded_underlying, phase_start) | Sector classification for the entity during this phase. Investor-oriented 11-sector taxonomy (companies grouped by demand-cycle and macro exposure, not by production process). | exchange | daily refresh | n/a | null when unresolved | Technology |
industry | String | industry | (figi, traded_underlying, phase_start) | Industry classification for the entity during this phase. Investor-oriented ~150-industry taxonomy nested under the 11 sectors. | exchange | daily refresh | n/a | null when unresolved | Software - Application |
isEtf | String | flag ('true' / 'false') | (figi, traded_underlying, phase_start) | Whether the underlying is an ETF or ETP. String-typed for compatibility with the customer-facing endpoints. | exchange | daily refresh | n/a | 'false' when unresolved (defaults to non-ETF) | false |
isAdr | String | flag ('true' / 'false') | (figi, traded_underlying, phase_start) | Whether the underlying is an American Depositary Receipt. | exchange | daily refresh | n/a | 'false' when unresolved | false |
isActivelyTrading | String | flag ('true' / 'false') | (figi, traded_underlying, phase_start) | Whether the entity is actively trading today. Falls back to 'true' when the phase is still open (phase_end = 2099-12-31) and the vendor lacks an explicit record, 'false' otherwise. | exchange | daily refresh | n/a | never null (default fallback based on phase_end) | true |
contract_id_mapping
What it is
A stable Masscrest identifier (contract_id) for every option contract, plus the per-phase shares-deliverable, strike, and symbol as they stood during each corporate-action epoch. One row per contract phase.
Why it exists
Reverse splits, spinoffs, and M&A baskets change what an option delivers without necessarily changing the strike or the symbol. After a 1-for-10 reverse split, an existing XYZ 50 call still has strike 50 but now delivers 10 shares instead of 100. The clearing house usually numerates the adjusted root (XYZ1) and a fresh standard XYZ 50 call relists shortly after, delivering the usual 100 shares. Two contracts with identical callput / strike / expiration and overlapping symbols, radically different payoffs. Keying on strike + symbol alone silently mixes them. contract_id disambiguates.
Forward splits are cleaner: the strike divides by the split ratio and the deliverable stays at 100 shares, so pre-split and post-split rows carry different strikes under the same contract_id without any ambiguity on the key.
How to use it
In most cases you don't. The REST and MCP option_flows_* responses already carry contract_id, adj_shares_deliverable, figi, and traded_underlying on every row, resolved server-side.
You need to join this table in two cases:
- Reading raw flat-file parquet. The base flat-file tables drop mapping columns to keep file sizes small. Join on
(traded_symbol, expirationdate, callput, traded_strikeprice)withdate BETWEEN phase_start AND phase_endto attachcontract_id,underlying_figi,adj_shares_deliverable, andtraded_underlying. - Reconciling your own option books to Masscrest flow. Look up the
contract_idfor the position on the trade date, then filter Masscrest flow on thatcontract_idto get the full history of that economic contract across any rename or split.
Examples
Reverse split (SOXS, 3x-inverse semiconductor ETF). SOXS reverse-splits often. After a 1-for-10 reverse split, the existing SOXS 50 call keeps strike 50 but drops to 10 shares deliverable. The clearing house numerates the adjusted root to SOXS1. A fresh SOXS 50 call relists shortly after at the standard 100 deliverable. In contract_id_mapping you get two separate contract_ids on the same (50, C, expiration) key: the adjusted series with traded_symbol=SOXS1, adj_shares_deliverable=10, cumulative_split_factor=0.1, and the fresh series with traded_symbol=SOXS, adj_shares_deliverable=100, cumulative_split_factor=1.0. Join on contract_id and the two never get confused.
Forward split (NVDA 10-for-1, June 2024). All open NVDA options had their strikes divided by 10 on the ex-date. The Jan 2025 500 call becomes a Jan 2025 50 call. Two phase rows under the same contract_id: pre-split with traded_strikeprice=500, post-split with traded_strikeprice=50. adj_shares_deliverable=100 on both (forward splits don't touch the deliverable). A PnL series joined on contract_id tracks the position clean across the ex-date with no manual strike scaling.
Relation to split_history
split_history carries the underlying-level split factor per stock. contract_id_mapping carries the contract-level deliverable per contract. The two agree on reverse splits (adj_shares_deliverable = 100 × cumulative_split_factor, both < 1.0). They diverge on forward splits (deliverable stays at 100 while cumulative_split_factor climbs above 1.0, because the strike absorbs the adjustment) and on M&A baskets (deliverable becomes a bespoke cash+share mix not a clean multiple of anything).
Fields
| field_name | type | unit | grain | description | provenance | timing_lag | history_start | null_semantics | example |
|---|---|---|---|---|---|---|---|---|---|
contract_id | String | identifier | (contract_id, phase_start, phase_end) | Masscrest-built stable contract identifier. Deterministic string built from (root_symbol, expiration, callput, root-strike × 1000, incarnation counter) where the trailing _NN counter indexes the nth economic contract to use this (symbol, expiration, callput, strike) key over time. Most contracts take _00 (first and only economic contract on this key); the counter increments only when the symbol is re-listed for a new contract after the prior one was adjusted away. The same contract_id value follows the economic contract across every corporate action in its chain. | derived | daily refresh | n/a | never null | AAPL 260815C000215000_00 |
traded_symbol | String | ticker | (contract_id, phase_start, phase_end) | Symbol (no-dot form: BRKB, not BRK.B). Post-corporate-action, the root can change (numerated forms like AAPL1); this column echoes the declared root for the phase. | exchange | daily refresh | n/a | never null | AAPL |
traded_underlying | String | ticker | (contract_id, phase_start, phase_end) | Point-in-time listed equity ticker for the deliverable underlying during the phase. Dotted dual-class form (BRK.B). Resolved via join to stock_mapping on root_symbol. | derived | daily refresh | n/a | never null | AAPL |
root_symbol | String | ticker | (contract_id, phase_start, phase_end) | Listing root of the contract (first-appearance symbol), stable across the contract's corporate-action lineage. Used as the join key into stock_mapping to recover the point-in-time listed traded_underlying. | derived | daily refresh | n/a | never null | AAPL |
root_strikeprice | Float64 | USD | (contract_id, phase_start, phase_end) | Original listed strike at contract inception, stable across the lineage. traded_strikeprice is the strike adjusted for the phase; root_strikeprice is the strike before any corporate-action adjustment. On standard non-adjusted contracts the two are equal. | derived | daily refresh | n/a | never null | 215.00 |
underlying_figi | String | identifier | (contract_id, phase_start, phase_end) | Composite FIGI of the deliverable underlying for this phase. Carries the full point-in-time entity binding directly on the row, so no stock_mapping hop is needed for FIGI resolution. Null when the underlying is cash-settled (index) or when the historical phase pre-dates FIGI coverage. | derived | daily refresh | n/a | null on index-settled rows / pre-coverage historical phases | BBG000B9XRY4 |
expirationdate | Date | boundary | (contract_id, phase_start, phase_end) | Contract expiration date (US equity calendar). | exchange | n/a | n/a | never null | 2026-08-15 |
callput | String(1) | option type | (contract_id, phase_start, phase_end) | 'C' (call) or 'P' (put). | exchange | n/a | n/a | never null | C |
traded_strikeprice | Float64 | USD | (contract_id, phase_start, phase_end) | Contract strike as declared for the phase. Post-split-adjusted contracts show the adjusted strike; pre-split contracts show the raw strike. | exchange | n/a | n/a | never null | 215.00 |
adj_shares_deliverable | Float64 | shares per contract | (contract_id, phase_start, phase_end) | Shares conversion adjustment for the phase. Standard equity option delivers 100 shares, so 100.0. Post-corporate-action phases carry the declared per-contract share count (fractional, cash+share baskets, etc.). Post-split standard contracts equal 100 × cumulative_split_factor. | exchange | daily refresh | n/a | never null | 100.0 |
cumulative_split_factor | Float64 | multiplier | (contract_id, phase_start, phase_end) | Cumulative split factor applied to the underlying over the contract's lineage from inception through the end of this phase. 1.0 on contracts that have not seen a split. On reverse-split-only mechanics, adj_shares_deliverable = 100 × LEAST(cumulative_split_factor, 1.0). Forward splits leave the deliverable at 100. | derived | daily refresh | n/a | never null | 1.0 |
phase_start | Date | boundary (inclusive) | (contract_id, phase_start, phase_end) | First trading date this phase applied to. Inclusive. Grounded in the contract's first listing date; clipped to the 2019-11-10 data-coverage floor when the first-listing date pre-dates it. | derived | daily refresh | n/a | never null | 2019-11-10 |
phase_end | Date | boundary (inclusive) | (contract_id, phase_start, phase_end) | Last trading date this adj_shares_deliverable applied to. Inclusive. On the final (or only) phase of a contract this equals the contract's expirationdate; earlier phases end on the trading day before a corporate-action takes effect. | derived | daily refresh | n/a | never null | 2024-05-17 |
is_index | Bool | flag | (contract_id, phase_start, phase_end) | Whether the underlying is a cash-settled index. Filtered out at export, so always false on the customer surface. | exchange | n/a | n/a | never null | false |
split_factors
What it is
Cumulative split-adjustment factors per FIGI, structured as a slowly-changing dimension. One row per continuous phase with a given factor; non-overlapping intervals covering each FIGI's timeline. date BETWEEN valid_from AND valid_to matches exactly one row per (figi, date).
Why it exists
px_01_day and px_10_min ship contemporaneous prints, not adjusted prices. You need an adjustment factor to compare prices across a split or to normalise share counts to current units. Shipping the factor as a separate SCD2 table (instead of baking an adj_close into the price table) means you can invert Masscrest's adjustment to recover the raw print whenever you need it, and reload prices and splits independently when one changes.
How to use it
Divide a raw close on any date X by the cum_split_factor whose [valid_from, valid_to] covers X. That gives you a current-shares-equivalent price. The factor is 1.0 on and after the most recent split, > 1 before a forward split (e.g. 4.0 before a 4-for-1), < 1 before a reverse split.
Join pattern: split_factors on figi with date BETWEEN valid_from AND valid_to.
Examples
Forward split (AAPL 4-for-1, 2020-08-31). Pre-split phase through 2020-08-30 carries cum_split_factor = 4.0. A raw close of 500 on 2020-07-01 gives an adjusted close of 125 (500 / 4). Post-split phase from 2020-08-31 carries cum_split_factor = 1.0 (nothing to adjust against the current unit).
Reverse split (SOXS 1-for-10). Pre-split phase carries cum_split_factor = 0.1. A raw close of 2 on a pre-split day gives an adjusted close of 20 (2 / 0.1). The adjusted series stays on a consistent share-count basis across the reverse split.
- Grain:
(figi, valid_from, valid_to). - History: full history for each covered FIGI back to the earliest known split. Pre-split-history phases use
valid_from = 2019-11-10. - Timing: rebuilt in full each trading day whenever a new split lands.
Fields
| field_name | type | unit | grain | description | provenance | timing_lag | history_start | null_semantics | example |
|---|---|---|---|---|---|---|---|---|---|
figi | String(12) | identifier | (figi, valid_from, valid_to) | Composite FIGI for the underlying entity. Join key to stock_mapping, px_01_day, px_10_min. | exchange | n/a | n/a | never null | BBG000MM2P62 |
valid_from | Date | boundary (inclusive) | (figi, valid_from, valid_to) | Start date this cumulative factor applies to. 1900-01-01 for the earliest period. | derived | n/a | 1900-01-01 (sentinel) | never null | 2019-08-30 |
valid_to | Date | boundary (inclusive) | (figi, valid_from, valid_to) | Last date this cumulative factor applies to. Open-ended periods (no future split yet) use the phase's phase_end; entities in a currently-active phase carry 2099-12-31. | derived | n/a | n/a | never null | 2020-08-30 |
cum_split_factor | Float64 | ratio | (figi, valid_from, valid_to) | Cumulative product of all splits from valid_from + 1 day forward within the entity's active phase. Divide a raw close on any date in [valid_from, valid_to] by this factor to get a current-shares-equivalent price. 1.0 for the most recent period (no pending split). | derived | n/a | n/a | null for extreme reverse-split cases where the true cumulative factor underflows Float64 precision (~1e-15). Treat null as "no valid split adjustment available for this period" and either skip or fail loudly; never coerce to 0.0. | 4.0 |
