π The Quantitative Microstructure & Cross-Market Series by FollowSM
In Part 2 we hedged Polymarket BTC markets with Binance perps. This time the underlying is a stock. Polymarket lists daily "TSLA Up or Down on β¦" markets, and since January 2026 Binance lists USDβ-M perps on TSLA, NVDA, AAPL, SPY and eight more, which trade 24/7. The stock does not: it closes at 16:00 ET and opens at 09:30 ET (16:30 EEST). The perp keeps trading through the gap.
That raises three questions:
- Do crypto microstructure tools such as VPIN, volume z-scores and book depth work on a market that has a regular session?
- Does off-hours perp flow predict the opening gap?
- How should a hedger handle the open: trade through it, freeze, or widen its band?
We ran the numbers on 1,663 US opens across 12 equity perps (JanβSep 2026, BTCUSDT as a 24/7 control) and 1,276 real Polymarket Up/Down markets.
β‘ TL;DR
- The perp prices the gap before the bell. Regressing the opening gap on the perp's move since the prior close gives slope 1.00 and RΒ² 0.998. The median gap is 74 bps; the median part not priced by 09:29 ET is 4.3 bps.
- Off-hours flow doesn't predict the rest. Taker imbalance correlates with the gap (Ο = 0.31) only because it moves the price. Against the unpriced remainder, nothing survives a multiple-testing correction, and VPIN shows no relation at all.
- Naive crypto alarms break on equities. A volume z-score against the last 24 h fires on ~50% of the first 15 minutes after the open. The same threshold against the same time slot on comparable days fires on ~1%.
- The hedge's volatility model matters most. Scaling Ο by session (overnight, pre-market, the open jump, regular hours) cut the P&L spread by 57% and the 5% expected shortfall from β$596 to β$526 per 1,000-share position, at $27 cost. Wall-clock Ο, the crypto default, cost $83 and made the tail worse than not hedging.
- The open-window freeze did almost nothing, and neither did microstructure gating: it did worse than continuous hedging.
Code and data pipeline:
tick-microstructure-research
Do FollowSM's live tick signals actually protect a market maker, and by how much? This repo records the live streams, tests the signals against a placebo, and simulates quote cancellation.
-
Capture. It records FollowSM's Enterprise streams (
/ws/v1/toxicity,/ws/v1/confluence) alongside the venues' own public tick data, which serves as ground truth. - Calibrate. It profiles the order-book signals.
- Test. It tests three hypotheses, each against a control group.
- Simulate. It simulates quote cancellation on real Polymarket books and compares every result with a placebo that fires the same trigger at random times.
Written as a follow-up to the dynamic-inventory-hedger backtest. That backtest could only rebuild VPIN from 1-minute public bars, and it found no timing value. The question left open was whether tick-level book and sweep signals do better. This repo collects the data needed to answer it.
Status: pipeline complete, data collection pending. Every number inβ¦
Dynamic Inventory Hedger
This tool delta-hedges Polymarket crypto positions with Binance USDβ-M perpetual futures. How hard it hedges depends on FollowSM microstructure toxicity: VPIN percentile, orderbook imbalance, liquidity sweeps and smart-money flow.
A Polymarket "Bitcoin above $84,000 on Friday" position is really a digital option on BTC. When informed flow hits the market, that position moves before any stop-loss can react. The hedger turns each position into an equivalent perp exposure and then:
- stays unhedged while the flow is normal;
- builds a hedge with post-only limit orders when toxicity rises;
- neutralises its exposure with price-protected IOC orders when toxicity spikes or a liquidity sweep hits;
- unwinds the hedge once the flow normalises.
It runs in paper mode by default.
Read the backtest before relying on toxicity gating. On 256 daily BTC markets (JanβSep 2026), gating on VPIN rebuilt from public 1-minute data did no better than the same hedgesβ¦
Part 1. Structural differences: a 24/7 perp on a 6.5-hour stock
Sessions
Every minute is labelled with the NYSE calendar (holidays, early closes and the US/EU daylight-saving mismatch; on 2026-03-09 the open was at 15:30 EET, not 16:30):
| session | ET | EEST |
|---|---|---|
| pre-market | 04:00β09:30 | 11:00β16:30 |
| regular (RTH) | 09:30β16:00 | 16:30β23:00 |
| post-market | 16:00β20:00 | 23:00β03:00 |
| overnight | 20:00β04:00 before a trading day | |
| closed | weekends, holidays |
The perps keep the stock's rhythm: 52β62% of single-stock volume trades in RTH, and only 3β7% when the market is closed. SPY and QQQ are more crypto-like (14% and 9% closed), and BTC is flat across sessions.
VPIN: global V vs session-aware V
The standard bucket size is V = ADV/50. We also calibrated a session-aware V: each session's trailing 7-day volume rate Γ 28.8 minutes, so a bucket fills in about the same time in every session.
| TSLAUSDT, share of time VPIN β₯ its trailing p95 | RTH | pre | post | overnight | closed |
|---|---|---|---|---|---|
| global V (ADV/50) | 13.2% | 13.6% | 14.6% | 12.3% | 11.2% |
| session-aware V | 1.8% | 4.8% | 1.3% | 5.5% | 20.7% |
The session-aware V removes the RTH false alarms but causes a new problem on weekends. Buckets sized to thin weekend flow are small, so the imbalance is noisy, and about 20% of closed-market time reads as toxic. The same holds for every symbol. Neither version is clean. A session-aware VPIN still needs a minimum bucket size or a separate threshold for closed sessions.
Fig 1. Volume jumps about 80Γ at 09:30, but VPIN's percentile falls: the burst is two-sided. BTC shows none of this.
Volume z-scores
A volume z-score against the previous 24 h (96 Γ 15-minute candles), the default for crypto sweep detection, is dominated by the daily cycle:
| minutes 09:30β09:45 ET with z β₯ 6 | naive z | same slot, comparable days |
|---|---|---|
| TSLA | 49.7% | 0.2% |
| NVDA | 46.8% | 1.1% |
| AAPL | 52.0% | 1.5% |
| SPY | 7.8% | 1.3% |
| BTC (control) | 1.4% | 0.0% |
Any "liquidity sweep" rule ported from crypto will fire on half the opening minutes. It needs a seasonal baseline keyed by session, and weekend/holiday days must not share a baseline with trading days.
Part 2. Gaps and overnight toxicity
Depth thinning before the open
We measured depth within Β±1% of mid from Binance's 30-second bookDepth snapshots. The 15-minute pre-open window (09:15β09:29) shows no thinning: the ratio to the same day's 08:00β09:00 depth is 0.97β1.01 for every symbol, and the same on the top-decile gap days (1.00 vs 0.99).
The thinning is shorter than that. Median depth drops to about 0.8Γ in the last minutes before the bell and on the open, and to about 0.7Γ on big-gap days. It recovers within about five minutes.
Fig 2. Β±1% depth relative to the same morning. The dip lasts minutes, not a quarter-hour. Red: days with |gap| β₯ 253 bps, including overnight news.
The pre-open depth ratio did not predict gap size (Ο = 0.007) or post-open volatility (Ο = 0.03).
Does overnight toxicity predict the gap?
We define the gap as the Yahoo open over the prior close, and the unpriced residual as the gap minus the perp's move up to 09:29.
| signal | vs gap | vs residual |
|---|---|---|
| off-hours taker imbalance | Ο +0.31, 62% direction | Ο +0.03 (p = 0.16) |
| pre-open taker imbalance | Ο +0.19, 57% direction | Ο +0.06 (p = 0.013) |
| book log-imbalance at 09:29 | Ο β0.12 | Ο β0.02 (p = 0.54) |
| VPIN percentile at 09:29 vs |gap| | Ο +0.02 (p = 0.33) | Ο +0.04 (p = 0.16) |
Flow "predicts" the gap only because flow moves the perp price, and the perp price already is the gap forecast. After removing that, the best signal is Ο = 0.06, a 55.7% hit rate, at p = 0.013 across six tests. That fails a Bonferroni correction, and we don't claim it.
Part 3. Cross-venue price discovery
| gap regressed on | n | slope | RΒ² |
|---|---|---|---|
| perp move, prior close β 09:29 | 1,663 | 1.002 | 0.998 |
| Binance index move | 1,663 | 0.991 | 0.968 |
| perp, after weekends/holidays only | 347 | 0.995 | 0.994 |
The perp's sign matched the gap's on 99.7% of opens with |gap| β₯ 10 bps. By the bell, the perp is the price.
At 1-minute resolution, lead-lag against the Binance index and Yahoo 1m bars peaks at lag 0 in every session. The one exception is closed hours, where the perp leads the index by a minute. That is expected: the index blends dxFeed, Kaiko and Pyth, and on weekends it partly tracks the perp itself, so it is not an independent reference. Any lead faster than a minute is beyond what this data can resolve.
Part 4. The strategy: hedging an Up/Down market through the open
Setup
- Positions. Each Polymarket " Up or Down on " market resolves on whether the official close beats the prior trading day's close. We buy 1,000 shares of Up (and, mirrored, of Down) at the prior close and delta-hedge with the perp until the market's final 5 minutes.
- Markets. 1,819 markets were found. 1,276 were simulated after skips: 481 for the 20-day variance warm-up, 55 listed after the prior close, and 7 whose resolution disagreed with Yahoo's closes. QQQ had no usable markets.
- Execution. IOC orders walk the real Binance tick tape from decision time plus latency; any unfilled remainder pays +5 bps. Fees and funding are charged.
- Fail-closed and hysteresis. Missing minutes or an empty tape mean no trade, never an optimistic fill. The gated strategy keeps the Part 2 hysteresis re-arm thresholds.
| strategy (per 1,000-share position) | mean P&L | P&L std | 5% ES | p95 max DD | cost | perp traded |
|---|---|---|---|---|---|---|
| unhedged | $0 | $504 | β$596 | $875 | $0 | $0 |
| continuous, wall-clock Ο | β$83 | $331 | β$792 | $997 | $83 | $782k |
| open-window freeze (Β±5 min), wall-clock Ο | β$82 | $338 | β$808 | $1,026 | $83 | $759k |
| continuous, session Ο | β$27 | $217 | β$526 | $685 | $27 | $273k |
| freeze, session Ο | β$26 | $219 | β$525 | $689 | $26 | $268k |
| microstructure-gated | β$196 | $421 | β$1,039 | $991 | $199 | $693k |
| placebo gate (10-seed avg) | β$211 | $411 | β$1,054 | $1,037 | $214 | $689k |
Fig 3. Per-position P&L and tail risk: unhedged vs continuous vs freeze, under both volatility models.
Key Backtest Findings:
- Session Ο is the whole result. The wall-clock model spreads the day's variance evenly across 24 hours, but most of a stock's variance lands in the opening jump and regular hours. So it misjudges the remaining variance, and its delta is jumpier. It trades about 3Γ the notional and pays 3Γ the cost, and its tail is worse than doing nothing. After weekends and holidays its cost rises to $139.
- The freeze window is irrelevant. It saves about $1 of opening-window cost and changes nothing else, whichever Ο model it uses. The perp has priced the gap by 09:30, so there is little left to avoid.
- Latency matters only at the extreme. Delaying the fill from 0 to 250 ms changes nothing. At 1,000 ms, cost rises from $83 to $92.
- Widening the deadband is a cost dial, not a risk tool. Raising the rebalance band from $500 to $5,000 cuts wall-clock cost from $74 to $24. But the 5% ES only improves to β$716, still worse than unhedged. A wider band cannot fix a wrong Ο.
- Gating doesn't help. The gated strategy had a better 5% ES than all ten placebo seeds, but a wider P&L spread than all of them. Both lose badly to plain continuous hedging, so we don't count it as an edge.
Even the best hedge keeps a β$526 ES, because a binary settles with a jump that no perp hedge can follow through the final minutes. That is the same lesson as the BTC study.
Caveats
- Short history. Eight months at most per symbol, and the newest perps (QQQ, SPY, AAPL, MSFT) have under six.
- Reference prices. Yahoo closes are the reference; the 7 markets whose resolution disagreed with them were skipped, not patched. Yahoo post-market 1m bars are sparse, so post-session correlations with Yahoo are near zero and are not informative.
- Fills. Queue position is not modelled for passive orders, and IOC fills assume we trade after the observed prints at their prices. Hedge notionals ($0.3β0.8M per position over a day) are small against RTH volume but not against weekend volume.
- Entry prices. Polymarket entry uses the CLOB price history at the prior close, not a real fill.
π Reproduce
git clone [https://github.com/Follow-SM/tick-microstructure-research](https://github.com/Follow-SM/tick-microstructure-research)
cd tick-microstructure-research && pip install -e ".[parquet]"
tmr tradfi fetch # ~1.4 GB of public Binance archives + Yahoo, checksum-verified
tmr tradfi analyze # research/TRADFI_REPORT.md, results_tradfi.json, figures
git clone [https://github.com/Follow-SM/dynamic-inventory-hedger](https://github.com/Follow-SM/dynamic-inventory-hedger)
cd dynamic-inventory-hedger && pip install -e ".[tradfi]"
python research/backtest_tradfi.py
Get started
- The hedger: dynamic-inventory-hedger. Paper mode by default.
- The research toolkit: tick-microstructure-research.
-
Python SDK:
pip install followsm-sdkΒ· TypeScript:npm install @followsm/sdk
FollowSM streams VPIN, 1% book toxicity, sweep detection and smart-money flow for crypto markets today. This study shows what session-aware versions of those signals need before they can be trusted on equity perps.
π Get your API key at follow-sm.com/pricing
References: Easley, LΓ³pez de Prado & O'Hara (2012), "Flow Toxicity and Liquidity in a High-Frequency World", Review of Financial Studies. Barclay & Hendershott (2003), "Price Discovery and Trading After Hours", Review of Financial Studies.
Not financial advice. Prediction markets and perpetual futures carry substantial risk of loss.



Top comments (0)