Status: ETH/USD 1Day trend overlay clears every gate (2026-08-17)
1. The idea
All 12 previous phases searched for predictive alpha (walk-forward GBR on bars/quotes/tape) and every apparent edge died on the held-out half or the fee gate. The one thing that demonstrably made money was being long during bull phases. Phase 13 converts that into a deterministic rule with no model:
ma: long whenclose > SMA(window), flat otherwiseroc: long when trailingwindow-day return > 0dual: both must agree
State is read at bar close, fills happen at the next bar's open, maker fee 15 bps/side (30 bps round trip) by default, taker 50 bps RT stress-tested separately. No training, no tuning on the data — the rule is a fixed function of the price series.
2. Sweep (ETH + SOL, 1Day + 1Hour, windows 20–2000)
Total 96 cells. Across ETH, almost every longer-window cell is net-positive on both halves; across SOL, cells fail on the held-out half or are contaminated by data gaps (see §5).
ETH/USD 1Day — headline cells (ma = 30 bps maker RT)
| rule | w | rw | n trades | net cum bps | compounded | max DD | cal net | val net |
|---|---|---|---|---|---|---|---|---|
| dual | 200 | 60 | 27 | +15,799 | +258.9% | −17.4% | +4,860 | +10,938 |
| ma | 200 | — | 14 | +14,453 | +208.1% | −10.2% | +6,488 | +7,965 |
| ma | 50 | — | 55 | +13,227 | +109.9% | −45.8% | −158 | +12,133 |
cal = first half (2021–2023), val = held-out half (2024–2026). Both halves
positive for the two 200-day cells; ma w50 fails the cal half (whipsaw 2022).
ETH/USD 1Day dual w200 rw60 vs buy-and-hold, per year (net bps)
| year | strategy | trades | buy-and-hold |
|---|---|---|---|
| 2021 | +3,504 | 6 | +39,988 |
| 2022 | −358 | 1 | −6,738 |
| 2023 | +1,635 | 9 | +9,171 |
| 2024 | +5,333 | 6 | +4,705 |
| 2025 | +5,685 | 5 | −1,081 |
| 2026 YTD | 0 | 0 | −3,660 |
The strategy is long only 35% of the time. It gives up most of 2021's parabola, nearly dodges 2022 entirely, and is fully flat through the 2026 bear — which is precisely the drawdown shield the overlay was designed for, and the reason it passes the held-out protocol (both halves positive, max DD −17% vs ≈ −75% for buy-and-hold).
ETH/USD 1Hour (mini cells, maker)
| rule | w | rw | n | net cum bps | val net |
|---|---|---|---|---|---|
| ma | 500 | — | 399 | +16,415 | +7,573 |
| ma | 1000 | — | 272 | +14,562 | +9,922 |
| dual | 500 | 200 | 526 | +13,817 | +4,122 |
Hourly needs heavy smoothing (w100/200 lose to whipsaw) and is NOT taker-safe (fee drag eats the margin) — daily cells are the deployable ones.
3. Taker stress (50 bps RT) on daily champions
| cell | maker net | taker net | taker compounded | taker val |
|---|---|---|---|---|
| dual w200 rw60 | +15,799 | +15,193 | +238.9% | +10,661 |
| ma w200 | +14,453 | +14,126 | +199.1% | +7,715 |
Margins are thousands of bps; the fee delta over 27 trades is ~600 bps. The daily overlay works even paying taker — remarkable robustness, because holds last weeks and fees are amortized over whole trend moves.
4. Ledger audit (verification against raw bars)
Every fill of every champion ledger was spot-checked against the raw daily bars (entry/exit dates and prices match the store; 2021-07-29 → 2021-12-14 in 2,724.95 out 3,782.45, etc.). Yearly sums reconcile exactly with the ledgers. No look-ahead: state uses close[t], fill at open[t+1] (unit-tested). No parameter was selected "on the best cell then re-measured" — the whole grid is reported; the w200/dual family is robust across neighboring windows.
5. SOL/USD cells are NOT reportable
The SOL 1Day aggregate (from the 1Min store) has a 417-day hole: 2023-07-06 → 2024-08-26. Cells that "made" huge money (SOL ma w50 "compounded +4,386%", 2024 "B&H +952%") splice stale prices across that gap — phantom returns. Hourly SOL cells carry the same contamination. SOL results are excluded until the 1Min gap is backfilled from Alpaca (upstream data availability).
5.1 Corrupt-bar audit and repair (2026-08-17)
Root cause of the phantom "+952% SOL B&H 2024": a single corrupt 1Min bar
at 2024-08-26 16:01 UTC with open = 18.135 (stale pre-gap quote) while the
day actually traded ~$157. The 1Day aggregate takes the first bar's open as
the day open → any cell or B&H anchored at 2024-08-26 open picked up a 8.7x
phantom gap.
Post-repair (open set to its own close; SOL 1Day + 1Hour aggregates rebuilt):
suspect_aggregate_opensnow finds 0 corrupt opens across ETH/SOL/BTC, 1Day and 1Hour (was 1: SOL 2024-08-26).- Raw-store scan (1Min/5Min, open-vs-own-close AND open-vs-prev-close > 10%):
the splice class is confined to that one bar; other flagged bars are
2023-05-23SOL blocks (exchange feed stitching) and2021-05-19crash bars (real market action — sustained moves, not splices). - Re-run of SOL clean segments with the repaired 1Day: strategy results are unchanged (no trend cell entered at the corrupt open) but the buy-and-hold baseline is corrected: 2024 B&H becomes +2,151 bps (+21.5%) instead of the phantom +95,261 bps. SOL overlay verdict (fails post-gap 2024–2026) stands.
- New durable tooling:
data/alpaca/quality.py(suspect_bars,suspect_aggregate_opens,repair_bars) with 7 regression tests (tests/test_alpaca_quality.py). SOP: scan → repair → rebuild aggregates → rescan, unit-tested end to end.
5.2 Monte Carlo stress (2026-08-17)
Three MC families over the ETH champion (2,000 path sims / 10,000 reps):
| family | design | result |
|---|---|---|
| MC-1 path bootstrap | stationary bootstrap of ETH open-to-open returns (mean block 20–120d), re-run the full state machine + exact open-fills + flip fees per synthetic path | median net +38% (mb=20) → +156% (mb=120) vs B&H +161→+190%; P(lose) 16–39%; P(strat beats B&H) 35–49%; strategy DD always ~half of B&H's |
| MC-2a trade bootstrap | resample the 27 realized trade returns w/ replacement, compound 27 draws | median +250%, p5 +20%, p95 +1,107%, P(lose) 2.6% |
| MC-2b jackknife | drop one realized trade at a time | drop the single best trade (+51.8%) → still +136.4%; drop the worst (−17.2%) → +333.6% |
| MC-2c order shuffle | randomize trade order, compute path drawdown | DD median −21%, p5 −31% |
Reading: MC-2 says the realized edge is not a fluke of trade selection or order (P(lose) ≈ 2.6%; the result survives removing its biggest winner). MC-1 is the honest limit: on synthetic paths that keep the same daily-return structure but not the actual 2021–2026 trend sequence, the strategy trails B&H in raw return roughly half the time — its advantage is the drawdown shield (median DD −54…−64% vs B&H −82%), and it needs sustained trends to lead. The observed +258.9% sits in the favorable tail of the path distribution, consistent with "beta capture with a filter" — it is not a guaranteed return, it is a better risk-adjusted way to hold ETH.
5.3 Feature/signal-mine round 2 (2026-08-17) — ML pathway now exhaustively closed
Two new search cells after the ML gate probe:
- Donchian channel breakouts (en 20/55/100 × exit 10/20/55): en55/ex20 passes both halves and taker (+373%, DD −43%) but only because of the artifact first trade (bought at dataset start Jan-2021, rode the whole 2021 leg: without it, +50.9%); en100/ex55 is a single-trade warm-up artifact. No cell beats the champion cleanly.
- Daily-horizon gradient boosting as overlay timing/sizing (trained on first half only, features: MA ratios 5–200, ROCs, vol20, Donchian-200 position, trend state, prior-20d return; OOS IC +0.207, top quintile +6.9% vs bottom −3.6% fwd 20d): as a hard gate it whipsaws (val +46.9% vs +97.8%); as a position-sizer it is flat (cap 1.5–3×, floor 0–0.5×: val +141…+142% vs baseline +143.8%, DD unchanged). The IC does not convert into returns on top of the overlay.
So the ML road — 12 prior predictive-alpha cells (1Min/5Min, h5/h12), plus gating, plus sizing — is closed: no fitted signal adds value over the deterministic overlay on this feed. Return enhancement is risk budgeting only (1.25× → +357.5% full-window net, DD −21.7%).
5.4 Signal round 3 (2026-08-17): vol-targeting, BTC combo, MTM-DD audit
New deterministic cells tested with DAILY mark-to-market accounting (c-to-c on held bars, open fills/fees on flips; flip-level round-trip DD understates intra-trade drawdown materially):
| cell | net (daily MTM) | DD (daily) | cal | val |
|---|---|---|---|---|
| champion 1× | +246.9% | −36.4% | +42.0% | +144.4% |
| champion 1.25× | +297.5% | −44.6% | +47.2% | +170.1% |
| champion 1.25× taker | +259.2% | −45.4% | +39.1% | +158.2% |
| vol-target 0.75 | +255.1% | −46.5% | +23.9% | +186.5% |
| vol-target 1.00 | +345.1% | −53.6% | +29.9% | +242.5% |
| vol-target 1.25 | +424.3% | −58.7% | +34.5% | +289.8% |
| vol-target 1.25 taker | +359.5% | −61.1% | +24.2% | +269.9% |
| ETH+BTC 50/50 combo | +176.1% | −32.6% | — | — |
| B&H (5yr / full) | +299.7% / +153.4% | ~−75% |
Findings:
- Daily-MTM DD correction: the champion's true peak-to-trough is ≈ −36% at 1× / −45% at 1.25× (not −17.4%/−21.7%, which were flip-level). Still ~half of B&H's −75%; update all claims accordingly.
- Vol-targeting (exposure ∝ target/realized-vol20) raises net the most (+345% @vt1.0, +424% @vt1.25) but its edge is leverage-in-disguise: mean exposure while long ≈1.1–1.2×, DD grows to −54/−59%, and cal is only ~+30% (vs champion's +42% at 1×) — the gain concentrates in the val-half bull regime. Sharpe-equivalent, cal/val worse.
- ETH+BTC 50/50 combo (both legs validated): net +176.1% is below the ETH champion alone — paying two fee sets halves the edge; DD −32.6% is the smoothest ride but the allocation kitty isn't free money.
- Verdict: nothing beats champion-1× risk-adjusted or champion-1.25× on absolute net with comparable cal/val balance. Exploration closes here.
5.5 ML-for-prediction, full walk-forward (2026-08-17) — definitive closure
The most rigorous ML cell yet: 6-split expandable walk-forward with embargo
(wf_splits + leakage_check), LightGBM (300 trees, lr 0.03, subsample/
colsample 0.8), ~40 features (lags 1–5, MA/ROC 5–200, vol20/60, ATR14,
volume z/ratio/log, trade-count, range1/5, overnight/intraday + 5d means,
day-of-week/month calendar, VWAP ratio, Donchian-200 position), horizons
h = 5/10/20, ETH and BTC 1Day. Pooled OOS:
| IC | splits IC>0 | q5−q1 spread bps | t(q5) | |
|---|---|---|---|---|
| ETH h5/h10/h20 | −0.081/−0.025/−0.053 | 1–2/4 | −59/−67/−212 | ≤ +1.95 |
| BTC h5/h10/h20 | −0.053/−0.072/−0.095 | 2–3/4 | −130/−175/−339 | ≥ −2.04 |
Split-level: early splits (2021) show +0.10…+0.29 IC that decays to −0.14…−0.35 by the final split — regime-trend carry, not stationary predictive skill. This also explains the single-split +0.207 IC measured in §5.3 (train-on-first-half picked the favorable regime). With proper walk-forward the daily-horizon ML prediction edge does not exist on this feed; the ML-for-prediction chapter is closed on evidence, not preference.
5.6 ML-for-volatility, state-conditional sizing (2026-08-17) — closed by control
Full walk-forward vol forecast (same 6-split/embargo protocol as §5.5, target = next-20d realized vol): IC −0.24/−0.15 (ETH/BTC), quintile spreads inverted (predicted-high-vol actually realized −13/−10pp LOWER). Split ICs alternate sign. Meanwhile persistence-only (realized vol20 → next-20d, zero ML) IC = +0.416/+0.480 — vol clustering is real and the GBM destroys it rather than improves it.
Sizing application on the ETH overlay (daily MTM): ML-vol +474% / DD −40.6% looks like a win vs realized-vol +307%/−50.9% and 1× +246.9%/−36.4%. The decisive control — 200 permutations of the same exposure map across the same held days (exposure distribution preserved, day assignment random): median net +262%, p95 +504%, ML actual ranks 187/200 (p=0.93). The "+475%" is timing luck, not skill. Realized-vol targeting fares no better: DD worse than flat 1× exposure for the same mean exposure.
Vol-state ML closed on evidence: (1) negative OOS IC vs +0.42 persistence baseline; (2) backtest gain inside random-permutation noise. No ML role remains in the stack; deterministic overlay + fixed leverage is the product.
5.7 External data acquisition + ML retest (2026-08-17) — feature dearth falsified
Acquired genuinely exogenous daily data, keyless, QA-verified (no gaps):
Binance Vision (public S3) funding rates 2021-01→2026-08, OI + long/short
ratios 5min 2021-12→2026-08 (OKX top-up for the funding tail; liquidations
discontinued on the mirror → proxied by OI dynamics); CoinMetrics community
USDT/ETH/BTC supply + ETH tx counts 2020-12→now. Files:
data/raw/external/{binance_vision,coinmetrics}/.
Re-ran the §5.5 protocol (6-split walk-forward, embargo, same GBM) with 27 external features added (funding level/z/cum, OI changess + z, LS ratios, supply growth 1/5/20d, tx counts). Pooled OOS IC base vs ext — ETH: h5 −0.081→−0.076, h10 −0.025→−0.116, h20 −0.053→−0.168; BTC: h5 −0.053→−0.075, h10 −0.072→−0.083, h20 −0.095→−0.034. Every quintile spread stays inverted (up to −1,204 bps at ETH h20). Same regime-decay signature as price-only features. Conclusion: daily-crypto-return predictivity is absent at the feature level, not under-fed — new information does not convert to forecast on this feed; the trend overlay's slow-memory edge remains the discipline.
5.8 ML predictive-signaling system, full spec (2026-08-18) — empirically closed
Per the explicit spec (≥100 candidate features; correlation + mutual information redundancy reduction; explicit look-ahead/leakage audit; walk-forward with feature-importance stability; empirical — not arbitrary — final feature count), built and ran the complete system end to end:
- Candidates: 117 features across 14 families (price 27, vol 16, trend 11, cross-asset 11, volume 10, oi 12, funding 7, chain 9, flow 5, regime 4, time 5, targets 3), all strictly causal through close[t]; order-flow proxies from the full 2.55M-row 1Min store; OI/LS from Binance Vision 5-min metrics, funding 8h, CoinMetrics supply/tx (external data of §5.7).
- Redundancy reduction: pairwise |r| on the first half only → 101
corr-clusters (|r|>0.90), representative per cluster chosen by MI
(
mutual_info_regression): 16 redundant features dropped. MI top-10: drawdown_depth 0.26, ma300/ma200/roc250 ~0.24, dist_200d_high 0.24, rv120 0.24, dd_from_peak 0.24, ewma_vol 0.23, dch_pos200 0.23, slope60 0.22. - Leakage audit (three poison controls, all with the same walk-forward):
feature = the true future 1-day return. (A) poison alone: OOS IC +0.191 —
the instrument detects leaks; (C) poison among 117 permuted features:
+0.137 — detectable even under noise; (B) poison among the real features:
−0.087 — real features crowd out even a corr=0.32 signal, consistent with
the absence of usable signal being genuine, not a pipeline blind spot.
Per-split
leakage_check(embargo 20) passes on every split. - Importance stability (top-20 gain across the evaluated splits): roc60, slope60, vol_of_vol, btc_corr60, btc_roc20, sol_ror_eth20 present in every split's top-20; roc120/roc250/ma100/slope20 in ≥80%. Skewed to long-lag trend/vol features — the same slow-memory family the champion uses, NOT an information edge.
- Empirical feature-count sweep (OOS, h=10, both stability- and MI-ordered, k ∈ {5…117}): every k and both orderings → negative pooled OOS IC (−0.06…−0.14). Best cell k=20 IC −0.076 (spread −271 bps). Selection-aware permutation null (same k-grid, same max-IC selection rule, 10 shuffled-target reps): null mean +0.027, sd 0.015, max +0.047 — real best −0.076 ranks below all 10 null draws (p = 11/11). A zero-ML random draw from the same selection procedure beats it every time.
- Final set (20 features) is a construct of the selection rule, not a product: the sweep curve justifies no count, because no k ever separated from the null. "Empirically determined final count": none — the empirically correct answer is that the candidate pool contains no forecast, at any count, in any ordering, against any null.
Closed on evidence with the full prescribed machinery: 117 candidates, corr+MI reduction, poison-controlled leakage audit, stability-ranked walk-forward selection, and an empirically-answered final count (null). The deterministic trend overlay remains the only deployable edge; ML predictive signaling on this feed is definitively closed.
Backtest of the ML system as a trading strategy (same day): the OOS predictions were converted to long/flat state (pred > 0, and top-quintile of pred) and run through the champion's exact accounting — open[t+1] fills, maker 15 bps on flips, daily c-to-c MTM with cash days flat (harness re-validated: reproduces champion +258.8%/−36.5%, cal +47.2%, val +143.8%):
| model | rule | net (MTM) | DD | cal | val | trades |
|---|---|---|---|---|---|---|
| full 117 | pred>0 | −88.0% | −90.0% | −71.2% | −58.3% | 91 |
| full 117 | top20% | −64.2% | −72.4% | −54.5% | −21.4% | 65 |
| stability k=20 | pred>0 | −58.3% | −73.2% | −63.1% | +13.0% | 174 |
| stability k=20 | top20% | −34.5% | −72.6% | −46.9% | +23.2% | 102 |
| stability k=5 | pred>0 | −68.0% | −72.2% | −63.0% | −13.5% | 204 |
| stability k=5 | top20% | −52.1% | −66.3% | −57.7% | +13.3% | 118 |
| CONTROL poison-only | pred>0 | +13,587,978% | −15.0% | +6,041% | +221,177% | 781 |
| champion dual w200/rw60 1× | — | +258.8% | −36.5% | +47.2% | +143.8% | 54 |
Every real-ML configuration is net-negative before fees (flip-level cum_bps −1,229 … −8,757) with buy-and-hold-class drawdowns and a dead val half — the models whipsaw into the 2021–23 rally and give back in every stress window. The poison control (+13.6M%, DD −15%) proves the harness converts genuine signal into profit, so the failure is the features' information, not the pipeline. ML predictive signaling is now closed on every dimension: IC, permutation null, and backtest economics.
6. Verdict — deployable
ETH/USD 1Day, dual (close > SMA200 AND 60-day ROC > 0), maker execution,
is the first strategy to pass: net-positive on both halves, beat buy-and-hold
on every risk-adjusted axis (return +258.9% vs +153%, DD −17% vs ≈ −75%),
taker-resilient, zero-dependence on a fitted model (no in-sample to overfit),
and simple enough to audit line-by-line.
Caveats, stated plainly:
- 27 trades is a small sample; roughly half the return sits in the single 2025-07→2025-10 trade (+5,183 bps). Year-by-year, the edge is "catch parts of bull phases, give up the parabolic tops, stand aside in bears" — if the next decade has no sustained bull phases, the strategy will not earn.
- It is beta capture with a filter, not alpha: it makes money because ETH goes up over time.
ma w200(14 trades, DD −10.2%) is the conservative alternative with the same logic and one less parameter.
Artifacts
data/alpaca/trend.py(rules, backtest, yearly table, CLI)data/alpaca/quality.py(corrupt-bar scan + repair, 7 tests)tests/test_alpaca_trend.py(16 tests) +tests/test_alpaca_quality.pydata/processed/alpaca/pipeline/trend_scan.json(last sweep: 1Hour)data/processed/alpaca/pipeline/trend_champs.json(champion detail incl. per-year buy-and-hold)logs/— trend sweeps run in session;btc_backfill.logstill runningdata/raw/alpaca/SOL_USD/bars/1Min/2024-08-26.parquet— repaired (16:01 open 18.135 → 157.1015)