The LAB vocabulary

Every column a rule can name: 105 of them, in 9 groups, with the unit, the range, the book it reads and one condition that uses it. The same dictionary the compiler is given, so what you read here is what it understands.

How a rule is written

A rule is one or two legs. A leg has a direction, up or down, the way the trade profits, and a list of conditions on the columns in the groups on the left, all of which must hold at the same minute. The engine then measures the move over the next 5, 15 or 30 minutes of the same session, after a cost, against the core condition alone, out of sample. Say it in words in the LAB chat and it is compiled into this shape; send the shape itself through the API.

{"name": "FOMC last-hour fade",
 "legs": [{"dir": "down", "when": [
   {"col": "ev_fomc", "op": ">=", "value": 1, "core": true},
   {"col": "min", "op": "between", "value": [330, 330]}]}],
 "horizon": 30, "cost": 1.0, "good_move": 3.0}

Operators

operatormeaning
>= <= > <compare with a number
abs>= abs<=compare the magnitude, sign ignored: distances, flows, changes
betweeninside [lo, hi], inclusive; [300, 300] is one exact minute
top_pctl abs_top_pctlin the top share of the column's own distribution over the whole store, 0.5 … 0.99; 0.9 is the top decile, signed or by magnitude

Three things to know first

Distances are signed: spot minus the level, positive above it, so "at the wall" is abs<= a few points and "above the flip" is flip_dist > 0.

Unqualified levels read the measured book; the _volcp and _oi twins read the other two, and a rule should not mix books.

The last minutes have no outcome: a condition on min must leave horizon minutes of session, so keep it at or below 384, 374 or 359 for the 5, 15 and 30-minute horizons.

The same reference as JSON, for scripts and assistants: /api/lab/vocabulary. Every column is computed per minute over every archived session by the Lab's feature-store builder; a new column reaches the compiler, this page and the API in the same deploy.

Time in the session

Where in the day the rule is read. Minute 0 is 09:30, 389 is 15:59; a rule that fires inside the last `horizon` minutes measures nothing, so keep min ≤ 389 − horizon.

columnwhat it isunitrangebooka condition that uses it
minminutes since the 09:30 open (0-389)minutes since 09:300 … 389min between [300, 330]
mins_leftminutes remaining to the closeminutes to 15:590 … 389mins_left <= 60

Price, VWAP and the move just made

The index itself, the session VWAP and its band, and the last few minutes of tape. Distances are signed index points, positive above.

columnwhat it isunitrangebooka condition that uses it
spotSPX spot priceindex pointsthe SPX levelspot >= 5000
vwapsession VWAPindex pointsthe session VWAPvwap > 0
vwap_distspot - vwap, pointspoints, signednegative below VWAPvwap_dist >= 10
vwap_sigmaone sigma of the VWAP band, pointspointsone sigma of the band, > 0vwap_sigma <= 4
vwap_zspot distance from VWAP in sigmas (+3 = stretched 3 sigma above)sigmas, signedtypically −4 … +4vwap_z >= 3
b2uupper 2-sigma VWAP bandindex pointsupper 2σ bandspot >= b2u is not allowed; use vwap_z >= 2
b2llower 2-sigma VWAP bandindex pointslower 2σ bandvwap_z <= -2
candle_delta1-minute spot change, pointspoints, signedone minute's changecandle_delta abs>= 5
ret15spot now minus spot 15 minutes ago, index points (the move just made; positive = drifted up)points, signedspot now − 15 min agoret15 <= -3
ret30spot now minus spot 30 minutes ago, index pointspoints, signedspot now − 30 min agoret30 abs>= 10
rv_1mintra-minute realized vol, annualised -- directly comparable to atmiv (implied); a choppy vs smooth minuteannualised %intra-minute realised volrv_1m >= 25

Dealer levels and distances

