Hypothesis
Polymarket binary prices exhibit short-term mean-reversion: a market that moved in logit-space over the last 24h will partially reverse in the following 24h, due to thin-liquidity overshooting and market-maker mean-reversion.
Data used
- 25 active binary Polymarket markets with non-frozen prices (std > 0.005, n_unique_prices > 10)
- Price history endpoint:
https://clob.polymarket.com/prices-history?market=<token_id>&interval=max&fidelity=60 - Sample market IDs: 573655, 573671, 573662, 573656 (geopolitics/election markets, started ~April 2026)
- Date range: 2026-04-27 → 2026-05-19 | 528 hourly cross-sections | 13,189 total (market, time) obs
Method
$$\text{mom_1d}t = \text{logit}(p{t}) - \text{logit}(p_{t-24})$$
$$f_t = \text{logit}(p_{t+24}) - \text{logit}(p_t) \quad \text{(forward 24h return, no look-ahead)}$$
Cross-sectional IC at each hour $h$: $\text{Pearson}(\text{mom_1d}h, f_h)$
AR(1) autocorrelation of IC series: $\rho_1 = 0.755$
Effective N: $n{\text{eff}} = 528 \times \frac{1-0.755}{1+0.755} = 73.6$
$$t_{\text{AR1}} = \frac{\overline{IC}}{\hat{\sigma}{IC}/\sqrt{n{\text{eff}}}} = \frac{-0.0549}{0.2465/\sqrt{73.6}} = -1.91$$
Result
- IC mean = -0.055, IC std = 0.247, n_periods = 528
- Rank-IC mean = -0.036
- AC(1) of IC series = 0.755 (highly persistent → hours are not independent)
- t_AR1 = -1.91 (p ≈ 0.06, two-tailed; marginal, does not clear 5% threshold)
- Pooled IC = -0.064, pooled t = -1.54 (eff_n = 575 assuming market×day independence)
- Backtest (long bottom-quintile mom_1d, short top-quintile): gross PnL = -4.23 logit units over 22 days; net = -19.0 after 2c per-leg spread
- Hit rate of L/S portfolio: 35%
Verdict: INCONCLUSIVE. The negative IC direction (mean-reversion) is consistent across cross-section IC, rank-IC, and pooled IC. The t-stat of -1.91 is suggestive but not significant at 95%. The signal direction is plausible (illiquid markets overshoot then revert) but the backtest fails badly after realistic costs.
Reproduction
source ~/.pmvenv/bin/activate
python /mnt/projects/tnt_85c10df4451042ca/prj_c7cb91b70b2f42ac/d4_tsstat.py
# Factor: mom_1d, all results in /tmp/pm_data/d4_results_final.json
Failure mode / next step
- Sample too short (22 effective days → eff_n ≈ 74). Need 6+ months to reject at 95%. Revisit with subgraph historical data.
- Transaction costs are prohibitive at hourly rebalance. Even if mean-reversion is real, the 2c half-spread exceeds typical 24h price moves. Strategy only viable at daily rebalance (lower turnover cost × 24).
- Potential look-ahead check: all factor computations use
hourly[:t]slices; forward return useslog_p[t+24] - log_p[t]. No look-ahead confirmed. - Next: Test on daily-rebalanced portfolio to see if net PnL turns positive; extend dataset via Polygon subgraph.