spb/anomaly-atlas Public License
Systematic discovery & rigorous validation of statistical anomalies in open HF market data (hfmarketdata.io) — pre-registered, artifact-null-driven, fully reproducible. Live atlas: www.anomaly-atlas.io
Python 61.4%
JavaScript 28.7%
CSS 8.6%
Shell 0.7%
Makefile 0.5%
1---2project: anomaly-atlas3document: State of the art4author: Simon-Pierre Boucher5contact: contact@spboucher.ai6data_source: hfmarketdata.io7created: 2026-08-128modified: 2026-08-129status: reviewed10---1112# State of the art (Phase 2)1314Critical map of each anomaly family and method, in the charter §5 template.15Sources: `research/bibliography.md` (52 verified references, accessed162026-08-12); dataset facts: `research/data_source_profile.md`; measured17artifact levels: `research/artifact_taxonomy.md` (T1–T7).1819**Epistemic status legend:** robust / decayed / disputed / likely-artifact.2021---2223## A1 — Short-horizon individual-stock reversal2425- **What it claims.** Individual stock returns revert at daily–monthly26 horizons (Lehmann 1990 weekly; Jegadeesh 1990 monthly).27- **Granularity required.** Daily suffices; our 1min adds the ability to28 separate close-convention effects. ✅ testable.29- **Known artifact confounds.** Bid-ask bounce (T1 — Blume–Stambaugh showed30 it halves such effects), stale prices (T2), auction-close mismatch (T4).31- **Decay evidence.** McLean–Pontiff −58 % post-publication; Chordia et al.32 2014 attenuation with liquidity. Largely gone in liquid U.S. names.33- **Correct test.** Cross-sectional reversal portfolios with bounce-robust34 prices + VR/AC1 net of the liquidity-bucket bounce null; block-bootstrap35 CIs (assumes stationarity within blocks).36- **Multiple-testing exposure.** Moderate: horizon × universe × weighting37 grid. Pre-specify or FDR-correct.38- **Cost sensitivity.** Extreme — highest-turnover class; Novy-Marx–Velikov39 prior: dies net of costs.40- **Open-source impl.** Our own `stats/reversion.py` (gated §8.1); arch's41 `VarianceRatio` as cross-check — both build on macOS arm64. ✅42- **Main limitation.** Without quote data, bounce correction is estimated,43 not measured.44- **Honest new test here.** A 2000–2026 *decay curve* of daily reversal net45 of the measured bounce null, by liquidity bucket — a decay re-measurement,46 not a discovery claim. **Status: decayed (gross); likely-artifact (net).**4748## A2 — Index/portfolio variance-ratio momentum4950- **Claims.** Weekly index returns positively autocorrelated, VR(q) > 151 (Lo–MacKinlay 1988).52- **Granularity.** Daily/weekly from our 1day bars (2000→) and intradaily53 aggregation. ✅54- **Confounds.** Fisher stale-constituent effect (T2/T3) inflated early55 index autocorrelation; largely gone in ETF prices (SPY trades fresh).56- **Decay.** The classic effect faded post-1990s; on ETFs (traded prices,57 not stale indices) it was always weaker.58- **Correct test.** Lo–MacKinlay VR with heteroskedasticity-robust CIs /59 block bootstrap; on BOTH the index (SPX) and the ETF (SPY) — divergence60 measures the Fisher artifact directly.61- **MT exposure.** Low if q-grid pre-specified (q ∈ {2,5,10,30}).62- **Cost sensitivity.** n/a as stated (it's a statistical property claim).63- **Impl.** Ours + arch. ✅64- **Limitation.** Regime breaks (2008, 2020) dominate long windows —65 Bai–Perron sub-periods mandatory.66- **Honest new test.** SPX-vs-SPY VR divergence as a *quantified Fisher67 artifact* 2008–2026 — methodological contribution. **Status: decayed;68 index-level residual = likely-artifact.**6970## A3 — Lead-lag: large caps → small caps7172- **Claims.** Returns of large stocks lead small stocks (Lo–MacKinlay 1990);73 the source of "contrarian" profits.74- **Granularity.** Daily and 1min both usable. ✅75- **Confounds.** Non-synchronous trading (T3) — THE canonical confound76 (Scholes–Williams); our expB measured SPY spuriously leading stale names77 +0.047 at 1min.78- **Decay.** Chordia–Roll–Subrahmanyam: minute-scale predictability79 arbitraged within 5–60 min by 2005; expect near-zero today in fresh pairs.80- **Correct test.** Lagged cross-correlation/Granger ONLY on both-fresh81 subsamples, against the staleness-matched null (expB machinery);82 Epps-aware at 1min.83- **MT exposure.** High (pairs explosion) — pre-specify a small pair set.84- **Cost sensitivity.** Extreme for any tradable interpretation.85- **Impl.** Ours (`stats/leadlag.py`, gated). ✅86- **Limitation.** No trade timestamps within the bar; sub-minute lead-lag87 invisible.88- **Honest new test.** Decay curve of large→small lead-lag 2000–2026 net of89 the staleness null — with the *artifact share* reported alongside the90 total. **Status: decayed (fresh pairs); the textbook effect is largely T391 artifact in modern data.**9293## A4 — Futures/ETF/index lead-lag (price-discovery ordering)9495- **Claims.** Futures (ES) lead cash ETFs (SPY) which lead the index print96 (SPX) at minute scale.97- **Granularity.** 1min is coarse for this (the true lead is seconds) but98 the *ordering* may still be detectable. ⚠️ marginal.99- **Confounds.** T3/T7 (session semantics, index staleness — expB measured100 SPX lagging SPY +0.065); futures splice choice (3 variants — testable).101- **Decay.** At seconds-scale this is permanent structure; at 1min it may be102 fully arbitraged/invisible.103- **Correct test.** Both-fresh 1min xcorr ES↔SPY with staleness null;104 robustness across the three futures adjustment variants.105- **MT exposure.** Low (one pre-specified triple).106- **Cost sensitivity.** n/a (structural claim, not a strategy).107- **Impl.** Ours. ✅108- **Limitation.** 1min floor; ES data starts 2008.109- **Honest new test.** Is ANY ES→SPY lead detectable at 1min after the110 staleness null, and is SPX→anything pure artifact? **Status: robust at111 sub-second (literature); unknown at 1min on open data — genuine gap.**112113## A5 — Cross-asset information flow: crypto ↔ crypto-exposed equities114115- **Claims.** (Thin literature.) 24/7 crypto prices embed information that116 equity prices can only reflect at the next open.117- **Granularity.** 1min crypto (24/7) + equity opens. ✅ — this is a118 *structural* granularity advantage of our dataset.119- **Confounds.** Overnight-gap conventions (T4), selection of "exposed"120 equities (must be pre-specified), regime dependence (crypto-equity beta121 varies).122- **Decay.** Unknown — modern, underexplored on open data.123- **Correct test.** Does BTC's Friday-close→Monday-preopen return predict124 the Monday opening gap of pre-specified crypto-exposed equities, vs a125 placebo set and a permuted-weekend null?126- **MT exposure.** Low if the equity set and horizon are pre-registered.127- **Cost sensitivity.** Open-auction execution is costly; report the128 frontier.129- **Impl.** Ours. ✅130- **Limitation.** Short joint history (crypto-exposed equities mostly131 2018→); few independent weekends (~400).132- **Honest new test.** Exactly the above — one of the few places our data133 can ask something not already answered. **Status: unknown/genuine gap.**134135## A6 — Weekend / Monday effect136137- **Claims.** Negative Monday returns (French 1980).138- **Granularity.** Daily. ✅139- **Confounds.** Close conventions (T4); DST weeks (T7).140- **Decay.** The cleanest corpse: gone post-publication (Schwert 2003;141 Marquering et al. 2006).142- **Correct test.** Day-of-week means with permuted-calendar null + SPA143 against the full day-of-week universe (STW 2001 protocol).144- **MT exposure.** High by construction — the calendar space.145- **Cost sensitivity.** Any exploitation is high-turnover.146- **Impl.** Ours. ✅147- **Honest new test.** Re-confirmation of absence on 2000–2026 open data,148 published as a **negative control** for the calendar pipeline.149 **Status: decayed.**150151## A7 — Turn-of-month152153- **Claims.** Returns concentrate around month boundaries (Ariel 1987;154 Lakonishok–Smidt 1988).155- **Granularity.** Daily. ✅156- **Confounds.** Month-boundary volume/flows are real mechanics157 (pension/401k flows) — a *mechanism*, not an artifact; but overlap with158 OpEx week and quarter-ends must be disentangled.159- **Decay.** The last survivor as of Marquering et al. 2006. Post-2006160 behavior on open data = open question.161- **Correct test.** Pre-specified window (−1..+3 trading days), permuted-162 calendar null, SPA vs the full window universe, sub-period stability.163- **MT exposure.** Moderate — window choice is the researcher degree of164 freedom; pre-register ONE window.165- **Cost sensitivity.** Low-frequency (12×/year) — the rare calendar effect166 that could survive costs if real.167- **Impl.** Ours. ✅168- **Honest new test.** Did the last survivor survive 2006–2026?169 **Status: disputed — the most interesting calendar re-test.**170171## A8 — Intraday momentum (first → last half-hour)172173- **Claims.** First half-hour market return predicts last half-hour (Gao et174 al. 2018); mechanism: gamma hedging (Baltussen et al. 2021).175- **Granularity.** 1min/30min SPY. ✅ perfect fit.176- **Confounds.** Overnight-gap inclusion choice; T4 close convention; spread177 seasonality (U-shape) at both ends of the day.178- **Decay.** Published 2018 — post-publication window (2018–2026) is exactly179 what open data can measure now.180- **Correct test.** Pre-registered replication (their exact spec) + OOS181 post-2018 sample + gamma-state split using our options chains; DSR for the182 spec search.183- **MT exposure.** Low if the published spec is frozen.184- **Cost sensitivity.** Two trades/day at the most liquid instrument's most185 liquid hours — survivable in principle; measure.186- **Impl.** Ours. ✅187- **Honest new test.** The cleanest possible *decay measurement*: published188 effect, published spec, untouched post-publication data.189 **Status: disputed (post-2018 fate unknown).**190191## A9 — Intraday U-shape (open/close vol & spread concentration)192193- **Claims.** Volatility, volume, spreads peak at open and close (Wood et194 al. 1985).195- **Granularity.** 1min. ✅196- **Confounds.** None — this one is *real microstructure*, and it is itself197 a confounder for other intraday claims.198- **Decay.** Robust across decades.199- **Correct test.** Descriptive profile with bootstrap bands.200- **Cost sensitivity.** n/a (input to the cost model, not a strategy).201- **Honest contribution.** Measure the intraday profile of OUR bounce null202 (taxonomy open item) so expE can subtract it. **Status: robust — use as203 positive control + cost-model input.**204205## A10 — Overnight vs intraday return split206207- **Claims.** Equity returns accrue disproportionately overnight.208- **Granularity.** Daily open/close (+1min for convention checks). ✅209- **Confounds.** T4 is *central*: auction close vs last bar changes overnight210 returns mechanically; stale opens for illiquid names.211- **Decay.** Persistent in the literature but convention-sensitive —212 disputed as economics vs plumbing.213- **Correct test.** Recompute under BOTH close conventions and both open214 definitions (first 1min bar vs daily open field); effect must survive all215 four.216- **MT exposure.** Low.217- **Cost sensitivity.** High (daily turnover).218- **Honest new test.** Quantify how much of the overnight premium is219 convention-dependent on this dataset. **Status: disputed.**220221---222223## Methods inventory (with macOS arm64 status)224225| Method | Use | Implementation | arm64 |226|---|---|---|---|227| Lo–MacKinlay VR + block bootstrap | Q1 scans | ours (§8.1-gated) + `arch.unitroot.VarianceRatio` cross-check | ✅ |228| Lo (1991) modified R/S | long-memory claims | to implement, gate on synthetic long-memory | ✅ |229| Lagged xcorr / Granger | Q2 | ours + `statsmodels grangercausalitytests` | ✅ |230| Roll / Corwin–Schultz / CHL / EDGE spreads | cost model, T1 null | ours (Roll); `bidask` package (EDGE, pure numpy) + own CS/CHL | ✅ |231| Moving-block / stationary bootstrap | all CIs | ours (Künsch); Politis–Romano to add for RC/SPA | ✅ |232| White RC / Hansen SPA / Romano–Wolf StepM | expF | no maintained OSS — implement ourselves, gate on synthetic | ✅ (numpy) |233| Benjamini–Hochberg FDR | scan triage | trivial; `statsmodels.stats.multitest` | ✅ |234| Deflated Sharpe / PBO-CSCV | expF/expH | implement from Bailey–López de Prado formulas | ✅ |235| Bai–Perron breaks | regime robustness | `statsmodels` (partial) / own dynamic-programming impl | ✅ |236237**Cross-cutting conclusion.** On modern liquid U.S. equities, the honest238prior for every *gross* short-horizon effect is decay toward zero, and for239every *net* effect, death by costs. The genuine opportunities on THIS data240are: (i) decay re-measurements with artifact shares reported (A1–A3, A8),241(ii) the structural questions our dataset uniquely reaches (A4 at 1min, A5242cross-asset 24/7), (iii) the last-survivor calendar re-test (A7), and243(iv) methodological artifact quantifications (A2 Fisher share, A10244convention share) — all publishable regardless of sign.245