The zero-gamma flip, the hold band, the call wall and put support, as signed distances from spot. Unqualified names read the MEASURED book; the *_volcp and *_oi twins read the volume and open-interest books.

columnwhat it isunitrangebooka condition that uses it
flipgamma flip level, priceindex pointsthe zero-gamma strikemeasuredflip_dist abs<= 5 (prefer the distance)
flip_distspot - gamma flip, points (+ = above the flip / positive-gamma side, - = below)points, signedspot − flip; + abovemeasuredflip_dist abs<= 5
gamma_pospositive-gamma regime flag: 1 above the flip (pin / mean-revert), 0 below (trend)flag1 above the flip, 0 belowmeasuredgamma_pos >= 1
hold_lolower dealer hold levelindex pointslower edge of the hold bandmeasuredhold_lo_dist abs<= 5
hold_hiupper dealer hold levelindex pointsupper edge of the hold bandmeasuredhold_hi_dist abs<= 5
hold_lo_distspot - lower dealer hold, points (- = below it)points, signedspot − hold_lomeasuredhold_lo_dist <= 3
hold_hi_distspot - upper dealer hold, points (+ = above it)points, signedspot − hold_himeasuredhold_hi_dist >= -3
cr0_distspot - the major positive-gamma strike (call-side wall / resistance), MEASURED book, points (+ = above it)points, signedspot − call wall; negative below itmeasuredcr0_dist abs<= 5
ps0_distspot - the major negative-gamma strike (put-side support), MEASURED book, points (+ = above it)points, signedspot − put support; positive above itmeasuredps0_dist abs<= 5
cr0_strengthhow much of the near-money book stands on the call-side wall's own strike, 0..1 (1 = the book's fattest strike; the terminal draws line width from this)share0 … 1 of the near book on that strikemeasuredcr0_strength >= 0.3
ps0_strengthsame for the put-side support strike, 0..1 -- a thin level is drawn like any other but may behave like noneshare0 … 1measuredps0_strength >= 0.3
flip_volcp_distspot - the volume-book gamma flip, points -- an alternative flip constructionpoints, signedspot − volume-book flipvolumeflip_volcp_dist abs<= 5
cr0_volcp_distspot - the call-side wall of the VOLUME book, points (+ = above it)points, signedspot − volume-book call wallvolumecr0_volcp_dist abs<= 5
ps0_volcp_distspot - the put-side wall of the VOLUME book, points (+ = above it)points, signedspot − volume-book put supportvolumeps0_volcp_dist abs<= 5
cr0_oi_distspot - the call-side wall of the OPEN-INTEREST book at 0DTE, points (+ = above it)points, signedspot − OI-book call wallopen interestcr0_oi_dist abs<= 5
ps0_oi_distspot - the put-side wall of the OPEN-INTEREST book at 0DTE, points (+ = above it)points, signedspot − OI-book put supportopen interestps0_oi_dist abs<= 5
flip_struct_distspot - the open-interest (structural) gamma flip, points -- the third flip alongside flip_dist and flip_volcp_distpoints, signedspot − OI-book (structural) flipopen interestflip_struct_dist abs<= 10
cw_agreehow many of the three books name the SAME call-side wall, 1..3. Agreement is rare -- 22% of minutes -- so 3 is a genuinely unusual state, not a defaultcount1 … 3 books naming the same call wallall threecw_agree >= 2
pw_agreesame for the put-side wall; the books agree here in only 2% of minutescount1 … 3all threepw_agree >= 2
cw_agree_distpoints from spot to the call wall the books agree on (negative = it is above spot). Null when they name different strikespoints, signedspot − the agreed call wallall threecw_agree_dist abs<= 5
pw_agree_distpoints from spot to the agreed put wall; positive = it is below spotpoints, signedspot − the agreed put supportall threepw_agree_dist abs<= 5

The dealer book and its flow

Net exposures at spot and how fast they are changing. Level columns are the state; *_flow and mc* columns are what moved in the last minutes.

