Files
PythagorasGoal/docs/diary/2026-06-19-trackB-ml.md
T
Adriano Dal Pastro d152941360 integra(TP01): merge ricerca branch strategy-research-2026-06 (squash) — strategia vincente + harness + track A-E
Integra il lavoro della linea di ricerca parallela (AdrianoDev), verificato indipendentemente
col mio gauntlet onesto (regge il hold-out 2025-26 su entrambi gli asset, plateau 1h/4h/1d):
- src/strategies/trend_portfolio.py  TP01 (TSMOM 30/90/180 vol-target 20% lev2x long-flat, 50/50 BTC+ETH)
- src/backtest/harness.py            harness onesto (load + backtest_signals no-leakage + OOS)
- scripts/research/track{A,B,C,D,E}_*.py + trackD_timing.py  (le 5 track della ricerca)
- scripts/live/paper_trend.py        paper trader forward-only di TP01 (no esecuzione reale)
- tests/test_trend_portfolio.py (5 test, passano) + 6 diari trackA-E + synthesis
- CLAUDE.md aggiornato con l'esito ricerca (TP01 vincente, mean-rev morto, onesta su €50/g)

Squash (non merge) per NON portare in git i ~68MB di data/_feed_backup/*.bak che il branch
aveva committato per errore: esclusi + data/_feed_backup/ e data/paper_trend/ ora gitignorati.
Storia granulare del branch conservata sul ref origin/strategy-research-2026-06.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 18:55:04 +00:00

6.0 KiB
Raw Blame History

2026-06-19 — Track B: ML / feature-prediction su BTC & ETH (walk-forward onesto)

Esperimento di ricerca sulla direzione machine-learning post-reset, su dati Deribit mainnet certificati (solo BTC/ETH). Tool: scripts/research/trackB_ml.py (runnable uv run python scripts/research/trackB_ml.py). Tutto netto fee, strict walk-forward, held-out tail mai usato per scegliere i config.

Metodologia (anti look-ahead — la lezione della v2.0.0)

  • Feature (21): ritorni multi-lag (1/2/3/6/12/24), geometria candela (body/upper/lower shadow su range, range normalizzato, body lag-1), momentum48 + accelerazione, RSI14, estensione ATR-normalizzata vs EMA24, vol realizzata 24/72 + ratio, posizione del close nel range 24/72, z-score del volume. Tutte backward (note solo a close[i]).
  • Label: segno del ritorno forward su H barre, sign(close[i+H]/close[i]).
  • Strict walk-forward: per predire il blocco che inizia a b, si addestra scaler+modello SOLO su indici < b-H (gap di H → label completamente realizzata nel passato), finestra rolling delle ultime W barre. Retrain ogni K=250 barre. Mai fit sul futuro. Nessun leakage (verificato: la label più recente del train usa close[b-1]).
  • Esecuzione: entry a close[i] nella direzione predetta, hold fino a H barre (no TP/SL); il no-overlap dell'harness distanzia i trade ≥ H barre.
  • Modello: LogisticRegression(class_weight='balanced'). Soglia di probabilità per filtrare i segnali deboli (long se p>0.5+thr, short se p<0.5-thr, altrimenti flat).
  • Selezione su DEV (primo 75%), conferma una volta sola sull'held-out tail (ultimo 25%).
  • Griglia: W∈{4000,8000,16000}, H∈{6,12,24,48}, thr∈{0,0.03,0.06,0.10}, BTC & ETH, 1h. Fee-sweep 0.05/0.10/0.15/0.20% RT. Turnover/time-in-market sempre riportati.

Risultato — esiste un segnale, ma è debole e a basso turnover

Pattern netto e robusto della griglia: la positività compare SOLO nelle celle a basso turnover → W grande (16000) + H lungo (24) + soglia alta (0.10). Tutto ciò che gira veloce (thr basso, H corto, e soprattutto il 15m) muore sulle fee.

  • 15m: 0/12 celle positive in dev (la migliore 47%, le altre 99%). Stesso win-rate 5256% del 1h, ma il turnover lo polverizza. Conferma di prim'ordine: l'edge per-trade è minuscolo, sopravvive solo se si tradano poche barre.
  • 1h, dev: 19/96 celle net-positive con Sharpe>0. Famiglie threshold-robuste: BTC W16000 H12, BTC W8000 H12, BTC W16000 H24, più ETH W16000 H12/H48 marginali.

Held-out tail (2024→2026, mai toccato in sviluppo)

config trades wr% net% Sharpe DD% mkt% €/g(2k) long% B&H tail
BTC W16000 H24 thr0.10 333 52.9 +83.7 0.57 23 12 +0.58 44 +3.9%
BTC W16000 H12 thr0.10 382 53.4 +37.6 0.35 25 7 +0.26 54 +3.9%
ETH W16000 H12 thr0.10 364 57.7 +23.7 0.24 35 7 +0.18 68 38.4%
ETH W16000 H48 thr0.06 215 55.3 13.3 0.08 64 16 0.10 67 38.4%

Non è solo beta. Il B&H sul tail è +3.9% (BTC) e 38.4% (ETH), eppure le celle migliori fanno +37…+84% (BTC) con long ~4454% (bilanciato long/short), e ETH +23.7% mentre ETH scendeva 38% (short corretti). Quindi c'è segnale direzionale genuino, non cattura di trend rialzista. Payoff asimmetrico: ~53% WR ma avgWin>avgLoss (BTC: +2.04% vs 1.63%).

Fee-sweep (held-out)

  • BTC W16000 H12 thr0.10: 0.05%→+66.6 | 0.10%→+37.6 | 0.15%→+13.7 | 0.20%→−6.1. Sopravvive fino a ~0.15% RT, poi muore. Margine sottile.
  • BTC W8000 H12 thr0.06: positivo solo a 0.05%, già 35% a 0.10%. Fragile.
  • ETH e le celle a turnover medio: muoiono tra 0.10 e 0.15%.

Stabilità per-anno (full walk-forward, BTC W16000 H24 thr0.10)

+11% (2020) / +188% (2021) / +14% (2022) / 38% (2023) / +13% (2024) / +75% (2025) / +7% (2026), CAGR full ~22%, ma DD 56% e fortissima concentrazione su 2021/2025 con un 2023 a 38%.

Verdetto onesto — NON deployabile verso l'obiettivo

  1. L'edge è reale ma minuscolo. A differenza della vecchia libreria (artefatto puro), qui il segnale sopravvive a strict walk-forward, a fee 0.10% RT e batte il B&H sul tail. È un risultato genuino e va registrato: la direzione ML non è morta.
  2. Ma è incompatibile col target. €/giorno su €2000 = +0.26…+0.58 baseline (anche la stima rosea full-WF CAGR 22% → ~€13/g). Il target è €50/g → siamo ~100x sotto.
  3. Fragilità: vive solo a basso turnover (thr alto, H lungo, W grande), DD 2356%, ritorni concentrati in pochi anni con un anno a 38%, e l'edge si assottiglia già a 0.15% RT. Un singolo cambio di regime lo annulla.
  4. ETH ≠ "specialmente buono" (contrariamente all'indizio dello shape-ML precedente): qui ETH è più sottile e più rumoroso di BTC sull'held-out; l'unico merito è aver shortato correttamente il drawdown 2024-25.

Conclusione: la logistic-regression walk-forward su feature di forma+momentum trova un debole edge momentum direzionale a basso turnover su BTC (più tenue su ETH), onesto e netto-fee, ma troppo piccolo, troppo concentrato e troppo fee-sensibile per essere deployato standalone. Al massimo un componente di un futuro ensemble, e solo nelle configurazioni a bassissimo turnover. Nessun config raggiunge, neanche lontanamente, i €50/g.

Prossimi passi possibili (non eseguiti)

  • Provare predizione di magnitudine/asimmetria (large-up vs large-down) e position-sizing proporzionale alla confidenza, invece del semplice segno.
  • GradientBoosting / feature non lineari (flag --gbm predisposto) — ma attenzione all'overfit; il rischio è di "trovare" edge che il walk-forward onesto non conferma.
  • Ensemble del segnale ML a basso turnover con un filtro di regime (vol/trend) per tagliare il 2023. Ma serve dimostrare che il filtro non è scelto col senno di poi.
  • Restare scettici: finché €/g resta ~100x sotto target, l'ML da solo NON è la risposta.