30-min opening drift on speculative small caps (Coen)
ID: S007
Slug: coen-opening-drift-speccap-v1
Failed at: Stage 1 (Quick-screen)
Fail reason: magnitude
Date: 2026-05-29
Contributor: Coen — first community-submitted setup through the Mechaniq Lab pipeline. Logged with thanks — a clean failure is valuable output too.
What we tested
The two-part setup came from observed retail trading dynamics:
Down-case: when one drops in the first 30 minutes, panic selling exhausts itself by midday (the panic sellers have sold), so the morning low should hold and the afternoon should drift back up — buyable at hour 4 and sellable into the close.
We tested both legs independently on 1,489 stocks meeting our "spec-cap" filter (market cap proxy via daily dollar volume between $10M and $500M, plus annualized volatility ≥ 70%). For each stock and each trading session we identified the 30-minute opening bar (09:30-10:00 ET), the midday bar (closing at 12:30 ET), and the day-end bar (closing at 16:00 ET).
Pre-set criteria: - Up-case: signal needed average 30min-to-hour-3 return of at least +1.8%, hit rate ≥ 55%, conditional probability of cumulative high reaching +3% above the open by hour 3 ≥ 35%, and survival after subtracting 0.30% in trading costs (these are expensive stocks to trade — wide bid-ask spreads). - Down-case: signal needed average hour-3-to-close return ≥ +1.2%, hit rate ≥ 55%, conditional probability of hour-3 being within 1% of the daily low ≥ 50%, and survival after 0.30% costs.
What we found
Both legs failed decisively.
Up-case (80,186 positive-opening signals)
| Criterion | We needed | We got | |
|---|---|---|---|
| Average 10:00 → 12:30 return | ≥ +1.8% | −0.04% | ✗ |
| Hit rate (positive 10:00 → 12:30) | ≥ 55% | 46.7% | ✗ |
| P(morning reaches +3% above open) | ≥ 35% | 60.8% | ✓ |
| Number of signals | ≥ 800 | 80,186 | ✓ |
| Effect persists in both sub-periods | yes | h1 −0.08%, h2 −0.04% (both negative) | ✗ |
| Average net return after 30bps cost | ≥ +0.5% | −0.34% | ✗ |
Down-case (89,841 negative-opening signals)
| Criterion | We needed | We got | |
|---|---|---|---|
| Average 12:30 → 16:00 return | ≥ +1.2% | −0.01% | ✗ |
| Hit rate (positive afternoon) | ≥ 55% | 48.0% | ✗ |
| P(12:30 close within 1% of daily low) | ≥ 50% | 15.2% | ✗ |
| Number of signals | ≥ 800 | 89,841 | ✓ |
| Effect persists in both sub-periods | yes | both close to zero | ✗ |
| Average net return after 30bps cost | ≥ +0.5% | −0.31% | ✗ |
Why this matters / what surprised us
The opening 30-minute bar captures essentially all of the day's directional drift in spec-caps. Looking at the aggregate session stats across all 190,000 sessions:
| Window | Average return |
|---|---|
| 09:30 → 10:00 (first 30 min) | +0.52% |
| 10:00 → 12:30 (next 2.5 hours) | +0.04% |
| 12:30 → 16:00 (afternoon) | +0.03% |
The first 30 minutes do more directional work than the entire rest of the trading day combined. The "trade the first 30 minutes" intuition is actually correct — but you have to be in by the opening bar to capture it. The setup was about predictive continuation after the first 30 minutes, and that doesn't exist.
Why the up-case (FOMO continuation) doesn't work: in 2026, the retail FOMO has front-run itself. Anyone who's going to chase a spec-cap rally is buying it pre-market or at the open via algo order types. By 10:00, the FOMO is in the price; the marginal buyer after that is profit-taking, not chasing. Mean 10:00 → 12:30 return on positive-open days is slightly negative, indicating mild mean reversion rather than continuation.
Why the down-case (capitulation bounce) doesn't work: the "panic exhausts by 3pm" pattern is folk wisdom; in reality, only 15% of weak-open spec-cap days bottom near 12:30. The other 85% bottom earlier (~30% of days) or later (~55% — slow bleed into the close, often driven by forced liquidations and margin calls that hit in the afternoon).
This cut demonstrates that Mechaniq Lab handles community submissions cleanly. Coen submitted the setup, we pre-registered the gates with him, ingested the new data infrastructure required to test it (intraday 30-minute bars across 1,489 spec-cap names — entirely new for the Lab), ran the test, and posted the result with his name on it. The full round-trip took ~4 hours of engineering work, most of it building reusable data infrastructure that future setups inherit for free.
What this doesn't tell us yet
- The setup doesn't generalize across spec-cap names — but sub-categories might behave differently. Quantum names vs battery names vs micro-cap tech may have different intraday dynamics. Not testable from this aggregate run.
- A pure first-30-minute-momentum signal might work. The data suggests the opening bar contains real edge; capturing it requires same-bar entry, which is a different operational profile (pre-market preparation rather than mid-morning execution). That would be a separate setup to pre-register.
- Friction modelling used a flat 30bps estimate. Actual bid-ask spreads on the smallest spec-caps can hit 50-100bps round-trip, especially during volatile sessions. Even a real edge would face higher friction than this gate assumed.
What happens next
The setup is closed in this form. The follow-ups Coen and the Mechaniq team can consider:
- A
bar1-only-momentum-v1pre-registration to test whether the 09:30 → 10:00 directional move predicts the next 30 minutes (i.e., very short-horizon continuation captured at the opening bar) - A
forced-liquidation-afternoon-v1to test the "slow bleed into close" pattern we observed (the inverse of Coen's down-case) - Both would need fresh pre-registration since they're conceptually different setups, not rescues of this one
This was the first community submission. We're keeping that tradition: contributors get named credit on whatever they submit, whether it passes or fails.
For the specialist — methodology details (click to expand)
Setup (verbatim from spec, condensed)
On US-listed speculative small caps, the direction of price movement in the first 30 minutes after the open predicts the subsequent 3-hour trajectory in two asymmetric ways: (1) up-moves in the first 30 minutes predict additional gains of ≥ 3% by hour 3, exitable at hour 4 (2) down-moves predict that a local bottom is reached by hour 3 (~6% drawdown), buyable at hour 4 and sellable into the close in the speculative small-cap US universe over 2020-present.
Test setup
- Effective period: 2022-01-01 → 2026-05-29 (~4 years). Most spec-caps in Coen's named list (RGTI, QUBT, IONQ, QBTS, AMPX) are 2021-2022 IPOs; pre-2022 data either doesn't exist or is irrelevant to the setup era.
- Universe (Pad B — ADV+vol proxy): monthly snapshot from the ~4,900-ticker Finnhub US Common Stocks pool. Eligible per month if trailing 60-day average dollar volume is in [$10M, $500M] AND trailing 90-day annualized realized volatility ≥ 70%. We chose this proxy because historical market-cap data was not available (Tiingo Fundamentals add-on not active); ADV+vol captures the same spec-cap profile cleanly. 1,489 distinct tickers across 53 months, median 200 eligible per month.
- Intraday data: Tiingo IEX 30-minute bars for the spec-cap union, 14.0M bars ingested. Note: IEX returns OHLC only (no volume), which is sufficient for this setup.
- Session structure: 13 bars per regular session (09:30-16:00 ET). bar1 = 09:30-10:00, bar6 = 12:00-12:30 (close = 12:30 ET hour-3 mark), bar13 = 15:30-16:00 (close = 16:00 ET).
- Signal classification per (ticker, session_date):
- Up-signal:
bar1.close > bar1.open(positive first 30 minutes) - Down-signal:
bar1.close < bar1.open(negative first 30 minutes) - Friction: −30bps round-trip applied to "net return after cost" gates per spec.
Pre-registered gates (each leg, all required)
UP-CASE:
mean_30min_to_hour3 ≥ +1.8%
hit_rate_positive ≥ 55%
P(cum_high ≥ +3%) ≥ 35%
n_signals ≥ 800
both_subperiods_positive
net_after_30bps ≥ +0.5%
top_ticker_share ≤ 8%
DOWN-CASE:
mean_hour3_to_close ≥ +1.2%
hit_rate_positive ≥ 55%
P(close_1230 within 1% of daily_low) ≥ 50%
n_signals ≥ 800
both_subperiods_positive
net_after_30bps ≥ +0.5%
top_ticker_share ≤ 8%
Pass logic: either leg can pass alone; both failing = complete cut.
Detailed numbers
Up-case (80,186 signals): - Mean 30min→hour3: −0.044%; net after 30bps: −0.344% - Hit rate: 46.7% - P(cum open→hour3 high ≥ +3%): 60.8% (the only gate that passed) - 2022-2023 sub-period: n=8,004, mean −0.080%, hit 46.1% - 2024-2026 sub-period: n=72,182, mean −0.040%, hit 46.8% - Top concentrated ticker: HUT at 0.5% (concentration not an issue)
Down-case (89,841 signals): - Mean hour3→close: −0.008%; net after 30bps: −0.308% - Hit rate (positive afternoon): 48.0% - P(close_12:30 within 1% of daily low): 15.2% (vs gate ≥ 50%) - 2022-2023 sub-period: n=8,457, mean −0.075% - 2024-2026 sub-period: n=81,384, mean −0.001% - Top concentrated ticker: ENVX at 0.4%
New permanent infrastructure built for this setup
The data and tooling stack for this run is reusable for any future intraday or spec-cap-targeted setup without re-ingestion:
src/data/ingest.py:fetch_iex_30min_to_parquet_parallel— parallel IEX intraday ingest (200s for 1,489 tickers × 4 years)src/data/ingest.py:iex_parquet_to_duckdb+ canonicaliex_30minDuckDB tablesrc/data/universe.py:monthly_speccap_snapshot— reusable ADV+vol-based universe builder- 14M intraday bars + 4.5M EOD bars now live in DuckDB
Artifacts
- Sessions (all 189,843 with bar1/bar6/bar13/highs/lows):
lab/postmortem/coen-opening-drift-speccap-v1/sessions.parquet - Histogram bins:
chart_data.jsonin same directory - Setup spec:
lab/setups/coen-opening-drift-speccap-v1.md - Pre-registered gate:
lab/setups/gates.md§coen-opening-drift-speccap-v1 - Run script:
/tmp/run_coen.py - Eligible-ticker list:
/tmp/coen_speccap_tickers.txt
Rewritten 2026-05-30 for broader accessibility. No claims, gates, or methodology changed — only presentation.