Odd-Lot Inside-Spread and Protected-Size Scarcity Slippage Playbook
Date: 2026-04-12
Category: research (execution / slippage modeling)
Why this playbook exists
In U.S. equities, the best visible price is increasingly not the same thing as the best protected price, and neither is guaranteed to represent meaningful executable size.
That gap matters for slippage modeling.
A modern execution stack can easily see situations like this:
- an odd-lot offer is displayed one tick inside the round-lot offer,
- that odd lot improves the visible best price,
- the protected round-lot quote remains worse,
- the odd-lot size is too small to complete the child order,
- the residual immediately sweeps or posts at the protected level anyway.
If the model anchors to the visible inside quote as if it were a normal top-of-book opportunity, it will systematically:
- overstate accessible price improvement,
- understate completion cost,
- overestimate passive fill probability at the inside price,
- compress benchmark spreads with tiny, low-capacity quotes,
- misattribute residual cost to urgency or impact instead of protected-size scarcity.
This problem is getting more important, not less. Public rulemaking and market-structure commentary now explicitly recognize that:
- odd-lot quotes often exist inside the traditional round-lot NBBO,
- odd-lot information is increasingly being disseminated in consolidated data,
- odd-lot quotes are still generally not protected under Regulation NMS,
- better visible prices can therefore exist without corresponding trade-through protection,
- some SIP message flows can publish odd-lot quote changes without a protected quote change.
That creates a specific modeling failure mode:
the visible best quote can improve while the executable/protected control surface barely changes.
This note turns that into a practical framework for features, labels, TCA, and routing controls.
Public facts that make this real
A few public references are enough to show the market has structurally changed.
- The SEC’s Market Data Infrastructure rule expanded core data to include certain odd-lot quotations and changed round-lot definitions for higher-priced stocks, explicitly acknowledging that consolidated market data needed to reflect better-priced liquidity beyond the legacy 100-share view.
- The SEC’s order-execution-disclosure modernization materials explicitly note that odd-lot quotes in higher-priced stocks often offer prices better than the round-lot NBBO.
- Bartlett, McCrary, and O’Hara’s “The Market Inside the Market: Odd-Lot Quotes” shows that better prices routinely exist relative to the NBBO and that odd-lot data contains economically useful information.
- CTA/UTP materials and vendor alerts make clear that odd-lot quotes are disseminated separately from protected quotes and may appear without a protected quote change.
- CTA Plan FAQ language publicly states that odd-lot quotes are not protected under Regulation NMS and do not change the round-lot NBBO.
The modeling implication is simple:
price discovery, benchmark formation, and trade-through protection are no longer aligned by default.
If your slippage stack treats them as one object, it is trading a cleaner market than the one that actually exists.
The core failure mode
For a buy order, define four prices at time (t):
- (P_{rl}(t)): best displayed round-lot offer,
- (P_{ol}(t)): best displayed odd-lot offer at or inside the round-lot best,
- (P_{vis}(t)): best visible offer across round lots and odd lots,
- (P_{prot}(t)): best protected / trade-through-relevant offer.
In many names:
[ P_{vis}(t) \le P_{prot}(t) ]
with strict inequality whenever an odd-lot offer sits inside the protected quote.
Define the odd-lot inside gap:
[ G_{odd}(t) = P_{prot}(t) - P_{vis}(t) \ge 0 ]
Interpretation:
- (G_{odd}(t)=0): visible and protected best price coincide,
- (G_{odd}(t)>0): the screen shows a better price than the protected control surface.
Now define visible size at the inside price (Q_{vis}(t)), and protected size at the protected best (Q_{prot}(t)).
A second quantity matters just as much:
[ R_{cap}(t) = \frac{Q_{vis}(t)}{Q_{child}(t)} ]
where (Q_{child}(t)) is intended child-order size.
When (G_{odd}(t)>0) and (R_{cap}(t) \ll 1), you have the classic failure case:
the quote improves your benchmark much more than it improves your achievable fill.
That is the slippage tax most naive top-of-book models miss.
Why this is different from ordinary depth truncation
This is not just “you needed more depth.”
Ordinary depth truncation assumes the top-of-book is at least structurally representative of the first executable level.
Odd-lot inside-spread conditions are different because:
- the inside quote can be better priced but too small to matter,
- it may not be protected even when visible,
- it may arrive in consolidated data as a new best visible quote without any protected quote transition,
- it can materially compress quoted spread statistics,
- the residual order path can behave as if the price improvement barely existed.
So the problem is not only lack of depth.
It is benchmark distortion caused by tiny non-protected price improvement.
Mechanism map
1. Micro-benchmark compression
Suppose the protected offer is $100.01 for 100 shares, but an odd-lot offer appears at $100.00 for 7 shares.
A buy child order for 300 shares now sees:
- visible spread tighter by one tick,
- visible offer improved,
- arrival benchmark improved,
- quoted half-spread improved.
But actual completion still mostly depends on liquidity at $100.01 and above.
If the model prices the order as if $100.00 were the economically relevant touch, it will underpredict slippage on almost every realized path.
2. Residual sweep illusion
An execution can print partly at the odd-lot inside and immediately continue at the protected round-lot quote.
That creates a misleading tape pattern:
- some price improvement did occur,
- but only on a trivial prefix of the child order,
- the economically dominant cost still came from the protected book.
A fill-only model that averages execution price against (P_{vis}(t)) often misreads this as “minor impact” rather than “almost no true price improvement capacity.”
3. Passive queue hallucination
When a model uses best visible bid/offer and imbalance features without distinguishing odd-lot vs protected size, it can infer queueable opportunity that is not really there.
The visible inside quote may:
- represent too little displayed size,
- disappear after a minimal interaction,
- fail to provide enough queue value for a standard child slice,
- reset the reference price without materially changing fill odds.
This contaminates passive fill-hazard models and queue-position models alike.
4. TCA fairness distortion
If arrival price, quoted spread, or price-improvement metrics are anchored to the odd-lot inside quote, then a broker or strategy can look worse simply because the benchmark became unrealistically tight.
This is especially acute in:
- high-priced stocks,
- low displayed depth names,
- retail-fragmented names,
- symbols where odd-lot activity dominates the price discovery process.
5. Feature regime instability
As SIP odd-lot dissemination expands, a feature pipeline may suddenly begin ingesting more inside-spread odd-lot information than it historically saw.
If retraining and backtests do not normalize for this, model drift appears even when the routing logic has not changed.
In that case the “alpha” is fake; the data representation changed.
The right abstraction: visible best, protected best, and actionable cost-to-complete
A useful decomposition for a buy order is:
[ C_{total} = C_{inside} + C_{residual} + C_{benchmark} + C_{queue} ]
Where:
- (C_{inside}): cost/benefit from whatever you actually got at the odd-lot inside,
- (C_{residual}): cost of completing the remaining size at protected and deeper prices,
- (C_{benchmark}): measurement distortion from benchmarking to visible best instead of protected/actionable best,
- (C_{queue}): error from treating tiny odd-lot price improvement as genuine queue opportunity.
A simple approximation for expected buy-side cost is:
[ \mathbb{E}[C \mid x_t] \approx w_1 \cdot G_{odd}(t) \cdot (1-\rho_t) + w_2 \cdot \Delta D_t + w_3 \cdot B_t ]
where:
- (\rho_t = \min(1, Q_{vis}(t)/Q_{child}(t))) is visible inside-capacity ratio,
- (\Delta D_t) is protected-plus-depth completion cost beyond the visible inside quote,
- (B_t) is benchmark compression penalty from using (P_{vis}) instead of (P_{prot}).
The key intuition:
- if visible odd-lot size is tiny relative to the child order, most of the inside-price benefit is cosmetic,
- the larger the odd-lot inside gap, the bigger that cosmetic distortion becomes.
Metrics worth instrumenting
1. OIG — Odd-Lot Inside Gap
[ OIG(t) = P_{prot}(t) - P_{vis}(t) ]
This is the core state variable.
Track it by symbol, price bucket, venue, time of day, and order size bucket.
2. OCR — Odd-Lot Capacity Ratio
[ OCR(t) = \frac{Q_{vis}(t)}{Q_{child}(t)} ]
A one-tick inside quote with OCR = 0.02 should not drive the same routing logic as a quote with OCR = 0.80.
3. RBI — Residual Burden Index
[ RBI(t) = 1 - \rho_t ]
How much of the child still depends on protected or deeper liquidity after consuming the visible inside quote.
4. VPC — Visible-vs-Protected Compression
Quoted spread using visible best minus quoted spread using protected best.
This quantifies how much your quoted-spread benchmark has been cosmetically tightened.
5. OLPR — Odd-Lot Price-Improvement Realization
Realized fraction of child volume that actually executed at the odd-lot inside level.
If OLPR is persistently tiny, the inside quote is mostly benchmark decoration.
6. PBP — Protected Book Penetration
Expected number of protected/deeper levels touched after any odd-lot inside interaction.
This is often the true driver of cost-to-complete.
7. OFD — Odd-Lot Feature Drift
Measure how often historical and live feature pipelines disagree because one includes odd-lot inside quotes and the other does not.
This is crucial during SIP/plan implementation changes.
Features for slippage models
A. Quote-state features
best_visible_pxbest_protected_pxodd_lot_inside_gap_ticksvisible_spread_ticksprotected_spread_ticksbest_visible_sizebest_protected_sizeodd_lot_inside_flagodd_lot_levels_inside_count
B. Capacity features
inside_capacity_ratiovisible_size_to_parent_ratiovisible_size_to_child_ratioresidual_after_inside_sharesprotected_depth_3lvl_sharesprotected_depth_5lvl_shares
C. Structure features
share_price_bucketnew_round_lot_tiersymbol_liquidity_bucketodd_lot_trade_share_20dodd_lot_quote_share_20dfractional_retail_intensity_proxy
D. Event-path features
visible_inside_changed_without_protected_change_flagtime_since_last_protected_change_mstime_since_last_odd_lot_inside_change_msodd_lot_message_burst_10msprotected_quote_stability_score
E. Label-integrity features
benchmark_type_visible_vs_protectedsip_vs_direct_visibility_modeodd_lot_dissemination_regimefeature_schema_version
Important rule:
do not let odd-lot inside quotes enter the model only through generic top-of-book fields.
They need explicit representation, or the model will learn the wrong economics from the same pixels.
Labeling blueprint
For each child order, store at decision time:
- visible best price and size,
- protected best price and size,
- whether the visible best was odd-lot-driven,
- how much actually filled at the inside level,
- residual completion path,
- benchmark computed both ways.
Then train three labels, not one:
Label 1 — visible-benchmark slippage
[ S_{vis} = p_{fill} - P_{vis}(t) ]
Label 2 — protected-benchmark slippage
[ S_{prot} = p_{fill} - P_{prot}(t) ]
Label 3 — completion slippage beyond inside capacity
[ S_{comp} = p_{fill} - \big(\rho_t P_{vis}(t) + (1-\rho_t)P_{prot}(t)\big) ]
The gap
[ S_{vis} - S_{prot} ]
is not ordinary execution error.
It is often benchmark compression error.
That distinction matters when retraining models or grading brokers.
Routing/control implications
Rule 1: maintain two top-of-book views
At minimum keep:
- visible best: what the market is showing,
- protected best: what actually anchors trade-through-sensitive routing.
Do not collapse them into one number.
Rule 2: size-weight the value of inside odd lots
One tick of price improvement on 3 shares is not economically equivalent to one tick of improvement on 300 shares.
Routing score should scale inside-price value by executable capacity.
Rule 3: benchmark child slices against feasible completion paths
For aggressive trading, benchmarking a 500-share child to a 1-share or 5-share inside quote is usually dishonest.
Use blended or protected benchmarks when OCR is low.
Rule 4: separate price-discovery information from execution capacity
Odd-lot inside quotes may still be highly informative for short-horizon price discovery.
That does not mean they are equally informative for execution cost-to-complete.
Use them in signal models and execution models differently.
Rule 5: detect odd-lot-only visible changes
If the visible best moves but the protected best does not, that event should enter the router as a different state than a true protected-quote transition.
Rule 6: version-control data-regime changes
When SIP/plan odd-lot dissemination changes, pin the data schema and retrain under explicit regime tags.
Otherwise you will mistake market-data plumbing changes for strategy improvement or decay.
Common anti-patterns
- Using visible NBBO-like best price as though it were always protected.
- Measuring price improvement against an odd-lot inside quote with negligible capacity.
- Feeding odd-lot inside prices into imbalance/microprice features without size and protection context.
- Treating all one-tick spread improvements as execution-equivalent regardless of displayed size.
- Ignoring whether the visible best changed without a protected quote change.
- Comparing old backtests that lacked odd-lot visibility to live systems that include it.
- Attributing cost-to-complete errors to urgency rather than protected-size scarcity.
- Praising a router for “capturing price improvement” when only a token amount filled there.
30-day rollout plan
Week 1 — Make the state observable
- Store visible best and protected best separately.
- Log whether inside improvement is odd-lot-driven.
- Record visible inside size and realized inside-fill share.
- Baseline OIG, OCR, and OLPR by symbol bucket.
Week 2 — Fix TCA first
- Report slippage vs both visible and protected benchmarks.
- Create dashboard slices for high-priced and odd-lot-heavy names.
- Quantify how often quoted-spread compression came from low-capacity inside quotes.
Week 3 — Retrain with explicit odd-lot features
- Add OIG, OCR, and odd-lot transition features.
- Separate price-discovery features from execution-capacity features.
- Compare calibration specifically in symbols with frequent inside odd lots.
Week 4 — Tighten routing controls
- Downweight tiny odd-lot inside improvements when child size is large.
- Use blended benchmark logic for broker grading.
- Add alerts for large visible/protected divergence with low inside capacity.
- Freeze schema versions around data-dissemination cutovers.
What good looks like
A production-grade slippage stack should be able to answer:
- Was the best visible quote actually better than the best protected quote?
- If yes, how much size existed at that better price?
- What fraction of the child actually captured that inside improvement?
- How much residual cost came from completing at protected and deeper levels?
- Did the benchmark get tighter without a meaningful change in executable capacity?
- Did a market-data regime change alter the meaning of our top-of-book features?
If you cannot answer those questions, your model is probably understating slippage whenever odd-lot quotes dominate the inside market.
Selected public references
- SEC, Market Data Infrastructure final rule — expansion of core data, odd-lot quotations, revised round-lot definitions, and interaction with protected quotations:
- SEC press release on adopted market-data-infrastructure rules — concise summary of odd-lot information being added to NMS data:
- SEC, Disclosure of Order Execution Information proposal — notes that odd-lot quotes in higher-priced stocks frequently offer prices better than the round-lot NBBO:
- Bartlett, McCrary, and O’Hara, The Market Inside the Market: Odd-Lot Quotes — evidence that better prices routinely exist inside the NBBO and remain economically important even after round-lot changes:
- CTA Plan odd-lot FAQ / proposal materials — odd-lot quotes are not protected and do not change the protected round-lot NBBO:
- Nasdaq UTP Vendor Alert #2025-18 — odd-lot quote messages can be published without a protected quote change:
- IEX commentary on round lots / protected quotes — useful practical explanation of why visible BBO and protected BBO can diverge:
- Cboe odd-lot market-structure note — practical data points on how large odd-lot activity has become across U.S. equities:
Bottom line
Odd-lot quotes are no longer a corner case.
They are part of the visible market, part of price discovery, and increasingly part of the data your models ingest. But they are not automatically the same thing as protected, scalable execution opportunity.
When a tiny odd-lot quote improves the inside price, three things can happen at once:
- the benchmark gets tighter,
- the signal gets more informative,
- the executable capacity barely changes.
If your slippage model does not separate those three effects, it will confuse seeing a better price with being able to trade meaningful size at that price.
That confusion gets expensive fast.