14522262e6
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>
86 lines
4.5 KiB
Markdown
86 lines
4.5 KiB
Markdown
# 2026-06-15 — Gate del feed CONGELATO (freeze gate)
|
||
|
||
## Problema (da "stato ordini")
|
||
|
||
Audit degli ordini live: 5 sleeve in posizione reale, **4-5 contaminati dal feed ETH
|
||
congelato**. `ETH-PERPETUAL` (inverse, il feed di DECISIONE del runner) è fermo a
|
||
**1661.95 da 36h+** (100% barre flat, 57/57 nel windows 2g, **1 solo valore distinto**),
|
||
mentre il book reale dove si ESEGUE (`ETH_USDC-PERPETUAL`, lineare) si muove ~1717-1722.
|
||
|
||
Effetto misurato sui soldi reali (log container):
|
||
- **SH01_ETH** ha aperto short a sim 1661.95 / real 1717.10 (slippage 332 bps), chiuso a
|
||
time_limit con `sim_exit 1661.95` ma `real_fill 1719.21` → **−2.83 USD reali vs −0.09 sim**
|
||
→ e ha **riaperto subito** lo stesso short sulla trappola.
|
||
- I 4 pairs con gamba ETH (ETH/BTC 1h+15m, ETH/SOL, LTC/ETH, ADA/ETH) sono entrati con
|
||
z-score **estremi** (−3.10, −2.96, +5.58, −2.56): artefatto MECCANICO del log-ratio con
|
||
ETH pinnato a 1661.95 mentre gli alt si muovono → falsa divergenza → carico di spread long-ETH.
|
||
|
||
È un GUASTO testnet, non di strategia: in mainnet l'arbitraggio tiene inverse ≈ lineare ≈ realtà.
|
||
|
||
## Decisione utente
|
||
|
||
> "congela gli sleeve ETH-leg finché il feed non si sblocca"
|
||
|
||
## Soluzione: gate del feed congelato nel runner (auto-guarente)
|
||
|
||
`src/portfolio/runner.py`: quando il feed di decisione 1h di un asset è **congelato**, gli
|
||
sleeve CONCENTRATI (single/ml/pairs) che ne dipendono **saltano il tick** (entry E exit)
|
||
finché il feed non si sblocca. Come un outage (i worker non valutano gli exit, protezione =
|
||
disaster-SL on-book). Si rilascia DA SOLO alla prima barra completa non-flat.
|
||
|
||
### Distinguere il GUASTO dall'ILLIQUIDITÀ (il punto critico)
|
||
|
||
Un detector flat-bar ingenuo sarebbe SBAGLIATO: sul feed reale (2026-06-15) gli alt sono
|
||
flat ma VIVI. Firma misurata (run finale di close invariate / valori distinti in 48h):
|
||
|
||
| Asset | run | distinti/48h | natura |
|
||
|-------|-----|--------------|--------|
|
||
| ETH | 64 | **1** | MORTO (guasto) |
|
||
| BNB | 64 | 2 | MORTO (testnet, solo paper) |
|
||
| DOGE | 42 | 4 | MORTO (testnet, solo paper) |
|
||
| XRP | 12 | 3 | illiquido |
|
||
| ADA | 11 | 5 | illiquido ma VIVO |
|
||
| LTC | 10 | 5 | illiquido ma VIVO |
|
||
| SOL | 1 | 31 | VIVO |
|
||
|
||
→ il detector conta la **run di close INVARIATE** (prezzo che non cambia MAI), non le barre
|
||
flat. Soglia **24** (`feed_freeze_gate_bars`, configurabile, 0=off): un giorno intero di
|
||
prezzo immobile separa nettamente le due popolazioni. ETH/BNB/DOGE (run 40-64) gateati,
|
||
ADA/LTC/XRP/SOL (run ≤12) no. **PR_BTCLTC resta attivo** (BTC vivo + LTC solo illiquido NON
|
||
deve sospendere il pair: si perderebbero segnali reali sulla gamba BTC).
|
||
|
||
### NON è l'entry-guard post-flat (BOCCIATA)
|
||
|
||
Si gatea **DURANTE** il freeze (ultima barra completa ferma). La barra di RIPRESA è non-flat
|
||
→ la run si azzera → il tick riprende SU di essa. NON si salta la candela-gap di ripresa
|
||
(quella è l'overshoot che la fade fada con profitto — l'entry-guard post-flat è bocciata,
|
||
CLAUDE.md / 2026-06-05). Rilascio solo su barra **completata** non-flat (la forming non basta,
|
||
coerente con EXIT-16).
|
||
|
||
### Scope
|
||
|
||
Solo sleeve `single`/`ml`/`pairs`. I multi-asset (basket/rotation/tsmom/xsec, tutti PAPER)
|
||
NON sono gateati: diversificati su 8 asset, un feed fermo non li compromette (e ROT02 ha ETH
|
||
nell'universo ma resta attivo). Osservabilità: log `FEED_FROZEN_GATE` + alert Telegram
|
||
GATED/RIPRESO, dedup per episodio.
|
||
|
||
## Esito (smoke feed reale, soglia 24)
|
||
|
||
- CONGELATI: ETH, BNB, DOGE.
|
||
- **GATEATI: le 9 gambe ETH esatte** — MR01/MR02/MR07_ETH, SH_ETH, PR_ETHBTC, PR_ETHBTC_15M,
|
||
PR_LTCETH, PR_ADAETH, PR_ETHSOL. BTC-only, PR_BTCLTC e i multi-asset restano attivi.
|
||
|
||
Le 5 posizioni ETH già aperte NON vengono flattate (freeze = pausa, non liquidazione): un
|
||
close forzato passerebbe per lo stesso feed congelato (= il close −2.83 di SH01). Restano
|
||
gestite alla ripresa del feed; protezione di coda = disaster-SL on-book a −30%.
|
||
|
||
Test: `tests/portfolio/test_freeze_gate.py` (detector guasto-vs-illiquido, rilascio su barra
|
||
completata, scope sui veri sleeve PORT06). Suite portfolio: 140/140 verdi.
|
||
|
||
## Lezione
|
||
|
||
Tre livelli di osservabilità del feed ora distinti: STALE_FEED (≥2 barre flat, alert umano),
|
||
FEED_BOOK_GAP (feed≠book d'esecuzione, alert), **FEED_FROZEN_GATE (≥24 barre invariate, AGISCE)**.
|
||
La firma che separa guasto da illiquidità è la **run di prezzo invariato**, non la barra flat:
|
||
gli alt illiquidi stampano barre flat ma il prezzo si muove ogni ~10 barre.
|