columnwhat it isunitrangebooka condition that uses it
dexdealer delta exposure$ of index deltasigned; + = dealers long deltameasureddex <= 0
dealer_dexdealer delta exposure (alias)$ of index deltaalias of dexmeasureddealer_dex top_pctl 0.9
vexvanna exposure$ per vol pointsignedmeasuredvex abs_top_pctl 0.9
charmcharm exposure$ delta per daysignedmeasuredcharm <= 0
vannavanna pressure (distinct from vex)$ delta per vol pointsignedmeasuredvanna abs_top_pctl 0.9
gpctgamma percentile vs historypercentile0 … 100 vs the last 20 sessionsmeasuredgpct <= 20
ngv_measnet gamma value, measured$Mnet gamma at spot, signedmeasuredngv_meas <= 0
ngv_convnet gamma value, conventional$Mnet gamma at spot, signedopen interestngv_conv >= 0
ngv_volcpnet gamma value, volume-cp book -- the third book alongside ngv_meas / ngv_conv$Mnet gamma at spot, signedvolumengv_volcp <= 0
meas_conv_divngv_meas - ngv_conv: the tape-signed book minus the call-minus-put OPEN-INTEREST book. Not a measured-vs-volume pair -- that is ngv_volcp$Mngv_meas − ngv_convmeasured vs OImeas_conv_div abs>= 50
dgamma_flowminute-over-minute change of net gamma (dGamma flow)$M per minutesigned change of ngv_measmeasureddgamma_flow abs_top_pctl 0.9
dex_flow1-minute change in dealer delta exposure$ per minute1-minute change of dexmeasureddex_flow abs_top_pctl 0.9
vex_flow1-minute change in vanna exposure$ per minute1-minute change of vexmeasuredvex_flow >= 0
charm_flow1-minute change in charm$ per minute1-minute change of charmmeasuredcharm_flow <= 0
mc5max-change GEX over 5 min -- flow velocity: how much the busiest strike's gamma just moved$Mlargest single-strike gamma change over 5 minmeasuredmc5 top_pctl 0.9
mc15max-change GEX over 15 min (flow velocity)$Mover 15 minmeasuredmc15 top_pctl 0.9
mc30max-change GEX over 30 min (flow velocity)$Mover 30 minmeasuredmc30 top_pctl 0.9
concentrationHerfindahl of near-money gamma: high = the book sits in a few strikes and pins hard, low = spread outHerfindahl0 … 1; high = a few strikes hold itmeasuredconcentration >= 0.3

The unsigned book (GROSS)

|gamma| × open interest per strike, calls and puts summed, no side assigned: how much convexity there is and where it sits. The two-sided measured book alongside it.

