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>
This commit is contained in:
@@ -0,0 +1,93 @@
|
||||
# 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
|
||||
52–56% 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 ~44–54%** (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% → ~€1–3/g). Il target è **€50/g** → siamo ~100x sotto.
|
||||
3. **Fragilità**: vive solo a basso turnover (thr alto, H lungo, W grande), DD 23–56%,
|
||||
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.
|
||||
Reference in New Issue
Block a user