← all research
REJECTED

"Phase 9 — Real-Data Research Results (Alpaca ETH/USD + SOL/USD)"

2026-08-16

Run: python -m data.alpaca.pipeline --steps all --timeframes 1Min,5Min --h-list 5,12 Complete 2026-08-16 00:47 UTC-4 (rc=0). All artifacts under data/processed/alpaca/pipeline/*.json.

1. Data store (fully backfilled, verified faithful to the API feed)

Per-day spot checks against live API (2024-06-15: API 1,042 rows = store 1,042; 2025-01-10: API 1,211 = store 1,211) confirmed the backfill is lossless; the "missing" minutes are genuine feed coverage (Alpaca crypto 1Min bars are thin: ~93% have zero volume / trade_count).

seriesday-filesrowsspan
ETH/USD 1Min bars2,0542,551,7852021-01-01 → 2026-08-16
ETH/USD 5Min bars2,054585,4442021-01-01 → 2026-08-16
SOL/USD 1Min bars1,6361,969,4832021-01-01 → 2026-08-16
SOL/USD 5Min bars1,636463,2062021-01-01 → 2026-08-16
ETH/USD trades66933,330,5062021-01-01 → 2026-08-16
SOL/USD trades322,0722024-10-05 → 2026-08-16
ETH/USD quotes1,17328,164,5612023-06-01 → 2026-08-16
SOL/USD quotes75615,680,9952023-06-01 → 2026-08-16

~91.2M rows total. Quotes for ETH effectively from 2023-06; SOL trades/quotes from ~Oct-2024 (feed reality). Deep book: no historical endpoint.

2. Obstacles found and fixed during this run

Full suite after all fixes: 312 passed, 2 skipped.

3. Walk-forward OOS results (5 splits, 50-bar embargo, GBR 300/3/0.05)

Only splits whose train span reaches the quote era (≥2023-06) produce models (splits 0-2 have no quote-derived features to train on — correct behavior).

cellrowsOOS predsICSpearmantop-quintile ret (bps)
ETH 1Min h52,551,7791,020,466+0.0122+0.0019−0.04
ETH 1Min h122,551,7721,020,463+0.0123−0.0078+0.13
ETH 5Min h5585,438234,176+0.0017−0.0168+0.56
ETH 5Min h12585,431234,173−0.0013−0.0062+1.24
SOL 1Min h51,969,477787,677−0.0011−0.0034+0.02
SOL 1Min h121,969,470787,674−0.0033−0.0013+0.10
SOL 5Min h5463,200185,280−0.0099−0.0017+0.00
SOL 5Min h12463,193185,278−0.0122+0.0124+2.02

IC ≈ |0.01| across all cells — statistically indistinguishable from noise; nothing survives sign consistency (ETH mildly positive, SOL mildly negative).

4. Backtests (long/flat, signal = top-decile pred, fills at next-bar

open, maker 15bps + half-spread 0.6bps per side — net includes ALL costs)

celltradesnet cum bpsgross cum bpshit rateSharpe
ETH 1Min h5498,062−14,911,221+8,2856.3%−97.9
ETH 1Min h12384,472−11,438,811+78,30914.5%−60.4
ETH 5Min h546,898−1,379,001+25,90921.5%−39.5
ETH 5Min h1246,840−1,345,250+58,01929.1%−25.3
SOL 1Min h5390,019−11,703,958−20,9758.4%−88.5
SOL 1Min h12266,548−8,032,482−48,16315.1%−59.5
SOL 5Min h591,715−2,782,518−35,29519.0%−45.1
SOL 5Min h1260,363−1,726,270+82,15432.8%−24.9

Verification: net ≈ gross − n × 30bps in every cell (e.g. ETH 1Min h5: 8,285 − 498,062×30 = −14,933,576 ≈ −14,911,221). The strategy loses exactly its cost floor per trade — the fee gate works as designed and rejects every cell.

5. Verdict

6. What it would take to revisit

  1. A feature family with actual microstructure content on this feed (quote-age/spread/fill-ratio tests already carry the weight — they are the only columns with any information) — or 15Min/1Hour horizons (longer holding to amortize the cost floor).
  2. Calibrate a fixed threshold_bps hurdle from OOS, then re-validate on a held-out tail (the phase-7 plan_signal path) before any paper run.
  3. If a future signal clears the gate: wire BarExecutor + RiskManager into a paper runner against AlpacaBroker(paper=True) and monitor via data/alpaca/monitor.py (quote staleness, missing partitions, risk halts).