columnwhat it isunitrangebooka condition that uses it
gross_totalsum of |gamma| x open interest over the near-money window, $M per index point. Magnitude only$M/ptsum over the near-money windowunsignedgross_total top_pctl 0.8
gross_at_spotthe unsigned book on the strike nearest spot, $M/pt$M/ptthe strike nearest spotunsignedgross_at_spot >= 100
gross_upthe heaviest unsigned strike ABOVE spot, $M/pt$M/ptheaviest strike above spotunsignedgross_up >= 150
gross_dnthe heaviest unsigned strike BELOW spot, $M/pt$M/ptheaviest strike below spotunsignedgross_dn >= 150
gross_up_distpoints from spot up to that heaviest strike above, always positivepoints, always positivedistance to gross_upunsignedgross_up_dist <= 5
gross_dn_distpoints from spot down to the heaviest strike below, always positivepoints, always positivedistance to gross_dnunsignedgross_dn_dist <= 5
gross_near_shareshare of the unsigned book within +-10 pt of spot, 0..1 -- how much convexity sits on top of priceshare0 … 1 within ±10 pt of spotunsignedgross_near_share >= 0.5
gross_top3_shareshare of the unsigned book on its three heaviest strikes, 0..1 -- concentrationshare0 … 1 on the three heaviest strikesunsignedgross_top3_share >= 0.6
signed_over_grosssum |measured gamma| / sum unsigned: how much of the convexity the tape-signed book accounts for. Low = the books cancel, the sign is thinratio0 … 1; low = the sides cancelmeasured ÷ unsignedsigned_over_gross <= 0.15
meas_belowsum |measured gamma| on strikes within 30 pt BELOW spot, $M/pt$M/ptsum |measured γ| within 30 pt below spotmeasuredmeas_below >= 50
meas_abovesame within 30 pt ABOVE spot, $M/pt$M/ptsum |measured γ| within 30 pt above spotmeasuredmeas_above >= 50
meas_below_chg15change of meas_below against the frame 15 min earlier (negative = the book below thinned)$M/pt, signedchange of meas_below over 15 minmeasuredmeas_below_chg15 <= -20
meas_above_chg15change of meas_above over 15 min (positive = the book above thickened)$M/pt, signedchange of meas_above over 15 minmeasuredmeas_above_chg15 >= 20
meas_below_chg30change of meas_below over 30 min$M/pt, signedover 30 minmeasuredmeas_below_chg30 <= -20
meas_above_chg30change of meas_above over 30 min$M/pt, signedover 30 minmeasuredmeas_above_chg30 >= 20

The expiry split

Today's 0DTE against everything that survives it, per book. Only sessions archived since the wide book carry it; earlier days are NaN and never match.

