9.4 KiB
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:
- qualcosa di ESEGUIBILE a $600-5.000 che aggiunge al libro TP01+SKH01 (raro);
- 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;
- un LEAD onesto con gate pre-registrato e data;
- 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/.../scratchpado 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 feeA.eval_weights_smallcap(df, target, capital=600)-> haircut reale a $600 (min-order $5)A.candidate_daily(target_fn)-> serie giornaliera del candidatoA.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_honeste' 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 calendarioA.implausible_sharpe(daily, n_trades, n_losing)-> Sharpe troppo bello = rischio FUORI dal datasetA.anchor_luck_band(fn_by_offset, offsets)-> la stima onesta e' la MEDIANA, non l'ancora 00:00A.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.
- Null del de-levering (5 occorrenze): "meno drawdown" e' quasi sempre solo meno leva.
Test obbligatorio su OGNI claim di DD: esiste
k<1che, applicato al baseline, da' lo STESSO DD con Sharpe migliore? Se si', il tuo overlay e' inutile. - TP01 travestito: corr al baseline > ~0.6 = stai ricomprando il trend.
marginal_vs_tp01. - Selezione sull'hold-out: scegliere la cella col miglior OOS. Usa
select_cell_insample. - Fortuna d'ancora: l'ora/il giorno di ribilanciamento e' un max-of-k non dichiarato.
- Sharpe implausibile: 0 perdite su N non e' "senza rischio" (regola del tre: fino a 3/N).
- Hedge travestito da alpha: paga solo quando TP01 e' debole ->
is_hedge. - Il win-rate e' un KNOB: WR ~ 1/(1+RR). Converti ogni claim "X% win" in expectancy R netta fee.
- Una riga presente non e' un dato presente: conta cio' che e' QUOTATO/ATTIVO, non le righe.
- Barre attive vs calendario: uno sleeve settimanale su griglia giornaliera e' 94% zeri.
- 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 fraSCARTATO/LEAD/CANDIDATO— e la ragione in una riga.CANDIDATOsolo se:earns_slot/marginal=ADDSE DSR>=0.95 E null-de-levering superato E eseguibile al capitale dichiarato. Altrimenti e'LEAD(con gate e data) oSCARTATO.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.