chore(reset): v2.0.0 — storico certificato Deribit mainnet, ripartenza pulita
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>
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
# Diario — 2026-06-05 — Fix EXIT-16 live: confirm sul close di barra COMPLETATA + alert STALE_FEED
|
||||
|
||||
## Innesco
|
||||
|
||||
Crash ETH 2026-06-05: gli stop MR01/MR02 ETH sono scattati molto sotto il livello
|
||||
nominale (MR02: sl 1636.28 → exit 1600.45; MR01: sl 1610.75 → exit 1594.35).
|
||||
Analisi delle due concause dichiarate:
|
||||
|
||||
1. **EXIT-16 close-confirm** (by design): uscita al close oltre `sl ∓ 0.5·ATR14`,
|
||||
non al livello — costo accettato e MODELLATO nel backtest validato (7.84/10.06).
|
||||
2. **Feed gappato**: ETH testnet flat ~2h (1656.80/1655.55, 13:00–14:50 UTC), poi
|
||||
una candela 14:55 da 1634 a 1600 — nessun prezzo esisteva tra SL ed exit. I fill
|
||||
REALI confermano (1600.2 / 1589.7, slippage −1.6/−29 bps): non è un bug, è il mercato.
|
||||
|
||||
## Scoperta: divergenza implementativa REALE nel worker
|
||||
|
||||
Audit dei 3 stop ETH del 2026-06-04/05 contro le candele:
|
||||
|
||||
| Stop live | Close barra COMPLETATA al momento | Confirm | Verdetto |
|
||||
|---|---|---|---|
|
||||
| MR02 06:03 @1672.9 | 1682.25 (05:00) | ~1675.4 | **wick-stop**: il backtest NON avrebbe stoppato lì |
|
||||
| MR02 15:00 @1600.45 | 1600.05 (14:00) | ~1621 | legittimo, fill ≈ backtest |
|
||||
| MR01 15:01 @1594.35 | 1600.05 (14:00) | ~1594.4 | **wick-stop**: il backtest NON avrebbe stoppato lì |
|
||||
|
||||
**2 su 3 erano valutazioni sulla barra IN FORMAZIONE**: `tick` confrontava
|
||||
`current_price` (close istantaneo della candela in corso al poll) con `sl − buf`.
|
||||
Il backtest (`fade_base`) valuta il confirm SOLO sul close di barra completata
|
||||
`c[j]`. La differenza reintroduce live esattamente la wick-sensitivity che EXIT-16
|
||||
elimina: un dip infrabarra sotto il confirm stoppava anche se la barra chiudeva
|
||||
sopra (e nei dip-che-rientrano la fade vince — è il suo edge). Live sarebbe stato
|
||||
strutturalmente PIÙ stop-prone del backtest validato.
|
||||
|
||||
## Fix (`strategy_worker.py`, ramo sl_confirm_atr)
|
||||
|
||||
- Il confirm è valutato sul **close dell'ultima barra COMPLETATA**: l'ultima riga
|
||||
del df è la candela in corso finché non è trascorsa la sua durata
|
||||
(`now_ms < ts[-1] + bar_ms`, `bar_ms` = mediana dei delta timestamp → regge 1h/4h/1d).
|
||||
- Il `buf` usa l'ATR14 alla stessa barra completata (prima: barra in formazione).
|
||||
- Il **fill resta al prezzo corrente** al poll (lag ≈ stress `lag_close_exit`,
|
||||
superato in exit-lab). TP intrabar sulla barra in corso INVARIATO (= backtest).
|
||||
- Test nuovi in `test_close_confirm_sl.py` (sezione FIX 2026-06-05): il dip della
|
||||
candela in corso non stoppa; il breach della completata stoppa anche se rimbalzato;
|
||||
TP intrabar invariato. NB fixture: timestamp in ms ESPLICITI
|
||||
(`Timestamp.now()` è risoluzione µs → `astype int64 // 10**6` darebbe secondi).
|
||||
|
||||
## Concausa feed: entry-guard TESTATA e BOCCIATA, solo osservabilità
|
||||
|
||||
Quantificato (1h, storico completo): segnali fade subito dopo barre flat = BTC
|
||||
0.2–0.9%, **ETH 3.4–11.8%**. Backtest con skip di quei segnali (config live,
|
||||
sl_confirm 0.5): **PEGGIORA tutti gli sleeve ETH** (MR01 +1344→+1256, MR02
|
||||
+2372→+2250, MR07 +740→+621; BTC ~invariato). La candela-gap post-flat è
|
||||
l'overshoot che la fade fada con profitto — e i fill reali post-crash lo
|
||||
confermano (riaperture a −1.9 bps di slippage). **Niente skip degli ingressi.**
|
||||
|
||||
Aggiunto invece **alert Telegram `STALE_FEED`** (`runner._check_stale_feed`):
|
||||
notifica quando un asset ha ≥2 barre 1h complete flat (worker ciechi) e al
|
||||
risveglio col **gap %** del primo prezzo reale. Una notifica per episodio
|
||||
(dedup per asset). Solo osservabilità, zero effetto sulle decisioni.
|
||||
|
||||
## Cosa NON è stato toccato (e perché)
|
||||
|
||||
- Il **costo del confirm** (uscita al close, non al livello nominale) resta: è il
|
||||
trade-off validato di EXIT-16 (FULL 6.47→7.84, OOS 8.82→10.06) — i wick-stop
|
||||
evitati pagano molto più dei close-stop più profondi.
|
||||
- Il **gap-through** non è mitigabile lato exit: nessun prezzo esisteva tra SL ed
|
||||
exit (fill reali ≈ sim). L'unica protezione strutturale resta la diversificazione
|
||||
(17 sleeve) + i cap di famiglia.
|
||||
Reference in New Issue
Block a user