# 2026-06-20 — Correzione estrazione cerbero MCP: il backfill sintetico (vol=0) ingannava la certificazione ## Contesto Richiesta: "analizza cerbero MCP correggendo l'estrazione dati storici secondo le analisi fatte". Le analisi del progetto avevano già fissato un principio — *"storia nativa Hyperliquid solo dal 2024, pre-2024 = backfill, volume 0"* — e `fetch_hyperliquid.py` lo gestiva con un floor `START=2024-01-01`. **Il floor non basta.** ## Il difetto `fetch_hl` chiedeva a cerbero MCP `get_historical` dal 2024-01-01 e certificava ogni asset con tre gate: **flat-bar** (O==H==L==C), **cross-venue** (mediana |close − Binance| < 60 bps), **recency**. Nessuno guardava il **volume**. Risultato: gli asset listati su HL *dopo* lo START passavano come PULITO pur essendo in gran parte **backfill sintetico**. Ispezione del volume sui parquet (leading run di barre a volume 0): | asset | barre | leading vol=0 | primo trade reale | % sintetico | |---|---|---|---|---| | **AXS** | 902 | **748** | 2026-01-18 | **82.9%** | | ALGO | 902 | 338 | 2024-12-04 | 37.5% | | SAND | 902 | 338 | 2024-12-04 | 37.5% | | AR | 902 | 58 | 2024-02-28 | 6.4% | | ETC | 902 | 11 | 2024-01-12 | 1.2% | | BTC/ETH + 19 major | 902 | 0 | 2024-01-01 | 0% | AXS era **certificato PULITO** (flat 0%, cross-venue 9.5 bps) pur avendo solo ~5 mesi di trading reale. ## Verifica diretta su cerbero MCP (token mainnet) Interrogato l'endpoint `cerbero-mcp.tielogic.xyz/mcp/tools/get_historical` (bot-tag `pythagoras-mainnet`): - **BTC**: 902 barre, leading vol=0 = 0, volume reale dal 2024-01-01 (V=699, 2437, 5306…). Nativo. ✓ - **AXS**: 902 barre, **748 leading vol=0**, primo vol>0 = 2026-01-18. Le barre a volume 0 hanno prezzi (O/H/L/C) che **coincidono con Binance**: | data | cerbero close | binance close | Δ | |---|---|---|---| | 2024-01-01 | 9.262 | 9.26 | 2.2 bps | | 2024-01-02 | 8.949 | 8.94 | 10.1 bps | | 2024-01-03 | 7.937 | 7.95 | 16.4 bps | **Diagnosi provata:** cerbero MCP riempie il periodo pre-quotazione con barre **sintetiche — volume 0, prezzi copiati da un venue di riferimento (Binance)**. Per questo i vecchi gate venivano ingannati: - cross-venue passa → i prezzi *sono* Binance (Δ 1–16 bps); - flat passa → le barre non sono flat (hanno movimento di prezzo); - ma **volume 0** → su HL quelle candele **non erano negoziabili**. È esattamente il caso v2.0.0 (edge su un book che non c'era). ## Correzione (`scripts/analysis/fetch_hyperliquid.py`) 1. **Il VOLUME è il rivelatore del backfill** → `trim_backfill()` taglia il run iniziale di barre a volume 0; si tiene solo la **serie nativa**. 2. **Gate storia nativa** `MIN_NATIVE_DAYS=365`: dopo il taglio serve ≥ 1 anno di vita reale → scarta chi è troppo corto (AXS, 154 barre reali → fuori). 3. **Gate vol=0 interno** `INTERIOR_VOL0_MAX=5%`: gap di liquidità oltre il taglio iniziale. 4. **cross-venue/flat ricalcolati SOLO sulle barre reali** (non più sui sintetici). 5. **I parquet degli asset scartati vengono rimossi** (disco == set certificato; niente file contaminati a riposo). ## Risultato - Universo certificato: **52 → 51** (AXS scartato). - ALGO/SAND (−338 barre), AR (−58), ETC (−11) ripuliti dal backfill → ora start reale corretto. - **I 19 major di XS01 hanno 0 backfill → invariati**: la strategia live (`XS_UNIVERSE` esplicito) NON è toccata. Verificato: portafoglio 3-way (TP01+XS01+VRP01) gira identico, FULL Sh 1.68 / HOLD 1.67. - Re-fetch end-to-end su cerbero reale: 51 PULITO, sweep su tutti i file → 0 backfill residuo. ## Nota su una conclusione precedente Il diario `2026-06-19-xsec-universe-expansion.md` concludeva "cross-section dei 52 = negativo". Quella finestra includeva i sintetici (AXS 83%, ALGO/SAND 37% di barre vol=0 con ritorni non eseguibili): la magnitudine del risultato era **in parte un artefatto**. La conclusione qualitativa (il long-tail diluisce XS01; i 19 major sono il sweet spot) resta valida, ma il numero netto è 51 e il test andrebbe ri-girato sui dati puliti se si volesse riusare quell'universo. ## Lezione `flat` + cross-venue **non bastano** a certificare un feed che fa backfill copiando un altro venue: il backfill è plausibile sui prezzi proprio perché è copiato. Il **volume** (=liquidità reale) è il gate che mancava. Coerente con la regola di prim'ordine v2.0.0: certificare il dato — anche il *volume*, non solo il prezzo — prima della strategia. File: `scripts/analysis/fetch_hyperliquid.py`. Universo: `data/raw/hl_*_1d.parquet` (51, serie native).