Reset del progetto su fondamenta verificate dopo la scoperta che l'intera libreria "validata OOS" era artefatto di feed contaminato (print fantasma del feed Cerbero TESTNET + storico Binance/USDT). - Storico ricostruito da Deribit MAINNET (ccxt pubblico, tokenless) e CERTIFICATO (certify_feed.py): BTC/ETH puliti su TUTTA la storia (mediana 2-6 bps vs Coinbase USD), integrita' OHLC + coerenza resample (maxΔ 0.00) + cross-venue OK. Alt esclusi (illiquidi/divergenti: LTC/DOGE 50-82% barre flat; XRP/BNB non certificabili). - Verdetto sul feed pulito: FADE / PAIRS / XS01 / TSM01 morti (ogni portafoglio Sharpe -2.3..-3.0, DD ~40%); solo SH01 e frammenti HONEST con segnale residuo, da ri-validare in isolamento. - Cleanup "restart pulito": strategie, stack live (src/live, src/portfolio, runner/executor, yml, docker), ~100 script ricerca/gate, waste/games/ portfolios, dati non certificati + cache e 60+ diari -> archiviati in Old/ (preservati, non cancellati). Diario consolidato in un unico documento. - Skeleton ricerca tenuto: Strategy ABC + indicatori + src/fractal + src/backtest/engine + load_data; tool dati certificati (rebuild_history, certify_feed, audit_feed, multi_source_check). - Universo dati ATTIVO: solo BTC/ETH (5m/15m/1h); guardrail fisico (load_data su alt -> FileNotFoundError). Esecuzione DISABILITATA, conto flat. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
3.3 KiB
2026-06-04 — Exit ladder (80% del TP → esci 80%, runner con stop dinamico): SCARTATO
La proposta
"E se all'80% del TP usciamo con l'80% della posizione, mettiamo uno SL dinamico su quella soglia (profitto lockato) e lasciamo correre il 20% restante?"
Idea: uscita scalare — bancare prima la maggior parte del profitto (la soglia all'80% viene toccata più spesso del TP pieno) e tenere un runner free-ride con worst-case alla soglia, best-case oltre il TP.
Il test (onesto, stessi segnali)
scripts/analysis/partial_tp_ladder.py: replay intrabar degli STESSI segnali
delle 3 fade (params live: trend_max=3.0, ema_long=200, hurst_max=0.55, min_tp_frac=0.0015), engine identico a fade_base (ingresso a close[i],
SL pieno prioritario nello stesso bar, fee 0.10% RT × leva 3 — il ladder NON
paga fee extra: due uscite ma stesso notional). Convenzioni conservative: se il
bar che tocca la soglia chiude oltre (rientro), il runner è stoppato subito.
Griglia: base vs ladder (f=0.8 q=0.8 — la proposta —, f=0.8 q=0.5, f=0.5 q=0.5),
FULL + OOS (nov 2023→), BTC+ETH.
Risultati (proposta f0.8 q0.8)
| Sleeve | ret% FULL base→ladder | DD% | ret% OOS | win% OOS |
|---|---|---|---|---|
| MR01 BTC | 92 → 92 | 13.8 → 10.0 | 41 → 39 | 60 → 65 |
| MR01 ETH | 194 → 195 | 16.5 → 15.3 | 134 → 147 | 70 → 75 |
| MR02 BTC | 129 → 112 | 19.0 → 17.2 | 66 → 54 | 55 → 59 |
| MR02 ETH | 2135 → 1319 | 16.2 → 12.7 | 893 → 651 | 75 → 80 |
| MR07 BTC | 78 → 78 | 6.8 → 5.2 | 43 → 40 | 64 → 66 |
| MR07 ETH | 115 → 96 | 10.6 → 10.6 | 68 → 64 | 66 → 70 |
Verdetto: NO-GO (gate fallito)
- Il runner non corre. Su centinaia di trade finisce oltre il TP quasi mai (~3% dei partial; 0-15 casi per sleeve) e viene stoppato alla soglia nel ~60% dei tocchi. È la fisica mean-reversion: il TP delle fade sta ALLA MEDIA — lì il movimento è esaurito per costruzione. Il runner è un trend-follow della coda, e i breakout rientrano (lezione squeeze).
- Il costo è concentrato sui winner migliori: ogni TP pieno ora esce all'80% della strada sulla quota grossa → MR02 ETH (lo sleeve più forte) −38% ret FULL / −27% OOS. Sharpe per-trade ~piatto: non migliora il rischio/rendimento, scambia ritorno con DD.
- Quello che compra (win-rate +4-5pp, DD −1-4pp) è lo stesso profilo del vol-target sizing già scartato ("abbassa il DD ma sacrifica ritorno"); il lavoro anti-DD lo fa già il loss-guard Hurst, che il gate l'ha passato perché taglia SOLO i loser.
Nota dal grid: f0.5 q0.5 su MR07 ETH fa Sharpe OOS 6.58 / win 82%, ma
distrugge MR02 (2135→531) → nessuna variante robusta su tutti gli sleeve,
niente cherry-picking per-sleeve.
Argomento esecutivo in più: il ladder raddoppierebbe la complessità dello shadow appena deployato (v1.0.7: limit reduce-only al TP) — due resting order per posizione, due riconciliazioni, e lo stop dinamico avrebbe il problema dei trigger Deribit (nuovo order_id al trigger → fill non verificabile per order_id).
Conferma della lezione di famiglia: i tweak d'exit che toccano i winner falliscono il gate (time-stop, vol-target, ADX, vratio… e ora il ladder); l'unico anti-perdite che passa resta il loss-guard Hurst, che riduce l'esposizione nel regime tossico senza toccare le uscite.