Last-Look Reject-Asymmetry FX Slippage Playbook

2026-04-12 · finance

Last-Look Reject-Asymmetry FX Slippage Playbook

Focus: model and control the hidden execution tax created when streaming FX liquidity looks tight on the screen but rejects toxic or stale requests asymmetrically, forcing the taker into a slower, worse second attempt.


1) Why this matters in production

In spot FX, a stream can look cheap and deep right until you try to trade it.

The usual failure pattern:

This creates a slippage component that is easy to miss because the rejected trade never becomes a fill. If you only analyze accepted fills, you systematically under-measure true execution cost.

Operationally, this produces four recurring distortions:

  1. Phantom best-price bias — streams with low displayed spread but high reject probability look artificially good.
  2. Second-hop deterioration — the realized cost happens on the fallback venue, not the original venue that caused the delay.
  3. Toxicity selection bias — accepted flow looks clean because the worst flow was screened out.
  4. Protocol fragility — in fast markets, reject asymmetry can dominate ordinary spread differences.

This is exactly why market guidance around FX last look has focused on transparency around symmetric vs asymmetric checks and on preventing extra hold time that is used to wait for favorable future price moves rather than complete genuine validity/risk checks.


2) Core setup

Suppose the taker receives quote

[ q_t = (b_t, a_t) ]

and submits a buy or sell request at time (t). The LP evaluates it over a last-look window (\Delta), using a reference price observed at decision time (t+\Delta).

Let side (s \in {+1,-1}), where (+1) is buy and (-1) is sell. Let the requested execution price be (p_t), and let the LP's reference mid at decision time be (m_{t+\Delta}).

Define the signed move against the LP / in favor of the taker as:

[ X = s \cdot (m_{t+\Delta} - p_t) ]

A simple last-look decision rule is:

[ \text{Accept if } X \le \theta^+ \text{ and } X \ge -\theta^- ]

where:

If (\theta^+ = \theta^-), the rule is symmetric. If (\theta^+ \ne \theta^-), the rule is asymmetric.

When rejected, the taker usually reroutes after latency (L_r) and executes at fallback price (p'_t). The realized reject-induced slippage is:

[ S_{rej} = s \cdot (p'_t - p_t) ]

This quantity is often the missing term in FX TCA.


3) What to measure live

3.1 Reject Asymmetry Ratio (RAR)

Compare reject rates on favorable vs unfavorable short-horizon price moves.

[ RAR = \frac{P(\text{reject} \mid X > x_0)}{P(\text{reject} \mid X < -x_0)} ]

for a small threshold (x_0) in bps or ticks.

Interpretation:

3.2 Reject Hold-Time Gap (RHG)

Difference between median reject and accept decision times:

[ RHG = \operatorname{Median}(T_{reject}) - \operatorname{Median}(T_{accept}) ]

A persistently positive RHG is suspicious because the taker pays not only the reject, but also the time spent waiting to be rejected.

3.3 Fallback-Hop Cost (FHC)

Mean cost of the second execution after rejection:

[ FHC = \mathbb{E}[S_{rej} \mid \text{reject}] ]

This is the cleanest economic measure of reject damage.

3.4 Display-to-Executable Spread Gap (DESG)

Difference between displayed spread and effective spread after reject handling:

[ DESG = \mathbb{E}[\text{effective spread}] - \mathbb{E}[a_t - b_t] ]

High DESG means the stream looks better than it trades.

3.5 Conditional Accept Drift (CAD)

Signed post-accept move of accepted trades:

[ CAD(\tau) = \mathbb{E}[s \cdot (m_{t+\tau} - p_t) \mid \text{accept}] ]

If accepts still have poor post-fill drift, the LP may be filtering only the most obviously toxic requests while still leaving the taker with weak executions.

3.6 Requote/Reject Replacement Cost (RRC)

If some venues requote instead of hard reject, normalize both into one cost bucket:

[ RRC = \mathbb{E}[s \cdot (p^{final}_t - p_t) \mid \text{reject or requote}] ]

This avoids undercounting “soft rejects.”


4) Modeling framework

Treat last look as a joint acceptance-and-cost problem, not a fill-only problem.

4.1 Two-stage model

For each LP / stream / protocol bucket, estimate:

  1. Acceptance model

[ \hat{P}_{acc} = P(\text{accept} \mid Z_t) ]

  1. Conditional fallback slippage model

[ \hat{S}{rej} = \mathbb{E}[S{rej} \mid \text{reject}, Z_t] ]

where features (Z_t) include:

4.2 Effective expected cost

Rank candidate liquidity by expected executable cost:

[ EEC = \hat{P}{acc} \cdot C{acc} + (1-\hat{P}{acc}) \cdot (C{rej} + \hat{S}_{rej}) ]

where:

This prevents “best displayed quote wins” from over-routing to low-quality streams.

4.3 Survival-style view

Another clean approach is to treat accept/reject as competing outcomes over the evaluation window.

Model hazards:

This helps separate:

Slow rejects are economically much worse than equally probable fast rejects.

4.4 Regime gate

Gate by state:

Then use regime-specific acceptance and fallback models:

[ \hat{P}{acc} = \sum_r P(r \mid Z_t) \hat{P}{acc}^{(r)} ]

Reject asymmetry is usually small in calm states and dominant in shock states.


5) Correct TCA decomposition

A robust FX TCA stack should split total cost into:

[ TC = S_{display} + S_{accept} + S_{reject-delay} + S_{fallback} + S_{residual} ]

where:

Most dashboards only capture the first two terms. In last-look-heavy protocols, the third and fourth terms are often the real story.


6) Live control rules

Define operator states:

STREAM_OK

Conditions:

Action:

ASYMMETRIC_WARN

Conditions:

Action:

REJECT_TOXIC

Conditions:

Action:

SAFE_FIRM_ONLY

Conditions:

Action:


7) Practical feature ideas

Useful features that often predict reject asymmetry better than raw spread:

A very common result: reject behavior is more stable by provider × session × protocol than by pair alone.


8) Backtest protocol

Step A — Reconstruct hidden rejects

For every request:

Without request-level logs, you cannot estimate last-look tax honestly.

Step B — Build executable-cost leaderboard

Compare providers by:

This often reorders the leaderboard dramatically.

Step C — Stress by regime

Slice results by:

Reject asymmetry usually matters most where visible spread signals matter least.

Step D — Counterfactual routing

Replay with routing objective:

[ \min EEC ]

instead of best displayed quote.

Report:

Step E — Canary rollout


9) Typical pitfalls


10) Minimal 2-week implementation plan

Week 1

Week 2


References


One-line takeaway

In FX, a quote that rejects asymmetrically is not tight liquidity but a hidden option sold by the taker; model the reject path, or your slippage numbers are fiction.