Files
PythagorasGoal/docs/diary/2026-06-19-trackB-ml.md
T
Adriano dc2b5697da research wave 1: 5 honest tracks on certified BTC/ETH + synthesis
- trackA trend, trackB ML, trackC mean-rev, trackD trend-portfolio, trackE xsec/ensemble
- VERDICT: Track D vol-targeted BTC+ETH trend portfolio is the one robust deployable
  earner (Sharpe 1.0-1.32, DD 13-19%, positive every year 2019-2026)
- mean-reversion confirmed dead on clean data; weak-but-real ML/trend residuals
- honest: EUR50/day on 2000 in 1-2y is not reachable (needs ~137k capital or ruinous DD)
2026-06-19 19:14:53 +02:00

94 lines
6.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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.