Getting run over, and not
Every fill is either income or information. The losing makers are the ones who can't tell which.
The mechanics of getting run over
At 4:47pm a company guides down. At 4:47:02 whoever read the release fastest sells every bid still resting at the old price — including yours if it is still there. You were quoting 99.90 for a stock that is now worth 94. That single fill costs you 5.9% of notional; at a 20 basis point spread, that is roughly thirty sessions of honest spread income returned in one trade. This is adverse selection: the flow that chooses you because you are wrong.
Reading the tape for toxicity
Informed flow has a signature, and the kit surfaces it:
- One-sided runs. Balanced buys and sells are retail noise — that is the flow you want. Three hits on the same side inside a minute is someone who knows something.
- Size escalation. Uninformed flow is small and steady. Informed flow gets greedy: fills grow as the trader races the news.
- Cross-venue lead. A move in futures, a correlated ticker, or the same token on another venue that your pair has not matched yet is a countdown, not a coincidence.
- Silence. Fill rate dropping to zero can mean your quotes are no longer competitive — or that everyone else already pulled and you are the last bid standing in front of a headline.
The response ladder
- Skew — shade both quotes toward the side hitting you, so the market pays you to reduce your exposure.
- Widen — uncertainty went up, so the price of immediacy you charge goes up.
- Size down — same quotes, less at stake per fill.
- Pull — cancel everything, flatten what you can, re-enter only when you can price the news. Pulling is not a failure state; it is the strategy working. A maker with no quotes loses nothing.
Where the intelligence actually matters
Steps 1–3 are arithmetic; any bot can run them. Step 4 is judgment: is this
headline priced in? Is this halt real? Does this filing change fair value or just
volatility? That is a reading-comprehension problem under time pressure, which is
precisely what a language model is for. The quoter.py loop hands every
unpriceable signal to the model driving it and treats "no quote" as a first-class
answer. A pool cannot do this. A cron job cannot do this. This is the moat.