Files
2026-08-22 16:43:06 +00:00

120 lines
9.4 KiB
Markdown

# 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_<tuo-slug>.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_<sym>_1d.parquet` | 2024 -> oggi (~965g) | serie native, no backfill |
| funding HL 1h | `data/raw/hlfund_<sym>_1h.parquet` | ~2023-05 -> oggi | 19 major |
| ETF/azioni 1d | `data/raw/eq_<sym>_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 <path>`).
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.