columnwhat it isunitrangebooka condition that uses it
gam_0dtemeasured gamma, TODAY's expiry only ($M)$Mtoday's expiry, net at spotmeasuredgam_0dte <= 0
gam_nextmeasured gamma past today -- the book that survives the close ($M)$Mthe book that survives todaymeasuredgam_next >= 0
gam_next_shareshare of the measured book that outlives today (0..1)share0 … 1measuredgam_next_share >= 0.6
gam_vol_0dtevolume-book gamma, 0DTE only ($M)$Mtoday's expiryvolumegam_vol_0dte <= 0
gam_vol_nextvolume-book gamma past today ($M)$Msurviving bookvolumegam_vol_next >= 0
gam_vol_next_shareshare of the volume book that outlives today (0..1)share0 … 1volumegam_vol_next_share >= 0.6
gam_oi_0dteopen-interest gamma, 0DTE only ($M)$Mtoday's expiryopen interestgam_oi_0dte <= 0
gam_oi_nextopen-interest gamma past today ($M)$Msurviving bookopen interestgam_oi_next >= 0
gam_oi_next_shareshare of the OI book that outlives today (0..1) -- the OI book is roughly half next-expiry, so this one really movesshare0 … 1open interestgam_oi_next_share >= 0.6
book_widthhow many post-0DTE expiries the session was ARCHIVED with -- a provenance stamp, not a market state. ~21 on a batch-built day, 3 on a live one (a live payload's flow book really is narrow). Use it ONLY to keep a rule that touches the gam_* columns inside one definition of them; never as a market condition, and never in a rule that does not reference gam_*count3 before 2026-08-17, ~21 afterbook_width >= 10

Implied and realised volatility

The 0DTE ATM surface, the straddle, skew, and realised volatility over three windows, plus the ratios that make them comparable across days.

columnwhat it isunitrangebooka condition that uses it
atmivATM implied-vol level (pair with top_pctl for an 'IV rank')IV, %0DTE at-the-moneyatmiv top_pctl 0.9
atmiv_chg1-minute change in ATM implied volIV points per minutesignedatmiv_chg >= 0.5
straddleATM straddle priceindex pointsthe 0DTE ATM straddlestraddle >= 30
straddle_pctATM straddle as a % of spot -- the expected move, comparable across days% of spotthe expected movestraddle_pct >= 0.6
exp_rangeexpected range implied by the straddleindex pointsthe implied range for the sessionexp_range >= 40
range_used|spot - vwap| / expected range -- how much of the day's implied range is spentratio|vwap_dist| ÷ exp_rangerange_used >= 1
div3030-min realized-minus-implied divergence -- the VRP proxyvol pointsrealised − implied, 30 mindiv30 >= 5
vrp_ratiorealized/implied ratio (rvi30 / atmiv); >1 = realized outrunning what's pricedratiorealised ÷ implied; > 1 = tape outrunningvrp_ratio >= 1.2
rvi1515-min realized volratiorealised ÷ implied, 15 minrvi15 >= 1.5
rvi3030-min realized volratio30 minrvi30 <= 0.7
rvi6060-min realized volratio60 minrvi60 >= 1.2
skewput/call skewvol points25Δ put − call IVskew top_pctl 0.9
skewpct25-delta skew as a RATIO: put IV over call IV minus one, in PERCENT (median ~10, 95th pctl ~25) -- NOT a 0-1 percentile; 'rich skew' is skewpct >= 15 or top_pctl on itpercentput IV over call IV minus one; ≈ −2 … 25, median ≈ 10. NOT a 0…1 percentileskewpct >= 15
skew_chg1-minute change in put/call skewvol points per minutesignedskew_chg >= 0.2

Volume

Contracts printed across the whole 0DTE chain per minute, and its rank inside the session.

columnwhat it isunitrangebooka condition that uses it
volper-minute traded volumecontracts per minutewhole 0DTE chainvol_pctl >= 0.9 (rank it, do not threshold contracts)
vol_pctltraded-VOLUME percentile of this minute vs the same minute of the prior 20 sessions (0-1) -- 'heavy for this time of day'; volume, NOT implied volpercentile0 … 1 against the same minute of the prior 20 sessionsvol_pctl >= 0.9
vol_snapvolume as the snapshot carries itcontracts per minutethe snapshot's own seriesvol_snap >= 1000

The market calendar

The scheduled-event context of the session, from the same calendar the terminal draws: day flags for FOMC, CPI, payrolls, PCE, ISM, earnings and opex, and two clocks to the nearest in-session event.

columnwhat it isunitrangebooka condition that uses it
ev_high1 on a day with a high-impact release: FOMC, CPI, payrolls or PCE; else 0flag1 on FOMC, CPI, payrolls or PCE daysev_high >= 1
ev_fomc1 on an FOMC decision day (statement 14:00, press conference 14:30)flag1 on a decision dayev_fomc >= 1
ev_cpi1 on a CPI day (08:30, before the open)flag1 on a CPI dayev_cpi >= 1
ev_nfp1 on a payrolls day (08:30, before the open)flag1 on a payrolls dayev_nfp >= 1
ev_pce1 on a PCE inflation day (08:30, before the open)flag1 on a PCE dayev_pce >= 1
ev_ism1 on an ISM day, manufacturing or services (10:00, inside the session)flag1 on an ISM dayev_ism >= 1
ev_earn1 when a mega-cap (NVDA, AAPL, MSFT, ...) reports today, before the open or after the closeflag1 when a mega-cap reportsev_earn >= 1
ev_opex1 on a monthly or quarterly options expiration dayflag1 on monthly / quarterly expirationev_opex >= 1
ev_pre_open1 if a high/medium release came out before 09:30, so the session already trades AFTER the numberflag1 if a release came out before 09:30ev_pre_open >= 1
ev_mins_tominutes until the next scheduled event inside the session (FOMC 14:00, ISM 10:00, FOMC minutes); NaN when none is ahead, so a condition on it selects event days by itselfminutesto the next in-session event; NaN if noneev_mins_to between [30, 90]
ev_mins_sinceminutes since the last scheduled event inside the session; NaN before the first oneminutessince the last in-session event; NaN before itev_mins_since <= 15