ID: S023
Slug: overnight-only-capture-v1
Type: OVN
Date added: 2026-06-08
Status: open — promoted from
lab/candidates/overnight-only-capture-v1.md
Wall: 4 — Things big funds can't hold
One-line setup
We expect that a strategy that buys a liquid US equity universe (or proxy ETF) at or near the closing auction and sells at or near the next open, repeated daily, sized at the universe-equal-weighted notional predicts positive mean cumulative return net of realistic auction-fill friction in the liquid US equity universe over a broad ETF benchmark over a 10+ year backtest window, because nearly all the long-run equity return historically accrues overnight (close→open) with the intraday session roughly flat or negative; the pattern survives because trading the open and close auctions is friction-heavy, capacity-limited, and carrying unhedged overnight gap risk is uncomfortable for leveraged institutional books — the discomfort is the reason it isn't fully arbitraged.
Rationale (the "because", expanded)
A long-documented pattern: for broad equities, nearly all the long- run return has accrued overnight, with the intraday session roughly flat or negative. It survives partly because it's awkward — trading the open and close auctions is friction-heavy and capacity-limited, and carrying unhedged overnight gap risk is uncomfortable for leveraged institutional books. The discomfort is the reason it isn't fully arbitraged.
Orthogonal, price-only, testable immediately. Its honesty test is the friction model — making it a useful discipline-check for the lab as much as a candidate edge.
Data required
- Tiingo EOD prices: daily close + daily open per ticker, 10+ years
- Universe definition: liquid US equity universe OR a single ETF proxy (SPY, IWM, MDY) — calibrate; ETF proxy is cleaner first test
- No scraping, no options, no fundamentals
Quick-kill gate (Stage 1)
Will be considered to have passed Stage 1 if:
- Net mean per-day return (close→open) after a realistic round- trip auction friction of 10bps per leg ≥ +1bp/day [suggested, to freeze]
- Net annualised return after friction ≥ +2.5% (annualised from daily net mean, 252 trading days) [suggested, to freeze]
- Welch p<0.05 AND mean>0 on the per-day net return distribution [suggested, to freeze]
- Sample size ≥ 2500 trading days (~10 years) [suggested, to freeze]
- Effect present in both sample halves [suggested, to freeze]
- Friction-sensitivity check: at 2× friction (20bps per leg), net mean per-day return must remain > 0 — the strategy's entire value proposition is friction-survivability [suggested, to freeze]
What I expect to find
The gross overnight effect is well-documented and will almost certainly show positive at face-value. The friction-sensitivity check is the entire ballgame. Probability of clearing the gross gate is high (~80-90%). Probability of clearing the friction-sensitivity gate is moderate-low (~30-40%) — at daily turnover, 10bps round-trip per leg is 50bps/week of bleed which eats most of the documented overnight premium in academic literature. Most likely failure mode is exactly what S006 (overnight gap-fade) demonstrated: positive in- sample mean that disappears under realistic transaction costs.
Notes
- The friction assumption is THE design choice. 10bps per leg is generous for auction-fills on liquid ETFs, tight for individual- name auctions. Calibrate against actual published auction imbalance data if available.
- ETF proxy first (SPY), then individual-name basket only if the ETF passes — names add complexity (which names? capacity-weighted or equal-weighted?) and likely worse friction.
- Look-ahead trap: the previous-close is the only valid entry-price reference at decision time; the open is the exit. No use of the same-day close as an entry-time signal.
- This setup is a discipline-check for the lab as much as an edge candidate. Even a clean failure would be informative — it pins down the friction model for future high-turnover setups.
Disclosure boundary
This setup file is internal. Downstream result.md / kill.md
writeups must follow lab/DISCLOSURE_POLICY.md §2. Pre-publish:
python -m pytest tests/test_disclosure.py.