# BRIEF ONDATA 2026-08-22 — ricerca multi-agente, branch `research/wave-0822` Sei UNO di ~30 agenti. Leggi tutto questo file prima di scrivere codice. ## 0. Obiettivo reale (non e' "trovare uno Sharpe alto") Il conto vero e' **$635** su Deribit. L'obiettivo dichiarato dall'operatore e' **50 EUR/giorno**. Misura gia' fatta nel progetto: la rendita perpetua vale ~45-55% del CAGR, quindi 50 EUR/g richiede **~$258k netti** di capitale. **Nessuna strategia colma quel divario**: il vincolo binding misurato il 26/07 e' *capitale che entra* + *conto che non sparisce*, non la ricerca. Percio' un risultato vale in ordine: 1. qualcosa di **ESEGUIBILE a $600-5.000** che aggiunge al libro TP01+SKH01 (raro); 2. qualcosa che alza **P(sopravvivere a una barriera di DD per-conto)** — e' il canale *prop/funded*, l'unico che moltiplica il nozionale senza possedere il capitale; 3. un **LEAD** onesto con gate pre-registrato e data; 4. una **falsificazione pulita** (chiudere un filone vale quanto aprirlo: si smette di pagarlo). Un "non funziona" MISURATO e' un risultato accettato e apprezzato. Un PASS non verificato e' un danno. ## 1. Disciplina di macchina — NON NEGOZIABILE La VPS ha **2 core** e ci gira il libro con **soldi veri**: `cron_book` al minuto **:07**, `cron_chain` al **:25**, `cron_daily` alle **00:30**. - Ogni comando python pesante va lanciato con `nice -n 19 timeout 900 uv run python ...` - **Budget: nessun singolo run > 15 minuti.** Se una griglia non ci sta, RIDUCILA e dichiara che l'hai ridotta. Meglio 24 celle dichiarate che 700 mai finite. - Preferisci **1d / 1h**. I 5m esistono (btc/eth) ma una sweep su 5m x griglia = ore: vietata salvo che sia il cuore della tua ipotesi, e allora su UN asset e UNA finestra. - **NON toccare**: `config/`, `data/live/`, `data/paper_*`, `data/venue_watch`, `data/fee_watch`, `src/live/`, `scripts/live/`, `scripts/cron_*.sh`. Sola lettura. - **NON eseguire** git checkout/commit/push/stash/branch. Il branch e' gia' quello giusto. - Scrivi **UN SOLO file nuovo**: `scripts/research/r0822_.py`. Niente altro in repo. Output/figure/CSV solo sotto `/tmp/claude-1001/.../scratchpad` o stampati a video. ## 2. Il dato — cosa esiste davvero Legge con `from src.data.downloader import load_data` oppure `scripts/research/alt/altlib.get()`. | dato | file | copertura | nota | |---|---|---|---| | BTC/ETH OHLCV | `data/raw/{btc,eth}_{5m,15m,1h}.parquet` | 2018/2019 -> oggi | **certificato**, unica verita' (Deribit mainnet) | | DVOL BTC/ETH | `data/raw/dvol_{btc,eth}.parquet` | 2021-03 -> oggi (1978g) | vol implicita ATM | | 51 alt Hyperliquid 1d | `data/raw/hl__1d.parquet` | 2024 -> oggi (~965g) | serie native, no backfill | | funding HL 1h | `data/raw/hlfund__1h.parquet` | ~2023-05 -> oggi | 19 major | | ETF/azioni 1d | `data/raw/eq__1d.parquet` | fino a 30 anni | SPY/QQQ/IWM/TLT/GLD/HYG certificati; TLT parte 2016 | | **catena opzioni Deribit** | `data/raw/cb_chain/YYYY-MM-DD.parquet` + `bite_archive.parquet` | **2026-05-01 -> oggi, oraria** | per-strike: bid/ask/mid/iv/delta/gamma/theta/vega/OI/volume/book_depth | | **snapshot di mercato** | `data/raw/cb_market_snapshots.parquet` | **2026-03-26 -> 2026-07-30** (17.406 righe) | dealer_net_gamma, gamma_flip_level, oi_delta_pct_4h, liquidation_long/short_risk, funding_cross, iv_minus_rv | | term structure IV | `data/raw/vol_term_{btc,eth}.parquet` | **solo 58 giorni** | iv 7/30/60/90/180d | Harness catena: `scripts/research/cblib.py` (`load_chain()` unisce archivio + raccolta). **ATTENZIONE**: catena/snapshot/vol_term hanno **3-5 MESI** di storia. Con 3 mesi non esiste un hold-out: quei dati possono produrre **al massimo un LEAD con gate pre-registrato**, mai uno sleeve. Dirlo esplicitamente e' parte del risultato. `load_data("SOL")` = guardrail: SOL sta in `alt_sol_*` ed e' **escluso per decisione dell'operatore** (22/08) — non riproporlo. ## 3. L'harness onesto — USALO, non riscriverlo `import sys; sys.path.insert(0, "scripts/research/alt")` poi `import altlib as A`. - `A.get(asset, tf)` dati · `A.vol_target(...)` · `A.eval_weights(df, target)` metriche nette fee - `A.eval_weights_smallcap(df, target, capital=600)` -> **haircut reale a $600** (min-order $5) - `A.candidate_daily(target_fn)` -> serie giornaliera del candidato - `A.marginal_vs_tp01(cand_daily)` -> ADDS / NEUTRAL / DILUTES / **HEDGE** / **NOISE** (contiene: robust_oos multicut, has_insample_edge, is_hedge, beats_noise_null) - `A.study_family_honest(name, factory, grid, tfs)` -> **il gate giusto se hai una GRIGLIA**: sceglie la cella **in-sample-only** + deflated-Sharpe. `earns_slot_honest` e' il verdetto. - `A.deflated_sharpe(sr, all_sr, daily)` -> PASS >= 0.95. **Conta TUTTI i trial, al RIALZO.** - `A.causality_ok(target_fn)` -> nessun look-ahead · `A.day_boundary_robust(...)` per segnali calendario - `A.implausible_sharpe(daily, n_trades, n_losing)` -> Sharpe troppo bello = rischio FUORI dal dataset - `A.anchor_luck_band(fn_by_offset, offsets)` -> la stima onesta e' la **MEDIANA**, non l'ancora 00:00 - `A.anchor_luck_delta(A_by_off, B_by_off, offsets)` -> per confrontare due varianti: **mediana delle DIFFERENZE APPAIATE**, mai differenza delle mediane. ## 4. I modi in cui questo progetto si e' gia' ingannato (li conosciamo per nome) Se il tuo risultato ha una di queste forme, e' quasi certamente quello — provalo prima di crederci. 1. **Null del de-levering** (5 occorrenze): "meno drawdown" e' quasi sempre solo meno leva. Test obbligatorio su OGNI claim di DD: esiste `k<1` che, applicato al baseline, da' lo STESSO DD con Sharpe **migliore**? Se si', il tuo overlay e' inutile. 2. **TP01 travestito**: corr al baseline > ~0.6 = stai ricomprando il trend. `marginal_vs_tp01`. 3. **Selezione sull'hold-out**: scegliere la cella col miglior OOS. Usa `select_cell_insample`. 4. **Fortuna d'ancora**: l'ora/il giorno di ribilanciamento e' un max-of-k non dichiarato. 5. **Sharpe implausibile**: 0 perdite su N non e' "senza rischio" (regola del tre: fino a 3/N). 6. **Hedge travestito da alpha**: paga solo quando TP01 e' debole -> `is_hedge`. 7. **Il win-rate e' un KNOB**: WR ~ 1/(1+RR). Converti ogni claim "X% win" in **expectancy R netta fee**. 8. **Una riga presente non e' un dato presente**: conta cio' che e' QUOTATO/ATTIVO, non le righe. 9. **Barre attive vs calendario**: uno sleeve settimanale su griglia giornaliera e' 94% zeri. 10. **Confronto appaiato per INGRESSO**, mai allineato sull'uscita (e' quella che la variante cambia). ## 5. Cosa e' GIA' MORTO — non riaprirlo senza un meccanismo nuovo mean-reversion/fade · trend 5m-15m (fee) · calendario in ogni forma (weekend 375 trial, expiry, stagionalita', event-clock, ora-del-giorno) · funding (carry CC01, time-series, cross-sectional: chiuso su 3 lati) · macro regime gate (ridondante col trend) · gamma scalping long-vol · CRT/ICT/ Elliott/Fibonacci/Albimarini · espansione universo XS01 · meta-allocazione dinamica · trend multi-asset (MAT01) · overlay DD su VRP01 (5/5 refutati) · SOL terza gamba (deciso 22/08) · breadth alt (rivedibile solo con 1-2 anni di storia HL in piu'). Il **soffitto strutturale BTC/ETH-direzionale e' ~1.3 di Sharpe**: superato una sola volta, e cambiando meccanismo (cross-sectional). ## 6. Il libro di oggi — il tuo termine di paragone LIVE su Deribit: **TP01 75% + SKH01 25%**, nettati sullo stesso strumento (USDC linear), cron orario, cap $318/asset, min order $5, disaster-SL -30%, fee reale **3,5 bps/lato**. Book di ricerca a 5 sleeve (TP01 33 / XS01 15 / VRP01 12 / SKH01 20 / GTAA01 20): Sharpe FULL **1.95** e HOLD **1.54** (stime de-luckate; i canonici 2.22/2.36 sono fortuna d'ancora), maxDD ~6.9%. GTAA01 **non e' deployabile** (PRIIPs) e XS01 serve ~$20k, XSR01 ~$5k. Un candidato si giudica **marginalmente vs questo**, mai in assoluto. ## 7. Contratto di consegna (obbligatorio) Consegni **testo strutturato**, non un racconto. Alla fine del tuo lavoro riporta ESATTAMENTE: - `IPOTESI`: cosa hai testato, in una frase, e **cosa ti aspettavi PRIMA di misurare**. - `GRIGLIA DICHIARATA`: quante celle/trial hai valutato in TOTALE (conta al rialzo, incluse le varianti provate e scartate). Se hai ridotto la griglia per il budget, dillo. - `NUMERI`: Sharpe FULL / hold-out / maxDD / CAGR, **netti fee**, + haircut a $600 se pertinente. - `GATE`: esito di ciascun gate che hai potuto far girare (marginal, DSR, causality, anchor, de-levering null, implausible). Un gate non girato si dichiara "non girato", non si omette. - `VERDETTO`: uno fra `SCARTATO` / `LEAD` / `CANDIDATO` — e **la ragione in una riga**. `CANDIDATO` solo se: `earns_slot`/`marginal=ADDS` **E** DSR>=0.95 **E** null-de-levering superato **E** eseguibile al capitale dichiarato. Altrimenti e' `LEAD` (con gate e data) o `SCARTATO`. - `COSA MI SMENTIREBBE`: l'osservazione che falsificherebbe il tuo risultato. - `SCRIPT`: il path del file che hai scritto (deve girare da solo: `uv run python `). Se non hai potuto misurare, il verdetto e' `SCARTATO (non misurabile)` col motivo. **Non inventare numeri, non estrapolare da un run non finito, non riportare un risultato di un run che hai ucciso.** ## 8. RAM — 7 GB totali, ~3 GB liberi, e siete in tanti Non caricare i `*_5m.parquet` di piu' di un asset alla volta, e taglia la finestra (`pd.read_parquet(f, columns=[...])` + slice temporale) prima di elaborare. Se ti serve la catena opzioni, filtra per asset/scadenza in lettura: `bite_archive.parquet` da solo e' 35 MB su disco ma esplode in memoria. Un agente che fa OOM uccide anche il lavoro degli altri.