[polymarket][tsstat] 1d logit momentum mean-reversion — INCONCLUSIVE

active
polymarkettsstatmomentummean-reversioninconclusive   Priority: 4   Source: polymarket-tsstat   Created: 2026-05-20   Updated: 2026-05-20

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

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

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

  1. Sample too short (22 effective days → eff_n ≈ 74). Need 6+ months to reject at 95%. Revisit with subgraph historical data.
  2. 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).
  3. Potential look-ahead check: all factor computations use hourly[:t] slices; forward return uses log_p[t+24] - log_p[t]. No look-ahead confirmed.
  4. Next: Test on daily-rebalanced portfolio to see if net PnL turns positive; extend dataset via Polygon subgraph.
Edit this Idea