ab5bcace16
Risposta a "trova un sistema di protezione da fallimento exchange" SOTTO IL VINCOLO della decisione appena presa (100% Deribit fino a $20k). Se non si puo' ridurre l'ESPOSIZIONE, l'unica leva e' il TEMPO: il modello di rischio del mattino assumeva il salto a zero istantaneo, ma i fallimenti reali non lo sono (Mt.Gox mesi, FTX ~72h, e misurato qui: Bitfinex 2018-19 dislocato per 2.324 ore consecutive). SEGNALE: un venue che gata i prelievi rompe l'ARBITRAGGIO -> il prezzo si stacca dal consenso e ci resta. E' |scarto|, non il segno (Mt.Gox a premio, un venue in fuga a sconto: stessa cosa). Consenso = venue USD indipendenti (Coinbase, Bitstamp), mai USDT. Deribit sta a 3 bps dal consenso in mediana su 8 anni (65.043 ore BTC + 64.541 ETH). TARATURA CONGELATA: 100 bps persistenti 4h a segno costante. Criterio DICHIARATO PRIMA, perche' i due ovvi sbagliano in versi opposti (provati entrambi): "minimi bps" -> 25/24h consuma 24 delle ~72h di FTX; "minime ore" -> 500/2h MANCA FTX (margine 0.6x). Regola: zero falsi allarmi in 8 anni + margine >=3x sul caso storico piu' debole -> soglia <=100bps -> poi minima latenza. Margine 3x FTX / 5x Quadriga / 10-20x Mt.Gox, zero falsi allarmi con crash COVID, maggio 2021, LUNA e novembre 2022 inclusi. CONTROLLO POSITIVO SUPERATO (un rilevatore tarato per non segnalare e' indistinguibile da uno rotto): puntato su Bitfinex 2018-19 scatta 22 volte, episodio piu' lungo 2.324h a +447bps. 22 dove il problema c'era, 0 su Deribit. E la durata risponde alla domanda vera: un venue gated resta dislocato per settimane, quindi 4h di latenza sono trascurabili. ECONOMIA: falso allarme = 0.248% atteso (flat 3g misurato sul book reale a ogni data d'inizio); vero positivo = 100% salvato. Break-even p > (falsi/anno) x 0.00248: a 1 ogni 8 anni serve p > 0.031%. Il valore sta nella SPECIFICITA', non nella sensibilita'. CABLATO: src/live/venue_watch.py (nucleo puro) + scripts/live/venue_watch.py, in cron_book.sh PRIMA di book_execute (se Deribit e' in stress l'allarme deve partire anche quando l'esecuzione fallisce per la stessa ragione). Tre stati OK/ALERT/BLIND — "non vedo" non e' "va bene". ALLERTA, NON BLOCCA: l'azione e' prelevare (manuale; una chiave con permesso di prelievo sarebbe essa stessa un rischio) e bloccare non protegge un saldo che e' a rischio anche stando flat. Runbook pre-deciso nel docstring. NON COPRE, e non e' un argomento per riaprire il 26/07: un fallimento SENZA finestra (furto chiavi, sequestro, exit-scam) non lo prende nessun tripwire. ERRORI CATTURATI IN SESSIONE: - break-even calcolato sul p5 invece che sulla media (8.3x piu' severo, conclusione ribaltata); - ipotesi meccanica sbagliata: credevo che i crash dislocassero a segno ALTERNATO. Falso, sono a segno costante anche loro (perp sotto spot per ore in cascata). A separare sono ampiezza e durata, non il segno; - la prima corsa tronco' il campione da 8 anni a 29 GIORNI per un inner-join con Kraken (che serve solo ~700 candele) e la copertura era gia' stampata a video: una diagnostica stampata NON e' un controllo. Ora c'e' una guardia che ferma lo script. 2a occorrenza in un giorno dopo GTAA01; - il controllo positivo era finito dentro il ramo `else` -> non girava mai, cioe' esattamente il difetto che doveva prevenire. Book, pesi, config INVARIATI. 359 test verdi (+23). Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
1263 lines
113 KiB
Markdown
1263 lines
113 KiB
Markdown
# PythagorasGoal — Istruzioni per agenti
|
||
|
||
## Stato del progetto — v2.0.0 RESET (2026-06-19)
|
||
|
||
**LEGGERE PRIMA DI TUTTO.** Il progetto è stato resettato dopo aver scoperto che l'intera
|
||
libreria di strategie "validata OOS" (FADE, PAIRS, DIP01, TR01, ROT02, TSM01, XS01, SH01) era
|
||
**artefatto di uno storico contaminato** — print fantasma del feed Cerbero **testnet** + storico
|
||
**Binance/USDT**. Ri-testate sul feed reale, tutte perdono ogni anno (vedi
|
||
`docs/diary/2026-06-19-deribit-history.md`, il documento di fondazione).
|
||
|
||
Cosa è cambiato:
|
||
- Lo storico è stato **ricostruito da Deribit mainnet** e **certificato**. Universo affidabile =
|
||
**solo BTC/ETH** (tutti i TF). Gli alt sono esclusi (illiquidi/divergenti/non certificabili).
|
||
- Tutto il codice vecchio (strategie, stack live, ~100 script di ricerca/gate, dati non
|
||
certificati, 60+ diari) è **archiviato in `Old/`** (preservato in git, non cancellato).
|
||
- ~~L'esecuzione è DISABILITATA, il conto mainnet è flat. Non c'è trading live attivo.~~
|
||
**AGGIORNATO 2026-06-20: l'esecuzione di TP01 è ARMATA e LIVE su Deribit mainnet** —
|
||
`config/live.json` `execution_enabled=true` + cron giornaliero `live_execute.py --execute`
|
||
(cablato in `scripts/cron_daily.sh`). Guardrail: cap **$300 notional/asset**, min order $5,
|
||
**disaster-SL on-book −30%**, alert Telegram su esecuzione/errori. **Capitale reale ≈ $600**
|
||
(NON i €2000 nominali del paper trader). Stato corrente: **flat** (target TSMOM risk-off →
|
||
BTC/ETH 0.0x, nessun ordine). Solo TP01 è eseguito; XS01/VRP01 restano paper/STAT-MODE.
|
||
- Si riparte dalla ricerca di strategie NUOVE, su dati certi, con la metodologia qui sotto.
|
||
|
||
### Ricerca post-reset (2026-06-19) — esito
|
||
|
||
Prima ondata di ricerca onesta su BTC/ETH certificati (5 track, harness condiviso
|
||
`src/backtest/harness.py`). Sintesi in `docs/diary/2026-06-19-research-synthesis.md`.
|
||
|
||
- **TP01 Trend Portfolio — strategia DIFENSIVA robusta (non alpha)** —
|
||
`src/strategies/trend_portfolio.py`. TSMOM multi-orizzonte (1-3-6 mesi) vol-targeted, long-flat,
|
||
50/50 BTC+ETH. Config canonica **PORT LF1d** (**>=12h, 1d raccomandato**, vol-target 20%, leva cap 2x):
|
||
**FULL Sharpe ~1.30, maxDD ~14%; HOLD-OUT 2025-26 Sharpe ~0.31 / +3.5%** mentre il buy&hold 50/50
|
||
faceva −39%/DD60%. Verificata indipendentemente col gauntlet onesto (hold-out + cross-asset +
|
||
plateau + deflated-Sharpe 0.999): **regge**. **Valore = taglio del drawdown ~6× vs buy&hold**, NON
|
||
generazione di ritorno (CAGR ~16% vs ~48% del buy&hold sul toro).
|
||
⚠️ **LOOK-AHEAD (2026-06-19):** un ffill MIXED-TIMEFRAME su barre open-labeled gonfiava il 4h
|
||
(~1.60 → reale ~1.1). Il calcolo per-singolo-TF è leak-free, ma **NON scendere sotto le 12h**:
|
||
costi+overfitting dominano senza vantaggio (FULL Sh piatto ~1.3 da 12h a 4h; hold-out migliore a 1d).
|
||
Deploy/paper a **1d**. Diari `2026-06-19-tp01-verification.md` / `-tp01-lookahead-fix-lf.md`.
|
||
Paper/forward: `scripts/live/paper_portfolio.py` (TP01+XS01, 1d). Test: `tests/test_trend_portfolio.py`.
|
||
(Il vecchio `paper_trend.py` standalone TP01 è RITIRATO in `Old/scripts/live/` 2026-07-17 — inerte
|
||
dal 2026-06-19, non in cron, sostituito da `paper_portfolio`.)
|
||
Ri-verifica: `scripts/analysis/{verify_tp01,stress_tp01,tp01_lowfreq}.py`.
|
||
⚠️ **ANCHOR TIMING-LUCK (2026-07-02, confermato da scettico):** l'hold-out ~0.31 è calcolato
|
||
sull'ancora daily 00:00 UTC, che è la **migliore delle 24 possibili** (mediana ancore 0.04, banda
|
||
[−0.13,+0.30]; P~0.86 che una qualsiasi ancora mostri uno spike così per puro caso) → l'hold-out
|
||
2025-26 NON risolve l'edge di ritorno di TP01; ciò che regge a OGNI ancora è il **taglio del DD**
|
||
(7-10% vs ~60% B&H). FULL/plateau/deflated-Sharpe/gate INVARIATI (h=0 al 31° pctl su FULL).
|
||
Regola: i futuri numeri hold-out di strategie a ribilanciamento ancorato si citano con la banda
|
||
d'ancora. Diario `2026-07-02-timing-crt-wave.md`; script `scripts/research/r0702_tp01_offset.py`
|
||
+ `r0702_skeptic_offset.py`.
|
||
- **XS01 Cross-Sectional Momentum (Hyperliquid) — DIVERSIFICATORE che migliora il portafoglio** —
|
||
`src/portfolio/sleeves.py:_xsec_returns`. Market-neutral su **19 alt liquidi major** Hyperliquid (1d,
|
||
dal 2024): ogni 10g long i 5 più forti / short i 5 più deboli, vol-target 20%. **Scorrelato a TP01
|
||
(~−0.12).** Affinato (2026-06-19): **(a) blend di lookback [30,90]** (z-score cross-sectional mediato,
|
||
come il multi-orizzonte di TP01); **(b) gate di dispersione p30** (entra solo se la dispersione
|
||
cross-section del momentum supera il percentile espandente causale, altrimenti flat — XS è rumore in
|
||
regime compatto). Standalone FULL Sh **1.50** / HOLD 1.71 / DD 11%, plateau robusto (lookback, gate
|
||
p15-35). **Caveat:** storia ~2.5 anni; STAT-MODE (book a 19 gambe non eseguibile a 2k, serve ~20k) →
|
||
monitor forward. NB il gate concentra XS nei regimi dispersi (2025-26 = hold-out alta-dispersione).
|
||
⚠️ **PHASE TIMING-LUCK (2026-07-02):** i numeri headline sono sulla fase 0 del ciclo H=10, che è
|
||
al **15° pctl di DD** (10.8% vs ~15.5% fase tipica, 29% peggiore) e 85° di FULL fra le 10 fasi
|
||
(HOLD solo 65°, non estremo); P(spike per caso)≈0.91-0.94. Lens onesta = **ensemble di fase:
|
||
FULL 1.25 / HOLD 1.31 / DD 10.9%**; a fase mediana FULL 1.08/HOLD 1.10/DD 21%. La decisione di
|
||
ammissione @15% regge (0 fasi negative, 8/10 FULL≥1.0), i numeri 1.50/1.71/11% no → citarli con
|
||
banda di fase. Ora-del-giorno NON testabile (solo 1d HL). Script `scripts/research/r0702_anchor_xs01.py`;
|
||
diario `2026-07-02-anchor-audit-xs01-skh01.md`.
|
||
Ricerca `scripts/portfolio/{xsec_research,xsec_blend,xsec_dispgate}.py`. Diari `2026-06-19-hyperliquid-xsec`
|
||
/ `-xsec-blend` / `-xsec-dispgate` / `-xsec-universe-expansion` / `-trend-multiasset`.
|
||
- **PORTAFOGLIO ATTIVO = TP01 (33%) + XS01 (15%) + VRP01 (12%) + SKH01 (20%) + GTAA01 (20%)**
|
||
(`src/portfolio/sleeves.active_sleeves`): TP01+XS01 combinato **FULL Sharpe 1.55, HOLD-OUT 1.55,
|
||
DD 4.4%**. Aggiunto **VRP01** (options short-vol, sotto): TP01+VRP01 da solo fa FULL Sh 1.30→1.44 /
|
||
HOLD 0.31→0.40 a peso 20%. **Aggiunto SKH01-V2-DD @25% effettivo (2026-06-23, sotto)**: 4-sleeve
|
||
**FULL Sharpe 1.68→2.13, HOLD-OUT 1.63→2.30, DD full 14.3%→7.8%** (Skyhook quasi-ortogonale,
|
||
corr ~0.09). **Aggiunto GTAA01 @20% effettivo (2026-07-01, i 4 preesistenti scalati ×0.80):**
|
||
trend difensivo equity 6-ETF su IB (`src/portfolio/gtaa.py`, ~30 anni storia, validato 2026-06-22
|
||
su OOS equity 2015+ INDIPENDENTE dall'hold-out crypto, corr al book ~+0.10) → 5-sleeve
|
||
**FULL Sharpe 2.12→2.24, HOLD-OUT 2.21→2.46, DD full 7.8%→6.2%** (costo dichiarato: CAGR full
|
||
23.3→18.8%; 2022 unico anno con dSh−). Uplift positivo in-sample E su tutte le finestre disgiunte
|
||
(vs EW-STR refutato lo stesso giorno). Convenzioni: weekend/festivi equity = 0.0 (capitale IB
|
||
fermo, non riciclato); attivazione nel book all'era crypto 2019-03; **il book live Deribit
|
||
(`deribit_book_sleeves` TP01+SKH01 75/25) NON lo include** (GTAA in paper_combo dal 2026-06-23).
|
||
Test `tests/test_gtaa_sleeve.py`; diario `2026-07-01-strategy-wave-6threads.md` (addendum GTAA).
|
||
Report `scripts/portfolio/run_portfolio.py`. Sleeve a date d'inizio diverse → outer-join con pesi
|
||
rinormalizzati (TP01/SKH01/GTAA dal 2019*, VRP dal 2021, XS dal 2024; *GTAA troncato all'era book).
|
||
⚠️ **ANCHOR-LUCK del book — MISURATO 2026-07-26 (la stima del 02/07 era ottimista su 3/3).**
|
||
I numeri canonici sono calcolati con TUTTI e cinque gli sleeve alla loro ancora canonica. Il
|
||
02/07 la correzione fu **stimata a occhio** sommando le fortune marginali (HOLD ~1.9-2.1, FULL
|
||
~2.0-2.2, "DD ~6% invariato"); il 26/07 è stata **misurata sullo spazio congiunto** (24×10×7×23×5
|
||
= 193.200 configurazioni, 2000 estrazioni uniformi indipendenti, `r0726_loo_deluck.py`):
|
||
| | canonico | pctl | **stima onesta = mediana** | banda p10-p90 |
|
||
|---|---|---|---|---|
|
||
| Sharpe FULL | +2.222 | 97.0° | **+1.95** | [1.81, 2.12] |
|
||
| Sharpe HOLD-OUT | +2.364 | **99.6°** | **+1.54** | [1.11, 1.91] |
|
||
| maxDD FULL | 6.07% | 12.0° | **6.85%** | [5.99, 7.94] |
|
||
**Solo 9 estrazioni su 2000 battono l'hold-out canonico.** Il book resta positivo e diversificato
|
||
a ogni ancora, ma **i numeri da citare sono 1.95 / 1.54 / 6.85%**, non i canonici.
|
||
⚠️ **Lezione: la somma delle fortune marginali NON è la mediana congiunta** — sbagliava di +0.82
|
||
di Sharpe hold-out, più di quasi tutti gli uplift per cui in questo progetto si è discusso se
|
||
ammettere uno sleeve. Quando serve la banda di un AGGREGATO si campiona lo spazio congiunto; gli
|
||
audit uno-sleeve-alla-volta (02/07, 03/07) restano validi per giudicare *quello* sleeve.
|
||
Diari `2026-07-02-anchor-audit-xs01-skh01.md` (originale) e `2026-07-26-loo-deluck.md` (misura).
|
||
- **SKH01-V2-DD "Skyhook" — DIVERSIFICATORE quasi-ortogonale (research)** — `src/strategies/skyhook.SKH01_V2_DD`,
|
||
sleeve `src/portfolio/sleeves._skyhook_returns`. Sistema dual-TF (segnale 690m / exec 230m) regime
|
||
(BuzVola/BuzVolume tipo-Chande) AND pattern (Donchian breakout), NON trend-follower, L/S. Vincitrice
|
||
di 2 onde multi-agente (la 2ª = DD-reduction): exit a **percentuale fissa ASIMMETRICA** (long sl4%/tp10%,
|
||
short sl2%/tp8% più stretto) → standalone **maxDD BTC 21% / ETH 27% (<30%)**, minFull +0.99, minHold
|
||
+1.26, causale (0/400), fee-surviving 0.40%RT. Marginal vs TP01 **ADDS** (corr 0.09, has_insample_edge,
|
||
robust_oos multicut 7/7, is_hedge=False); blend 0.75·TP01+0.25·SKH **hold-out 0.31→1.17**. Verificato
|
||
leak-free + 2 scettici. **CAVEAT:** equity daily-step (Sharpe lens), ETH DD margine sottile, book 230m
|
||
(costi ribilanciamento da verificare a deploy) → research win, forward-monitor. Diario `2026-06-23-skyhook.md`.
|
||
⚠️ **GRID TIMING-LUCK (2026-07-02, più forte di TP01):** i numeri headline sono sull'offset 0 della
|
||
griglia 230m/690m, al **93-98° pctl dei 23 offset a priori** — minHold +1.26, blend 1.17 e book
|
||
HOLD 2.44 sono il MASSIMO dei 23 (mediane: minHold +0.39, blend 0.72, book 1.96); spike, non
|
||
plateau (±30m crolla); P(spike)≈0.70. **Il gate DD<30% (criterio di selezione di V2-DD) fallisce
|
||
in 15/23 offset** (mediana ETH 29.2%). Regge de-luckato: uplift blend positivo a TUTTE le 23 fasi
|
||
(min +0.18, med +0.42) + corr 0.05-0.11 → ADDS sopravvive ridimensionato. **LIVE (SKH=25% del book
|
||
Deribit):** path reale cron orario + exit software → book 50/50 FULL 1.46→1.19 / HOLD 1.64→1.15 /
|
||
DD 18→25%; nei crash gap-through-stop reale (sl2% modellato → −11/−23% realizzato). Pesi/book
|
||
INVARIATI (ogni cambio passa weights_tilt_null). **Follow-up CHIUSO 2026-07-24**
|
||
(`scripts/research/r0724_skh_live_weight.py`): sul path live (lente hourly, 23 offset) il peso
|
||
ottimale de-luckato È 0.25 (argmax mediana-IS di banda, plateau 0.20-0.30; w=0.30 passa il gate
|
||
solo a off0 = ancora fortunata, fallisce a offset mediano) e la cadenza 230m vale ~+0.01/+0.02 Sh
|
||
mediano (rumore: il degrado live è il fill-al-livello, ~+0.35 Sh, che nessun cron recupera) →
|
||
**book 75/25 e cron orario CONFERMATI**; diario `2026-07-24-skh-live-weight.md`.
|
||
Script `scripts/research/r0702_anchor_skh01.py`; diario `2026-07-02-anchor-audit-xs01-skh01.md`.
|
||
- **VRP01 Options Short-Vol — DIVERSIFICATORE da FinanceOld/OptionsAgent** — `src/portfolio/sleeves._vrp_combo_returns`.
|
||
Put credit spread settimanale (vendi put -0.28, compra put -0.10) gated su IV-rank. Idee portate da
|
||
`../FinanceOld/OptionsAgent` (Bear Call Spread + gate d'ingresso). Migliora il lead VRP nudo
|
||
(options_vrp_lab): **(a) defined-risk** taglia la coda (worst-week -16.6%→-7.4%, DD 33%→14%);
|
||
**(b) gate IV-rank>0.30** = vendi vol solo ricca → ribalta HOLD-OUT da -0.25 a +0.28 (l'alpha è il
|
||
filtro di regime). Standalone **FULL Sh 1.10, HOLD 0.60, DD 12%**, positivo/piatto ogni anno (2022
|
||
crash incluso). Scorrelato a TP01 (~+0.01-0.07). **CAVEAT:** premio MODELLATO su DVOL ATM (skew non
|
||
esplicito), book a 1d, f di stress reale non catturato → LEAD robusto, non deploy pieno. Ricerca
|
||
`scripts/research/options_vrp_v2.py` (vs baseline `options_vrp_lab.py`). Test `tests/test_vrp_sleeve.py`.
|
||
⚠️ **ANCHOR-AUDIT CHIUSO + ondata "migliora e proteggi" (2026-07-03, 7 filoni + 2 lenti + scettico):
|
||
VRP01 NON è migliorabile e la protezione DD si compra SOLO con la size.** (a) **Anchor-luck (ciclo
|
||
settimanale, 7 fasi): PRIMO sleeve SENZA firma di luck** — la fase canonica è la PEGGIORE delle 7 su
|
||
FULL (1.09 = 7° pctl) e su DD (11.8% = 93° pctl), mediana su HOLD (0.59); spike bootstrap NEGATIVO →
|
||
i numeri di ammissione FULL 1.10/HOLD 0.60/DD 12% sono CONSERVATIVI, non gonfiati. Da ora si citano
|
||
con banda: ShFULL [1.09,1.83], ShHOLD [−0.03,1.11], DD [5.7,11.8%]; edge OOS f-dipendente (f=0.8 →
|
||
HOLD~0). **Con questo l'audit anchor è completo su 4/4 sleeve ancorati.** (b) Griglia 288 strutture:
|
||
nessuna batte VRP01 (DSR 0.000; metà griglia = 3ª occorrenza "0-perdite/Sharpe implausibile" dopo
|
||
CC01/ALB-A → gate `implausible_sharpe` alzato di priorità). (c) 4 overlay DD (exit-spike/SL-MTM/
|
||
ala-coda/cooldown): 4/4 REFUTED dal null de-levering — la protezione crash vive già nel gate
|
||
d'ingresso IV-rank. (d) Gate nuovi: 4° fallimento su 4 (l'alpha è il binario IV-rank>0.30). (e)
|
||
Sizing: 12% deploy ≈ 0.27 Kelly onesto (anti-rovina); ⚠️ NON confondere col 12% di PESO del book
|
||
(~0.014 Kelly, fattore 19x). (f) Gate term-structure VIX/VXV su SPX (ΔSh +0.90, DSR 0.992) =
|
||
**confound di modello al 100%** (la var del gate coincide con l'errore BS-flat vs term-structure) →
|
||
nuova regola: riprezzare term-structure-consistent prima di credere a un gate vol su strutture
|
||
BS-flat. Book/pesi INVARIATI. Diario `2026-07-03-vrp-improve-dd.md`; script `scripts/research/r0703_vrpimp_*.py` (7 file).
|
||
Diario `2026-06-20-financeold-analysis-vrp-v2.md`.
|
||
- **Universo Hyperliquid: ESPANDERLO NON aiuta XS01** (provato): 52-asset / top-liquidità dinamico /
|
||
trend-multi-asset → tutti peggiori (small-cap/memecoin diluiscono il momentum relativo; il trend
|
||
multi-asset è ridondante con TP01, corr 0.74). I margini su XS sono nella STRUTTURA DEL SEGNALE
|
||
(blend + gate), non nel numero di asset. I **51** parquet certificati restano per ricerca futura.
|
||
⚠️ Il test "52-asset = negativo" era in parte inquinato dal backfill sintetico (AXS 83%, ALGO/SAND
|
||
37% di barre vol=0) poi rimosso — vedi correzione estrazione 2026-06-20 sotto; resta comunque vero
|
||
che il long-tail diluisce XS01, ma il numero netto post-fix è 51.
|
||
- **Lead OPZIONI VRP (income short-vol) — quantificato, NON deploy** — `scripts/research/options_vrp_*.py`.
|
||
Vendita put settimanali che incassa il volatility risk premium (IV>RV), scorrelato al trend (~0.07).
|
||
Premio prezzato BS su DVOL reale (`fetch_dvol.py`) + calibrato su quote REALI cerbero-bite mainnet
|
||
(`options_vrp_calibrate.py`): **f reale ≈ 1.0** (non 1.29) → Sharpe ~0.71, DD 33%, coda severa
|
||
(settimane −15..−26% su LUNA/FTX). Diversificatore DEBOLE a premio reale, e short-vol da modello.
|
||
**Regola: niente short-vol da modello in deploy.** Rivalutare quando cerbero-bite cattura un crash
|
||
(per il f di stress reale). Diari `2026-06-19-options-vrp-lab` / `-eval-crypto-backtest-options`.
|
||
- **Edge deboli/scartati:** ML walk-forward BTC (Sh ~0.57), trend 1h L/S (~1.0), RV ETH/BTC (Sh 0.27,
|
||
regime-luck), calendar/seasonality (buy&hold travestito), volume/vol e momentum-reversal (negativi).
|
||
- **MORTO/confermato artefatto:** mean-reversion / fade (negativo anche a fee zero — la vecchia
|
||
libreria +201%/+1238% era contaminazione); trend 5m/15m (fee).
|
||
- **GAMMA SCALPING (long-vol) "scalping BTC/ETH con copertura in opzioni" — SCARTATO (2026-06-26)** —
|
||
`scripts/research/options_gamma_scalp.py`, test `tests/test_gamma_scalp.py`. È lo **specchio
|
||
esatto del VRP01** (long straddle ATM + delta-hedge: incassa **RV−IV**, dove VRP01 incassa IV−RV).
|
||
Perde **ogni anno, ogni variante, ogni frequenza** (Sharpe −3 a −6; nudo/cheap-gated/rich-skip;
|
||
rehedge 1d e 1h). Diagnostica strutturale: a 1d IV≈o>RV (BTC +4.9pp) → paghi il VRP; a 1h RV>IV
|
||
gross ma (a) gonfiata da microstruttura, (b) il rehedge orario paga **24× la fee di hedge** →
|
||
variante *peggiore* (−6). Marginale vs TP01 = **DILUTES**, non è nemmeno hedge (perde sia TP01-up
|
||
sia TP01-down). Muro eseguibilità: opzione BTC min $5.968 ≫ $600. Schiacciato tra due muri:
|
||
rehedge lento = premio, veloce = fee → **nessuna frequenza vince.** Regola gemella del VRP:
|
||
*niente long-vol scalp da modello in deploy*. Il VRP01 (lato short, gated) resta l'unico edge
|
||
opzioni — funziona perché sta sul lato *giusto* dello stesso premio. Diario `2026-06-26-gamma-scalp-options.md`.
|
||
- **CASH-AND-CARRY (basis trade) "CC01" — premio REALE, Sharpe ARTEFATTO, NON deployabile (2026-06-26)** —
|
||
`scripts/research/cash_carry_hl.py`, test `tests/test_cash_carry.py`. Diverso da FC01 (funding
|
||
cross-sectional, già scartato): qui delta-neutral long-spot/short-perp sullo *stesso* asset →
|
||
ritorno ≈ **+funding** (zero esposizione prezzo). Il premio di funding è **reale** (~+8-14%/anno
|
||
aggregato, positivo ogni anno in-sample, ortogonale a TP01 corr ~0.05). MA lo **Sharpe modellato
|
||
11-13 (DD 0.3%) è un ARTEFATTO**: il modello cattura solo il cashflow liscio del funding e i
|
||
rischi di coda sono **strutturalmente fuori dal dataset** — (1) storico funding dal 2023-05 →
|
||
**manca il 2022** (deleveraging, funding −, basis blow-out); (2) **procyclico** (carry +23% toro
|
||
2024 → +1.7% bear 2026, si comprime quando servirebbe); (3) liquidazione short/slippage non
|
||
modellati. Il mark-to-market della base (`premium` col → r=funding−Δpremium) sgonfia lo Sharpe
|
||
solo 13→11 → il basis-from-data NON è il rischio vero. Sharpe reale di un basis-trade ~1-3 con
|
||
code brusche. **NON eseguibile a $600** (spot+perp = 4-38 gambe, funding HL non Deribit) → STAT-MODE.
|
||
**LEAD da rivedere a scala (~20k+ e venue con funding eseguibile), non uno sleeve.** Sottoprodotto:
|
||
CC01 passa OGNI gate del marginal scorer → **punto cieco** (manca un gate "Sharpe implausibile →
|
||
rischio nascosto"; prossima indurita raccomandata). Diario `2026-06-26-cash-carry-hl.md`.
|
||
- **TP01 × DVOL vol-targeting — NON migliora (2026-06-26)** — `scripts/research/tp01_dvol_overlay.py`,
|
||
test `tests/test_tp01_dvol_overlay.py`. Angolo ESEGUIBILE (tocca il book live, non STAT-MODE):
|
||
usare il DVOL (vol implicita forward-looking) come denominatore del vol-target di TP01 invece
|
||
della vol realizzata. Su finestra comune 2021-2026: le varianti DVOL abbassano il DD (12.3%→9.2%)
|
||
ma anche Sharpe FULL (0.75→0.70) e CAGR (8%→6%). **Controllo decisivo:** il realized a target_vol
|
||
RIDOTTO (15%) eguaglia quel DD (9.4%) a Sharpe **più alto** (0.75) → il taglio di DD del DVOL è
|
||
solo **de-levering**, replicabile meglio con un semplice target_vol più basso. L'unico residuo
|
||
(hold-out +0.06) è single-window (storia DVOL <5 anni) → sotto la soglia multi-cut. Il gate
|
||
DVOL-spike de-risk è **ridondante col trend** (TP01 già flat nei crash, Δ 0.00). **Lezione: per meno
|
||
DD sul live la leva è `target_vol`, non un overlay DVOL** (20% resta canonico). Diario `2026-06-26-tp01-dvol-overlay.md`.
|
||
- **Filoni 2026-06-29 (1ª ondata) — tutti scartati/forward.** (A) **DVOL-DIREZIONALE** standalone BTC/ETH
|
||
(buy-the-fear / IV-RV come segnale di livello): l'unico edge è un **HEDGE** (is_hedge=True, paga solo
|
||
quando TP01 è debole), non alpha → earns_slot=False, forward-monitor come DD-dampener (diario
|
||
`2026-06-29-dvol-directional.md`). (B) **INTRADAY ERM** (efficiency-ratio regime momentum sub-daily):
|
||
**falso positivo da selezione-sull'hold-out** → SCARTATO (vedi gate SELECTION-ON-HOLDOUT;
|
||
`2026-06-29-intraday-regime.md`). (C) **XSEC-V2 NON-MOMENTUM** su HL (reversal/idio-reversal/low-vol/BAB):
|
||
solo LOWVOL 19-major regge standalone (FULL/HOLD 1.07) ma deflated-Sharpe 0.13 + storia 2.5a → **DEBOLE/
|
||
forward STAT-MODE** (`2026-06-29-xsec-v2-nonmom.md`). (D) **MACRO regime-gate** (equity/credito/oro/tassi →
|
||
de-risk crypto): **RIDONDANTE col trend** (corr→TP01 0.989; il gate lavora solo nel 2-3% dei giorni, TP01
|
||
già flat nei crash) → SCARTATO (`2026-06-29-macro-regime-gate.md`).
|
||
- **Sweep strategie a 5 thread (2026-06-29) — 0 nuovi sleeve, 1 LEAD che rompe 2 muri su 3.** Ricerca
|
||
parallela onesta su aree inesplorate (harness `altlib`+`xsec_v2_nonmom`, tutti i gate incl. il nuovo
|
||
`study_family_honest`): (1) low-risk cross-sectional, (2) momentum-structure vs XS01, (3) meta-allocazione
|
||
dinamica, (4) segnali ortogonali ETH/BTC, (5) 1-gamba a segnale. Esito: soffitto ~1.3 riconfermato; ogni
|
||
candidato ucciso dal gate giusto (deflated-Sharpe, is_hedge, selection-on-holdout, sostituzione-XS01,
|
||
multi-cut). Niente batte/diversifica XS01 (varianti = REDUNDANT); meta-allocazione < pesi fissi (i 4
|
||
sleeve già quasi-risk-parity); 1-gamba a segnale = TP01 travestito (trend) o hedge a DSR<0.95.
|
||
**LEAD forward-monitor:** **STATARB-RESID** (relative-MOMENTUM del residuo ETH−β·BTC, β OLS rolling, 2 gambe,
|
||
cella vincente **sgn=+1**: le dislocazioni ETH-vs-BTC CONTINUANO a 1d, la MR pura sgn=−1 perde) — primo
|
||
stream **insieme ortogonale (corr→book 0.027, β-mkt 0.013) ED eseguibile a $600** (haircut ~0, NON
|
||
STAT-MODE come XS01/opzioni): marginal ADDS, robust_oos, fee-survive 0.30%/gamba; resta sotto soglia solo
|
||
sull'**edge** (Sharpe 0.84, DSR 0.929 same-sign <0.95). **CABLATO in forward-monitor PAPER:**
|
||
`scripts/live/paper_statarb.py` (W=45/sgn=+1 congelati, doppio libro MODELED/REAL-$600), nel cron
|
||
giornaliero accanto a `paper_prevday`; test `tests/test_paper_statarb.py`. Se la finestra forward conferma
|
||
l'edge è *deployabile* (2 gambe BTC/ETH perp). Altri LEAD: IVOL (idio-vol XS, STAT-MODE), DVOLSPREAD
|
||
(storia DVOL corta). Diario `2026-06-29-strategy-search-5threads.md`. Script
|
||
`scripts/research/{xsec_v3_lowrisk,xsec_v3_momstruct,meta_allocation,orthogonal_signals,signal_inout_1leg}.py`.
|
||
- **Ondata 2026-07-01 (6 filoni multi-agente + scettico) — 0 edge nuovi dai filoni, 1 gate nuovo,
|
||
e 1 sleeve promosso DALL'ARCHIVIO (GTAA01, sotto nel bullet portafoglio).** Filoni su angoli non coperti dalle ondate precedenti: (1) **funding time-series**
|
||
BTC/ETH (posizionamento) = SCARTATO — FOLLOW è trend-beta ritardato, FADE shorta il toro, il gate è
|
||
TP01 travestito (DSR 0.215); **il filone funding è chiuso su 3 lati** (FC01 carry, price-clock, TS).
|
||
(2) **breadth/internals alt** (51 HL) = SCARTATO ma unico NON-ridondante col trend (corr→TP01 0.40);
|
||
muore su jackknife (uplift su 1 mese) + DSR 0.433 con ~8 mesi IS → **rivisitabile tra 1-2 anni di
|
||
storia HL nativa**. (3) **residual momentum XS** (β-hedged, 19 major) = REDUNDANT — cross-section la
|
||
residualizzazione è un no-op (lo z-score di XS01 rimuove già il mercato); l'edge resta solo nella
|
||
coppia ETH/BTC (STATARB-RESID). (4) **ri-ottimizzazione pesi + guardia-DD**: il candidato EW-STR
|
||
(TP30/XS25/VRP15/SKH30, HOLD 2.21→2.35) **refutato dallo scettico come selezione-sull'hold-out di 2°
|
||
ORDINE** — SKH01/XS01 furono ammessi/affinati *perché* forti su quell'hold-out; pre-2025 ΔSh −0.05,
|
||
finestre disgiunte −0.12/+0.06/+0.14, percentile 94-100° fra 500 tilt casuali ≈ firma best-of-15.
|
||
Guardia-DD 5%/0.5: inerte OOS (la diversificazione fa già il lavoro; solo circuit-breaker d'emergenza).
|
||
(5) **affinamento VRP01** = NON MIGLIORA (l'alpha è tutto nel gate binario IV-rank; gate TP01 =
|
||
trappola in-sample; **3° fallimento → filone "VRP dentro il modello" esaurito** fino a f di stress
|
||
reale). (6) **stagionalità cross-sectional HL** = morta allo step statistico (null permutato).
|
||
**GATE nuovo codificato: `weights_tilt_null`** in `src/portfolio/portfolio.py` (+ `combine_outer`
|
||
riusabile): ogni proposta di CAMBIO PESI si giudica vs il null dei tilt casuali cap-respecting —
|
||
gate_pass solo se delta_insample≥0 E percentile < firma best-of-k (necessario, non sufficiente);
|
||
test `tests/test_weights_tilt_null.py`. ⚠️ Lezione tecnica: `DatetimeIndex.view("int64")` su indici
|
||
tz-aware non-ns (pandas 2.x) → scala sbagliata → `merge_asof` broadcasta = **look-ahead che
|
||
`causality_ok` non vede**; usare epoca esplicita in ms (altlib verificato pulito). Diario di sintesi
|
||
`2026-07-01-strategy-wave-6threads.md` + 6 diari di filone; script `scripts/research/r0701_*.py`.
|
||
- **Ondata 2026-07-02 (TIMING + CRT, 8 filoni multi-agente + scettico) — 0 nuovi sleeve, 1 finding
|
||
strutturale (anchor timing-luck di TP01, vedi ⚠️ nel bullet TP01).** Goal: "strategie con timing
|
||
differenti". (1) **Event-clock bars** (volume/vol/range da 5m, TSMOM/Donchian/EWMA in tempo-informazione):
|
||
batte il wall-clock a pari segnale/frequenza solo in 4/45 coppie; cella best IS 1.45 → HOLD −0.46,
|
||
NEUTRAL (corr 0.74 = trend travestito) → SCARTATO: il clock non è dove vive l'edge. (2) **Calendario
|
||
scadenze Deribit** (expiry weekly/monthly/quarterly ven 08:00 UTC): 0/24 celle a Bonferroni; il drift
|
||
post-expiry monthly fallisce placebo-weekday e permutation e si INVERTE sul quarterly (dove l'OI massimo
|
||
dovrebbe amplificarlo); unico pattern robusto = gio→ven negativo, ma è day-of-week (SEA morta) a Sharpe
|
||
netto ~0 → SCARTATO. (3) **Anchor timing-luck TP01 + tranching**: finding confermato (dettagli nel
|
||
bullet TP01); tranching K=2/4 = sola riduzione della varianza della STIMA (ΔSharpe n.s., ΔDD ~0.5pt),
|
||
NO deploy a $600 (il min-order lo degenera in K=1; serve feed intraday fuori path certificato) —
|
||
rivalutare a ≥5-10k. **Audit d'ancora ESEGUITO su XS01 e SKH01 (stesso giorno): il finding si
|
||
replica su 3/3 sleeve ancorati** — vedi ⚠️ nei rispettivi bullet e la stima de-luckata del book
|
||
nel bullet portafoglio; diario `2026-07-02-anchor-audit-xs01-skh01.md`.
|
||
(4) **Clock lenti (2-7g) + bande isteresi**: fee drag di TP01 = ~0.4%/anno = tetto di ogni risparmio;
|
||
il lag costa più del risparmio (HOLD ensemble 0.34→0.11 da N=2 a 7); a $600 **il min-order $5 è GIÀ la
|
||
banda ottimale** (ordini −74% a costo ~0) → nessun cambio al book. (5) **Velocità trend
|
||
regime-condizionata** (pesi tra orizzonti 30/90/180g vs percentile vol RV/DVOL): pctl 0.71 vs null
|
||
pesi-statici-casuali = tilt-30d statico travestito (trappola EW-STR); pesi canonici 1/3 confermati →
|
||
SCARTATO. (6-8) **CRT "Candle Range Theory"** (sweep-and-reclaim 3 candele, mai coperto da MRV/MIC):
|
||
base 864 trial DSR 0.000 + anchor-flip + short "smart-money" negativo perfino in-sample; multi-TF
|
||
(4h→15m, 1h→5m, ~10k trade) expectancy negativa ovunque anche a fee zero, e **il ritest è informazione
|
||
negativa** (pattern con-ritest −40bps vs senza +52bps: aspettarlo seleziona i peggiori); contesto
|
||
(FVG/equal-highs/sessioni, 22 trial) non salva il fade, cella "Asia" = artefatto anchor-flip →
|
||
SCARTATO 3/3. Sottoprodotto: sugli stessi livelli prior-day **FOLLOW > FADE ogni anno 2019-26**
|
||
(conferma indipendente del lead prevday in forward-monitor). Lezione: il timing-luck d'ancora è
|
||
multiple-testing che il deflated-Sharpe NON conta (candidato gate futuro `anchor_luck_band`).
|
||
Diario `2026-07-02-timing-crt-wave.md`; script `scripts/research/r0702_*.py` (9 file).
|
||
- **Ondata 2026-07-02-bis ("video claims": Elliott 3 filoni + Albimarini 2 + capital scaling) — 0 nuovi
|
||
sleeve, 0 forward-monitor, 1 azione config pendente sul deposito.** Meccanizzazione onesta di claim da
|
||
video didattici: (1) **Elliott range-cycle** (onda1 compressa→onda3 ampia): rumore, 0/24 celle a
|
||
Bonferroni, nessuna cella weekly regge a tutte le 7 ancore → SCARTATO. (2) **Confluenza Fibonacci**:
|
||
vs null ingenui sembra buona (pctl 0.82-1.00), vs null **location-matched** (Fib±jitter: "0.618 vs
|
||
0.58?") crolla a 0.39-0.68 = l'apparente edge è la POSIZIONE dei livelli, non i numeri; confluenza
|
||
FAIL 4/4 → SCARTATO (il null location-matched è IL test per ogni claim su livelli "speciali").
|
||
(3) **Tecnica del canale Elliott**: Donchian travestito — non batte il Donchian a pari geometria
|
||
(corr 0.43-0.53), DSR 0.685, cella in-sample collassa in hold-out (1.40→−0.87), target 1.618 = caso
|
||
(5/6 celle), anchor-luck di nuovo (4h banda hold [0.35,1.54], 00:00 la migliore) → SCARTATO.
|
||
(4) **Albimarini double-diagonal** (short T + long T+1, deep OTM, via motore DVOL di VRP01): il
|
||
condor stessa-scadenza la batte a ogni f (la long T+1 = assicurazione di coda +12/33bps nel tail,
|
||
~1bps costo medio, non dominanza); senza gate IV-rank TUTTE le strutture perdono (3ª conferma:
|
||
l'alpha del VRP è il gate); su Deribit fee-negativa a QUALSIASI size (fee 8 gambe = 194-221% del
|
||
theta); celle deep-OTM 0-perdite/142 trade = 2° caso "Sharpe implausibile" dopo CC01 → gate
|
||
`implausible_sharpe` raccomandato con più forza. VRP01 resta superiore su tutta la banda skew →
|
||
nessun LEAD. (5) **Audit claims** (28 trade, 82% win, PF 5.16, "420%/anno"): consistente con ZERO
|
||
skill (P=20-45%; il 78.6% delle finestre 6-mesi 1996-2026 lo produce); replay con code reali =
|
||
rovina 1998/2002/2020 col sizing dichiarato; la diagonale lascia passare il 12-40% della perdita
|
||
naked. (6) **Capital scaling 600→2-5k** (`r0702_capital_scaling.py`): l'unico vincolo binding è
|
||
`max_notional_per_asset_usd=300` (a 5k il book live girerebbe al 49% del target) → **al deposito
|
||
alzare il cap a equity/2** ($1000/$1750/$2500 a 2k/3.5k/5k); min_order $5 da LASCIARE; tranching
|
||
K=2 non cablare (blocco feed intraday); opzioni ETH eseguibili da ~2.6k ma la regola no-short-vol-
|
||
da-modello non decade col capitale; XS01 ~20k confermata, CC01 fuori per struttura. Aspettativa
|
||
onesta col CAGR de-luckato (10-15%): 2k ≈ €0.6-0.8/g, 5k ≈ €1.4-2/g (€50/g resta ≈130k).
|
||
⚠️ Lezione pandas: `resample("7D", origin=...)` IGNORA origin (pandas 2.x, solo RuntimeWarning) →
|
||
bande d'ancora weekly finte; usare `"168h"`. Diario `2026-07-02-elliott-albimarini-capital.md`;
|
||
script `scripts/research/r0702_{ell_*,alb_*,capital_scaling}.py` (6 file).
|
||
- **Video-claim "CRT top-down multi-TF, 74% win rate" — SCARTATO (2026-07-07): il 74% è un KNOB, non
|
||
un edge.** `scripts/research/r0707_crt_topdown.py`. Metodo ICT/SMC top-down (H1 setup CRT → M15
|
||
struttura/FVG → M5 conferma → M1 entry) con uscita parziale-70/80%-a-1.5R + break-even + runner verso
|
||
prev-daily high/low. Il setup H1 CRT è **già triplo-refutato** (onda 2026-07-02: base DSR 0.000, MTF
|
||
expectancy neg. ovunque "il ritest è informazione negativa", contesto/FVG peggiora, fade<follow) →
|
||
qui testato l'UNICO angolo nuovo: la **gestione d'uscita** e il **claim 74%**. Su BTC/ETH certificati
|
||
(H1→5m/15m; M1 non nel feed): **WR reale 30–37%** a RR 1.5–2 (SOTTO il null gambler's-ruin 40% =
|
||
P(+1.5R prima di −1R)=1/(1+1.5) → il ritest tocca il target MENO di una moneta), **expectancy R
|
||
negativa a ogni schema/fee/finestra/asset** (−1.2…−3.3R netto). **Il 74% si fabbrica avvicinando il
|
||
target**: sweep rr1 0.5→2.0 mostra WR salire (51→32%) con expectancy R INVARIANTE (WR alto = target
|
||
vicino, non direzione). DSR 0.000 (48 trial); a **fee 0** expR −0.10/Sh −0.63 → **non è morte-per-fee,
|
||
l'edge lordo non c'è** (residuo = beta di trend dei time-exit); parziale+BE+runner = 3-4 ordini/trade,
|
||
alcuni sub-min-order a $600. **Regola candidata:** il win-rate di uno schema parziale+BE non è merito
|
||
(≈1/(1+rr1)); convertire ogni claim "WR X%" in **expectancy R netto fee** prima di crederci (helper
|
||
`winrate_is_a_knob()`). Diario `2026-07-07-crt-topdown-74winrate.md`. Book/pesi INVARIATI.
|
||
- **Ondata WEEKEND ven→lun (2026-07-17, 4 agenti) — SCARTATO 4/4; famiglia CALENDARIO dichiarata
|
||
SATURA; 1 fatto strutturale difensivo sul book.** Goal "strategie che lavorino solo ven→lun a
|
||
timing diversi". (1) **WK-DRIFT** (144 trial, griglia ore ven×lun × L/S × asset): il drift weekend
|
||
è **beta B&H a esposizione ridotta** — null weekday: Fri = 71° pctl, sotto Mon e Sun (nessuna
|
||
specialità); DSR 0.001; hold-out negativo **anche a fee zero**; boundary ARTIFACT-RISK. (2)
|
||
**WK-COND** (5 gate causali × 9 timing = 99 combo): 5/5 earns_slot=False, boundary ARTIFACT-RISK
|
||
5/5; il gate TSMOM è TP01-in-weekend (β 0.67, re-timing del trend); FOLLOW-del-venerdì si inverte
|
||
OOS (il lead prevday NON si trasferisce al weekend); l'unica variante HOLD+ (vol HIGH70) non è
|
||
selezionabile in-sample = trappola selection-on-holdout. (3) **WK-INTRA** (132 celle 1h/15m:
|
||
Donchian weekend, gap "CME" dom22, magnete-livelli-venerdì): ~50% celle LORDE positive = **moneta
|
||
simmetrica** (diagnostica nuova di famiglia-rumore); il claim CME-gap è morto **anche lordo**;
|
||
magnete del venerdì inesistente; FOLLOW>FADE riconfermato (3ª volta); a $600 l'esecuzione non è
|
||
il vincolo. (4) **WK-OVERLAY** (lato eseguibile): **il weekend porta il 38% del gross di TP01 nel
|
||
31% del tempo** (positivo ogni anno) → TP01-weekend-flat è **attivamente dannoso** (ΔSh −0.46,
|
||
P(danno)=1.000 bootstrap, banda 6/6 negativa, non-fee); half = de-levering pagato con fee
|
||
(k=0.755 lo domina); boost ×1.5 n.s. → **regola: non de-esporre il weekend del book; ogni futura
|
||
proposta "risk-off weekend" parte REFUTED** salvo null de-levering superato. Chiusura di famiglia:
|
||
SEA + expiry + event-clock + 375 trial weekend ⇒ su BTC/ETH nessun edge di calendario/finestra
|
||
oraria; riaprire solo con meccanismo non-calendario. Book/pesi INVARIATI. Diario
|
||
`2026-07-17-weekend-window.md`; script `scripts/research/r0717_wk_{drift,cond,intra,overlay}.py`.
|
||
- **Ondata 2026-07-25 (MAT01 + generalizzazione STATARB) — 0 sleeve nuovi, 1 DIFETTO DI DATO sul
|
||
libro live trovato e riparato.** Diario `2026-07-25-mat01-statarb-generalization.md`.
|
||
(1) **MAT01** (`r0725_mat01_multiasset_trend.py`, `r0725_mat01b_regime.py`): allargare il trend
|
||
difensivo da 6 a **18 ETF multi-asset-class** (i 12 su disco dal 22/06, mai usati per un trend)
|
||
a meccanismo GTAA CONGELATO = **SCARTATO**. MAT18 perde 3/4 finestre disgiunte; **a PARI VOL il
|
||
suo minor DD si inverte** (−20.6% vs −15.4%) → era solo de-levering (**3ª occorrenza del null
|
||
de-levering** dopo VRP-DD e TP01×DVOL: e' il primo test da fare su ogni claim "meno drawdown");
|
||
corr→crypto invariata (0.110 vs 0.116) → zero guadagno di diversificazione; book 2.22→2.19.
|
||
**Risultato positivo da conservare:** la curva d'ampiezza e' monotona (mediana OOS 0.44 a k=1 →
|
||
**0.80 a k=18**, DD −16.0%→−6.9%, satura a k≈10-12) — l'ampiezza E' un meccanismo reale, ma
|
||
**GTAA6 sta gia' al 95° pctl dei 6-subset casuali** (e non e' cherry-picked: contiene TLT, il
|
||
peggiore dei 18) → **niente piu' ampiezza da raccogliere su questo sleeve**.
|
||
(2) **STATARB-MULTI** (`r0725_statarb_multi.py`): meccanismo congelato (W=45, sgn=+1) su tutte le
|
||
**50 coppie alt/BTC** HL, out-of-pair-sample. REGGE: 82% Sharpe>0 (media 0.38), **0/50 degeneri**
|
||
(mono 53% → non e' la statica short-alt travestita), perm p<0.05 nel 18% (atteso 5%), paniere
|
||
Sharpe 0.82 / DD −6.0% / corr XS01 0.207. **E ETH/BTC e' al rango 22/50 (58° pctl): la coppia
|
||
scopritrice NON e' un outlier** → per il gate 27/09 l'ipotesi "fortuna di una coppia" e' refutata.
|
||
NON e' uno sleeve: ampiezza **effettiva ~4.5** (corr media 0.204, gamba BTC condivisa), paniere
|
||
**IC95% [−0.12,1.72], t 1.31** (non distinguibile da zero a 2.6 anni), uplift −0.11 vs il null
|
||
a priori "sempre short alt vs BTC", 51 gambe = STAT-MODE. ⚠ Errore di metodo corretto in-sessione:
|
||
il primo null statico usava `sign(mean(segnale))` sull'intero campione = **look-ahead**; rifatto
|
||
causale (media espandente) + a priori.
|
||
(3) **STATARB-EQ** (`r0725_statarb_eq.py`): stesso meccanismo su **12 coppie ETF a priori,
|
||
28.5 anni, ampiezza effettiva 9.9** = **SCARTATO**. Paniere Sharpe **−1.00** (IC95% [−1.36,−0.64],
|
||
t −5.33), negativo in **4/4 decadi**, 0% coppie a perm p<0.05. **Ma la lettura sta nel LORDO
|
||
(−0.17, non −1.00): due terzi sono drag di turnover (0.40/g)** → **non esiste strategia specchio**
|
||
(sgn=−1 sarebbe lorda +0.17, netta −0.16). Il segno lordo dice che **sulle azioni il residuo
|
||
REVERTE debolmente mentre sul crypto CONTINUA** → il meccanismo e' plausibilmente crypto-specifico.
|
||
Inferenza onesta: non prova che il crypto sia falso, ma il gate 27/09 **non puo' appoggiarsi**
|
||
all'argomento "fenomeno universale".
|
||
(4) **Addendum PRE-REGISTRATO al gate STATARB** (registrato a forward-day 26/90, 64g prima della
|
||
decisione): `r0724_statarb_deploy_gate.py` riporta ora anche lo Sharpe della **statica sempre-short
|
||
a pari vol-target sulla stessa finestra**. **Soglie del 24/07 NON toccate** (diagnostica non
|
||
binding; renderla binding e' decisione dell'operatore). Lettura odierna (26 barre): STATARB +5.70
|
||
vs benchmark **−4.98**, e la posizione corrente e' LONG lo spread = opposta alla statica → la
|
||
finestra forward non e' spiegata dal beta di regime.
|
||
- ✅ **XSR01 "Cross-Sectional Residual" — CANDIDATO NUOVO in forward-monitor (2026-07-25).**
|
||
`scripts/live/paper_xsr.py`; scoperta `r0725_statarb_basket_gate.py`, scettico
|
||
`r0725_statarb_demean_skeptic.py`, gate `r0725_xsr_deploy_gate.py`, test `tests/test_paper_xsr.py`.
|
||
**Cos'e':** il meccanismo congelato di STATARB-RESID (W=45, sgn=+1, residuo OLS causale su BTC,
|
||
z-score, tanh, vol-target 20%) applicato ai **50 alt HL**, con posizioni **DEMEANATE
|
||
cross-sezionalmente** ogni giorno. Il demeaning annulla ALGEBRICAMENTE la gamba BTC comune
|
||
(`sum(p_i−p̄)(r_i−r_btc) = sum(p_i−p̄)r_i`) → non e' un paniere di coppie ma una **strategia
|
||
cross-sectional dollar-neutral**, e l'ampiezza effettiva passa da **4.5 a 37.4**.
|
||
**Numeri (2.6 anni):** Sharpe netta **1.82** (lorda 2.70), maxDD **−2.6%**, vol 2.3%, ret 4.2%/a.
|
||
**Gate superati:** marginale **ADDS** (robust_oos + beats_noise_null + non-hedge +
|
||
has_insample_edge); **deflated-Sharpe 0.985 PASS**; **corr ~0 a TUTTI e 5 gli sleeve** (TP01 0.060,
|
||
XS01 −0.019, VRP01 −0.001, SKH01 0.001, GTAA01 0.071); book a w=15% HOLD 2.36→**2.51**, DD invariato.
|
||
**Scettico superato:** 3 null **a fee-neutrale** (permutazione cross-sezionale / casuale /
|
||
temporale a blocchi) centrati a ~0.01, candidato lordo 2.70 **sopra il massimo di 300 estrazioni**
|
||
(p<0.004); **lag 1.82/1.19/0.81/0.51** a +0/1/2/3g = decadimento dolce di segnale lento, NON
|
||
firma di look-ahead; non ridondante con XS-momentum semplice (corr 0.17-0.29).
|
||
**NON nel book, 3 motivi dichiarati:** (a) storia 2.6a monoregime e **crescente** (Sh 2024 1.03 /
|
||
2025 1.98 / 2026 3.11) → l'edge e' recente; (b) **`weights_tilt_null` FALLITO** (gate_pass=False a
|
||
10% e 15%, delta_insample −0.004/−0.007: effetto della storia corta, ma un gate fallito resta
|
||
fallito); (c) **margine di costo sottile** — 1.82 a 0.05%/gamba, **0.93 a 0.10%, NEGATIVA a 0.20%**,
|
||
con turnover 38.5% del lordo/g su 50 alt anche illiquidi e **slippage NON modellato** (rischio #1).
|
||
**Eseguibilita':** ticket/gamba $1.73 a $600 (**sotto min-order $5 → STAT-MODE oggi**), $5.76 a
|
||
$2000, **$14.41 a $5000** → diventa reale a **~$5k**, non ai ~$20k di XS01.
|
||
**Gate pre-registrato 2026-10-23** (forward-day 0): deploy solo se Sharpe≥1.0 **E** haircut di
|
||
eseguibilita' a $5000 ≤40% (se l'haircut sfonda → **RITIRO a prescindere dallo Sharpe**), poi
|
||
weights_tilt_null e capitale ≥$5k. Monitor in `cron_daily.sh`, 3 libri (MODELED $2000 / REAL $600 /
|
||
REAL $5000). ⚠ Lezione: XSR01 **non e' nato da un'idea nuova ma dalla DIAGNOSI di un fallimento**
|
||
(ampiezza effettiva 4.5 → c'e' un fattore comune da togliere); e i suoi null vanno confrontati
|
||
**a fee zero**, perche' permutare un segnale ne fa esplodere il turnover e il null perderebbe per
|
||
costo invece che per assenza di informazione (p-value trionfale e falso).
|
||
- ⚠ **SPLIT NON AGGIUSTATI nel feed equity — difetto sul LIBRO LIVE, riparato (2026-07-25).**
|
||
`data/raw/eq_iwm_1d.parquet` ed `eq_efa_1d.parquet` avevano uno split non aggiustato il
|
||
**2005-06-09** (IWM 2:1 = −49.5%; EFA 3:1 = −66.5%); IB `ADJUSTED_LAST` non li aveva aggiustati.
|
||
**La certificazione non li vedeva per un punto cieco strutturale:** l'unica guardia era
|
||
`maxret > 50% → SPIKE?` e uno split 2:1 fa **esattamente −50%** → IWM passava a 49.5% con status
|
||
OK. **IWM e' una delle 6 gambe di GTAA01 in produzione.** Impatto: GTAA6 FULL Sh 0.61→**0.64**,
|
||
IS 0.49→**0.54**, OOS 2015+ e maxDD **INVARIATI** (artefatto nel 2005, fuori hold-out) → il
|
||
difetto SOTTOSTIMAVA lo sleeve, **nessuna decisione presa va rivista**. Discriminante
|
||
split-vs-crollo (riusabile): **non il rapporto** (SLV 2026-01-30 ha rapporto 1.3994, a 4bps da
|
||
1.4, ma e' un crollo vero: GLD −10.3% lo stesso giorno) ma il **RANGE INTRADAY** — lo split apre
|
||
gia' al nuovo livello con range normale (IWM: open 47.00, range 1.7%), il crollo si muove DENTRO
|
||
la barra (SLV: range 33%). Modulo `src/data/eq_splits.py` (`detect_unadjusted_splits` a 3
|
||
condizioni congiunte + `repair_splits` componibile), riparazione **in lettura** in
|
||
`src/portfolio/gtaa.py::_close` e `scripts/research/eqlib.py::load_eq`, status
|
||
**`SPLIT-NON-AGG`** in `fetch_ib_equities.certify()`, test `tests/test_eq_splits.py` (8 casi).
|
||
**Regola nuova: ogni soglia di certificazione tarata su un valore tondo va controllata contro il
|
||
difetto che genera esattamente quel valore** (una soglia a 50% non puo' sorvegliare gli split 2:1).
|
||
- ⚠ **RENDITA / CURVA CAPITALE (2026-07-25, 2° filone del giorno) — il muro del 24/07 era ottimista
|
||
2-4x, e 1 DIFETTO DI ESEGUIBILITA' su GTAA01.** Script `r0725_capcurve.py` + `r0725_prop_config.py`,
|
||
test `tests/test_capcurve.py` (10 casi); diario `2026-07-25-rendita-capcurve-prop.md`. Book/pesi/cron
|
||
**INVARIATI**.
|
||
(1) **GTAA01 non e' eseguibile come codificato.** `gtaa.py` modella 2bps proporzionali e lo sleeve e'
|
||
documentato "switch mensile/basso turnover": FALSO — il vol-target e' **continuo giornaliero su 6
|
||
gambe**, e IB ha un **pavimento FISSO** `min(max($0.35, $0.0035/az), 1% valore)` per ordine =
|
||
~$530/anno indipendenti dal capitale. A $600: **CAGR −3.5% / Sh −0.55**; negativo fino a ~$3k;
|
||
a $50k 0.59. **La banda lo salva**: plateau robusto **weekly x banda $25-100** → Sh 0.45-0.64 a
|
||
ogni capitale (a $600: Sh 0.52 / CAGR 3.0%). ⚠ **Correzione a un errore MIO:** la prima stesura
|
||
citava il modello vecchio a "0.77/5.5%" — era un **artefatto di annualizzazione** (metricavo la
|
||
serie GTAA grezza a ~252 barre/anno con `metrics()` che annualizza a 365 → Sharpe ×1.20, CAGR
|
||
×1.45). Valore vero del modello vecchio: **0.64/3.8%**. **Quindi il difetto NON e' "sovrastimava
|
||
di 0.13": alla taglia grande il modello vecchio era GIUSTO (0.64 vs 0.59-0.66 reali). Il difetto
|
||
e' che era CIECO AL CAPITALE** — dava 0.64 sia a $50k sia a $600, dove la realta' e' −0.55.
|
||
**Lezione: una serie su giorni di borsa (~252/anno) non si passa a `metrics()` (che annualizza a
|
||
365) senza `to_daily()` — il Sharpe esce ×1.20 e il CAGR ×1.45.**
|
||
✅ **FIX CABLATO** (stessa sessione, `src/portfolio/gtaa.py`): costo IB reale (`ib_commission`),
|
||
esecuzione a **banda+cadenza** (settimanale, $50/gamba), `gtaa_returns(capital=...)` capital-aware,
|
||
soglia `GTAA_MIN_CAPITAL=$3.000` + `gtaa_is_deployable`, e **`gtaa_rebalance_plan(held, capital)`**
|
||
per l'esecutore (salta le gambe sotto banda). `sleeves.py` dichiara il capitale assunto
|
||
(`GTAA_DEFAULT_CAPITAL=$10.000` ≈ book $50k al peso 20%). **Impatto book misurato: FULL 2.22→2.22,
|
||
HOLD 2.36→2.38, DD 6.2→6.0%** = trascurabile alla taglia assunta; il fix conta per il **DEPLOY**
|
||
(a $600-2k: da −3.5%/anno a +3.0%/anno). Pesi INVARIATI. Test `tests/test_gtaa_sleeve.py` (+4). **REGOLA NUOVA: il costo di un venue va modellato nella sua
|
||
FORMA (fisso vs proporzionale), non solo nel livello** — due venue a pari "costo medio" danno esiti
|
||
OPPOSTI al variare del capitale (il pavimento fisso e' una tassa regressiva). Controprova: su Deribit
|
||
(proporzionale, senza pavimento) lo Sharpe realistico di TP01 = modellato da ~$500 in su → conferma
|
||
indipendente di "a $600 il min-order $5 e' gia' la banda ottimale".
|
||
(2) **La rendita NON e' `capitale x CAGR`.** Il 24/07 calcolava capitale = target/CAGR (€122k a CAGR
|
||
15%), ignorando il rischio di sequenza. Bootstrap a blocchi sui ritorni REALI (SKH01 su **path live**):
|
||
rendita **perpetua** (= prelievo con P(cap a 20a >= cap iniziale) >= 90%) del book de-luckato ×0.6 =
|
||
**5.98% → $497k**; SWR-20a 7.31% → $406k; lente modellata 13.57% → $219k. ~~Il muro vero e' una
|
||
BANDA $232k-$497k, stima centrale ~$300-400k.~~
|
||
⚠️ **AGGIORNATO 2026-07-26 — il ×0.6 era MISURATO troppo severo del 31-34% → il muro scende
|
||
del ~45%.** Il fattore d'ancora onesto sul drift e' **×0.89** per il book live (misurato, non a
|
||
occhio) e ogni componente del path live e' non-negativa (bullet in fondo). Ricalcolo con la
|
||
STESSA macchineria (`r0726_capwall_refresh.py`): **perpetua 6.00% → 10.91%, muro $494.758 →
|
||
$272.061** a leva 1.0 (a leva 1.5: $366k → $200k). Il ×0.89 e' un **limite inferiore** del
|
||
fattore, quindi il muro vero sta fra la riga ×0.89 e la riga ×1.00 ($233k). **La conclusione
|
||
STRUTTURALE non cambia:** $272k restano **~453× il conto di oggi** → i €600 come CAPITALE
|
||
restano refutati, come BIGLIETTO (prop) no. Rendita a $600: €0.12/g → **€0.18/g** (centesimi:
|
||
il fattore conta per il MURO e le soglie prop, non per il conto attuale).
|
||
Cio' che NON dipende dalla lente: **la rendita perpetua vale ~45-55% del CAGR**, quindi ogni muro
|
||
calcolato come `target/CAGR` sbaglia di un fattore ~2.
|
||
**TRAIETTORIA da $600, ricalcolata col fattore corretto (26/07).** Il fattore agisce **due
|
||
volte**: alza il drift (si accumula prima) E abbassa il bersaglio (serve meno capitale), e i due
|
||
effetti pesano quasi uguale. Mediana degli anni per toccare il capitale-rendita:
|
||
| dep./mese | ×0.60 muro $495k (25/07) | ×0.89 muro $495k (solo drift) | ×0.89 muro $272k (26/07) |
|
||
|---|---|---|---|
|
||
| €0 | mai | mai | **mai** |
|
||
| €250 | 22.4a (8% entro 20a) | 19.6a (53%) | **16.2a (91%)** |
|
||
| €500 | 19.6a (48%) | 15.7a (94%) | **12.4a (100%)** |
|
||
| €1000 | 14.8a (95%) | 12.0a (100%) | **9.0a (100%)** |
|
||
| €2000 | 10.0a (100%) | 8.5a (100%) | **6.0a (100%)** |
|
||
✅ La colonna ×0.60 **riproduce esattamente** i numeri del 25/07 (19.6a / 14.8a) = validazione
|
||
indipendente della replica. ⚠️ **Cio' che NON cambia col fattore: senza depositi il
|
||
capitale-rendita non si raggiunge mai** (0% dei path a 20 anni a OGNI fattore) — l'accumulo
|
||
viene dai versamenti, non dal rendimento; e la mediana e' una MEDIANA (meta' dei path arriva
|
||
dopo, una quota non arriva affatto).
|
||
**QUANTO VERSARE PER UN ORIZZONTE DATO** (bersaglio $272k, ×0.89; "arrivarci in N anni" non e'
|
||
un numero: dipende dalla confidenza):
|
||
| orizzonte | P=50% | P=75% | P=90% | P=95% | totale versato @P=90% |
|
||
|---|---|---|---|---|---|
|
||
| **10 anni** | €806/m | €995/m | **€1.178/m** | €1.299/m | **$155.923** |
|
||
| 15 anni | €313/m | €408/m | €509/m | €583/m | $101.643 |
|
||
| 20 anni | €129/m | €180/m | €237/m | €280/m | $63.406 |
|
||
⚠️ **Comprimere l'orizzonte da 20 a 10 anni costa 2.5× al mese E 2.5× in totale**: a 10 anni
|
||
versi $155k per arrivare a $272k (il rendimento fa il 43%), a 20 anni ne versi $63k (il
|
||
rendimento fa il **77%**). **A orizzonti corti non fai lavorare la strategia, COMPRI il
|
||
capitale coi bonifici** — il confronto onesto e' sempre `totale versato` vs bersaglio.
|
||
Drill-down €250/m (5000 path): traguardo p10 13.4a / **mediana 16.2a** / p90 19.7a;
|
||
P(entro 15a) **31%** → P(entro 20a) **92%** (la curva non da' segnali per un decennio e poi si
|
||
muove tutta insieme: chi giudica al 5° anno giudica nel punto peggiore); al traguardo hai
|
||
versato ~$54k su $272k → **80% viene dal rendimento**. ⚠️ Bug catturato in sessione: il
|
||
contatore `paid` si congelava al traguardo mentre `cap` continuava a ricevere i depositi →
|
||
rapporto capitale/versato gonfiato (46× invece di 25× a 30 anni); test di regressione cablato.
|
||
(3) **Diversificare NON crea reddito a pari nozionale — libera BUDGET DI RISCHIO.** Per tier:
|
||
iso-nozionale 2 sleeve 5.98% → 4 sleeve 6.35% (nulla, il diversificatore a basso CAGR toglie vol e
|
||
ritorno insieme); a **ISO-RISCHIO** (vol 15%) 7.51%/$395k → **9.25%/$321k (−19% di muro)**.
|
||
**REGOLA: un diversificatore a basso CAGR si giudica a ISO-RISCHIO, mai a iso-nozionale** (e' il
|
||
null de-levering al contrario). L'ipotesi "piu' capitale → piu' sleeve → CAGR super-lineare" e'
|
||
**REFUTATA nella forma forte**: la curva Sharpe del book eseguibile e' PIATTA da $600 a $200k.
|
||
(4) ✅ **ASIMMETRIA CAPITALE-PROPRIO vs FUNDED (risultato strategico).** Il 24/07 valuto' il fronte
|
||
prop **solo col book a 2 sleeve**; ma su un conto funded il capitale e' $100k → **gli sleeve STAT-MODE
|
||
per taglia (XS01, ~$20k) diventano eseguibili**, e le regole prop passano sul **DRAWDOWN, non sul
|
||
CAGR**. Finestra comune 2024+, de-luck, crypto-only: P(pass) HYRO 1.0x **44.4%→54.7%**, FTMO 1.5x
|
||
**51.9%→70.0%**; **funded HYRO 1.0x P(vivo 1a) 18.9%→57.6% (3x)**, FTMO 1.0x 58.8%→**92.0%**,
|
||
E[payout] $8.7k→$9.3k (~€15.7/g atteso). **Si RIBALTA la raccomandazione "funded a 0.75x"**: col book
|
||
diversificato 1.0x e' sostenibile. **In una riga: sul capitale proprio diversificare non aumenta il
|
||
reddito; su un conto funded si', perche' li' il vincolo binding e' la regola di DD, non il capitale
|
||
→ gli sleeve "inutili a $600" sono gli asset di maggior valore sull'unico canale che scala.**
|
||
⚠ CAVEAT: MC **close-only** (C-bis 24/07: i wick tagliano 6-37pp) → livelli assoluti = TETTO, il
|
||
DELTA e' la misura onesta ed e' conservativo (B ha vol minore); la finestra comune 2024+ e' quella in
|
||
cui XS01 e' stato scoperto/affinato → la TAGLIA del guadagno e' ottimista (finestra piena: 56.9%→58.5%),
|
||
il MECCANISMO (corr bassa → meno DD → piu' sopravvivenza sotto vincolo di DD) e' robusto.
|
||
(5) ✅ **LA VIA: i 600 euro come BIGLIETTO, e il problema della correlazione fra conti**
|
||
(`r0725_prop_ladder.py`). I €600 come capitale sono refutati; come **biglietto** no: si compra
|
||
un'eval, il funded moltiplica il NOZIONALE senza possedere capitale, i payout comprano altri
|
||
biglietti. Il 24/07 si fermava a UN conto (cap $200k/firm → ~€15-30/g); **50 EUR/g richiede piu'
|
||
conti**, e li' il problema mai studiato: **N conti sullo STESSO book bustano INSIEME** (corr 1.0)
|
||
→ la diversificazione fra conti e' illusoria salvo **sleeve diversi su conti diversi**. E' un
|
||
problema di portafoglio sotto **barriera di rovina PER-CONTO**. Sim 36 mesi, €600, max 6 conti,
|
||
2 firm, regole vere, payout mensile prelevato subito, fisco 33%, **morte-firm 10%/anno**,
|
||
bootstrap CONGIUNTO (corr reali). **Vince il MISTO, non gli estremi** (close-only, leva 1.0x):
|
||
MISTO mediana €10.70/g, P(≥50/g) 20.7%, P(zero) 33.4% > CONC-DIV 5.70/17.8%/33.4% > SPARSO
|
||
0.00/16.8%/**66.0%** > **CONC-2SL (= il book live attuale) 0.00/13.1%/55.6% = la PEGGIORE**.
|
||
Logica: ogni conto serve Sharpe per sopravvivere alla PROPRIA barriera (uccide SPARSO), ma i
|
||
conti servono decorrelati fra loro (penalizza CONC). **Con lente INTRADAY (wick)** tutto crolla:
|
||
P(≥50/g) 1.6-2.5%, P(zero) 78-90%. ⚠ Il mio wick e' un **PAVIMENTO**: gap estratto INDIPENDENTE
|
||
dal rendimento del giorno → breach spuri → **follow-up dichiarato, poi CHIUSO lo stesso giorno
|
||
(bullet successivo): la stima onesta e' P(≥50/g) ~6%, P(zero) 52-65%.** Il confronto fra POLITICHE
|
||
e' robusto (stessa lente per tutte) — **verificato a posteriori sulla lente accoppiata: l'ordine
|
||
MISTO ≥ CONC-DIV > CONC-2SL ≈ SPARSO regge a tutte e 3 le lenti** → **se si apre il fronte prop,
|
||
NON mandarci il book live attuale**.
|
||
(6) **ADDENDUM "e se metto 10K su IB?"** (`r0725_ib10k.py`): allocazione fra venue, non domanda su
|
||
GTAA01. Deribit = **motore** (CAGR ~11% de-luck), IB/GTAA01 = **diversificatore** (CAGR ~3.9%).
|
||
A $11.5k totali: 0% su IB → **€2.16/g**; 50% → €1.54/g (Sharpe migliore 1.13, DD 15.3→11.2%);
|
||
**94% (= i 10k su IB) → €0.93/g = REDDITO PIU' CHE DIMEZZATO**. La via d'uscita (levare per
|
||
convertire lo Sharpe in reddito) e' **chiusa dai costi**: su ETF a IB con €10k c'e' Reg-T **2x max**
|
||
(portfolio margin da ~$110k) e il margine costa **~5.5%/anno** → contando il finanziamento vince
|
||
**tutto-Deribit a 1.33x** (rendita €1.33/g vs €0.92/g a 50/50). **REGOLA: l'argomento iso-rischio
|
||
(punto 3) vale solo se la leva e' (a) disponibile e (b) a costo < uplift — su un retail da €10k su
|
||
ETF non lo e'.** Confronto che ridimensiona GTAA01: €10k nello sleeve = €0.93/g con maxDD 10.5%,
|
||
gli stessi €10k FERMI a ~2% = €0.54/g con maxDD ~0% → **premio ~€0.50/g pagato con un DD del 10%**.
|
||
Raccomandazione: i depositi vanno su **Deribit**; al massimo **25% su IB** (costa ~€0.08/g di
|
||
rendita, taglia il maxDD 15.3→12.0%, unico split che regge coi costi). ⚠ Il confronto FAVORISCE il
|
||
crypto per costruzione (7 anni con 2 bull vs 30 anni di GTAA); tassi e aliquote (26%/33%) sono
|
||
assunzioni dichiarate, da confermare col commercialista (non un parere fiscale).
|
||
(7) **HYROTRADER nello specifico** (`r0725_hyro.py`): la firm meglio classificata per questo book
|
||
(API reale da funded, nessun limite di tempo, **weekend consentito** — e il weekend porta il 38%
|
||
del gross di TP01). **Ipotesi REFUTATA: la regola di consistency 40% NON morde** (costo ≈0pp a
|
||
ogni leva/lente) perche' il book accumula il 10% in 130-300 giorni → nessun giorno si avvicina al
|
||
40% del cumulato; ⚠ prima di dichiararlo ho dovuto **provare che il controllo funziona** (un
|
||
"costo 0" puo' essere un bug): su un book con profitto concentrato in 1-2 giorni la regola porta
|
||
P(pass) da >90% a <5% (test cablato). **Il vincolo vero e' il maxDD 6% STATICO**: config A (book
|
||
live) ha maxDD 9.5% > 6% = strutturalmente incompatibile a leva piena — intraday a 1.0x
|
||
sopravvive l'**1.4%**; config B (+XS01) ha maxDD 6.2%, Sharpe 1.13. ~~**Funded consigliato: config B
|
||
a 0.50x**~~ → **CORRETTO a 0.75x dalla lente accoppiata (bullet successivo)**: il 0.50x era scelto
|
||
perche' il wick indipendente dava a 0.75x P(vivo) 55%; la lente onesta da' **76%**, e 0.75x
|
||
**massimizza il payout atteso su 3 anni** ($2.674 vs $1.230 a 0.50x e $1.992 a 1.00x). L'argomento
|
||
"la sopravvivenza COMPONE su piu' anni" resta valido: si sposta il punto in cui morde.
|
||
EV del biglietto $100k **positivo in entrambe le lenti** (+$6.789
|
||
close-only, +$1.166 intraday), ma ~69% di perdere la fee nella lente pessimista. Cap $200k/trader
|
||
⇒ ~€15-30/g max → per €50/g servono piu' firm (punto 5). ✅ Discrepanza col 24/07 (P(vivo) A@0.75x
|
||
58% vs 10% mio) **RISOLTA: non era la finestra, era la lente** — sulla stessa finestra piena la
|
||
lente accoppiata da' **63.2%** vs il 58% del 24/07 (accordo entro 5pp, implementazioni separate).
|
||
⚠ Bug catturato in sessione: base di prelievo funded aggiornata giornalmente come HWM mobile →
|
||
guadagno al checkpoint ≈ 0 → **payout $230/anno invece di ~$7.000**; regole vere = max-loss STATICO
|
||
dal saldo iniziale + base ripristinata dopo il prelievo. Test di regressione cablato.
|
||
- ✅ **LENTE WICK ACCOPPIATA (2026-07-25, follow-up del bullet precedente — CHIUSO).** Script
|
||
`r0725_prop_coupled.py`, test `tests/test_prop_coupled.py` (13 casi), diario
|
||
`2026-07-25-prop-wick-accoppiato.md`. Book/pesi/cron **INVARIATI**. Generalizza il recon MTM di
|
||
`r0724_goal50_intraday_mc.py`: (a) sleeve TP01/SKH01 **separati** a risoluzione oraria → il minimo
|
||
intraday si compone ESATTO per QUALSIASI vettore di pesi (prima erano cablati 75/25); (b) **XS01
|
||
accoppiato** dagli OHLC giornalieri HL (4 checkpoint, ordine condiviso avverso; recon = sleeve
|
||
ufficiale a `max|Δ|=0.0`).
|
||
⚠️ **IL FINDING: la CALIBRAZIONE del wick era giusta, l'errore era l'INDIPENDENZA.** Le marginali
|
||
coincidono quasi (p50 −0.17pp **identico**, p90 −1.03 vs −0.90, p99 −2.70 vs −3.50) — sbagliava
|
||
**su quali giorni** cadono i tuffi. E la dipendenza va nel **verso inatteso**: il gap e' ~**3× piu'
|
||
profondo nei giorni che finiscono BENE** (−1.58pp nel decile migliore vs −0.48pp nel peggiore),
|
||
perche' un giorno brutto scende tutto il giorno e **chiude sul minimo** (`m==R` nel **26%** dei
|
||
giorni). Il breach si valuta sul minimo → l'estrazione indipendente carica i giorni brutti con la
|
||
coda dei giorni buoni e **raddoppia i breach da daily-loss (2.0-2.9×, misurato sui giorni storici)**.
|
||
**`close-only` non e' conservativa, e' CIECA**: 0.00% di breach da daily-loss su OGNI configurazione
|
||
(la regola non scatta mai sulle chiusure) → usarla come controllo, mai come stima.
|
||
**Verifiche (un "nessuna differenza" va provato):** (1) **1h vs 5m** sulla gamba TP01 = identici
|
||
(p99 −3.06 vs −3.14pp) → **il caveat di risoluzione portato avanti dal 24/07 e' quantificato e
|
||
trascurabile**, l'ora cattura gia' il minimo del giorno; (2) riconciliazione col 24/07 (sopra);
|
||
(3) **bound severo su XS01** (ogni gamba al proprio peggio insieme): config B resta sopra config A
|
||
(P(vivo) 57.6% vs 39.4%) → la conclusione non dipende dalla convenzione.
|
||
**Decisioni:** funded **0.75x** (non 0.50x, vedi sopra); scala di conti **P(≥50/g) ~5.6-6.5%** in
|
||
3 anni (non 1.6-2.5% ne' 20.7%) con **P(zero) 52% a 0.75x / 65% a 1.00x**, e **P(≥10/g) massima a
|
||
0.75x (29.7%)** = stesso ottimo di leva del conto singolo. **Ordine fra politiche INVARIATO a
|
||
tutte e 3 le lenti.** Verdetto ristretto: **€600→€50/g ≈ 6% in 3 anni, P(perdere i €600) ≈ 52-65%**
|
||
— resta coda destra, ma con probabilita' conoscibile invece di una banda di un ordine di grandezza.
|
||
**REGOLA NUOVA: un modello di rischio intraday NON si valida sulla marginale del wick ma sul suo
|
||
ACCOPPIAMENTO al rendimento del giorno** — qui un test "i percentili coincidono" sarebbe PASSATO
|
||
con la stima sbagliata di 2-3×. Ogni regola valutata sul minimo (daily-loss, trailing DD, stop di
|
||
conto) va misurata su **tuple accoppiate**, mai su un wick estratto a parte.
|
||
- **Ondata 2026-07-26-bis (TP01 su barra parziale + i 2 gate mai costruiti) — 0 sleeve nuovi,
|
||
1 audit sul libro live, 2 gate codificati, 1 falso positivo MIO su uno sleeve in produzione.**
|
||
Script `r0726_tp01_partial_day.py` + `r0726_gates_retro.py`, test
|
||
`tests/test_gates_implausible_anchor.py` (13), diario `2026-07-26-wave-tp01-partial-gates.md`.
|
||
**Book/pesi/cron/config INVARIATI.**
|
||
(1) **T1 — anche TP01 legge una barra giornaliera PARZIALE nel live, ma non conta.** Stesso fatto
|
||
strutturale di SKH01: `resample_tf` non scarta il giorno in corso e `current_target` prende `[-1]`;
|
||
il feed si ricostruisce alle 00:30 UTC → tutto il giorno il book vede oggi come **1 barra oraria
|
||
su 24** (verificato `barre1h=1/24`). Docstring "ultima barra CHIUSA" **falso**, corretto (3ª volta
|
||
in 2 giorni che un docstring di produzione dichiara una causalita' che il codice non ha).
|
||
Tre path a un grado di liberta' per volta, 24 ancore, **differenze appaiate**: *barra parziale*
|
||
ΔFULL **−0.031** (pos. 7/24) / ΔHOLD **+0.118** (pos. 19/24); *ritardo d'esecuzione 1h* **−0.004**
|
||
(11/24 = moneta); leva gonfiata **+0.4%**. → **trascurabile, nessun cambio al live.**
|
||
⚠️ All'ancora canonica sembra peggio del vero: a offset 0 la parziale costa **−0.230** di hold-out
|
||
= **il minimo dell'intera banda** (mediana +0.118) → guardando solo l'ancora canonica avrei
|
||
concluso "il live degrada TP01": speculare alla lezione del 26/07 (li' l'ancora canonica
|
||
*nascondeva* un vantaggio, qui *inventa* un danno).
|
||
**REGOLA NUOVA (il risultato trasferibile):** la parzialita' dell'ultima barra conta **in
|
||
proporzione a quanto il segnale pesa la barra piu' recente**. SKH01 = Donchian breakout su 230m,
|
||
la barra corrente E' il segnale → **+0.38**; TP01 = TSMOM 30/90/180g, l'ora mancante e' 1/24 di
|
||
UNA osservazione su 30-180 → **±0.03**. **La conclusione non si trasferisce fra sleeve.**
|
||
(2) **T2 — `implausible_sharpe` e `anchor_luck_band` CODIFICATI in `altlib.py`** (debito
|
||
raccomandato 3 volte — 26/06 CC01, 02/07 Albimarini "con piu' forza" — e mai scritto).
|
||
`implausible_sharpe`: Sharpe>3, perdite/attive<2%, Calmar>20 o maxDD~0, **regola del tre**
|
||
(0 perdite su N → tasso vero fino a 3/N: e' perche' "0/142" non si legge "senza rischio").
|
||
`anchor_luck_band`: la griglia d'ancore NON e' una griglia di parametri → **il deflated-Sharpe non
|
||
la conta**; riporta stima onesta = **mediana della banda** e fortuna = canonica − mediana.
|
||
`anchor_luck_delta`: **mediana delle differenze appaiate** (codifica l'errore del 26/07).
|
||
⚠️ **Il gate ha segnalato VRP01 e il difetto era MIO:** perdite contate su TUTTE le barre, ma
|
||
VRP01 e' settimanale su griglia giornaliera = **94.2% di zeri** → "0.96%, coda assente" su uno
|
||
sleeve **in produzione**; sulle barre **ATTIVE** e' **16.5%**, la forma giusta di un credit spread
|
||
a rischio definito. **E la lezione era gia' cablata il giorno prima** nel monitor DVOLSPREAD
|
||
("barre attive, non giorni di calendario") — imparata in un contesto, non applicata nell'altro.
|
||
Zeri per sleeve: VRP01 94.2 / SKH01 87.6 / XS01 39.6 / GTAA01 31.9 / TP01 30.7%.
|
||
**Applicazione retroattiva 7/7 — tutti ok:** TP01 1.29, XS01 1.36, VRP01 1.08, SKH01 1.45,
|
||
GTAA01 1.01, **XSR01 1.79 (DD 2.5% ma 47.8% di barre attive in perdita → il DD basso e' vol bassa
|
||
+ dollar-neutrality, NON una coda mancante: per il gate del 23/10 il rischio #1 resta lo slippage)**,
|
||
DVOLSPREAD 0.68. Controlli positivi obbligatori superati (firme CC01 e deep-OTM segnalate, rumore
|
||
Sh 0.62 no) — *un gate che non segnala nulla puo' essere semplicemente rotto*.
|
||
✅ **Replica indipendente del finding d'ancora del 02/07:** il gate applicato alla cieca a TP01
|
||
ritrova canonica **+0.237 = 92° pctl** delle 24, **mediana onesta +0.056**, banda [−0.087,+0.247],
|
||
fortuna +0.182 — contro mediana 0.04 / banda [−0.13,+0.30] misurate il 02/07 con implementazione
|
||
SEPARATA. **L'hold-out onesto di TP01 e' ~+0.05, non 0.31** (il valore del sleeve resta il taglio
|
||
del DD ~6× vs buy&hold, che non e' ancorato).
|
||
(3) ~~**NON fatto e perche':** il book sul path live e' bloccato da una **incompatibilita' di
|
||
lenti** — il simulatore SKH01 compone per-trade a nozionale unitario, lo sleeve e' vol-targeted.
|
||
Follow-up dichiarato: serve la versione vol-targeted del path live di SKH01.~~
|
||
✅ **CHIUSO 2026-07-26 — E IL BLOCCO NON ESISTEVA: la premessa era FALSA.** Lo sleeve SKH01
|
||
**non e' vol-targeted** (`backtest_signals(..., leverage=1.0, position_size=1.0)`, nessun
|
||
`target_vol` nel sorgente, e `sim_equity(canonical)` riproduce `backtest_signals` a
|
||
**max|diff| = 0.0**): le due lenti erano gia' la stessa cosa. Il 20.7% di vol realizzata dello
|
||
sleeve — probabilmente cio' che aveva suggerito "vol-target 20%" — e' un **prodotto** della
|
||
strategia (uscite % asimmetriche + poco tempo a mercato), non un parametro; **SKH01 e' l'unica
|
||
delle 5 a NON essere vol-targeted**, il contrario di quanto si credeva. Vedi bullet dedicato
|
||
in fondo e diario `2026-07-26-skh-live-book-deluck.md`. **REGOLA: un blocco dichiarato e'
|
||
un'ipotesi, non un fatto — si ri-verifica prima di costruirci sopra o di rimandare** (qui: tre
|
||
sessioni di follow-up rimandato contro due minuti di verifica).
|
||
- **Ondata 2026-07-26 (3 filoni: esecuzione SKH01 / DVOLSPREAD / XSR01 fuori dal crypto) — 0 sleeve
|
||
nuovi, 1 raccomandazione operativa aperta, 1 lead promosso, 1 falsificazione.** Script
|
||
`r0726_{skh_onbook,dvolspread_gate,xsr_equity}.py`, test `tests/test_wave_0726.py` (11 casi),
|
||
diario `2026-07-26-wave-esecuzione-dvolspread-xsr-equity.md`. **Book/pesi/cron INVARIATI.**
|
||
(1) ⚠️ **T1 — IL DEGRADO D'ESECUZIONE DI SKH01 ERA ANCH'ESSO FORTUNA D'ANCORA.** Testato l'unico
|
||
meccanismo che non e' un cron (ordini **resting on-book**: TP = limit al livello per costruzione +
|
||
fee maker; SL = stop-market). A **offset 0** l'on-book recupera il **94%** del degrado — ma
|
||
l'audit 02/07 aveva de-luckato i numeri headline di SKH01 e **NON il degrado**, misurato solo a
|
||
off0. Sulla banda appaiata dei 23 offset il degrado massimo recuperabile e' **+0.054 Sh di book**,
|
||
non −0.35 di sleeve. ⚠️ Errore di metodo mio, corretto in sessione: **mediana(A)−mediana(B) fra
|
||
offset e' sbagliato** (confronta offset diversi) → serve la **mediana delle DIFFERENZE appaiate**;
|
||
con quella il verdetto si RIBALTA. Esito: **solo TP a limite = +0.054 FULL / +0.061 HOLD,
|
||
positivo in 19/23 (FULL) e 21/23 (HOLD) offset**; **lo SL on-book PEGGIORA** (contributo mediano
|
||
−0.010, positivo in **11/23 = moneta**) perche' cristallizza la perdita al livello mentre l'exit
|
||
software ritardata incassa il rimbalzo — e sopra **0.50% di slippage** l'on-book e' peggio del
|
||
live. Meccanismo misurato: sulle uscite TP il fill orario **batte** il livello nel 42% dei casi
|
||
(vantaggio medio −0.035%) → il limit TP converte una lotteria in certezza piu' che aggiungere
|
||
ritorno; solo l'**1% degli SL gappa** davvero a 5m. **RACCOMANDAZIONE NON ESEGUITA (decisione
|
||
dell'operatore): TP come limit resting reduce-only, SL strategico NON on-book.** E' un cambio di
|
||
esecuzione (non passa `weights_tilt_null`) ma piccolo, da pesare contro ordini orfani/doppio fill.
|
||
Il disaster-SL −30% on-book resta com'e'.
|
||
❌ **T1 NON IMPLEMENTATO — e il perche' e' una CORREZIONE DI MODELLO** (2026-07-26, diario
|
||
`2026-07-26-t1-esecuzione-skh-live.md`). Leggendo il codice di produzione: TP01 e SKH01 tradano
|
||
lo **stesso strumento** con **una sola posizione netta** Deribit → un ordine on-book al livello di
|
||
SKH chiuderebbe anche quota TP01. Misurati i 2 ostacoli: (A) segno compatibile nel **97%** dei
|
||
trade che escono in TP (long 100%, short 94%) = risolvibile; (B) divergenza modello/live che
|
||
sembrava bloccante (ritardo mediano 115 min, **70%** dei TP con ≥1 cron dentro la finestra).
|
||
⚠️ **MA (B) NON ESISTE: `resample_5m` NON scarta il bin 230m in corso** (verificato: 21 barre 5m
|
||
su 46 nell'ultimo bin) **e `_skyhook_positions` ci itera dentro** → il live rileva gia' SL/TP
|
||
**intra-barra**, entro ~1h dal tocco. I docstring che dicevano "usa solo barre chiuse" /
|
||
"latenza fino alla chiusura della barra 230m" erano **FALSI** e hanno guidato 3 analisi
|
||
(02/07, 24/07, T1) — **corretti sul posto**. Conseguenza: la lente `hourly` **sottostima il path
|
||
live di +0.081 Sharpe FULL di book (23/23 offset, banda appaiata)**, il live vero sta **sopra il
|
||
canonical** sul FULL, e **il fix richiesto sarebbe un DECLASSAMENTO** (+0.054 vs +0.081) in cambio
|
||
di ordini parziali sul netto in un percorso con soldi veri. → non fatto, per misura, non per
|
||
difficolta'.
|
||
✅ **CABLATO INVECE il problema vero trovato per strada:** `fresh_5m` **fallisce in SILENZIO**
|
||
(fallback al feed certificato, rigenerato 1x/giorno) → la latenza d'uscita di SKH01 passa da ~1h
|
||
a **~1 giorno** senza che nulla lo segnali (conto online, posizione leggibile, e il gate di
|
||
staleness guarda il feed di TP01: **nessun controllo esistente scatta**). Stesso schema del
|
||
feed-freeze del 14/07, su un altro feed. Aggiunti: `livefeed.feed_age_minutes` (pura, eta' dalla
|
||
CHIUSURA della barra, `None`=non misurata, clamp sugli skew), `book_report.skh_feed_age_min`
|
||
(max fra gli asset), allerta Telegram in `book_execute` sopra `skh_feed_max_age_min`=**30 min**.
|
||
**Scelta dichiarata: ALLERTA, NON blocca** — bloccare fermerebbe anche TP01 (nettato sullo stesso
|
||
strumento) per un guasto di rete, e forzare SKH flat chiuderebbe posizioni buone su un glitch.
|
||
Test `tests/test_skh_feed_freshness.py` (11 casi). Strategia/pesi/cadenza INVARIATI.
|
||
✅ **FOLLOW-UP CHIUSO 2026-07-26 — la misura dedicata sugli INGRESSI e' fatta: NON e' un difetto,
|
||
il verso e' LASCIARLO.** `scripts/research/r0726_skh_partial_entry.py`, test
|
||
`tests/test_skh_partial_entry.py` (10), diario `2026-07-26-skh-partial-entry.md`.
|
||
Confronto di due path identici in tutto (livelli, uscite intra-barra, cap, fee) tranne **quando si
|
||
valuta l'ingresso**: LIVE = a ogni confine orario dentro il bin 230m (cio' che il cron fa oggi),
|
||
BACKTEST = solo a chiusura di bin. **ΔSharpe su 3 offset x 2 asset: −0.01/+0.04/+0.44/+0.32/+0.59/
|
||
+0.98 → 6/6 non negativi, mediana +0.38.** All'offset 0 (l'ancora fortunata del backtest, 93-98°
|
||
pctl) l'effetto e' ~0 sul FULL ma l'hold-out BTC fa **1.12 live vs 0.71 backtest**. I falsi ingressi
|
||
(segnale che evapora) sono **~5/anno/asset**, e cannibalizzano il cap `max_per_day` solo 2-3 volte
|
||
in 7 anni (0.6-0.9% degli ingressi veri). **Meccanismo:** SKH01 e' un Donchian breakout — aspettare
|
||
fino a 230 min la chiusura del bin fa *pagare il movimento gia' avvenuto* (ingresso **0.25-0.26%
|
||
peggiore** in media); e siccome i livelli sono percentuali sull'ingresso (long sl4%/tp10%, short
|
||
sl2%/tp8%), lo stesso 0.26% vale il **6-13% della distanza dallo SL** contro il 2.6-3.3% di quella
|
||
dal TP → vantaggio **asimmetrico a favore della sopravvivenza del trade** (win rate +8pp ETH/+2pp BTC).
|
||
**Due attacchi superati:** (a) il divario NON e' concentrato — togliendo i 5 giorni migliori si
|
||
ALLARGA (ETH@460 35.6x vs 3.0x); e' il *backtest* il path concentrato (~39% del log-equity in 5
|
||
giorni contro 17-22% del live); (b) **nessun look-ahead intra-bin** — troncando i 5m alle sole barre
|
||
gia' chiuse la risposta e' identica in **289/289** osservazioni intra-bin e il prezzo d'ingresso e'
|
||
sempre l'ultimo close 5m disponibile (test permanente `test_nessun_lookahead_intra_bin`; serviva
|
||
perche' il self-check valida solo a **chiusura** di bin → un leak solo-intra-bin gli sarebbe
|
||
invisibile per costruzione).
|
||
⚠️ **La lettura che conta e' la seconda: live e backtest girano due strategie DIVERSE e la
|
||
differenza non e' neutra.** Ogni numero di SKH01 nel progetto (Sharpe standalone, peso 25%, audit
|
||
d'ancora 02/07, conferma peso/cadenza 24/07) e' calcolato sul path a chiusura di bin, che non e'
|
||
quello che gira. Sommato alla misura del 26/07 sulle uscite (+0.081 Sharpe FULL di book
|
||
sottostimato), **il path live di SKH01 e' stato modellato in modo sistematicamente pessimistico su
|
||
ENTRAMBI i lati.** Cio' che NON si conclude: che l'ingresso intra-bin sia un miglioramento
|
||
*validato* — e' stato misurato sugli stessi 7 anni su cui SKH01 e' stato selezionato, non e' passato
|
||
per `study_family_honest` ne' per un deflated-Sharpe, e la taglia varia molto fra ancore. Ma non
|
||
serve promuoverlo: **e' gia' cio' che il live fa**; l'azione e' smettere di trattare il numero del
|
||
backtest come l'aspettativa del live, NON "riparare" il live verso un backtest peggiore.
|
||
**Book, pesi, cron, config INVARIATI.**
|
||
⚠️ **Regole nuove (due errori catturati in sessione, entrambi del tipo che passa i test pigri):**
|
||
(i) **un self-check su eventi rari si campiona sugli EVENTI, non sulla popolazione** — la prima
|
||
stesura stampava "BTC 80/80 OK" mentre la ricostruzione era rotta da un off-by-one di confine
|
||
(`obs//MS_LTF` a chiusura cade nel bin successivo, vuoto → segnale 0): con gli ingressi al ~2% dei
|
||
bin confrontava **zeri con zeri**, potenza zero, e le 2 sole divergenze ETH erano gli unici 2 bin
|
||
con segnale vero. (ii) **un conteggio di eventi su segnale GREZZO non e' un conteggio di trade** —
|
||
la prima scansione dava 1361 falsi ingressi e un costo inventato di −3%/anno di sleeve perche'
|
||
ignorava cap+non-overlap del live (**sovrastima ~20x**); la spia era 305 *giorni* con un falso
|
||
ingresso a fronte di 663 "eventi", impossibile con cap 1/giorno.
|
||
(2) ✅ **T2 — DVOLSPREAD ESCE DAL LIMBO** (era fermo dal 21/06, unico sopravvissuto del marginal
|
||
scorer indurito, mai ripreso: non nel book, non in monitor, non rifiutato). Passato ai due gate
|
||
che nel giugno NON esistevano. ⚠️ La griglia dichiarata dall'agente ("72 celle") ne contiene
|
||
**729** (6 assi x 3) → valutate tutte, scelta conservativa (piu' trial = DSR piu' basso).
|
||
Plateau REALE e larghissimo: **729/729 celle con hold-out positivo**, FULL [0.60,0.71].
|
||
Selection-on-holdout **confermata ma mite**: la cella pubblicata e' **83ª/729 sull'hold-out ma
|
||
471ª/729 in-sample**. Scegliendo onestamente in-sample: **FULL 0.68 / HOLD 0.69** (non il **0.93**
|
||
pubblicato — **citare 0.69**) e **DSR 0.953 PASS**, mentre la cella pubblicata **FALLISCE (0.947)**.
|
||
Marginale ADDS + robust_oos + multicut + non-hedge + insample_edge + beats_noise; corr +0.11,
|
||
alpha +7.4%/a, dSharpe book **+0.08 FULL / +0.17 HOLD** a w=15%. **PROMOSSO a forward-monitor con
|
||
i parametri ONESTI** (zwin=180 k=2.0 lw=0.6 zw=1.1 tgt=0.17 svw=60), **NON nel book**: campione
|
||
**ATTIVO 1949/2691 g** (prima del 2021-03 non c'e' DVOL, book flat) con **hold-out attivo 1.6
|
||
anni**, margine DSR sul filo, e `weights_tilt_null` mai affrontato.
|
||
✅ **MONITOR CABLATO** (stessa sessione): `scripts/live/paper_dvolspread.py` in `cron_daily.sh`
|
||
dopo `fetch_dvol.py`, stato `data/paper_dvolspread/` (gitignored), test
|
||
`tests/test_paper_dvolspread.py` (10 casi). Inception **2026-07-25**, apertura +0.184 =
|
||
**$111/gamba** (cap $300), 2 libri MODELED $2000 / REAL $600.
|
||
⚠️ **Strumentazione specifica:** il book va **flat quando manca il DVOL** → un feed rotto
|
||
produrrebbe zeri che, contati come evidenza, direbbero "nessuna perdita" invece di "nessuna
|
||
misura". Contabilita' a **3 stati** (ATTIVE / flat-da-segnale / **flat-senza-dato**) e finestra
|
||
misurata in **barre attive**, non giorni di calendario; guardia sulla config che **esce 1** se
|
||
`FROZEN` diverge dallo stato salvato. **GATE PRE-REGISTRATO:** kill **2026-10-24** se Sharpe
|
||
forward < −0.50; decisione **2027-01-24** solo se TUTTE — (a) Sharpe>0 [debole di proposito:
|
||
con ~180 barre SE(Sharpe)≈1.4, una soglia alta sarebbe finta precisione] (b) marginale ancora
|
||
ADDS+robust_oos+insample_edge (c) **deflated-Sharpe ricalcolato ≥0.95** [e' qui il peso: se lo
|
||
0.953 gia' sul filo NON migliora con piu' dati, l'edge non c'e'] (d) `weights_tilt_null`;
|
||
**veto d'integrita'** se barre attive <80% → si ESTENDE, non si decide su dati mancanti.
|
||
(3) ❌ **T3 — XSR01 NON GENERALIZZA fuori dal crypto** (meccanismo CONGELATO W=45/sgn=+1 su
|
||
**9 settoriali SPDR 1998+ / 28 ETF 30 anni**, residuo vs SPY, demean giornaliero, split IWM/EFA
|
||
riparati, **annualizzazione √252**). Diverso dal test del 25/07: quello era a **coppie**, questo
|
||
e' la versione **DEMEANATA** (quella vera di XSR01). Lordo **+0.24 (SECT9, p=0.193)** e **−0.14
|
||
(ALL28, p=0.747)** vs null di permutazione **a fee zero**; netto −1.6/−1.8 ovunque; per decennio
|
||
stesso profilo nei 2 universi (neg. 1998-2005, debolmente pos. poi) = piu' cambio di regime che
|
||
edge. **Il risultato che conta non e' lo Sharpe ma l'AMPIEZZA:** il demeaning porta l'ampiezza
|
||
effettiva **4.5→37.4 (8x) sul crypto** ma solo **5.3→6.2 / 8.4→11.3 (1.2-1.35x) sulle azioni**.
|
||
Spiegazione strutturale (e migliore descrizione di XSR01 di quella della sua scoperta): il residuo
|
||
OLS rimuove gia' il beta al fattore comune; sul crypto alle gambe **RESTA** un enorme fattore
|
||
comune (ampiezza 4.5 su 50 gambe) ed e' quello che il demean toglie — sulle azioni il residuo-vs-SPY
|
||
e' **gia'** quasi indipendente, quindi non c'e' niente da togliere. **Per il gate del 23/10:**
|
||
conferma e CHIUDE la scappatoia lasciata aperta dal test a coppie; XSR01 e' **crypto-specifico**.
|
||
NON prova che sia falso. **Soglie del gate NON toccate**: resta appoggiato interamente su finestra
|
||
forward + haircut di eseguibilita' a $5.000, come pre-registrato.
|
||
**LEZIONI:** (a) **se si de-lucka una strategia va de-luckato anche il suo DEGRADO** — ogni Δ fra
|
||
due varianti misurato su griglia ancorata eredita la fortuna dell'ancora; (b) su offset appaiati
|
||
la statistica e' la **mediana delle differenze**, non la differenza delle mediane; (c) **un lead
|
||
"in forward-monitor" senza monitor e senza scadenza e' un lead perso** (DVOLSPREAD: 35 giorni di
|
||
limbo) → applicare ai lead la stessa disciplina dei candidati (config congelata + gate
|
||
pre-registrato + cron); (d) il claim di multiple-testing di un agente va **ricontato**, non
|
||
creduto (72 dichiarate, 729 reali); (e) quando un meccanismo non generalizza, **chiedersi PERCHE'
|
||
vale piu' del fatto che non generalizzi**.
|
||
- ⚠️ **LEAVE-ONE-OUT DEL BOOK DE-LUCKATO (2026-07-26, 3° filone del giorno) — la classifica dei
|
||
contributi si RIBALTA su 2 metriche su 3, e la stima de-luckata del book era ottimista.**
|
||
Domanda: *"quale sleeve terrei?"*. Script `scripts/research/r0726_loo_deluck.py`, test
|
||
`tests/test_loo_deluck.py` (9), diario `2026-07-26-loo-deluck.md`. **Book/pesi/cron/config
|
||
INVARIATI** (non è un gate sui pesi: quello resta `weights_tilt_null`).
|
||
(1) **Il metodo:** un leave-one-out **è un Δ**, quindi eredita la fortuna d'ancora come ogni Δ
|
||
(lezione 26/07). Con 4 sleeve su 5 ancorati il problema è congiunto → 2000 estrazioni uniformi
|
||
indipendenti sullo spazio 24×10×7×23×5, book completo + 5 LOO **alla stessa configurazione**,
|
||
statistica = **mediana delle differenze appaiate**. Sanity bit-exact 5/5 (`max|dif| = 0.0`) sulle
|
||
repliche ancorate — quattro riusate dagli audit 02/07-03/07, solo la fase di GTAA01 è nuova.
|
||
(2) **Contributi de-luckati** (mediana, e **frazione di estrazioni positive** — che conta più
|
||
della mediana): **TP01 +0.390 FULL (100%)** = quasi 3× il secondo, e il canonico lo
|
||
**SOTTOSTIMAVA** (+0.280 al 5.8° pctl); SKH01 +0.142 (91%), XS01 +0.125 (99.9%), VRP01 +0.122
|
||
(100%), GTAA01 +0.115 (100%).
|
||
(3) **Due giudizi ribaltati rispetto alla lente canonica.** **SKH01 non è il motore del book**:
|
||
l'ancora regala **2/3 del FULL** (+0.43→+0.14), **70% dell'hold-out** (+0.65→+0.19), **80% della
|
||
protezione DD** (+1.64pp→+0.32pp) → de-luckato è **il meno affidabile dei cinque**. **GTAA01 è
|
||
l'unico positivo nel 100% delle estrazioni su TUTTE E TRE le metriche** e il miglior protettore
|
||
di DD (+2.0pp, doppio del secondo), senza fortuna da restituire (canonico *sotto* la mediana su
|
||
FULL e DD). ⚠️ Ma **attribuzione ≠ eseguibilità**: sotto `GTAA_MIN_CAPITAL` $3k resta non
|
||
deployabile, e la nota del 25/07 (€0.50/g sopra il risk-free con maxDD 10% a $10k) è intatta.
|
||
(4) **TP01: hold-out negativo −0.200, e NON è artefatto d'ancora** (negativo nel **99.1%** delle
|
||
configurazioni) — mentre sul FULL è il maggior contributore. È la firma dell'assicurazione,
|
||
misurata: paga premio negli anni senza incendio, riprende tutto sul campione che contiene il 2022.
|
||
**Regola: uno sleeve difensivo si giudica sul sinistro, non sul premio** — l'hold-out negativo
|
||
non è un argomento per ridurlo. **XS01: protezione DD ESATTAMENTE ZERO** (mediana 0.000, positiva
|
||
nel 43% = moneta) → è un diversificatore di **rendimento, non di rischio**; conta perché sul
|
||
canale funded il vincolo binding è il DD (25/07 §4). **VRP01: 2ª conferma di zero fortuna**
|
||
(canonico al 1.8° pctl sul FULL = numeri di ammissione *conservativi*).
|
||
(5) **Contrappeso dovuto a SKH01:** il de-luck lo penalizza sul path **backtest**, ma il path
|
||
**live** è misurato migliore su entrambi i lati (ingressi +0.38, uscite +0.081) → **vale meno dei
|
||
suoi numeri di ammissione e più di questa tabella**; quantificarlo resta il follow-up bloccato
|
||
(serve la versione vol-targeted del path live).
|
||
⚠️ **Errore di stampa catturato:** il primo output dava `pctl 100%` per l'hold-out del book —
|
||
arrotondamento di 99.55% con `%.0f`. **Un percentile stampato a 0 decimali mente esattamente agli
|
||
estremi, che sono l'unico posto dove lo si legge.** Verificato a mano (9 estrazioni su 2000
|
||
battono la canonica), formato portato a 1 decimale.
|
||
- ✅ **FOLLOW-UP SKH01 "vol-targeted" CHIUSO (2026-07-26, 4° filone) — il blocco non esisteva, e
|
||
il fattore de-luck ×0.6 era troppo severo del 31-34%.** Script `r0726_skh_sigcache.py` (cache),
|
||
`r0726_skh_live_book.py` (misura), `r0726_deluck_factor.py` (decomposizione),
|
||
`r0726_capwall_refresh.py` (muri); test `tests/test_skh_live_book.py` (8); diario
|
||
`2026-07-26-skh-live-book-deluck.md`. **Book/pesi/cron/config INVARIATI.**
|
||
(1) **La premessa era falsa** — vedi il bullet dell'ondata 26/07-bis: SKH01 **non e'
|
||
vol-targeted**, le due lenti erano gia' identiche (`sim_equity(canonical)` == `backtest_signals`
|
||
a max|diff| = 0.0). Test permanente `test_lente_sleeve_uguale_a_quella_del_simulatore`: se
|
||
qualcuno aggiunge un vol-target allo sleeve, la premessa torna vera e **il test deve rompersi**
|
||
invece di far passare numeri non piu' validi.
|
||
(2) **Ingressi live vs backtest, de-luckato a 8 offset** (sottocampione uniforme a priori: la
|
||
griglia piena a 23 costa ~9 min per asset×offset, fuori portata su 2 core col cron live).
|
||
Sanity **120/120** bin con ingresso ricostruiti. **Il numero del 26/07 era ~4× troppo grande:**
|
||
like-with-like (mediana PER-ASSET) **+0.38 su 3 offset → +0.097 su 8**, e "6/6 non negativi" →
|
||
**13/16**. A livello di sleeve 50/50 la mediana appaiata e' **+0.112, positiva 8/8**.
|
||
⚠️ Le due grandezze (per-asset e sleeve 50/50) **non sono la stessa cosa** — nel book entra la
|
||
seconda, dove la diversificazione BTC/ETH cambia il denominatore.
|
||
(3) **A livello di BOOK: Sharpe ≈ monetina, drift certo.** dSh FULL +0.048 (>0 nel 79.3%),
|
||
dSh HOLD +0.051 (51.2%), **d drift +0.73pp (>0 nel 100.0%)**. Meccanismo: l'ingresso intra-bin
|
||
prende un prezzo migliore ma i falsi ingressi aggiungono churn (530-605 trade live vs 411-484)
|
||
→ vol e ritorno salgono insieme. **REGOLA: chiedersi QUALE grandezza entra nella decisione
|
||
prima di misurare** — qui il ×0.6 e' sul drift, quindi lo Sharpe non era la metrica.
|
||
(4) **Il ×0.6 decomposto e misurato.** (a) fortuna d'ancora **sul drift**: **×0.874** (5-sleeve)
|
||
/ **×0.890** (book live) — e la **vol e' invariata** fra le ancore (7.80→7.76%), la fortuna sta
|
||
tutta nel drift; (b) path live: **non-negativo ovunque** (uscite +0.081 Sh, ingressi +0.73pp,
|
||
TP01 trascurabile). Il ×0.6 implicava un residuo **×0.687** attribuito al live oltre l'ancora,
|
||
che nessuna misura sostiene → **FATTORE ONESTO ×0.87-0.91 (5-sleeve), ≥×0.89 (book live)**.
|
||
Il sospetto registrato il 25/07 ("conta due volte la degradazione SKH01") e' **confermato
|
||
quantitativamente**. **REGOLA: un fattore correttivo scelto a occhio va DECOMPOSTO prima di
|
||
accettarlo o rifiutarlo** — il ×0.6 non era sbagliato, era due fattori moltiplicati insieme di
|
||
cui uno contato due volte.
|
||
(5) ❌ **Ipotesi MIA nata e refutata nella stessa sessione:** che la grid timing-luck di SKH01
|
||
(audit 02/07) fosse un artefatto della lente a chiusura-di-bin, perche' il live valuta ogni ora
|
||
e non e' ancorato al confine del bin. Dispersione fra gli 8 offset: **LIVE/CANONICO = 1.59×**,
|
||
cioe' il live e' **piu'** disperso, non meno → **l'audit del 02/07 resta valido com'e'**.
|
||
L'ipotesi nasceva da **2** offset, si e' incrinata a 4 (1.24×), chiusa a 8. **REGOLA: due punti
|
||
non fanno una tendenza nemmeno quando la meccanica sembra spiegarla.**
|
||
(6) ⚠️ **Trovato per strada:** `simulate()` in `r0726_skh_partial_entry.py` **non e' mai chiamata
|
||
da `main()`** — i numeri headline del diario del 26/07 vennero da una corsa ad hoc mai
|
||
committata. Ora il driver e' committato (`r0726_skh_live_book.py`). *Un numero pubblicato in un
|
||
diario deve avere uno script committato che lo riproduce.*
|
||
- ⚠️ **RISCHIO DI VENUE — mai prezzato in 2 mesi, e non e' diversificabile dagli sleeve
|
||
(2026-07-26).** Script `r0726_venue_risk.py`, test `tests/test_venue_risk.py` (13), diario
|
||
`2026-07-26-venue-risk.md`. **Book/pesi/cron INVARIATI.**
|
||
(0) **Il buco:** il progetto ha prezzato fee, slippage, min-order, pavimento IB, haircut
|
||
small-cap, fortuna d'ancora, degrado d'esecuzione, look-ahead, backfill, split — **mai la
|
||
probabilita' che l'exchange sparisca col saldo dentro**. E TP01+SKH01+VRP01 stanno **tutti sullo
|
||
stesso conto Deribit**: tre sleeve quasi-ortogonali sui ritorni, **perfettamente correlati sul
|
||
fallimento del venue** — cosa che la matrice di correlazione del book non vede per costruzione.
|
||
(0-bis) ⚠️ **Limite dei muri del 25-26/07:** `book_series` gira a **`alloc=$600` col book a 2
|
||
sleeve** → portarlo fino a $272k assume (a) che a $272k si giri ancora il book da $600 e (b)
|
||
**"tutto su Deribit" per 10-20 anni, senza dirlo**. ✅ **(a) MISURATO e REFUTATO il 26/07** —
|
||
vedi bullet "MURO COME PUNTO FISSO": il muro **non** scende, $273.900 vs $272.061 (**+1%**).
|
||
(1) **La misura** (accumulo da $600, €250/m, 20a, bersaglio $272k, ×0.89, jump di venue a
|
||
probabilita' annua `p`; CONC = 100% Deribit vs SPLIT = Deribit 65 / HL 15 / IB 20; **bersaglio
|
||
identico → conservativo CONTRO lo split**):
|
||
| p annua | P(arrivare) CONC | SPLIT | **P(perso TUTTO) CONC** | **SPLIT** |
|
||
|---|---|---|---|---|
|
||
| 0.5% | 87% | 90% | **10%** | **0%** |
|
||
| 1.0% | 81% | 83% | **18%** | **0%** |
|
||
| 2.0% | 69% | 71% | **34%** | **4%** |
|
||
| 5.0% | 42% | 45% | **64%** | **27%** |
|
||
Capitale mediano CONC a 20a: $544k (p=0) → **$0 (p=5%)**.
|
||
(2) **La colonna che conta non e' la prima.** Sulla probabilita' di ARRIVARE la concentrazione
|
||
costa 1-3pp; sulla **ROVINA** costa fino a 64pp. Motivo strutturale: **con un conto solo "almeno
|
||
un fallimento" COINCIDE con "perso tutto"**. ⚠️ Lo SPLIT viene colpito **2.5× piu' spesso** (26%
|
||
vs 10%) ed e' molto piu' sicuro → **"quante volte vieni colpito" NON e' una misura di rischio**.
|
||
(3) **Onesta' obbligatorie:** `p` **non e' stimato** (sensibilita', non previsione — la sceglie
|
||
l'operatore e va dichiarata); i fallimenti sono assunti **indipendenti**, ottimistico per
|
||
Deribit-HL (crisi sistemica) → **la parte solida dello split e' IB**, altra classe di rischio;
|
||
**a $600 lo split e' impossibile**, la concentrazione e' forzata.
|
||
(4) **RISPOSTA: no, ma la domanda ha una DATA.** Oggi concentrazione forzata; **~$3k = prima
|
||
riduzione vera** (GTAA01 su IB, 20-25% fuori dal rischio-exchange); ~$20k (XS01/HL) aggiunge
|
||
poco perche' e' ancora crypto. ✅ **Convergenza che rafforza il 25/07:** `r0725_ib10k` disse
|
||
"max 25% su IB, **costa** ~€0.08/g" su basi di solo RENDIMENTO; sull'asse della ROVINA quello
|
||
stesso 25% e' la mossa principale → **€0.08/g non e' il prezzo di un peggioramento, e' il premio
|
||
di un'assicurazione contro il modo piu' probabile di perdere tutto.**
|
||
⚖️ **(5) DECISIONE DELL'OPERATORE 2026-07-26: TUTTO SU DERIBIT FINO A $20k.** Presa DOPO aver
|
||
visto la tabella della rovina, e con la controparte esplicitata. **Cosa e' stato accettato:**
|
||
P(perso TUTTO) resta 10/18/34/64% a p=0.5/1/2/5% invece di 0/0/4/27%; in cambio si evita il
|
||
costo (~€0.08/g di rendita, commissione fissa IB, un secondo venue da gestire) di proteggere
|
||
**$750** alla soglia dei $3k. **L'argomento a favore, che regge:** sull'asse su cui l'operatore
|
||
ottimizza — P(ARRIVARE al capitale-rendita) — lo split vale solo **+1-3pp** (81%→83% a p=1%),
|
||
ed e' un fatto misurato, non una concessione. **L'argomento contro, che resta vero:** zero e'
|
||
**assorbente** (andare a zero all'anno 10 di un piano da 16 anni significa non arrivarci piu',
|
||
perche' si riparte da €0 + versamenti), quindi il valore del non-andare-a-zero NON e'
|
||
proporzionale alla frazione salvata. **Cosa NON si ri-discute:** la soglia $3k. **Cosa si
|
||
ri-apre a $20k:** lo split, che a quella taglia protegge ~$5k e ha senso anche solo per
|
||
eseguibilita' (XS01/HL, GTAA01/IB). ⚠️ **Nota per il futuro-me:** questa e' una decisione presa
|
||
con l'informazione completa, non una svista da correggere — se a $3k qualcuno propone lo split
|
||
"come da CLAUDE.md", la risposta e' che la data e' $20k. Se cambia il piano (orizzonte, importo
|
||
dei versamenti) o `p` diventa stimabile invece che assunto, si riapre PRIMA.
|
||
**REGOLE:** (a) un rischio non-diversificabile dagli sleeve va prezzato a parte; (b) P(successo)
|
||
puo' nascondere P(rovina) — per una rendita la metrica e' la seconda; (c) una raccomandazione
|
||
presa su un asse solo va ricontrollata sugli altri prima di considerarla stabile; (d) quando una
|
||
raccomandazione viene respinta con motivo, si registra **cosa e' stato accettato in cambio** —
|
||
altrimenti la stessa analisi la ripropone fra tre mesi come se fosse nuova.
|
||
- ✅ **VENUE WATCH — tripwire di fallimento exchange, CABLATO LIVE (2026-07-26).** Risposta alla
|
||
domanda *"trova un sistema di protezione da fallimento exchange"* **sotto il vincolo** della
|
||
decisione appena presa (100% Deribit fino a $20k): se non si puo' ridurre l'ESPOSIZIONE, l'unica
|
||
leva e' il **TEMPO**. Script `r0726_venue_tripwire.py` (segnale) + `r0726_venue_response.py`
|
||
(costo della risposta); produzione `src/live/venue_watch.py` + `scripts/live/venue_watch.py` in
|
||
`cron_book.sh`; test `tests/test_venue_watch.py` (23); diario `2026-07-26-venue-tripwire.md`.
|
||
**Book, pesi, config INVARIATI.**
|
||
(1) **Il segnale:** un venue che gata i prelievi **rompe l'arbitraggio** → il suo prezzo si stacca
|
||
dal consenso e ci RESTA. Il segnale e' **|scarto|, non il segno** (Mt.Gox andava a *premio*, un
|
||
venue in fuga a *sconto*: dicono la stessa cosa). Consenso = venue **USD indipendenti**
|
||
(Coinbase, Bitstamp); mai USDT (depeg 2022 → falsi allarmi giganti). Deribit sta a **3 bps** dal
|
||
consenso in mediana su 8 anni (65.043 ore BTC + 64.541 ETH) — fondo di rumore bassissimo, ed e'
|
||
cio' che rende possibile una soglia con margine.
|
||
(2) **Taratura CONGELATA = 100 bps persistenti 4h a segno costante.** Criterio **dichiarato
|
||
prima**, perche' i due ovvi sbagliano in versi opposti (provati entrambi): *minimi bps* → 25bps/24h
|
||
consuma 24 delle ~72h che diede FTX; *minime ore* → 500bps/2h **manca FTX** (margine 0.6x).
|
||
Regola adottata: (a) zero falsi allarmi su entrambi gli asset in 8 anni; (b) margine ≥3x sul caso
|
||
storico **piu' debole** (FTX ~300bps) → soglia ≤100bps; (c) a quei vincoli, minima latenza.
|
||
Margine finale **3x FTX / 5x QuadrigaCX / 10-20x Mt.Gox**, con **zero falsi allarmi** inclusi
|
||
crash COVID 2020-03, maggio 2021, LUNA e novembre 2022.
|
||
(3) ✅ **CONTROLLO POSITIVO superato** (obbligatorio: un rilevatore tarato per non segnalare e'
|
||
indistinguibile da uno rotto). Puntato su **Bitfinex 2018-19** (problemi bancari/Tether):
|
||
**22 episodi**, il piu' lungo **2.324 ore consecutive** a +447bps di picco, altri a 1.151h/+663bps
|
||
e 496h/+1136bps. **22 scatti dove il problema c'era, 0 su Deribit in 8 anni.** E la DURATA
|
||
risponde alla domanda vera: un venue gated resta dislocato per **settimane** → 4h di latenza
|
||
costano una frazione trascurabile del preavviso.
|
||
(4) **Economia della risposta:** costo ATTESO di un falso allarme (flat 3 giorni, misurato sul
|
||
book reale a ogni data d'inizio) = **0.248%** di equity (coda p5 −2.065%); guadagno di un vero
|
||
positivo = **100%**. Break-even: `p_annua > (falsi allarmi/anno) × 0.00248` → a 1 ogni 8 anni
|
||
serve **p > 0.031%**, a 12/anno servirebbe p > 2.97%. **Il valore sta nella SPECIFICITA', non
|
||
nella sensibilita'.** ⚠️ Errore mio corretto: il break-even si calcola sulla **media**, non sul
|
||
p5 (con la coda esce 8.3x piu' severo e la conclusione si ribalta).
|
||
(5) **Tre stati, e il terzo NON e' il primo:** `OK` / `ALERT` / **`BLIND`** (referenze
|
||
irraggiungibili o in disaccordo fra loro → dopo 12h e' un allarme suo). *"Non vedo" non e' "va
|
||
tutto bene"* — stessa lezione della contabilita' a 3 stati di `paper_dvolspread`. **ALLERTA, NON
|
||
BLOCCA:** l'azione a un vero positivo e' *prelevare* (manuale — una chiave API con permesso di
|
||
prelievo sarebbe essa stessa un rischio), e bloccare non protegge il saldo, che e' a rischio
|
||
anche stando flat. **Runbook pre-deciso** nel docstring del modulo (escludere guasto referenze →
|
||
`public/status` → **prelievo di prova**, unica evidenza diretta → flat + prelievo totale).
|
||
(6) ⚠️ **Cio' che NON copre, e non e' un argomento per riaprire il 26/07:** un fallimento **senza
|
||
finestra** (furto di chiavi, sequestro, exit-scam notturno) non lo prende nessun tripwire; quella
|
||
parte di `p` resta scoperta e la sola difesa e' lo split. E il preavviso di 200-2.300 ore viene da
|
||
**un** caso osservato: e' un'ancora, non una distribuzione.
|
||
**REGOLE:** (a) un rilevatore tarato per non segnalare va validato su un **controllo positivo**;
|
||
(b) una soglia si sceglie con un criterio **dichiarato prima** (i criteri ovvi sbagliano in versi
|
||
opposti); (c) la persistenza richiesta **e' latenza** e va confrontata con la durata del fenomeno
|
||
da rilevare; (d) un break-even si calcola sulla **media**, non sulla coda; (e) ⚠️ **una
|
||
diagnostica STAMPATA non e' un controllo** — la prima corsa tronco' il campione da 8 anni a
|
||
**29 giorni** per un inner-join con Kraken (che serve solo ~700 candele) e la copertura era gia'
|
||
a video: ora c'e' una guardia che ferma lo script (2ª occorrenza in un giorno dopo GTAA01 —
|
||
**l'outer-join con referenze di lunghezza diversa e' una trappola ricorrente**); (f) un controllo
|
||
positivo finito dentro il ramo `else` **non gira mai** (trovato in sessione: era esattamente il
|
||
difetto che doveva prevenire).
|
||
- 📅 **NUOVO SCHEMA FEE DERIBIT dal 2026-08-01 — misurata la CURVA, nessuna azione oggi
|
||
(2026-07-26).** Script `r0726_fee_sensitivity.py`, test `tests/test_fee_sensitivity.py` (6),
|
||
diario `2026-07-26-fee-deribit.md`. **Book/pesi/cron/config INVARIATI.**
|
||
L'annuncio (taker piu' bassi, **maker rebate piu' bassi**, soglie VIP abbassate, nuovo VIP7,
|
||
**liquidation fee 1%** su tutti i prodotti, spot a zero fino al collegamento con Coinbase) **non
|
||
contiene numeri** e ⚠️ **la tabella nell'articolo Insights e' un'IMMAGINE, non letta da fonte
|
||
primaria** → i valori indicativi (base ~5bps taker / 2bps maker, VIP7 2/0) vengono da un
|
||
riassunto **secondario** e vanno etichettati come tali. Percio' e' misurata la **curva**:
|
||
| bps/lato | %RT | TP01 Sh | SKH01 Sh | BOOK Sh | BOOK CAGR |
|
||
|---|---|---|---|---|---|
|
||
| 0 | 0.00% | 1.322 | 1.567 | 1.849 | 21.69% |
|
||
| 3 | 0.06% | 1.303 | 1.495 | 1.799 | 20.99% |
|
||
| **5** | **0.10%** | **1.290** | **1.446** | **1.766** | **20.53%** ← oggi |
|
||
| 10 | 0.20% | 1.258 | 1.324 | 1.682 | 19.39% |
|
||
| 15 | 0.30% | 1.226 | 1.200 | 1.597 | 18.26% |
|
||
**Sensibilita' marginale del book: −0.017 Sharpe/bps, −0.23% CAGR/bps** → anche un RADDOPPIO del
|
||
taker costa 0.08 di Sharpe, **meno della banda d'ancora dello stesso book** (2.222 → 1.946).
|
||
⚠️ **SKH01 e' ~4× piu' sensibile di TP01** (−0.69% vs −0.09% CAGR/bps: round-trip discreti vs
|
||
posizione continua vol-targeted) → **se il taker salisse, il primo parametro da rivedere e' il
|
||
peso 75/25**, non altro. **REGOLA DECISA IN ANTICIPO (per non decidere col numero davanti):
|
||
taker ≤5bps/lato → non si tocca nulla; >10bps/lato → rivedere il peso di SKH01.**
|
||
**Punti irrilevanti e perche':** *maker* — il book manda ordini **market**; tocca solo la
|
||
raccomandazione **T1 non implementata** (TP resting per incassare il maker), che resta chiusa
|
||
per il netting su strumento unico e il cui beneficio era quasi tutto "convertire una lotteria in
|
||
certezza", non la fee. *Liquidation fee 1%* — `live.json` da' nozionale lordo max **1.00x
|
||
l'equity** (`frac 0.5` × 2 asset) con disaster-SL −30%: servirebbe un movimento avverso ~100%;
|
||
⚠️ la conclusione poggia sul CAP, quindi e' cablata una **guardia di decisione**
|
||
(`test_leva_massima_da_config_resta_sotto_o_uguale_a_1x`): **alzare il cap rompe il test**.
|
||
*VIP/VIP7* — a $600 il volume 30g e' trascurabile, tier base a qualunque soglia.
|
||
✅ **Cio' che il cambio non puo' rompere:** tutti i backtest sono a 0.10% RT → se la fee scende
|
||
diventano **conservativi**. **AZIONE 1 agosto:** leggere il tier reale in Account Settings e
|
||
applicare la regola sopra. **REGOLE:** (a) a un annuncio senza numeri si risponde misurando la
|
||
**curva**, non aspettando il numero; (b) dichiarare la **qualita' della fonte** (immagine non
|
||
letta = dato secondario); (c) una conclusione che poggia su un parametro di config va legata a
|
||
un **test su quel parametro**, o sopravvive al cambio che la rende falsa.
|
||
- ❌ **MURO COME PUNTO FISSO — la mia previsione era SBAGLIATA e il numero pubblicato era giusto
|
||
per caso (2026-07-26).** Script `r0726_wall_fixedpoint.py`, test `tests/test_wall_fixedpoint.py`
|
||
(11), diario `2026-07-26-wall-fixedpoint.md`. **Book/pesi/cron INVARIATI.**
|
||
Il follow-up dichiarato diceva: *"i muri usano il book a 2 sleeve da $600 estrapolato a $272k;
|
||
il book diversificato ha Sharpe piu' alto → **il muro vero e' piu' basso**"*. **Misurato: FALSO.**
|
||
(1) **Struttura giusta: il muro e' un PUNTO FISSO** — serve capitale C per girare il book che
|
||
determina il muro C → si itera `C_{n+1} = muro(book(C_n))`. Converge in **1 iterazione** perche'
|
||
il muro cade **sopra** la soglia XS01 ($117k), quindi la composizione non cambia; la struttura
|
||
conta solo se il muro atterra vicino a una soglia — ma **va iterato per saperlo**.
|
||
(2) **Risultato:** book deployable (TP01 38/SKH01 23/GTAA01 23/XS01 17; **VRP01 escluso** per
|
||
regola short-vol, **XSR01 escluso** per gate 23/10; costi capital-aware; ancora ×0.860 misurata
|
||
su questo book) → Sharpe **1.94**, vol 8.9%, CAGR 18.3%. **Muro $273.900 vs $272.061 = +1%.**
|
||
(3) **Perche':** diversificare alza lo Sharpe (1.64 → 1.94) ma abbassa **drift e vol insieme**;
|
||
la rendita perpetua vive sul **drift** → 10.91% → 10.84% = invariata. **Il guadagno di Sharpe va
|
||
in meno rischio, non in piu' reddito** — cioe' il fatto gia' misurato il 25/07 §3, che avevo
|
||
dimenticato scrivendo il follow-up.
|
||
(4) ⚠️ **Stavo violando una regola gia' codificata:** *"un diversificatore a basso CAGR si giudica
|
||
a ISO-RISCHIO, mai a iso-nozionale"* (25/07 §3). A iso-rischio (leva **1.28x**): rendita 13.35%,
|
||
**muro $222.406 = −18%** — ✅ **replica indipendente** del −19% misurato il 25/07 con macchineria
|
||
e book diversi. Vale **solo** se la leva e' disponibile e a costo < uplift (IB: Reg-T 2x,
|
||
portfolio margin da ~$110k, margine ~5.5%/a): **$222k e' un TETTO, non una stima.**
|
||
(5) ⚠️ **BUG catturato prima di pubblicare:** la prima corsa dava Sharpe 0.95 e muro **$854k**
|
||
("diversificare triplica il muro" — spettacolare e falso). Causa: `CC.gtaa_banded` ritorna la
|
||
storia GTAA **dal 1996** mentre lo sleeve di produzione tronca a `GTAA_BOOK_ACTIVATION`; con la
|
||
rinormalizzazione per-riga di `combine_outer` il **75% del campione** era **GTAA01 da solo al
|
||
100%**. Preso **non da un test** ma perche' la somma pesata dei componenti (~18%) non tornava col
|
||
drift del combinato (6.8%). **Diagnostica decisiva: la COPERTURA PER COLONNA** (TP01 24.6% /
|
||
SKH01 24.6% / GTAA01 100.0% / XS01 8.6%) — un 100% accanto a valori bassi dice tutto.
|
||
**REGOLE:** (a) un follow-up dichiarato contiene una **previsione**, che va misurata non assunta;
|
||
(b) **rileggere le regole gia' codificate prima di impostare il confronto**; (c) quando un
|
||
aggregato non torna con la somma dei suoi pezzi, **fermarsi** — era l'unico segnale del bug
|
||
(nessun test, nessuna eccezione, output plausibile); (d) **la copertura per colonna e' la prima
|
||
diagnostica di un outer-join**.
|
||
- **Soffitto strutturale BTC/ETH-direzionale ~1.3** superato SOLO espandendo a un meccanismo diverso:
|
||
cross-sectional su universo Hyperliquid certificato (XS01) → portafoglio Sharpe ~1.55.
|
||
- **Sweep "strategie alternative" (2026-06-20) — 104 ipotesi / 153 agenti / NIENTE di nuovo regge.**
|
||
Ricerca onesta a largo spettro su BTC/ETH+DVOL (harness condiviso vettoriale leak-free
|
||
`scripts/research/alt/altlib.py`, 104 script in `scripts/research/alt/runs/`): 11 famiglie
|
||
(breakout, trend non-TSMOM, mean-rev gated, DVOL/vol, cross-asset pairs, stagionalità, overlay
|
||
rischio, opzioni modellate, microstruttura, ML walk-forward, combo). 16 promettenti, **1 sola**
|
||
sopravvissuta alla verifica avversariale (3 scettici) e comunque NON deployabile. Conferma forte
|
||
del soffitto ~1.3: ogni PASS era hold-out-fitting o **TP01/TSMOM travestito** (trend-beta del
|
||
toro). Unico LEAD: **STA05** (EWMA-cross ensemble, **long-short**) — leak-free, plateau, corr
|
||
hold-out **0.53** a TP01, il blend 0.75·TP01+0.25·STA05 alza l'hold-out 0.31→0.59 (full 1.30→1.24,
|
||
DD 14→16%); MA hold-out corto (536g) → **forward-monitor, non sleeve.** Lezione harness: valutare
|
||
lo Sharpe **MARGINALE vs baseline TP01** (non assoluto) + esigere plateau e jackknife
|
||
drop-one-month sull'hold-out prima di PASS (hanno ucciso 13/14 falsi positivi). Diario
|
||
`2026-06-20-alt-strategies-100agent-sweep.md`.
|
||
- **MARGINAL SCORER (implementato 2026-06-20)** — la lezione "Sharpe marginale, non assoluto" è
|
||
ora codice in `scripts/research/alt/altlib.py`: `study_marginal(name, target_fn)` valuta un
|
||
candidato direzionale BTC/ETH **sia** in assoluto **sia** rispetto al baseline `tp01_baseline_daily()`
|
||
(corr, uplift del blend OOS, beta+alpha residua) e ritorna `earns_slot = (abs!=FAIL) AND
|
||
(marginal==ADDS)`. **Regola: una nuova strategia direzionale si giudica su `earns_slot`, non sullo
|
||
Sharpe assoluto** (gli overlay-su-TSMOM ereditano lo Sharpe di trend e prendono PASS fasulli —
|
||
es. CMB04 PASS assoluto → NEUTRAL marginale). Demo `marginal_demo.py`, test `tests/test_marginal_scorer.py`.
|
||
⚠️ **INDURITO 2026-06-21 (onda ortho):** la versione fisso-HOLDOUT + jackknife-mese era
|
||
ingannabile — 17/18 book relative-value "ADDS" su una sola finestra 2025 (ETH-bleed dove TP01 è
|
||
debole). Tre gate nuovi in `marginal_vs_tp01`: **(1) persistenza multi-cut** (uplift positivo a più
|
||
date di taglio, non solo 2025); **(2) edge in-sample** (`has_insample_edge`: lo Sharpe standalone
|
||
PRE-holdout dev'essere ≥0.5 — un low-corr a Sharpe ~0.3 "aggiunge" solo matematica di
|
||
diversificazione, riportata via `null_pctl_*` vs un asset-rumore a corr-zero); **(3) hedge vs
|
||
alpha** (`is_hedge`: un low-corr che paga SOLO quando TP01 è debole — `corr(Sharpe-TP01, uplift
|
||
annuo)` molto negativa — è un hedge, non alpha). Verdetti nuovi: HEDGE, NOISE. Sull'onda ortho lo
|
||
scorer indurito collassa 17/18 → **1** (`dvol_spread`, unico con edge in-sample reale; comunque
|
||
forward-monitor per multiple-testing/storia DVOL corta). Lezione: un nuovo sleeve si giudica su
|
||
edge-in-sample + persistenza multi-cut + non-hedge, non sull'uplift di una finestra fortunata.
|
||
- **HARNESS REALISM (codificato 2026-06-21, onda intraday)** — due gate nuovi in `altlib.py`,
|
||
test `tests/test_harness_realism.py`:
|
||
- **`day_boundary_robust(target_fn, tf)`** — un effetto ora/sessione/giorno il cui uplift
|
||
marginale **si inverte** spostando il confine del giorno UTC di poche ore è un **artefatto di
|
||
etichettatura calendario** (ha ucciso `open_drive`: +0.23 a 00:00 → −0.33 a +8h → ARTIFACT-RISK).
|
||
Un segnale di prezzo è INVARIANT (spread 0); un effetto calendario vero è ROBUST (resta positivo;
|
||
es. `prevday_range_breakout`). **Regola: ogni segnale calendar/session/hour passa questo test
|
||
prima di crederci.**
|
||
- **`eval_weights_smallcap(df, target, capital=600, min_order=5)`** — a ~$600 un ribilanciamento
|
||
di nozionale < min_order **non si esegue**; la fee proporzionale che `eval_weights` applica a
|
||
migliaia di micro-trade sub-dollaro (tipici di un overlay vol-target) è **finzione**. Salta i
|
||
sub-min_order e riporta lo **Sharpe haircut** reale vs modellato. **Vale per OGNI sleeve a questo
|
||
capitale, TP01 incluso** — lo Sharpe netto onesto a $600 è quello small-cap, non quello modellato.
|
||
- **SELECTION-ON-HOLDOUT gate (codificato 2026-06-29, filone B intraday ERM)** — terzo gate in
|
||
`altlib.py`, test `tests/test_harness_realism.py`. Il lead ERM faceva `earns_slot=True` MA lo script
|
||
di scoperta sceglieva la cella per **`min_hold` massimo** su 60+ celle = **selezione-sull'hold-out**:
|
||
scegliendola in-sample-only ne esce un'altra (trend-beta corr→TP01 0.53, NEUTRAL) e il deflated-Sharpe
|
||
crolla (DSR 0.0-0.24 su 122 trial). `study_marginal` da solo non lo vede (giudica UNO stream, non *come*
|
||
è scelto). Tre funzioni: **`deflated_sharpe()`** (Bailey & Lopez de Prado, PASS ≥0.95), **`select_cell_insample()`**
|
||
(cella scelta col solo Sharpe pre-HOLDOUT), e il gate combinato **`study_family_honest(name, factory, grid, tfs)`**
|
||
→ `earns_slot_honest = earns_slot[cella in-sample] AND deflated-Sharpe≥0.95`. **Regola: una strategia
|
||
direzionale grid-searched si giudica con `study_family_honest`, non chiamando `study_marginal` sulla
|
||
cella a max hold-out.** Chiude il punto cieco gemello di CC01 ("Sharpe implausibile"). Diario
|
||
`2026-06-29-intraday-regime.md` (analisi `scripts/research/intraday_regime_analysis.py`).
|
||
- **Onestà sul target €50/giorno:** NON raggiungibile su 2000 in 1-2 anni (servono ~130k di
|
||
capitale o un DD da rovina). La leva non è la scorciatoia; la via è target-vol + capitale +
|
||
tempo. La strategia che *guadagna* esiste, ma a ~+€1.5/giorno su 2000.
|
||
|
||
Script ricerca: `scripts/research/track{A,B,C,D,E}_*.py` + `trackD_timing.py`.
|
||
|
||
## Obiettivo
|
||
|
||
Ricerca: riconoscimento pattern frattali per trading algoritmico su crypto. Target dichiarato
|
||
€50/giorno partendo da €1.000. **Onestà prima di tutto**: nessun numero va creduto finché non è
|
||
netto fee, out-of-sample, robusto su griglia, e su dati certificati + liquidi + eseguibili.
|
||
|
||
## Stack
|
||
|
||
- **Linguaggio:** Python 3.11+ — **Package manager:** uv (`pyproject.toml`, `uv.lock`)
|
||
- **Dati:** Parquet in `data/raw/` (gitignored). Solo BTC/ETH (5m/15m/1h).
|
||
- **Analisi/ML:** numpy, pandas, scipy, scikit-learn
|
||
- **Fonte dati storici:** Deribit mainnet via `ccxt` (pubblico, tokenless)
|
||
|
||
## Struttura (post-reset)
|
||
|
||
```
|
||
src/data/downloader.py → load_data(asset, tf): legge i parquet certificati da data/raw/
|
||
src/strategies/base.py → Strategy (ABC), Signal, BacktestResult, YearlyStats
|
||
src/strategies/indicators.py → indicatori condivisi (ema, atr, keltner, ...)
|
||
src/strategies/trend_portfolio.py → TP01: strategia DIFENSIVA robusta (PORT LF1d, >=12h), causale
|
||
src/portfolio/ → PORTAFOGLIO DI STRATEGIE estensibile (Sleeve + StrategyPortfolio)
|
||
portfolio.py → combina N sleeve per peso su griglia giornaliera; metriche FULL/hold-out/anno
|
||
sleeves.py → REGISTRY sleeve attivi: TP01 33 / XS01 15 / VRP01 12 / SKH01 20 / GTAA01 20. Aggiungere = una riga
|
||
src/fractal/ → indicatori frattali (patterns.py, indicators.py, similarity.py)
|
||
src/backtest/engine.py → engine di backtesting riusabile
|
||
src/backtest/harness.py → harness ONESTO (load BTC/ETH, backtest_signals no-leakage, OOS)
|
||
src/version.py → APP_VERSION (legge il file VERSION)
|
||
scripts/research/ → ricerca: track{A-I}_*.py + options_vrp_*.py + fetch_dvol.py
|
||
scripts/portfolio/ → run_portfolio.py (report) + xsec_*.py (ricerca/affinamento XS01)
|
||
scripts/live/paper_portfolio.py → paper/forward-only del book attivo TP01+XS01 (1d) (no esecuzione reale)
|
||
scripts/analysis/ → SOLO i tool dati certificati:
|
||
rebuild_history.py → (ri)costruisce lo storico da Deribit mainnet (base 5m + resample)
|
||
certify_feed.py → certifica il feed (integrità, coerenza resample, spike, cross-venue)
|
||
audit_feed.py → audit per-barra vs riferimento esterno
|
||
multi_source_check.py → cross-check multi-venue (quale venue è "vero")
|
||
data/raw/ → btc/eth × {5m,15m,1h} (gitignored). UNICO dato attivo.
|
||
data/instruments_registry.json → registry strumenti (reference)
|
||
docs/diary/ → diario di ricerca (1 voce: il reset; aggiungere dopo ogni esperimento)
|
||
Old/ → ARCHIVIO: tutto il vecchio (strategie, live, ricerca, dati, diari)
|
||
VERSION → semver (2.0.0)
|
||
```
|
||
|
||
## Comandi
|
||
|
||
```bash
|
||
uv sync # installa dipendenze
|
||
uv run python scripts/analysis/rebuild_history.py --asset BTC ETH # (ri)costruisci storico da Deribit mainnet
|
||
uv run python scripts/analysis/certify_feed.py # certifica i feed (locale + cross-venue)
|
||
uv run python scripts/analysis/certify_feed.py --local # solo check locali (veloce)
|
||
uv run python scripts/research/trackD_trendport.py # backtest strategia vincente (full report)
|
||
uv run python scripts/research/trackD_timing.py # vincitrice su 15m/1h/4h/1d + PnL/DD/trade per anno
|
||
uv run python scripts/analysis/fetch_hyperliquid.py # fetch+certify universo Hyperliquid (Cerbero mainnet) -> data/raw/hl_*
|
||
uv run python scripts/portfolio/xsec_research.py # ricerca cross-sectional su Hyperliquid (XS01)
|
||
uv run python scripts/portfolio/run_portfolio.py # report del PORTAFOGLIO attivo (TP01+XS01)
|
||
uv run python scripts/live/paper_portfolio.py # avanza il paper del book TP01+XS01 (forward-only, 1d)
|
||
uv run pytest # test
|
||
```
|
||
|
||
```python
|
||
from src.data.downloader import load_data
|
||
df = load_data("BTC", "1h") # OK. load_data("SOL", ...) -> FileNotFoundError (guardrail: solo dati certi)
|
||
```
|
||
|
||
## IL DATO — fonte di verità (regola di prim'ordine)
|
||
|
||
- **La verità è Deribit mainnet**, perché è dove (in futuro) eseguiamo. Cross-check multi-venue:
|
||
Deribit mainnet è a 0-1 bps dal consenso. **Binance NON è la verità** (è USDT, ~10 bps fuori, e
|
||
sotto depeg USDT fino al 3% off) → usare Binance/Coinbase SOLO come audit indipendente, mai come
|
||
ancora per "ripulire" i dati.
|
||
- **Aggiornare lo storico SOLO con `rebuild_history.py`** (ccxt Deribit mainnet, base 5m unica +
|
||
resample → coerenza interna garantita). **MAI** il vecchio downloader Cerbero (token testnet =
|
||
feed farlocco: è la causa della contaminazione).
|
||
- **Certificare sempre** dopo un rebuild con `certify_feed.py` (integrità OHLC, zero gap, coerenza
|
||
resample maxΔ≈0, spike = solo crash reali, accordo cross-venue per-anno vs Coinbase USD).
|
||
|
||
### Universo ricercabile certificato
|
||
- **BTC / ETH**: puliti (2-6 bps vs Coinbase USD su tutta la storia), liquidi (~0% barre flat a 1h),
|
||
storia lunga (2018/2019→oggi) → **ogni timeframe (5m/15m/1h)**. È l'unico dato in `data/raw`.
|
||
- **Alt Deribit (SOL/XRP/ADA/LTC/DOGE/BNB): FUORI.** Illiquidi (LTC 5m 82% barre flat, run ~3 giorni),
|
||
divergenti, o non certificabili. Archiviati in `Old/data/raw`.
|
||
- **Universo Hyperliquid (Cerbero MCP MAINNET): 19 alt liquidi a 1d, dal 2024** — BTC/ETH/SOL/BNB/XRP/
|
||
DOGE/AVAX/LINK/LTC/ADA/ARB/OP/SUI/APT/INJ/TIA/SEI/NEAR/AAVE. Certificati (`fetch_hyperliquid.py`):
|
||
flat 0%, cross-venue 4-9 bps vs Binance, >1% ≈0% → `data/raw/hl_*_1d.parquet`. **Caveat:** storia
|
||
nativa solo **~2.5 anni** (2024-2026; pre-2024 = backfill, vol 0). Abilita le strategie
|
||
CROSS-SECTIONAL (impossibili a 2 asset). NB: Cerbero col token TESTNET = farlocco; col token
|
||
**mainnet** (`.env.mainnet`) = reale, ma SEMPRE da certificare (cross-venue + liquidità).
|
||
⚠️ **CORREZIONE estrazione (2026-06-20):** il backfill NON è solo pre-2024 — cerbero MCP padda con
|
||
barre SINTETICHE (volume 0, prezzi copiati da Binance → matchano cross-venue e non sono flat) ogni
|
||
asset listato su HL **dopo** lo START. Il `flat`+cross-venue da soli non lo vedono: il rivelatore è
|
||
il **VOLUME**. `fetch_hyperliquid.py` ora (1) taglia il run iniziale a volume 0, (2) scarta chi resta
|
||
< 365g reali (es. **AXS 83% sintetico → fuori**), (3) gata i gap vol=0 interni. Universo certificato
|
||
= **51** (era 52). I **19 major di XS01 hanno 0 backfill → invariati** (strategia live non toccata).
|
||
Verificato direttamente su cerbero MCP. Diario `2026-06-20-cerbero-backfill-fix.md`.
|
||
|
||
## Metodologia obbligatoria per ogni nuova strategia
|
||
|
||
1. **Ingresso eseguibile**: direzione e prezzo decisi con dati **fino a `close[i]`**, mai
|
||
`close[i-1]` con direzione presa da `i`; mai entry sull'estremo (high/low) di una candela.
|
||
2. **Backtest NETTO** dopo fee realistiche Deribit (**0.10% RT** taker; maker ~0%) + leva.
|
||
3. **Out-of-sample** held-out + robustezza su **griglia parametri** (entrambi gli asset, tutte le
|
||
celle positive) + **sweep fee** (0.00-0.20% RT, margine ampio).
|
||
4. **Liquidità & plausibilità** (lezione v2.0.0): incrociare ogni edge con la liquidità reale del
|
||
book (quota di barre flat) e con la plausibilità del prezzo (cross-venue). Un edge full+OOS
|
||
robusto su un book fermo o su wick fantasma NON è un edge.
|
||
5. Strategia in `scripts/strategies/` (codice univoco), test in `tests/`, diario aggiornato.
|
||
|
||
## Lezioni critiche (da NON ripetere — la storia di questo progetto)
|
||
|
||
- **Feed contaminato → libreria fasulla (v2.0.0).** Print fantasma testnet + Binance/USDT hanno
|
||
prodotto edge inesistenti (+201%/+1238%/+16492% "OOS"). Tutti spariti sul feed reale. Lezione: il
|
||
dato viene prima della strategia; certificare sempre.
|
||
- **Look-ahead squeeze (storico).** L'intera famiglia squeeze-breakout aveva accuratezze 76-82% che
|
||
erano artefatto: decideva la direzione con la candela di breakout `i` ma entrava a `close[i-1]`.
|
||
Con ingresso onesto: lancio di moneta. (Dettagli nei diari in `Old/`.)
|
||
- **Entry sugli estremi di candela.** Strategie che entrano a `close` quando `close` è all'estremo
|
||
del range (≤0.1% o ≥99.9%) gonfiano i ritorni in modo irrealistico (ETH 2024: +30.848% → +2.725%
|
||
rimuovendoli). Spesso è un artefatto di dato o di entry non eseguibile.
|
||
- **Mean-reversion vs breakout.** Sui dati storici l'unica direzione che mostrava edge era la
|
||
mean-reversion (i breakout rientrano) — MA anche quegli edge erano per lo più artefatto del feed:
|
||
da riverificare da zero su dati certi.
|
||
- **Fee** = vincolo di prim'ordine. 0.10% RT baseline. Molte operazioni = morte per fee.
|
||
- **Leva**: testare 3x; 5x raddoppia il drawdown. I numeri a leva alta NON sono il caso base.
|
||
- **Data leakage** con rendimenti log: `returns[k] = log(close[k+1]/close[k])` usa `close[k+1]`. I
|
||
feature devono fermarsi a `returns[i-2]` se il prezzo corrente è `close[i-1]`. Verificare SEMPRE.
|
||
|
||
## Convenzioni
|
||
|
||
- Strategie in `scripts/strategies/` con codice univoco; scartate documentate nel diario.
|
||
- Diario in `docs/diary/YYYY-MM-DD.md`, aggiornato dopo ogni esperimento significativo.
|
||
- **Nessun segreto nei commit** (token/chiavi). `.env` e `.env.mainnet` sono gitignored.
|
||
- Versionamento: `VERSION` (semver) + `scripts/bump_version.py`. `src/version.py` lo legge.
|
||
|
||
## Archivio `Old/`
|
||
|
||
Tutto il lavoro pre-reset (preservato in git per consultazione storica): strategie
|
||
(`Old/scripts/strategies`), stack live e portafogli (`Old/src/live`, `Old/src/portfolio`,
|
||
`Old/scripts/portfolios`), ricerca/gate (`Old/scripts/analysis`), dati non certificati
|
||
(`Old/data`), 60+ diari (`Old/docs/diary`), test (`Old/tests`). Consultabile come riferimento
|
||
("come facevamo X"), ma **nessun edge lì dentro è fidato** finché non è ri-validato su dati certi.
|
||
```
|