Iceberg Refresh Priority Illusion Slippage Playbook
Date: 2026-04-08
Category: research
Scope: Modeling the slippage tax from treating reserve replenishment as if queue priority survived the refresh
Why this matters
A hidden-liquidity signal is not the same thing as a queue-priority signal.
That sounds obvious until a live execution stack starts leaning on reserve / iceberg behavior. Then a very common mental shortcut appears:
- same price level survives,
- replenishment keeps showing up,
- therefore passive opportunity is still "basically the same queue."
That shortcut is often wrong.
Public venue documentation makes the key boundary explicit:
- Nasdaq reserve-order guidance says when the displayed portion is fully executed, the non-displayed reserve is decremented, and a new displayed order is sent back to the book with new time priority.
- TSX’s iceberg guide states that only the disclosed portion has priority at the given price level.
- Cboe order-type documentation distinguishes the displayed component’s displayed-order priority from the reserve component’s non-displayed priority.
Operationally, that means the hidden parent may still exist, but the displayed queue edge you thought you were leaning on may have reset.
This is a distinct slippage regime:
- the model correctly detected absorption,
- but incorrectly assumed absorption implied stable passive fill odds,
- so it kept posting as if queue advantage survived each refill,
- then paid with missed fills, delayed completion, and late aggression into a thinner book.
The expensive mistake is not:
“we failed to detect hidden liquidity.”
It is:
“we detected hidden liquidity and then over-credited it as if displayed priority were continuous.”
That turns a useful iceberg signal into a queue-position hallucination.
Failure mode in one line
The strategy observes repeated same-price reserve replenishment, mistakes it for continuous queue edge, overestimates passive fill probability after each refresh, and later pays catch-up slippage when the refreshed displayed clip does not fill like the old one.
Market-structure facts that matter operationally
1) Same price continuity does not imply same displayed time priority
The crucial distinction is between:
- parent reserve continuity,
- price-level continuity,
- and displayed queue continuity.
Those are not interchangeable.
A level can keep reappearing at the same price while the newly displayed clip repeatedly returns with fresh time priority. If your model collapses those three concepts into one variable, passive-fill estimates will be too optimistic.
2) Venue docs explicitly separate displayed and hidden priority
Across public docs, the broad pattern is consistent even if exact matching rules differ:
- displayed tranches receive displayed-order priority,
- reserve / non-displayed tranches do not enjoy that same status,
- and replenishment can re-enter as a fresh displayed order.
So the right question is not merely:
“is there more hidden size behind this level?”
It is:
“if more size reloads, what priority does the new displayed slice actually get?”
3) MBP feeds make the illusion worse
With market-by-price feeds, you often see:
- size at a price level,
- fast replenishment after prints,
- and no direct identification of whether the reloaded clip kept, lost, or never had displayed queue seniority.
That means a reserve-refresh event can look like “depth resilience” even when your own passive order effectively got pushed back in the actionable queue each time.
4) Randomized display refresh can further break naive inference
Some venues allow randomized disclosed refresh size. That is useful to remember because many simple iceberg detectors depend on fixed-clip repetition.
When randomization exists, you can have both:
- real hidden reserve,
- and unstable displayed-queue continuity.
So an execution model that relies on repeated identical clip sizes can under-detect the reserve while still overestimating the value of posting behind it.
5) Hidden support can be real while passive opportunity is deteriorating
This is the subtle branch that hurts production systems. The level may genuinely absorb aggressive flow for a while, yet your own next passive child may still fill more slowly because:
- replenishment resets displayed seniority,
- other participants step ahead during each reload,
- the reserve is available for taking but not for gifting you passive queue rank,
- and the next exhaustion event comes closer with every cycle.
So “strong absorption” and “good passive queue economics” can diverge sharply.
6) This is mostly a miss-cost and deadline-convexity problem, not a spread-capture problem
The slippage tax usually shows up as:
- lower-than-expected passive completion,
- repeated queue waiting with poor realized progress,
- and a later forced increase in aggression.
In other words, the damage often arrives one step later:
not at the moment you detect reserve, but at the moment you realize you trusted the refill too much.
The core modeling distinction
Model three separate latent objects:
Hidden reserve presence
Is there likely undisplayed size behind the level?Refresh / replenish behavior
Does the level tend to reload after consumption?Displayed-priority continuity
After reload, does the newly visible clip behave like a queue continuation for passive-fill purposes, or like a fresh arrival?
Most desks model (1), some model (2), and many quietly assume away (3). That is where the slippage leak lives.
Observable signatures
1) Same-price replenishment continues, but passive fill latency suddenly worsens
The book keeps “coming back,” yet your own resting order fills slower than the model expects.
That pattern often means:
- hidden support is still there,
- but queue advantage did not survive the refresh the way your model implicitly assumed.
2) Refill count looks bullish for passive execution, but realized completion lags
A naive controller may interpret multiple refills as safety:
- “there is plenty behind this price,”
- “keep posting,”
- “cross later if needed.”
If completion remains behind schedule despite strong refill statistics, refresh-priority loss is a suspect.
3) Fill-probability residuals turn sharply negative after each reload event
If you compute expected vs realized passive-fill probability conditional on local flow and depth, look for repeated negative residuals immediately after a displayed tranche is exhausted and reloaded.
That is one of the cleanest production diagnostics.
4) MBP-inferred queue position improves on paper but not in reality
In compressed feeds, the visible level may look “stable enough” that your queue-position model thinks little changed. But if post-reload realized fill ordering repeatedly disappoints, the model is probably treating price-level continuity as queue continuity.
5) Late-session or deadline-sensitive catch-up bursts cluster after repeated refill episodes
The cost is usually not one giant bad print. It is a sequence:
- passive patience,
- underfilling through multiple refreshes,
- then urgency ramp,
- then aggressive completion into a weaker book.
6) Markout after delayed catch-up looks worse than the model budgeted
Because the controller kept waiting for passive fills that never arrived quickly enough, the eventual aggressive switch occurs later, often into higher toxicity or lower resilience.
Mechanical path to slippage
Step 1) The strategy detects hidden support at the working level
Signals may include:
- repeated replenishment,
- excess traded volume vs displayed depth,
- clip-size consistency,
- or queue-survival anomalies.
So far, so good.
Step 2) The model upgrades passive-fill expectations
This is the dangerous jump. The controller starts to assume:
- the level is safe to lean on,
- posting there should keep decent queue economics,
- and passive opportunity remains strong as long as replenishment continues.
Step 3) The displayed tranche exhausts and a new one appears
If venue semantics give the new displayed slice fresh time priority, the market has changed in a way that MBP-style state may not represent clearly.
Step 4) The controller underestimates queue reset cost
The strategy behaves as if the reloaded display were a continuation of prior opportunity. But your passive child may now be effectively farther back than the model thinks.
Step 5) Schedule progress decays quietly
Nothing dramatic may happen in a single instant. Instead:
- passive fills arrive slower,
- residual inventory falls behind plan,
- and queue waiting time stretches.
Step 6) Deadline or toxicity pressure forces catch-up
Now the desk pays the real bill:
- more aggressive routing,
- larger child clips,
- worse markout,
- higher implementation shortfall,
- and sometimes venue hopping away from the once-absorbent level.
Modeling framework
A useful decomposition is:
[ P(\text{passive fill in }\Delta t)=f(H_t, R_t, Q_t, V_t, U_t) ]
where:
- (H_t): hidden-reserve presence / strength,
- (R_t): refresh hazard / recent replenish behavior,
- (Q_t): displayed-priority continuity state,
- (V_t): venue microstructure regime,
- (U_t): urgency / deadline state.
The key upgrade is making (Q_t) explicit.
A simple latent-state version
Let:
- (Q_t = 1): post-refresh displayed opportunity behaves like fresh priority loss,
- (Q_t = 0): no recent refresh break / continuity not yet broken.
Then effective actionable queue support is:
[ D^{actionable}_t = D^{disp}_t + w_H H_t - \lambda_Q Q_t ]
where:
- (D^{disp}_t): visible depth,
- (H_t): hidden-support estimate,
- (w_H): discounted conversion from hidden support to actionable passive value,
- (\lambda_Q): queue-reset premium / penalty.
The point is not exact elegance. It is to force the model to stop giving full passive credit to hidden reserve when refresh semantics break displayed continuity.
Queue-reset premium
Define a conditional miss-cost term:
[ QRP_t = P(Q_t=1 \mid \mathcal{F}_t) \cdot C^{miss}_t ]
where (C^{miss}_t) is the estimated cost of underfilling now and catching up later.
This term belongs in live slippage control every bit as much as temporary impact or adverse-selection penalties.
Features that matter online
Maintain rolling features around the working level:
Refill Event Count (REC)
Number of replenishment signatures in the lookback.Post-Refresh Fill Residual (PFR)
Realized passive fills minus model-expected fills immediately after a refill.Reload Gap (RG)
Time between visible tranche depletion and next displayed replenishment.Clip Consistency / Randomization Score (CCS)
Whether visible refill sizes repeat tightly or vary within a venue-like randomization band.Consumed-to-Displayed Ratio (CDR)
Aggressive flow consumed at the level relative to displayed depth.Queue Survival Residual (QSR)
How actual queue survival differs from what a no-refresh-loss model predicted.Hidden Support Strength (HSS)
Your existing iceberg / reserve-presence score.Venue Priority Semantics Flag (VPS)
Venue-specific prior about whether refresh tends to imply fresh displayed time priority and/or distinct reserve priority treatment.Modeled Depth Visibility (MDV)
MBO vs MBP vs broker-internal synthetic visibility; MBP should increase uncertainty.Completion Pressure (CP)
Residual-vs-clock gap, which controls how costly a passive miss is right now.
Slippage decomposition
Extend the shortfall model:
[ IS = Spread + TempImpact + Delay + Fees + MissCost + QRP ]
where:
[ MissCost_t = P(\text{passive underfill} \mid \mathcal{F}_t) \cdot C^{catchup}_t ]
and
[ QRP_t = P(\text{refresh-priority loss} \mid \mathcal{F}_t) \cdot C^{catchup}_t ]
These two are related but not identical:
- passive underfill can happen for many reasons,
- refresh-priority loss is the specific branch where your hidden-liquidity signal got over-translated into passive confidence.
This distinction matters for diagnostics and policy tuning.
Controller design
State A — ABSORBING_BUT_FRESH
Hidden support present, no strong evidence yet that queue continuity broke.
- normal passive bias,
- standard clip sizes,
- monitor refill transitions closely.
State B — RELOADING
Refills are happening, but each new display should be treated cautiously.
- reduce passive-size assumptions,
- widen uncertainty on fill probability,
- cap queue-edge credit from hidden reserve.
State C — RELOAD_TRAP
Repeated refill events + negative post-refresh fill residuals.
- trim passive participation,
- lengthen tolerance for hidden-support inference only if urgency is low,
- diversify venue usage,
- escalate miss-cost weight in action scoring.
State D — DEADLINE_PROTECT
Residual-vs-clock gap is widening after repeated passive disappointments.
- stop pretending the reserve will save completion,
- rotate to safer completion routes,
- allow controlled aggression before panic mode.
Use hysteresis and minimum dwell time so the controller does not flip state on every micro-event.
Practical policy rules
A compact policy overlay:
[ PassiveBias_t = PassiveBias_{base} - a \cdot P(Q_t=1) ]
[ Clip_t = Clip_{base} \cdot (1 - b \cdot P(Q_t=1)) ]
[ CatchupWeight_t = CatchupWeight_{base} + c \cdot P(Q_t=1) \cdot CP_t ]
High-level meaning:
- do not eliminate passive logic just because reserve exists,
- do not grant full queue credit after refresh,
- and raise the price of waiting when schedule pressure is already building.
Backtest / replay design
To test this properly, avoid the usual trap of replaying only depth snapshots.
You want event labels that approximate:
- visible tranche depletion,
- replenishment timing,
- whether your passive child would have remained competitive after each refresh,
- and the eventual cost of waiting too long.
Minimum viable replay labels
For each candidate episode, record:
- symbol / venue / session,
- working price level,
- displayed depletion timestamps,
- replenishment timestamps and sizes,
- passive child resting state,
- expected fill under continuity assumption,
- realized fill outcome,
- residual-vs-clock gap after the episode,
- and eventual catch-up cost.
Key counterfactual
Compare two policies:
Naive refill-trusting policy
Hidden support boosts passive confidence with little or no priority-loss penalty.Refresh-aware policy
Hidden support helps, but post-refresh queue continuity is discounted.
Success is not just lower average spread cost. It is lower p90/p95 catch-up pain and fewer deadline squeezes.
Monitoring KPIs
Track by venue, liquidity bucket, and urgency bucket:
- passive fill hit rate after refill events,
- passive fill residual conditional on refill,
- residual-vs-clock drift after repeated refills,
- late aggression share after refill episodes,
- markout of catch-up children following refill-trap states,
- implementation shortfall p50 / p90 / p95,
- and calibration error of the refresh-priority-loss probability.
A particularly useful KPI is:
Refill Trust Gap (RTG)
[ RTG = E[\text{expected passive fill after refill} - \text{realized passive fill after refill}] ]
If RTG is persistently positive, your controller is over-trusting reserve refresh.
Common mistakes
1) Treating hidden reserve as if it were displayed queue rank
Reserve can support price without supporting your passive seniority. Those are different assets.
2) Training on MBP-only data without an uncertainty premium
If you cannot directly observe queue continuity, your model should widen uncertainty, not collapse it.
3) Measuring only immediate spread capture
The real cost often appears later as delayed completion and catch-up impact.
4) Assuming all venues refresh the same way
Even when the broad pattern is similar, venue-specific semantics matter enough that a single global rule is dangerous.
5) Ignoring urgency interaction
A mild queue-reset penalty is manageable when the clock is loose and expensive when the deadline is near.
Minimal pseudocode
features = featurize(level_events, trades, queue_model, urgency_state)
hidden_score = hidden_model.predict(features)
refresh_loss_prob = refresh_priority_model.predict_proba(features)
passive_fill_prob = fill_model.predict({
**features,
"hidden_score": hidden_score,
"refresh_loss_prob": refresh_loss_prob,
})
if refresh_loss_prob < th1:
state = "ABSORBING_BUT_FRESH"
elif refresh_loss_prob < th2:
state = "RELOADING"
elif urgency_state.completion_pressure < cp_crit:
state = "RELOAD_TRAP"
else:
state = "DEADLINE_PROTECT"
params = policy_map[state]
submit_child_orders(params)
log_decision(features, hidden_score, refresh_loss_prob, state, params)
Bottom line
Reserve replenishment is valuable information. But if your slippage stack turns that signal into unconditional passive confidence, it will eventually pay for a false assumption:
same price does not mean same queue.
A robust model should separately estimate:
- hidden support,
- refresh behavior,
- and displayed-priority continuity.
When those three get untangled, iceberg signals stop behaving like magical liquidity promises and start behaving like what they really are:
useful, partial information with venue-shaped limits.