Compare commits
347 Commits
v2.0.0
..
f10d847816
| Author | SHA1 | Date | |
|---|---|---|---|
| f10d847816 | |||
| 4f91b25b72 | |||
| ee5c6ed539 | |||
| 14e1567125 | |||
| 426735448e | |||
| 2751a7efd0 | |||
| 11a2370027 | |||
| b237ad2e8b | |||
| 214599e0a8 | |||
| 12dc04c969 | |||
| 782c0ce4bc | |||
| 7456be1ce5 | |||
| f5d9409213 | |||
| 1803e0ac9f | |||
| 10c373075c | |||
| 0cd0747e95 | |||
| 8c0b5f97ee | |||
| cdec81c5bc | |||
| e48de7fcc7 | |||
| 273a43ad6a | |||
| ab4590c326 | |||
| 80ca982f64 | |||
| 00f55fd753 | |||
| 37c83c11c9 | |||
| 8c57274bac | |||
| c97f221c62 | |||
| 73207f79b9 | |||
| 4a849f3f74 | |||
| bf617b75ff | |||
| 8694da31bc | |||
| aaddd2c93c | |||
| 9d23ea2ef0 | |||
| e428659851 | |||
| f5ebe689da | |||
| 892ca6e214 | |||
| ab497cc028 | |||
| caa7cc4020 | |||
| f4551090f5 | |||
| 8c2fa6e46c | |||
| a4c9fca77a | |||
| e7ee0738a3 | |||
| 58395a594e | |||
| 89ab19aed5 | |||
| c4514fc2c7 | |||
| d84471e6f7 | |||
| 5700280f65 | |||
| c7ec178499 | |||
| af19892c20 | |||
| 7d4f0c328e | |||
| 4e1dae5c09 | |||
| 9cb3465374 | |||
| e2aee5730b | |||
| fd8d5441af | |||
| 5f6aa90180 | |||
| ca1e766069 | |||
| 33c24b14b2 | |||
| 279c70222b | |||
| 13daccf6de | |||
| 7264a8fe90 | |||
| 696f2e5bdd | |||
| 824531b5ba | |||
| fc55698096 | |||
| 6f74dcb843 | |||
| 96d37c7013 | |||
| 8e7d181171 | |||
| 790849cb54 | |||
| 3e3b41d842 | |||
| 0ff03babae | |||
| 09bae3b9ea | |||
| 3a4592bdfc | |||
| 9973b04bc1 | |||
| 0f64eb4720 | |||
| f5d88f10bb | |||
| db9d844351 | |||
| ef30c20af5 | |||
| 1d513632c7 | |||
| df08460af0 | |||
| 2da765bcbb | |||
| 758bcce97f | |||
| fc0c0a2923 | |||
| ee5cbb2c08 | |||
| d930492d47 | |||
| 8eaf7aa730 | |||
| 73ae21c955 | |||
| ebc8cf7d7c | |||
| dd4391b55b | |||
| bcffcc01af | |||
| a1407874cb | |||
| 89af0554d5 | |||
| e460caf667 | |||
| fd37add518 | |||
| 74539db8b8 | |||
| aaa32daff7 | |||
| 1b5ddd1ba1 | |||
| 409de063f6 | |||
| 82ccff2553 | |||
| 93ce12931a | |||
| 1ec928cf09 | |||
| 0f2e195674 | |||
| 103dd7bce5 | |||
| 0bcc5bc5d0 | |||
| 827ae54dc1 | |||
| 272622b6e8 | |||
| 93147a95c8 | |||
| fbb6e75e67 | |||
| cef559b350 | |||
| 987569c5a3 | |||
| fe6ad97225 | |||
| 1750b5a93b | |||
| b6c0deb866 | |||
| 32ed18222e | |||
| 5fe931e00d | |||
| 090129359b | |||
| ea22a0e20c | |||
| f0122d97a1 | |||
| f975272ec8 | |||
| e8bbb92f8a | |||
| aa72e0c9ed | |||
| 110f894bdf | |||
| 75606d0f44 | |||
| f4b14f305b | |||
| bd5b634209 | |||
| 14c1a75a7e | |||
| 3b206c8e6d | |||
| ff4aa94528 | |||
| fa86a7b089 | |||
| cb8d9e2a0e | |||
| eec76424ee | |||
| 8cfe15cbd5 | |||
| fac9978d87 | |||
| e69cc5bd81 | |||
| c932fab304 | |||
| b1c3ff1bb8 | |||
| 3bc620e914 | |||
| 02e0cf775f | |||
| 963776e5d2 | |||
| ba5ea2f5c3 | |||
| ed2532b991 | |||
| 56141b0ffe | |||
| 68c6894d85 | |||
| f81c783ea7 | |||
| fb01c5714c | |||
| 36dc55748e | |||
| 04cb572535 | |||
| a2f28153d8 | |||
| 933ccff057 | |||
| e9a4538054 | |||
| 444b804415 | |||
| d55eb13533 | |||
| 8c18e82f1a | |||
| 7d64dd4c2b | |||
| 0a77290636 | |||
| 067c89fc16 | |||
| fa18621eb3 | |||
| 1aa5a0616a | |||
| 17b0f2cb47 | |||
| fd05307c96 | |||
| 3f0812c7fc | |||
| 378f448450 | |||
| d0c804ebfc | |||
| 842b0e865b | |||
| be4690375f | |||
| 6664575e1c | |||
| b3082de9af | |||
| dc4135a781 | |||
| 95f7fb30a3 | |||
| 66b4b2b9c0 | |||
| bdd9e60355 | |||
| 95caeb87da | |||
| e320e3c2ba | |||
| a1b4416ac0 | |||
| 1296fa2d96 | |||
| 28b63cf3a3 | |||
| 8b21d29e69 | |||
| b023cc2bdf | |||
| eb7c3af636 | |||
| 1227b2baab | |||
| d1cf44f874 | |||
| 4703f75f9f | |||
| e8ce60d41c | |||
| 1dd26342ca | |||
| 4450321a81 | |||
| ab5bcace16 | |||
| 0ec6f8b761 | |||
| dc60624772 | |||
| 3a44171402 | |||
| 29626210e6 | |||
| a937e3766f | |||
| 0050ac4782 | |||
| 326229188a | |||
| ff3ec6795a | |||
| 825bf081f4 | |||
| 75713a5ec4 | |||
| 842420ce7b | |||
| 5e2b4bd308 | |||
| b9b2ef1b26 | |||
| 7453a29699 | |||
| 37be1df838 | |||
| 6d0813a399 | |||
| c8d31bc944 | |||
| 36d3361075 | |||
| 031b71bf54 | |||
| 4b2de1ce87 | |||
| 841f48c319 | |||
| 444c251e3b | |||
| 2c3882b60c | |||
| 8b4c698ad9 | |||
| 4cb82dc474 | |||
| 8831c3ff38 | |||
| 607cd94ecd | |||
| 3266f3a09a | |||
| 6f64845aa9 | |||
| ea6743d6b0 | |||
| 7b567c8435 | |||
| 71b39c2c86 | |||
| 8a2fede2d5 | |||
| ec1501caa6 | |||
| b8c9430bd7 | |||
| 9af6693e4f | |||
| 741bbc2c09 | |||
| d606cd3548 | |||
| 05d069f336 | |||
| 636be89b2b | |||
| 00996640fb | |||
| 4c1961d77b | |||
| b65f067f69 | |||
| 2320fa9cec | |||
| 5c48a8322a | |||
| 2e7178487d | |||
| acfba63420 | |||
| 870428e559 | |||
| 7ebb1b8c37 | |||
| ddc980a097 | |||
| 7534b08be0 | |||
| 67f7b89e4c | |||
| 9fa3e6a0be | |||
| b691f48f43 | |||
| 822aa1307e | |||
| cf7de40dc0 | |||
| eef200cf14 | |||
| 116abf5203 | |||
| 26f8d27a61 | |||
| 76120b59c2 | |||
| a74cc69583 | |||
| 73d74c5e53 | |||
| e6657fcb16 | |||
| 491411ac77 | |||
| ccf5e38101 | |||
| 567046953d | |||
| 31369b358c | |||
| 88f5f5a02a | |||
| ee82e0a056 | |||
| c52e0ab3f8 | |||
| cff5fa2bf5 | |||
| 02d875b07b | |||
| b4ec92734c | |||
| aad69f9790 | |||
| a158d0e2ae | |||
| e28176efef | |||
| 8d559c6f33 | |||
| 555977d987 | |||
| 8c3868cb31 | |||
| 9d586eeb58 | |||
| 69e3517f1b | |||
| cf72e395d3 | |||
| db738bce3b | |||
| 25a22fc7c1 | |||
| eeac97dde4 | |||
| c8a390d6b7 | |||
| 384b9cb0af | |||
| 160ad300be | |||
| 50e2adf837 | |||
| 7eb0f67956 | |||
| 8d1fe173f7 | |||
| de72e3ce1f | |||
| 8e46a62e67 | |||
| c7c07f4c35 | |||
| 2d8faf3896 | |||
| 64d98a070d | |||
| 237ca8da13 | |||
| 856a02fcc5 | |||
| 010d1f0733 | |||
| 1c15c3c1be | |||
| 3a3bdd5c7b | |||
| f983cc2447 | |||
| 389573e517 | |||
| 3b552a92da | |||
| 09c8bb7de8 | |||
| c4bc336a53 | |||
| 55c337144e | |||
| d916520f2c | |||
| d2d535cf6a | |||
| 67850b0dd8 | |||
| 437cf11199 | |||
| c9b89739c1 | |||
| 03267b8fc3 | |||
| 1c0b5f1869 | |||
| 61180637eb | |||
| 745ba7d066 | |||
| 043f141bf1 | |||
| b388c462e8 | |||
| 8514c096ea | |||
| b5db59bea9 | |||
| 5cce7acfe1 | |||
| d5dd6f4b72 | |||
| 4ae3b42442 | |||
| 24565974c0 | |||
| 62d3b23cc6 | |||
| 0adc69a357 | |||
| 1afb1014c9 | |||
| f5d30d88b9 | |||
| 9612560479 | |||
| 5ac4e16af8 | |||
| bf84bc91e2 | |||
| 3cba5bb9d0 | |||
| e5e2d3ec9b | |||
| 4650aa71a2 | |||
| bc9e322d0d | |||
| a3d6b97db6 | |||
| cddea50c5a | |||
| c00f6016df | |||
| 715f197cf2 | |||
| bec2fb2089 | |||
| 9c48cdd884 | |||
| 9ed2ea4b13 | |||
| c6236ed5d9 | |||
| 75e1aacd19 | |||
| 92a63feb9c | |||
| 26e977d338 | |||
| 0d9f483131 | |||
| 87dd56a9ce | |||
| fd5a0bd3cf | |||
| bf6ade51af | |||
| 182d4eeac2 | |||
| 8426d05f12 | |||
| 53d0134cb1 | |||
| 8f9ce89039 | |||
| 87af03955c | |||
| 790caefd52 | |||
| a5a61ac7e3 | |||
| 18f22160b2 | |||
| ef52ad6a79 | |||
| 12754c4908 | |||
| 756a2bdf04 | |||
| d152941360 | |||
| 55c28e51b2 | |||
| 38c8cdf25b |
@@ -0,0 +1,11 @@
|
|||||||
|
Old/
|
||||||
|
data/
|
||||||
|
.venv/
|
||||||
|
.git/
|
||||||
|
logs/
|
||||||
|
__pycache__/
|
||||||
|
**/__pycache__/
|
||||||
|
*.pyc
|
||||||
|
.env
|
||||||
|
.env.mainnet
|
||||||
|
docs/
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
# Credenziali IB Gateway PAPER per la ricerca dati (account paper, es. DUQ513966).
|
||||||
|
# COPIA questo file in .env.ibgw (gitignored) e riempi i valori REALI.
|
||||||
|
# cp .env.ibgw.example .env.ibgw && chmod 600 .env.ibgw && nano .env.ibgw
|
||||||
|
# NON committare mai .env.ibgw. Sono credenziali del CONTO PAPER (nessun denaro reale),
|
||||||
|
# l'API e' comunque READ_ONLY (solo dati storici, nessun ordine).
|
||||||
|
TWS_USERID=il_tuo_username_paper
|
||||||
|
TWS_PASSWORD=la_tua_password_paper
|
||||||
+47
@@ -6,6 +6,8 @@ build/
|
|||||||
.venv/
|
.venv/
|
||||||
.env
|
.env
|
||||||
!.env.example
|
!.env.example
|
||||||
|
.env.ibgw
|
||||||
|
!.env.ibgw.example
|
||||||
.vscode/
|
.vscode/
|
||||||
.idea/
|
.idea/
|
||||||
.DS_Store
|
.DS_Store
|
||||||
@@ -29,6 +31,7 @@ data/funds_watch.json
|
|||||||
|
|
||||||
# dati regime (DVOL/funding/feature cache, rigenerabili)
|
# dati regime (DVOL/funding/feature cache, rigenerabili)
|
||||||
data/regime/
|
data/regime/
|
||||||
|
data/venue_watch/
|
||||||
_disp_scratch/
|
_disp_scratch/
|
||||||
data/regime/dispersion_features.parquet
|
data/regime/dispersion_features.parquet
|
||||||
|
|
||||||
@@ -43,3 +46,47 @@ data/games/
|
|||||||
# archived data (mirrors top-level data/ ignores, which are top-level-anchored)
|
# archived data (mirrors top-level data/ ignores, which are top-level-anchored)
|
||||||
Old/data/
|
Old/data/
|
||||||
Old/**/__pycache__/
|
Old/**/__pycache__/
|
||||||
|
# run logs (rigenerabili dagli script)
|
||||||
|
logs/
|
||||||
|
|
||||||
|
# cache di ricerca rigenerabile (serie d'ancora, tabelle di segnale intra-bin SKH01):
|
||||||
|
# 22MB, ~2.4h a ricostruirla, ma e' DERIVATA dai parquet certificati -> non si versiona.
|
||||||
|
data/_cache/
|
||||||
|
|
||||||
|
# cache della ricerca trackE (rigenerabile)
|
||||||
|
.cache_trackE_*.npy
|
||||||
|
|
||||||
|
# feed backup pre-rebuild (binari rigenerabili, NON in git) + stato paper trader (runtime)
|
||||||
|
data/_feed_backup/
|
||||||
|
data/paper_trend/
|
||||||
|
data/paper_portfolio/
|
||||||
|
|
||||||
|
# output grezzo dello sweep di ricerca xsec (rigenerabile dagli script in runs/)
|
||||||
|
scripts/research/xsec/runs/out/
|
||||||
|
|
||||||
|
# blind-signal derived data (regenerable via make_blind.py)
|
||||||
|
data/blind/
|
||||||
|
scripts/research/blind/leaderboard.json
|
||||||
|
|
||||||
|
# forward-monitor runtime state (regenerable, forward-only)
|
||||||
|
data/paper_prevday/
|
||||||
|
data/paper_combo/
|
||||||
|
data/paper_statarb/
|
||||||
|
data/paper_xsr/
|
||||||
|
data/paper_dvolspread/
|
||||||
|
# stato della sorveglianza fee (ultima lettura del tier Deribit, per rilevarne i cambiamenti)
|
||||||
|
data/fee_watch/
|
||||||
|
# battuta di cuore del collettore catena (stato runtime, come gli altri monitor)
|
||||||
|
data/chain_collect/
|
||||||
|
data/vrp_f_watch/
|
||||||
|
|
||||||
|
# log esecuzioni del book live (stato runtime, contiene fill/fee del conto reale)
|
||||||
|
data/live/
|
||||||
|
|
||||||
|
# dati esterni di ricerca (on-chain CoinMetrics community, F&G) — non certificati, non in git
|
||||||
|
data/external/
|
||||||
|
data/options_daily/
|
||||||
|
|
||||||
|
# libro di bordo: il DB e' dato operativo (coperto dal backup), non codice
|
||||||
|
data/live/trades.db
|
||||||
|
data/cache_regime_capitale.json
|
||||||
|
|||||||
@@ -1,133 +1,482 @@
|
|||||||
# PythagorasGoal — Istruzioni per agenti
|
# PythagorasGoal — Istruzioni per agenti
|
||||||
|
|
||||||
## Stato del progetto — v2.0.0 RESET (2026-06-19)
|
**Come si usa questo file.** Qui sta solo cio' che serve per **non sbagliare una decisione**:
|
||||||
|
stato, book, numeri citabili, decisioni vincolanti, gate con la loro data, debiti aperti, regole.
|
||||||
|
Il racconto completo — 69 filoni di ricerca, le misure, i controesempi, gli errori corretti — sta
|
||||||
|
in `docs/memory/`, estratto **verbatim** da questo file il 2026-08-25 (nulla riscritto, nulla perso).
|
||||||
|
|
||||||
**LEGGERE PRIMA DI TUTTO.** Il progetto è stato resettato dopo aver scoperto che l'intera
|
⚠️ **Prima di riaprire un tema, apri il file di memoria che lo copre.** Quasi tutto e' gia' stato
|
||||||
libreria di strategie "validata OOS" (FADE, PAIRS, DIP01, TR01, ROT02, TSM01, XS01, SH01) era
|
misurato, e **il motivo per cui una cosa e' morta vale piu' dell'esperimento che l'ha uccisa**:
|
||||||
**artefatto di uno storico contaminato** — print fantasma del feed Cerbero **testnet** + storico
|
chi la riapre deve battere il motivo, non ripetere la misura.
|
||||||
**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:
|
| file | contiene | aprilo quando |
|
||||||
- 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).
|
| `docs/memory/10-sleeve-e-candidati.md` | TP01 · XS01 · VRP01 · SKH01 · GTAA01 · XSR01, portafoglio | tocchi uno sleeve o i pesi |
|
||||||
- Tutto il codice vecchio (strategie, stack live, ~100 script di ricerca/gate, dati non
|
| `docs/memory/20-ondate-e-scartati.md` | 69 filoni, ogni scartato col suo perche' | hai un'idea "nuova" |
|
||||||
certificati, 60+ diari) è **archiviato in `Old/`** (preservato in git, non cancellato).
|
| `docs/memory/30-piano-capitale-fisco.md` | muri, versamenti, rischio venue, fisco, prop firm | parli di soldi, rendita, orizzonti |
|
||||||
- L'esecuzione è **DISABILITATA**, il conto mainnet è flat. **Non c'è trading live attivo.**
|
| `docs/memory/40-produzione-e-deploy.md` | esecutore, tripwire, monitor, libro di bordo, PRIIPs/UCITS | tocchi cio' che gira con soldi veri |
|
||||||
- Si riparte dalla ricerca di strategie NUOVE, su dati certi, con la metodologia qui sotto.
|
| `docs/memory/50-dati-e-feed.md` | difetti del dato trovati e riparati, catena opzioni | tocchi i feed |
|
||||||
|
| `docs/memory/60-metodo-e-gate.md` | i gate codificati in `altlib.py` | valuti un candidato |
|
||||||
|
| `docs/research/RESULTS-0822.md` | registro per filone §1-70 | vuoi il dettaglio di un filone |
|
||||||
|
| `docs/diary/` (123 voci) | la sessione originale, per data | vuoi il contesto completo |
|
||||||
|
|
||||||
## Obiettivo
|
---
|
||||||
|
|
||||||
|
## 0. Stato — v2.0.0 RESET (2026-06-19)
|
||||||
|
|
||||||
|
**LEGGERE PRIMA DI TUTTO.** Il progetto fu resettato dopo aver scoperto che l'intera libreria di
|
||||||
|
strategie "validata OOS" era **artefatto di uno storico contaminato** (print fantasma del feed
|
||||||
|
Cerbero **testnet** + storico **Binance/USDT**). Ri-testate sul feed reale, tutte perdono ogni anno.
|
||||||
|
Documento di fondazione: `docs/diary/2026-06-19-deribit-history.md`.
|
||||||
|
|
||||||
|
- Lo storico e' **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 pre-reset e' archiviato in `Old/` (preservato in git, non cancellato).
|
||||||
|
- **L'esecuzione e' ARMATA e LIVE** su Deribit mainnet dal 2026-06-20. Capitale reale **~$635**
|
||||||
|
(NON i €2.000 nominali del paper trader).
|
||||||
|
- Si riparte dalla ricerca di strategie NUOVE, su dati certi, con la metodologia della §8.
|
||||||
|
|
||||||
|
📌 **La riga che chiude sei ondate e 69 filoni:** *la ricerca ha smesso di essere il vincolo binding
|
||||||
|
il 2026-07-26, e sei ondate lo hanno **confermato** invece che ribaltarlo.* I vincoli binding sono
|
||||||
|
**il capitale che entra** e **il conto che non sparisce**. Il miglior lead misurato vale
|
||||||
|
**+0,046 €/giorno**; versare €500/mese invece di €250 porta P(traguardo a 20 anni) dal 14% all'85%.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Il book
|
||||||
|
|
||||||
|
**LIVE (soldi veri).** Deribit mainnet, **TP01 + SKH01 a 75/25**, nettati in software su **una sola
|
||||||
|
posizione per asset** (`src/live/book.py`: `W_TP01=0.75`, `W_SKH=0.25`, `WEIGHT=0.5` → 50/50 BTC/ETH).
|
||||||
|
Esecutore `scripts/live/book_execute.py`, cron **orario** `scripts/cron_book.sh` (minuto **:47**
|
||||||
|
dal 2026-08-25; era `:07`). Due vincoli, entrambi misurati: fuori dai ~26s del minuto tondo
|
||||||
|
(rate-limit per-IP) **e** fuori dallo slot di release Deribit (**martedi' 09:00 UTC**, 15-30 min
|
||||||
|
annunciati), che il `:07` beccava — 4 volte in 63 giorni. **GTAA01, XS01, VRP01, XSR01 NON sono
|
||||||
|
nel book live.**
|
||||||
|
|
||||||
|
**RICERCA (paper).** Portafoglio a 5 sleeve `src/portfolio/sleeves.active_sleeves`:
|
||||||
|
TP01 33 / XS01 15 / VRP01 12 / SKH01 20 / GTAA01 20. **Non e' il book live** — quasi tutti i numeri
|
||||||
|
di portafoglio del progetto sono su questa serie, non su quella che gira.
|
||||||
|
|
||||||
|
**Guardrail live** (`config/live.json`, unica autorita' — **non ridichiararli nel codice**):
|
||||||
|
cap per-asset **`equity × 0.5`, SENZA tetto assoluto**, quando l'equity reale e' leggibile;
|
||||||
|
`min($3.000, watermark × 0.5)` **solo nel fallback** a equity illeggibile (watermark
|
||||||
|
`data/live/equity_seen.json`). ⚠️ Fino al 2026-08-25 questa riga dichiarava `min($3.000, …)`
|
||||||
|
come se valesse sempre: **falso** — `max_notional_per_asset_usd` non morde mai sul percorso
|
||||||
|
normale (verificato in `src/live/book._cap`). Conseguenza: **il book scala all'infinito a leva
|
||||||
|
lorda massima 1,0x**, e nessun livello di capitale cambia il profilo di rischio relativo. ·
|
||||||
|
`min_order_usd` 5 · `disaster_sl_pct` 0.30 on-book sulla posizione **netta** · staleness-gate feed
|
||||||
|
2 giorni (blocca) · `skh_feed_max_age_min` 30 (allerta, **non** blocca) · alert Telegram.
|
||||||
|
|
||||||
|
⚠️ **Il nome "disaster-SL −30%" inganna:** e' **rotolante e simmetrico**, non un massimo di perdita
|
||||||
|
per trade. Su cicli a ingresso proprio lascia passare perdite oltre −30% senza scattare, e il
|
||||||
|
peggior DD dall'ingresso misurato e' **−60,6% BTC / −61,5% ETH**. Dettaglio in `40-produzione`.
|
||||||
|
|
||||||
|
**Candidati in forward-monitor** (nessuno nel book): XSR01 · DVOLSPREAD · STATARB · PREVDAY.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. I numeri da citare — e quelli da NON citare
|
||||||
|
|
||||||
|
Ogni numero di questo progetto va scritto **con la sua lente e la sua banda**. Le stime canoniche
|
||||||
|
sono all'ancora fortunata; le stime oneste sono la **mediana della banda d'ancora**.
|
||||||
|
|
||||||
|
| grandezza | ❌ non citare | ✅ citare |
|
||||||
|
|---|---|---|
|
||||||
|
| Sharpe FULL book 5-sleeve | 2,222 (canonico, 97° pctl) | **1,95** [1,81 – 2,12] |
|
||||||
|
| Sharpe HOLD-OUT book | 2,364 (canonico, **99,6°** pctl) | **1,54** [1,11 – 1,91] |
|
||||||
|
| maxDD FULL book | 6,07% | **6,85%** [5,99 – 7,94] |
|
||||||
|
| TP01 hold-out | 0,31 | **~+0,05** — il valore di TP01 e' il **taglio del DD ~6× vs buy&hold**, non il ritorno |
|
||||||
|
| XS01 standalone | 1,50 / 1,71 / DD 11% | ensemble di fase **1,25 / 1,31 / 10,9%**; maxDD fuori campione **21%** |
|
||||||
|
| SKH01 | i numeri di ammissione | de-luckato e' **il meno affidabile dei cinque** (l'ancora regala 2/3 del FULL) |
|
||||||
|
| VRP01 | f = 1,00 | **f = 0,73** misurato sulle quote reali (IC95 [0,698; 0,780]) |
|
||||||
|
| muro capitale-rendita | $272k (lordo) | **$313k** al netto di fisco **e** funding — banda **[$187k – $1,14M]** |
|
||||||
|
| P(≥50 €/g), canale funded, 36 mesi | 42% | **2,6%** [1,5 – 4,7], P(zero) 40,3% |
|
||||||
|
| XSR01 | Sharpe 1,82 (e' una **terza** lente, divisore fisso 50) | **1,79** alla scoperta / **1,56-1,63** a oggi — lente dei gate, sole barre chiuse. Citare sempre la coppia (lente, ultima barra chiusa) |
|
||||||
|
| soffitto direzionale BTC/ETH | ~1,3 | **~1,15** col funding dentro |
|
||||||
|
|
||||||
|
📌 **Il libro a k=1 rende MENO dell'S&P 500** (15,19% contro 17,40%, stessa finestra): il vantaggio
|
||||||
|
sta nello **Sharpe** (1,35 vs 0,89), e **senza leva non si converte in rendimento**. A iso-rischio
|
||||||
|
farebbe +9,0 punti sopra l'indice; a k=1,40 (max difendibile) +3,9 con meno vol. ⇒ **senza leva il
|
||||||
|
libro non si giustifica come veicolo di ACCUMULO, si giustifica come veicolo di RENDITA** — dove
|
||||||
|
serve **2,5× meno capitale** ($254k contro $646k) perche' la perpetua vive sul drawdown (misura
|
||||||
|
2026-08-25, `r0825_piano_10a_500.py`). E **tutta la leva autorizzabile vale quanto €100-150/mese**:
|
||||||
|
k=1,25 (+15,6% a 10 anni) vale **meno** di €100/mese in piu' (+19,1%).
|
||||||
|
|
||||||
|
📌 **L'equivalenza che ordina il piano:** **€100/mese in piu' == +4,07%/anno di drift** (+27% su
|
||||||
|
tutto il drift del libro). A 10 anni i bonifici fanno il **59%** del risultato.
|
||||||
|
|
||||||
|
📌 **Il libro e' FLAT il 28,0% dei giorni** sull'intera storia (2,7% nel 2021, 77,0% nel 2022,
|
||||||
|
75,6% nel 2026); live, esposto **14 giorni su 64**, leva lorda mediana **0,00x** e **max 0,52x** su
|
||||||
|
un tetto di 1,0x. **Il cap non ha mai morso: il vincolo e' il segnale.** Riempire quel vuoto con
|
||||||
|
l'ETF e' stato **misurato e SCARTATO** il 25/08 (`20-ondate`).
|
||||||
|
|
||||||
|
🚨 **Tre baseline diverse girano sotto lo stesso nome "libro 75/25"**, e lo spread fra loro (0,12 di
|
||||||
|
Sharpe, 1,7pp di maxDD) e' **piu' grande di quasi tutti gli effetti che il progetto misura**:
|
||||||
|
`hourly` **1,683 / 11,22%** (la lente di **ogni muro e ogni traiettoria**) · `canonical` 1,800 / 9,56%
|
||||||
|
· mediana d'ancora 1,626 / 10,4%. **Un Δ accostato al baseline sbagliato cambia piu' del Δ stesso.**
|
||||||
|
|
||||||
|
🚨 **«Positivo in N/N ancore» NON e' N osservazioni.** Correlazione media fra le 24 ancore di TP01
|
||||||
|
0,631 → **N_eff 1,55**; fra le 10 fasi di XS01 0,790 → **N_eff 1,23**. E non si salva sulla differenza
|
||||||
|
appaiata (N_eff 1,64-2,24). La **banda d'ancora e' ~4× piu' stretta dell'IC95 bootstrap, che CONTIENE
|
||||||
|
LO ZERO**. Si cita come *robustezza alla scelta dell'ancora* (~2 osservazioni), **mai** come N prove,
|
||||||
|
**mai** come intervallo di confidenza, e **mai** con un p-value attaccato a un conteggio di ancore.
|
||||||
|
*Cade la precisione dei numeri, non la direzione delle decisioni.*
|
||||||
|
|
||||||
|
🚨 **Il funding dei perpetual non e' modellato in NESSUN backtest** (verificato: zero occorrenze in
|
||||||
|
`harness.py`, `trend_portfolio.py`, `sleeves.py`, `portfolio.py`, `src/live/`). Costo misurato:
|
||||||
|
**−2,16%/anno di drift** (2019-2026), −1,39% sulla finestra dello strumento vero, −0,55% sul 2025+.
|
||||||
|
Esposizione e funding sono **positivamente correlati** → il prodotto ingenuo *esposizione media ×
|
||||||
|
tasso medio* **sottostima di ~2×**. E' una tassa sul **drift**, quindi colpisce i **muri** molto piu'
|
||||||
|
dello Sharpe.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Decisioni vincolanti dell'operatore
|
||||||
|
|
||||||
|
Prese **con l'informazione completa**, non sviste da correggere. Se qualcuno le ripropone "come da
|
||||||
|
CLAUDE.md", la risposta e' la colonna *cosa la riapre*.
|
||||||
|
|
||||||
|
| decisione | data | non si ri-discute | cosa la riapre |
|
||||||
|
|---|---|---|---|
|
||||||
|
| **100% Deribit fino a $20k** — accettato P(perso tutto) 10/18/34/64% a p=0,5/1/2/5% invece di 0/0/4/27% | 26/07 | la soglia $3k | **$20k**, o un cambio di piano, o `p` che diventa stimabile invece che assunto |
|
||||||
|
| **SOL escluso** — universo direzionale resta BTC/ETH (presidiato da un test) | 22/08 | SOL su un book a 2 gambe con questi dati | ~3 anni di storia SOL certificata (**non prima del 2028**), o un meccanismo che non sia TP01/SKH01 congelati |
|
||||||
|
| **Niente short-vol da modello in deploy** — e niente long-vol scalp da modello | 19/06 | — | un `f` di stress reale misurato su un crash catturato |
|
||||||
|
| **Non de-esporre il weekend** (porta il 38% del gross di TP01 nel 31% del tempo) | 17/07 | — | ogni proposta "risk-off weekend" parte **REFUTED** salvo null de-levering superato |
|
||||||
|
| **Peso 75/25 confermato 3 volte** (24/07, 26/07, 24/07-follow-up) | 26/07 | — | `weights_tilt_null` superato, che finora **fallisce** |
|
||||||
|
| **Fee Deribit: ≤5 bps/lato → non si tocca nulla; >10 bps → rivedere il peso SKH01** (regola decisa *prima* di vedere il numero) | 26/07 | — | il sorvegliante `fee_watch` allerta da solo |
|
||||||
|
| **Gradino di leva NON autorizzato oggi.** 1,25x autorizzabile *a condizione*; **1,50x BOCCIATO** (peggior giorno strutturale 21,48% > 20%); **k max difendibile 1,40** | 23/08 | il 1,50x | costruire prima una **chiave di scala esplicita** in config **e** rifare `r0726_fee_sensitivity` |
|
||||||
|
|
||||||
|
⚠️ **La regola *"ogni cambio di scala passa dal cap di config, non da `target_vol`"* NON E'
|
||||||
|
IMPLEMENTABILE COME SCRITTA:** verificato che in `config/live.json` **non esiste una chiave di scala**
|
||||||
|
— servirebbe toccare `WEIGHT`/`W_TP01`/`W_SKH` in `src/live/book.py`, cioe' codice su un percorso con
|
||||||
|
soldi veri. Specifica pronta in `docs/research/SPEC-scale-key.md` (`GATE SCALA-01`, 9 condizioni, con
|
||||||
|
il **tetto sul PRODOTTO** `n_asset · frac · scala · disaster_sl_pct ≤ 0,50` — non sulla singola chiave).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Gate pre-registrati — con la loro data
|
||||||
|
|
||||||
|
Un gate si decide **alla data**, coi criteri scritti **prima**. Anticiparlo e' selezione
|
||||||
|
sull'hold-out; cambiarne le soglie guardando l'esito, pure.
|
||||||
|
|
||||||
|
| gate | data | criterio | stato |
|
||||||
|
|---|---|---|---|
|
||||||
|
| **STATARB** | 2026-09-27 | soglie 24/07 (non toccate) + diagnostica statica sempre-short | 🚨 **si ribalta col difetto `advance()`**: riparata → RITIRO, attuale → candidato |
|
||||||
|
| **XSR01** | 2026-10-23 | Sharpe ≥1,0 **E** haircut a $5.000 ≤40% (se sfonda → ritiro a prescindere), poi `weights_tilt_null` e capitale ≥$5k | 🚨 legge un monitor **mal tarato** (§5.3), e P(capitale ≥$5k quel giorno) = **0,0%** (mediana $2.635) → **il criterio di capitale non e' raggiungibile**. Sotto la lente RENDITA il sleeve e' **eguagliato da un conto remunerato** (📌 sotto) |
|
||||||
|
| **DVOLSPREAD** | kill 2026-10-24 se Sh<−0,50; decisione 2027-01-24 | (a) Sharpe>0 (b) marginale ADDS+robust_oos+insample_edge (c) **DSR ≥0,95** (d) `weights_tilt_null`; **veto** se barre attive <80% → si estende, non si decide | il veto **non scatta** su una serie che registra 2 min/giorno (§5.1) |
|
||||||
|
| **GATE PROP-01** | chiuso 22-23/08 | (a) listino 13/13 ✅ (b) ancora SKH01 23/23 ✅ (c) economica+sopravvivenza 2/2 ✅ | **chiuso 3/3** — ma il numero operativo e' sceso 42% → 7,8% → 4,4% → 2,6% |
|
||||||
|
| **GATE PREVDAY-01** | scritto 23/08 | 10 condizioni | **8/10**: la cella che GIRA non e' quella che la selezione onesta sceglie, e quella viva **fallisce il DSR** (0,905) |
|
||||||
|
| **`edge_watch`** (kill del book live) | continuo | **(A)** Sharpe rolling 36m < −0,5 → si riapre `weights_tilt_null`+DSR, il book **non si spegne da solo**; **(B)** in un anno con DD buy&hold >10%, il DD di TP01 deve restare <75% di quello | stato 27/07: Sharpe 36m +1,51, protezione **8/8** |
|
||||||
|
|
||||||
|
📌 **XSR01 sotto la lente RENDITA (25/08): il meccanismo vale ~0.** Mescolarne i rendimenti da' lo
|
||||||
|
stesso muro ($476-484k contro $478,7k), e un **conto remunerato** allo stesso tasso (3,72%, vol 0, corr 0,
|
||||||
|
nessun secondo venue) da' **$477,6k** — identico dentro la risoluzione MC, e **meglio** al 4,0%. Cio' che
|
||||||
|
si compra e' un **drift scorrelato**, non la scorrelazione (a drift zero il muro SALE). E l'haircut lo
|
||||||
|
mangia: **non pareggia un conto al 4% nemmeno a haircut ZERO**; pareggia il 2% solo sotto il 46%.
|
||||||
|
Per un 25% sopra il C\* vero servono **$60.000** di conto. `r0825_xsr_rendita.py`.
|
||||||
|
|
||||||
|
📌 **Un gate superato non e' un numero confermato:** differenze e livelli ereditano la fortuna
|
||||||
|
d'ancora in modo diverso (nella differenza si cancella in parte, nel livello per niente).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Debiti aperti — difetti noti NON riparati
|
||||||
|
|
||||||
|
1. 🚨 **`advance()` registra una frazione del giorno → 4 monitor su 6 sono rotti.**
|
||||||
|
`fetch_hyperliquid`/`resample_tf` scrivono la barra del giorno **in corso**, `advance()` la consuma
|
||||||
|
e ci porta sopra `last_ts` → `paper_statarb` **4 min/giorno**, `paper_dvolspread` 2, `paper_xsr` 41.
|
||||||
|
✅ **La finestra non va persa** (misurato due volte: 0 barre chiuse cambiate su 1.761.259) → l'azione
|
||||||
|
e' *"riparare **e rigenerare**"*, e **nessuna data di gate si sposta**. Guardia raccomandata e non
|
||||||
|
cablata: `ts_ultima_barra + cadenza ≤ mtime`, grazia 5 min.
|
||||||
|
2. 🚨 **Il trasporto degli allarmi e' un punto singolo di guasto** — 6,9% di invii falliti (2/29).
|
||||||
|
Fatte il 23/08: retry opzionale in `send()` e registrazione del motivo nel punto in cui veniva
|
||||||
|
ingoiato. **Resta:** `alerted=True` marcato **prima** dell'invio → un 🚨 perso e' perso per
|
||||||
|
l'episodio intero (gli episodi storici durano 200-2.324 ore). Cambiarlo **cambia il comportamento**
|
||||||
|
→ decisione dell'operatore.
|
||||||
|
3. 🚨 **Il gate XSR01 del 23/10 legge un monitor tarato sul pavimento del venue sbagliato**
|
||||||
|
(C* vero $15.000-20.000, non ~$3.000). Due sole vie pulite: riscrivere la soglia **adesso**
|
||||||
|
dichiarando che la si riscrive prima di vedere l'esito, **oppure** lasciarla e **citare il difetto
|
||||||
|
alla decisione**. Decisione dell'operatore.
|
||||||
|
4. ❓ **Due domande al commercialista, aperte** (valgono ~$22k di muro e ~€30/mese di versamento):
|
||||||
|
(a) i derivati Deribit (inverse, margine e regolamento in cripto, sede extra-UE) stanno in
|
||||||
|
`c-sexies` (33%) o `c-quater` (26%)? E il collaterale sconta il 2‰ al 31/12? (b) i payout di una
|
||||||
|
prop firm: **ne' `c-sexies` ne' `c-quater`** — le fonti convergono su **lavoro autonomo**, nessuna
|
||||||
|
prassi ufficiale. *Non sono pareri fiscali: sono domande da porre.*
|
||||||
|
5. ⚠️ **`test_leva_massima_da_config_resta_sotto_o_uguale_a_1x` va cancellato con nota, non
|
||||||
|
aggiustato:** misura `frac · n_asset` mentre con una chiave di scala la grandezza vera diventerebbe
|
||||||
|
`frac · n_asset · scala` → **continua a passare e smette di controllare**.
|
||||||
|
6. ⚠️ **TLT ha 13,5 anni di storia in meno** (parte 2016-02 invece del 2002) → **GTAA01 gira su
|
||||||
|
CINQUE gambe prima del 2016**, e l'assente e' quella obbligazionaria. Non e' un fetch da rifare (IB
|
||||||
|
ritorna 0 barre). ⇒ in-sample e hold-out di GTAA01 **non sono la stessa strategia**.
|
||||||
|
7. ⚠️ **Il docstring di `book_execute.py` prescrive "ogni ~230 minuti", il cron gira OGNI ORA.**
|
||||||
|
**Il docstring e' sbagliato e la configurazione che gira e' quella giusta** — chi lo "correggesse"
|
||||||
|
sposterebbe il libro sulla riga 4h, dove BTC **raddoppia** gli scatti del disaster-SL.
|
||||||
|
8. ⚠️ **Il Rulebook Deribit** (ADL, perdita socializzata, *emergency powers*, conti dormienti) **non
|
||||||
|
lo sorveglia nessuno**; `MAINT_GRACE_HOURS`=2 **presume** gli annunci invece di leggerli.
|
||||||
|
✅ *Ridotto in parte il 2026-08-25:* `src/live/venue_probe.py` interroga l'API **pubblica**
|
||||||
|
Deribit e distingue **manutenzione / venue giu' / NOSTRO gateway / non vedo**, e lo slot di
|
||||||
|
release (**martedi' 09:00 UTC**) e' ora una costante dichiarata e testata. Resta scoperto il
|
||||||
|
Rulebook vero e proprio: la sonda legge se il venue *risponde*, non cosa il venue *annuncia*.
|
||||||
|
9. ⚠️ **`tests/test_wave_0726.py::test_t1_canonical_riproduce_il_backtest_ufficiale` FALLISCE**
|
||||||
|
(dal ~24-25/08): Sharpe hold-out SKH01 `canonical` **1,9223** contro la banda cablata
|
||||||
|
`1.3 < h < 1.9`. **Il codice non e' cambiato, sono cambiati i DATI** — `data/raw/` e' gitignored
|
||||||
|
e il cron lo ricostruisce ogni notte, quindi la finestra si allunga e il numero deriva (verso
|
||||||
|
l'**alto**). **La banda non e' stata allargata**: si guarda sotto prima di toccarla (lezione
|
||||||
|
07/08). Suite: **730 passati, 1 fallito** (25/08).
|
||||||
|
10. ⚠️ **Nessuna tabella pubblicata prima del 22/08 contiene fisco E funding insieme.** L'unica
|
||||||
|
congiunta e' quella in `30-piano-capitale-fisco.md` — le altre vanno lette con lo sconto.
|
||||||
|
11. 🚨 **Le credenziali Deribit esistono SOLO dentro il gateway** (`cerbero-mcp`): in locale c'e'
|
||||||
|
solo `CERBERO_TOKEN`. Quindi il gateway e' un **punto singolo di guasto non aggirabile** —
|
||||||
|
**4 dei 5 traceback in 63 giorni** sono suoi (404 su `get_positions`, 502, due `ReadTimeout`),
|
||||||
|
ed e' l'unico pezzo della catena che possediamo. Un fallback diretto ai **privati** Deribit
|
||||||
|
(conto/posizioni/ordini) richiede **chiavi API create dall'operatore** sul conto Deribit:
|
||||||
|
e' una decisione, non un refactor. Fatto intanto il pezzo che non le richiede: la sonda
|
||||||
|
**pubblica**, che almeno dice *di chi e' il guasto*.
|
||||||
|
12. ⚠️ **Un test scriveva nel watermark VIVO** (`data/live/equity_seen.json`): lanciare la suite
|
||||||
|
ci metteva **$5.000** e il giro successivo del book mandava un allarme falso *"USCITA DI FONDI
|
||||||
|
−86,6%"*. Non era cosmetico: `cap_fallback = min(cap_config, watermark × frac)` sarebbe passato
|
||||||
|
da **$334 a $2.500/asset — ~7,5x di leva** su un conto da $668, per giunta sul ramo `eq_fallback`
|
||||||
|
che **allerta e NON blocca**. ✅ Riparato il 2026-08-25 con una fixture **autouse** in
|
||||||
|
`tests/conftest.py` (strutturale: non si chiede a ogni autore di ricordarsene — quella scommessa
|
||||||
|
ha gia' perso il 26/07 e il 21/08) + guardia in `test_cap_watermark.py`. **Resta il principio:
|
||||||
|
un test non deve poter scrivere in `data/live/`; oggi e' deviato solo il watermark, non
|
||||||
|
`trades.db` ne' `book_executions.jsonl`.**
|
||||||
|
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. Le regole di prim'ordine
|
||||||
|
|
||||||
|
Estratte dai 69 filoni. Ognuna e' stata pagata almeno una volta. Testo completo e caso d'origine
|
||||||
|
nei file di memoria.
|
||||||
|
|
||||||
|
### Sul dato
|
||||||
|
- **D1** La verita' e' **Deribit mainnet**; Binance/Coinbase solo come audit indipendente, mai come ancora per "ripulire".
|
||||||
|
- **D2** **Una riga presente non e' un dato presente**, e **una barra presente non e' una giornata presente**: contare cio' che e' *quotato/chiuso*, non cio' che e' *scritto*.
|
||||||
|
- **D3** Una certificazione che guarda solo **dentro** la serie non vede cio' che la serie **ha perso** (split 2:1, contaminazione EUR/USD, troncatura: tutte passano integrita', gap, spike, duplicati).
|
||||||
|
- **D4** Ogni soglia di certificazione **tarata su un valore tondo** va controllata contro il difetto che genera *esattamente* quel valore (una soglia al 50% non puo' sorvegliare gli split 2:1).
|
||||||
|
- **D5** Quando un buco non si puo' chiudere senza generare falsi positivi, si misura il **danno** del caso non rilevato: un buco quantificato e innocuo e' un risultato, uno taciuto e' un debito.
|
||||||
|
- **D6** Due serie dello stesso progetto possono avere **convenzioni di etichettatura diverse**: verificare col **lag**, non fidarsi dell'indice. `DatetimeIndex.view/astype("int64")` su risoluzioni miste produce look-ahead **senza eccezioni e senza NaN**.
|
||||||
|
- **D7** Un guasto **in corso** si misura al **giorno peggiore**, non in media. E prima di cancellare una sorgente si verifica che la copia sia **completa**, non che esista.
|
||||||
|
|
||||||
|
### Sul metodo
|
||||||
|
- **M1** Una strategia direzionale si giudica su `earns_slot` (**Sharpe marginale vs TP01**), mai sullo Sharpe assoluto: gli overlay-su-TSMOM ereditano lo Sharpe del trend.
|
||||||
|
- **M2** Una famiglia grid-searched si giudica con `study_family_honest` (cella scelta **in-sample-only** + deflated-Sharpe ≥0,95), mai chiamando lo scorer sulla cella a max hold-out.
|
||||||
|
- **M3** 🚨 **Non basta contare i trial: serve la VARIANZA di screen** — e **la stessa griglia da' verdetti opposti a seconda di come la si partiziona**. La partizione e' un secondo posto dove barare e' indolore e invisibile: dichiararla **prima**, contare **al rialzo**, e pubblicare la **sensibilita' del verdetto al conteggio**.
|
||||||
|
- **M4** Quando si riapre un parametro **si riapre la sua famiglia**.
|
||||||
|
- **M5** **Null del de-levering (7 occorrenze):** ogni claim "meno drawdown" si testa a **iso-rischio** prima di crederci — e' il primo test, non l'ultimo. Se la variante e' una pura ri-scalatura il null e' **degenere** (`sh(k·base) ≡ sh(base)`): serve iso-peso sullo Sharpe.
|
||||||
|
- **M6** Un diversificatore a **basso CAGR** si giudica a **iso-rischio**, mai a iso-nozionale.
|
||||||
|
- **M7** Su offset/ancore appaiate la statistica e' la **mediana delle differenze**, non la differenza delle mediane. E **se si de-lucka una strategia va de-luckato anche il suo DEGRADO**.
|
||||||
|
- **M8** Un **argmax dentro un plateau non e' una decisione**; e la mediana da sola puo' nascondere il fatto decisivo (p90 su, p10 giu' = si compra dipendenza dall'ancora, non Sharpe).
|
||||||
|
- **M9** Un contributo positivo si **scompone per anno** prima di crederci: "24/24 ancore positive" puo' essere **un anno solo**.
|
||||||
|
- **M10** **Due punti non fanno una tendenza** nemmeno quando la meccanica sembra spiegarla.
|
||||||
|
- **M11** Un **blocco dichiarato e' un'ipotesi, non un fatto**: si ri-verifica prima di costruirci sopra o di rimandare (3 occorrenze, ogni volta il blocco non esisteva).
|
||||||
|
- **M12** Un **follow-up dichiarato contiene una previsione**, che va **misurata** non assunta.
|
||||||
|
- **M13** Un criterio si misura sulla sua **risoluzione** prima che sul suo esito, e un gate si valida **contando quante volte lo passa un candidato a caso**.
|
||||||
|
- **M14** Un **null di permutazione** va confrontato **a fee zero** (permutare un segnale ne fa esplodere il turnover: il null perderebbe per costo invece che per assenza di informazione) e controllato per **bilanciamento del segno**.
|
||||||
|
- **M15** Un rilevatore tarato per **non** segnalare va validato su un **controllo positivo** — e un controllo positivo finito dentro un ramo `else` non gira mai.
|
||||||
|
- **M16** Un self-check su **eventi rari** si campiona sugli **eventi**, non sulla popolazione (altrimenti confronta zeri con zeri: potenza zero).
|
||||||
|
- **M17** Il **win rate di uno schema parziale+BE non e' merito** (≈ 1/(1+rr1)): convertire ogni claim "WR X%" in **expectancy R netto fee**.
|
||||||
|
- **M18** Vs claim su livelli "speciali" (Fibonacci, max-pain, expiry) il test e' il **null location-matched**; vs claim di calendario, il **day-boundary robustness**.
|
||||||
|
- **M19** Mettere nella griglia una variabile che si **sa gia' morta** trasforma *"il candidato perde"* in *"il dato non contiene nient'altro di selezionabile"* — l'unica forma in cui un inventario conclude qualcosa su un'assenza.
|
||||||
|
- **M20** Un meccanismo si trasferisce a un asset nuovo **coi parametri congelati**, o e' una famiglia nuova; e **il criterio di SELEZIONE va riprovato sull'asset nuovo**.
|
||||||
|
- **M21** Quando un meccanismo **non generalizza**, chiedersi **perche'** vale piu' del fatto che non generalizzi.
|
||||||
|
- **M22** Un confronto appaiato eredita **tutti** i parametri della riga in cui compare; un'uscita si giudica appaiata per **INGRESSO** (allineare sull'uscita tiene solo i casi in cui non e' successo niente — 3 occorrenze).
|
||||||
|
- **M23** Un **Monte Carlo ha una risoluzione e va detta**; e prima di pubblicare un numero nuovo, **far riprodurre alla macchina quello vecchio**.
|
||||||
|
- **M24** Un **non-arrivo** si codifica **+∞, mai −1**; una **mediana condizionata** si stampa sempre accanto alla sua probabilita'; un **percentile a 0 decimali mente esattamente agli estremi**.
|
||||||
|
- **M25** Quando **due stimatori di coda non concordano si cita la banda**, non quello che conviene.
|
||||||
|
- **M26** **Non contare su una compensazione fra correzioni misurate separatamente** — la si misura, e in piu' di una **moneta** (un'interazione piccola cambia segno con la moneta).
|
||||||
|
- **M27** Prima di dichiarare che un campo di un dataset e' sbagliato, **aprire il codice che lo produce**. E una **fonte normativa citata in un commento si verifica come un numero**.
|
||||||
|
- **M28** Quando **due affermazioni della stessa memoria si contraddicono, la contraddizione e' informazione**: una delle due e' stata scritta guardando i dati.
|
||||||
|
|
||||||
|
### Sui costi e l'eseguibilita'
|
||||||
|
- **C1** Il costo di un venue va modellato nella sua **FORMA** (fisso vs proporzionale), non solo nel livello: un pavimento fisso e' una **tassa regressiva** e due venue a pari "costo medio" danno esiti **opposti** al variare del capitale.
|
||||||
|
- **C2** Un parametro d'esecuzione espresso in **valuta assoluta** ha effetto che dipende dal capitale: il controllo non e' lo Sharpe ma la **quota di tempo a mercato**.
|
||||||
|
- **C3** Prima di misurare il rendimento a un capitale dato, misurare il **lotto minimo del venue** — e sapere **quale famiglia di strumenti** si sta guardando (inverse vs USDC-lineare: lotti 7,5× diversi).
|
||||||
|
- **C4** Un **fattore di errore si giudica moltiplicato per il suo peso** (5,85 al 3% fa meno danno di 2,23 al 18%). Il `f` di una struttura multi-gamba **non e' il `f` di una sua gamba**.
|
||||||
|
- **C5** **L'open interest NON misura la negoziabilita'** (su Deribit USDC sono quasi anti-correlati). Prima di credere a un rapporto estremo su un prezzo piccolo, **contare i tick**.
|
||||||
|
- **C6** La negoziabilita' **sul conto reale** va verificata quando lo sleeve entra in **RICERCA**, non quando entra nel book (PRIIPs costo': 5 settimane di misure). *"Non posso comprare" ≠ "non posso vedere"*: il segnale puo' girare su una serie che non si puo' negoziare.
|
||||||
|
- **C7** Si cerca per **ISIN, non per ticker**; si prende la linea nella **valuta del proprio saldo**; un costo di conversione e' proprieta' della **coppia strumento-conto**, non dello strumento.
|
||||||
|
- **C8** La deviazione fra due veicoli sullo stesso indice si misura sul **rapporto cumulato**, mai sulla media delle differenze. Il **carry** si misura sul **log del rapporto dei prezzi**, mai sulla media aritmetica delle differenze.
|
||||||
|
- **C9** **Una regola d'uscita che scatta piu' spesso sui vincenti che sui perdenti non e' protezione, e' troncatura** — si vede in una riga: la peggior settimana non cambia.
|
||||||
|
- **C10** Una capacita' mancante (es. API di un broker) si valuta sul **costo di non averla**, non sulla sua assenza.
|
||||||
|
|
||||||
|
### Sulla produzione e le sorveglianze
|
||||||
|
- **P1** 🚨 **Un sorvegliante deve DERIVARE il proprio bersaglio dal codice sorvegliato, mai ridichiararlo.** *Un controllo puntato su una configurazione diversa da quella che gira passa sempre, e non sta controllando niente.* **5 occorrenze**: e' il difetto piu' ricorrente del progetto.
|
||||||
|
- **P2** Un rilevatore si valida **sul segnale E sul trasporto**.
|
||||||
|
- **P3** Se un errore si ingoia per non bloccare, **si registra nel punto in cui lo si ingoia** — non c'e' un secondo momento buono: quando la diagnosi serve, il guasto e' rientrato.
|
||||||
|
- **P4** Un'allerta risponde a **due** domande: *cosa* (decide) e *perche'* (ripara). **Una nota di diagnosi cablata e' peggio di nessuna nota.**
|
||||||
|
- **P5** Distinguere guasti diversi **anche quando l'azione e' la stessa**; e prevedere lo stato **"non vedo"** (`BLIND`, `flat-senza-dato`, `NUOVO`): *"non vedo" non e' "va tutto bene"*, e il silenzio in una serie di ritorni si legge come **zero**.
|
||||||
|
- **P6** Una soglia si sceglie con un criterio **dichiarato prima** (i criteri ovvi sbagliano in versi opposti); la **persistenza richiesta E' latenza** e va confrontata con la durata del fenomeno; un **break-even si calcola sulla media**, non sulla coda.
|
||||||
|
- **P7** Un numero di taratura si etichetta con la **CONFIGURAZIONE**, non solo con la finestra; e uno **"zero" si legge accanto alla quota di campione utilizzabile** (meno falsi allarmi *perche' si vede meglio* e *perche' si vede di meno* hanno lo stesso valore stampato e valore opposto).
|
||||||
|
- **P8** Un **veto d'integrita' sorveglia l'asse su cui e' stato scritto**: contare *se* il dato c'era non dice *quanto* del giorno copriva.
|
||||||
|
- **P9** Un **allarme massimo speso per un evento atteso** e' un allarme che non verra' letto il giorno che e' vero.
|
||||||
|
- **P10** Un modello di rischio **intraday** non si valida sulla marginale del wick ma sul suo **accoppiamento** al rendimento del giorno: `close-only` non e' conservativa, e' **cieca** (0,00 breach da daily-loss su ogni configurazione).
|
||||||
|
- **P11** Un **dato operativo non ricostruibile non puo' vivere in un file gitignored** — si materializza dove il backup arriva.
|
||||||
|
- **P12** Fra due fonti che non concordano, una **riparazione silenziosa e' un'invenzione**: si riporta la divergenza.
|
||||||
|
- **P13** Una **guardia sui NUMERI non copre il RAGIONAMENTO**: l'analisi in prosa si legge come opinione di un lettore fallibile, mai come parte del registro. Chi scrive in un registro va **firmato**.
|
||||||
|
- **P14** Una **guardia piu' stretta del contratto** produce allarmi che si impara a ignorare; una regola che si accende su $2 di cumulato insegna a saltare la sezione.
|
||||||
|
- **P15** Una **regola operativa va provata contro il codice che dovrebbe eseguirla**, o si discute per mesi di un knob che non esiste.
|
||||||
|
- **P16** Il cron gira dal **working tree**: con un branch di ricerca attivo, il cron esegue quel branch.
|
||||||
|
|
||||||
|
### Sul piano e sulle decisioni
|
||||||
|
- **N1** **Il piano si dimensiona sul VERSAMENTO, che e' certo, non sul muro** — il muro e' `prelievo/perpetua`, cioe' un `1/x` su una quantita' che va a zero: l'errore e' **asimmetrico verso l'alto** e la banda e' esplosiva.
|
||||||
|
- **N2** Un piano di accumulo si giudica sulle sue **deviazioni**, non sul caso nominale (piatto/ininterrotto/per sempre e' l'unico scenario che non succede). Piani di taglia diversa si confrontano su **`$ finale / $ versato`**.
|
||||||
|
- **N3** Ordine delle leve, da citare quando si parla del piano: **versare o no** (da *mai* a ~16 anni) > **quando** (6×) > **quanto presto si smette** (i primi 5 anni sono il 25% dei soldi e il 58% del risultato) > piatto vs crescente (24%) > frequenza (1-3%). *A orizzonte corto non fai lavorare la strategia: **compri il capitale coi bonifici**.*
|
||||||
|
- **N4** Un rischio **non-diversificabile dagli sleeve** (venue) si prezza a parte, e si compra con un **secondo CONTO**, non con un secondo sleeve. **P(successo) puo' nascondere P(rovina)**: per una rendita la metrica e' la seconda, perche' **zero e' assorbente**.
|
||||||
|
- **N5** Quando una metrica **binaria satura**, la decisione si sposta sulla metrica **continua**.
|
||||||
|
- **N6** Un **obiettivo si dichiara nella sua definizione operativa PRIMA di ottimizzarlo**: *flusso* e *ricchezza sostenibile* sono entrambe difendibili e differiscono di **cento volte** (33,9% contro 0,33%).
|
||||||
|
- **N7** Uno **sleeve difensivo si giudica sul sinistro, non sul premio**: hold-out negativo non e' evidenza di morte.
|
||||||
|
- **N8** Una rivalutazione parte dall'elenco di **cosa cambia una decisione**, non dal riassunto di cosa si e' scoperto; quando due correzioni puntano in versi opposti **si misura**; quando le leve hanno **ordini di grandezza diversi, dirlo**.
|
||||||
|
- **N9** 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.
|
||||||
|
- **N10** Una **data in un gate va giustificata col COSTO della misura**, non con la sua difficolta' percepita (due gate d'attesa da mesi eliminati in una sera perche' nessuno aveva contato i secondi). Una **verifica esterna a €0 va fatta PRIMA** di qualunque misura che ne dipenda, e si fa **sul venue, non sul sito** di chi la dichiara.
|
||||||
|
- **N11** Un numero pubblicato in un diario deve avere **uno script committato che lo riproduce**, e ogni script deve calcolare il proprio **verdetto a runtime** (e' cio' che ha salvato un'ondata interrotta).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. IL DATO — fonte di verita' (regola di prim'ordine)
|
||||||
|
|
||||||
|
- **La verita' e' Deribit mainnet**, perche' e' dove eseguiamo. Cross-check multi-venue: Deribit
|
||||||
|
mainnet e' a 0-1 bps dal consenso. **Binance NON e' la verita'** (e' USDT, ~10 bps fuori, fino al 3%
|
||||||
|
sotto depeg) → audit indipendente, mai ancora per "ripulire" i dati.
|
||||||
|
- **Aggiornare lo storico SOLO con `rebuild_history.py`** (ccxt Deribit mainnet, base 5m unica +
|
||||||
|
resample). **MAI** il vecchio downloader Cerbero (token testnet = feed farlocco: e' la causa del reset).
|
||||||
|
- **Certificare sempre** dopo un rebuild con `certify_feed.py` (integrita' 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), liquidi (~0% barre flat a 1h), storia 2018/2019→oggi,
|
||||||
|
**ogni timeframe** (5m/15m/1h). E' l'unico dato in `data/raw/` col namespace nudo.
|
||||||
|
- **Alt Deribit: FUORI** (illiquidi/divergenti). SOL vive in `data/raw/alt_sol_*.parquet`, **fuori dal
|
||||||
|
namespace nudo e non rinfrescato dal cron** — vedi §3 e la lezione: *ricostruire dati per un'analisi
|
||||||
|
puo' disattivare un guardrail che vive nell'assenza di un file*.
|
||||||
|
- **Hyperliquid (Cerbero MCP MAINNET): 51 certificati, 19 major usati da XS01**, 1d dal 2024. Storia
|
||||||
|
nativa ~2,5 anni. ⚠️ Cerbero col token **testnet** e' farlocco; col mainnet e' reale ma **sempre da
|
||||||
|
certificare**, e il rivelatore del backfill sintetico e' il **VOLUME**, non il flat ne' il cross-venue.
|
||||||
|
- **Catena opzioni Deribit mainnet — raccolta propria** dal 2026-07-30 (`scripts/live/collect_chain.py`,
|
||||||
|
cron **:25**). Dettaglio, archivio ereditato, difetti e buchi di colonna in `docs/memory/50-dati-e-feed.md`.
|
||||||
|
**Perche' si memorizza invece di interrogarla:** una catena opzioni **non e' ricostruibile a
|
||||||
|
posteriori** — un'ora non raccolta e' persa per sempre.
|
||||||
|
|
||||||
|
**Backup.** `data/raw/` e' gitignored → il dato non ricostruibile (catena, `data/paper_*`,
|
||||||
|
`data/chain_collect`, `data/live`, `venue_watch`, `fee_watch`, `config/live.json`) e' salvato da
|
||||||
|
`do_pythagoras` in `/opt/docker/scripts/backup.sh` (daily 04:00). ⚠️ `/opt/docker/scripts` **non e' un
|
||||||
|
repo git**: quella modifica vive solo su disco.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. 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, conservativo: il tier reale e'
|
||||||
|
3,50 bps/lato dal 2026-08-01) + leva. ⚠️ **Il funding NON e' nel motore** — vale −2,16%/anno di drift.
|
||||||
|
3. **Out-of-sample** held-out + robustezza su **griglia parametri** (entrambi gli asset, tutte le celle
|
||||||
|
positive) + **sweep fee** (0.00-0.20% RT).
|
||||||
|
4. **Liquidita' & plausibilita'**: incrociare ogni edge con la liquidita' reale del book (quota di barre
|
||||||
|
flat) e con la plausibilita' del prezzo (cross-venue). Un edge full+OOS robusto su un book fermo o su
|
||||||
|
wick fantasma **non e' un edge**.
|
||||||
|
5. **I gate di `altlib.py`** (dettaglio in `docs/memory/60-metodo-e-gate.md`): `study_marginal` /
|
||||||
|
`marginal_vs_tp01` (ADDS·NEUTRAL·REDUNDANT·HEDGE·NOISE, con persistenza multi-cut, edge in-sample,
|
||||||
|
hedge-vs-alpha) · `study_family_honest` (+ `deflated_sharpe` ≥0,95, `select_cell_insample`) ·
|
||||||
|
`day_boundary_robust` · `eval_weights_smallcap` · `implausible_sharpe` · `anchor_luck_band` /
|
||||||
|
`anchor_luck_delta` · `weights_tilt_null` (**ogni** proposta di cambio pesi).
|
||||||
|
6. Strategia in `scripts/strategies/` (codice univoco), test in `tests/`, diario aggiornato.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 9. Lezioni critiche storiche (da NON ripetere)
|
||||||
|
|
||||||
|
- **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. **Il dato viene prima
|
||||||
|
della strategia.**
|
||||||
|
- **Look-ahead squeeze.** Accuratezze 76-82% erano artefatto: direzione dalla candela `i`, ingresso a
|
||||||
|
`close[i-1]`. Con ingresso onesto: lancio di moneta.
|
||||||
|
- **Entry sugli estremi di candela.** ETH 2024: +30.848% → +2.725% rimuovendoli.
|
||||||
|
- **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 e' `close[i-1]`.
|
||||||
|
- **Fee** = vincolo di prim'ordine; **leva**: 5x raddoppia il drawdown, i numeri a leva alta non sono il
|
||||||
|
caso base.
|
||||||
|
- **Onesta' sul target €50/giorno.** Non e' raggiungibile a questo capitale: serve ~$313k (banda
|
||||||
|
[$187k – $1,14M]) o **€1.733/mese per 10 anni** a P=90%. La leva non e' la scorciatoia; la via e'
|
||||||
|
target-vol + capitale + tempo.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 10. Obiettivo
|
||||||
|
|
||||||
Ricerca: riconoscimento pattern frattali per trading algoritmico su crypto. Target dichiarato
|
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 è
|
€50/giorno partendo da €1.000. **Onesta' prima di tutto**: nessun numero va creduto finche' non e'
|
||||||
netto fee, out-of-sample, robusto su griglia, e su dati certificati + liquidi + eseguibili.
|
netto fee, out-of-sample, robusto su griglia, e su dati certificati + liquidi + eseguibili.
|
||||||
|
|
||||||
## Stack
|
## 11. Stack
|
||||||
|
|
||||||
- **Linguaggio:** Python 3.11+ — **Package manager:** uv (`pyproject.toml`, `uv.lock`)
|
- **Linguaggio:** Python 3.11+ — **Package manager:** uv (`pyproject.toml`, `uv.lock`)
|
||||||
- **Dati:** Parquet in `data/raw/` (gitignored). Solo BTC/ETH (5m/15m/1h).
|
- **Dati:** Parquet in `data/raw/` (gitignored). Solo BTC/ETH (5m/15m/1h) nel namespace nudo.
|
||||||
- **Analisi/ML:** numpy, pandas, scipy, scikit-learn
|
- **Analisi/ML:** numpy, pandas, scipy, scikit-learn
|
||||||
- **Fonte dati storici:** Deribit mainnet via `ccxt` (pubblico, tokenless)
|
- **Fonte dati storici:** Deribit mainnet via `ccxt` (pubblico, tokenless)
|
||||||
|
|
||||||
## Struttura (post-reset)
|
## 12. Struttura
|
||||||
|
|
||||||
```
|
```
|
||||||
src/data/downloader.py → load_data(asset, tf): legge i parquet certificati da data/raw/
|
src/data/downloader.py → load_data(asset, tf): legge i parquet certificati
|
||||||
src/strategies/base.py → Strategy (ABC), Signal, BacktestResult, YearlyStats
|
src/strategies/ → base.py (Strategy/Signal/BacktestResult), indicators.py,
|
||||||
src/strategies/indicators.py → indicatori condivisi (ema, atr, keltner, ...)
|
trend_portfolio.py (TP01), skyhook.py (SKH01)
|
||||||
src/fractal/ → indicatori frattali (patterns.py, indicators.py, similarity.py)
|
src/portfolio/ → portfolio.py (combina N sleeve + weights_tilt_null),
|
||||||
src/backtest/engine.py → engine di backtesting riusabile
|
sleeves.py (REGISTRY: aggiungere uno sleeve = una riga), gtaa.py
|
||||||
src/version.py → APP_VERSION (legge il file VERSION)
|
src/backtest/harness.py → harness ONESTO (load BTC/ETH, backtest_signals no-leakage, OOS)
|
||||||
scripts/analysis/ → SOLO i tool dati certificati:
|
src/live/ → book.py (esecutore netto TP01+SKH01), shadow.py, deribit.py,
|
||||||
rebuild_history.py → (ri)costruisce lo storico da Deribit mainnet (base 5m + resample)
|
livefeed.py, venue_watch.py, monitor_health.py, notifier.py,
|
||||||
certify_feed.py → certifica il feed (integrità, coerenza resample, spike, cross-venue)
|
tradesdb.py · journal.py · analista.py (libro di bordo)
|
||||||
audit_feed.py → audit per-barra vs riferimento esterno
|
src/data/eq_splits.py, eq_crosscheck.py → guardie sul feed equity
|
||||||
multi_source_check.py → cross-check multi-venue (quale venue è "vero")
|
scripts/research/ → ricerca (r<data>_*.py). Harness condiviso: alt/altlib.py
|
||||||
data/raw/ → btc/eth × {5m,15m,1h} (gitignored). UNICO dato attivo.
|
scripts/analysis/ → SOLO tool sui dati certificati: rebuild_history, certify_feed,
|
||||||
data/instruments_registry.json → registry strumenti (reference)
|
audit_feed, multi_source_check, fetch_* , certify_cb_chain
|
||||||
docs/diary/ → diario di ricerca (1 voce: il reset; aggiungere dopo ogni esperimento)
|
scripts/live/ → book_execute · venue_watch · fee_watch · edge_watch ·
|
||||||
Old/ → ARCHIVIO: tutto il vecchio (strategie, live, ricerca, dati, diari)
|
monitor_health · collect_chain · paper_* · trades_db ·
|
||||||
VERSION → semver (2.0.0)
|
journal · analista
|
||||||
|
scripts/cron_{book,daily,chain,opt_snapshot,vol_term}.sh
|
||||||
|
docs/memory/ → LA MEMORIA (indice in testa a questo file)
|
||||||
|
docs/research/ → BRIEF-0822 · RESULTS-0822 (§1-69) · SPEC-scale-key
|
||||||
|
docs/diary/YYYY-MM-DD.md → una voce per esperimento (123)
|
||||||
|
docs/journal/YYYY-MM-DD.md → libro di bordo, una voce al giorno, 4 livelli per provenienza
|
||||||
|
data/live/trades.db → i trade allineati col tempo (dentro il perimetro di backup)
|
||||||
|
Old/ → ARCHIVIO pre-reset
|
||||||
|
VERSION → semver
|
||||||
```
|
```
|
||||||
|
|
||||||
## Comandi
|
## 13. Comandi
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
uv sync # installa dipendenze
|
uv sync # dipendenze
|
||||||
uv run python scripts/analysis/rebuild_history.py --asset BTC ETH # (ri)costruisci storico da Deribit mainnet
|
uv run python scripts/analysis/rebuild_history.py --asset BTC ETH # 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] # certifica i feed
|
||||||
uv run python scripts/analysis/certify_feed.py --local # solo check locali (veloce)
|
uv run python scripts/portfolio/run_portfolio.py # report del portafoglio (ricerca)
|
||||||
uv run pytest # test (da ripopolare con le nuove strategie)
|
uv run python scripts/live/paper_portfolio.py # avanza il paper (forward-only)
|
||||||
|
uv run python scripts/live/trades_db.py --report # stato libro di bordo + P&L
|
||||||
|
uv run python scripts/live/trades_db.py --reconcile # incrocio delle 3 fonti sui fill
|
||||||
|
uv run python scripts/live/journal.py # voce del giorno (numeri + lettura)
|
||||||
|
uv run python scripts/live/analista.py --secco # analisi del giorno, senza salvare
|
||||||
|
uv run pytest # test (731: 730 ok, 1 noto §5.9)
|
||||||
```
|
```
|
||||||
|
|
||||||
```python
|
```python
|
||||||
from src.data.downloader import load_data
|
from src.data.downloader import load_data
|
||||||
df = load_data("BTC", "1h") # OK. load_data("SOL", ...) -> FileNotFoundError (guardrail: solo dati certi)
|
df = load_data("BTC", "1h") # load_data("SOL", ...) -> FileNotFoundError (guardrail: solo dati certi)
|
||||||
```
|
```
|
||||||
|
|
||||||
## IL DATO — fonte di verità (regola di prim'ordine)
|
## 14. Convenzioni
|
||||||
|
|
||||||
- **La verità è Deribit mainnet**, perché è dove (in futuro) eseguiamo. Cross-check multi-venue:
|
- Strategie in `scripts/strategies/` con codice univoco; **le scartate si documentano** (memoria + diario).
|
||||||
Deribit mainnet è a 0-1 bps dal consenso. **Binance NON è la verità** (è USDT, ~10 bps fuori, e
|
- Diario in `docs/diary/YYYY-MM-DD.md` dopo ogni esperimento significativo; registro per filone in
|
||||||
sotto depeg USDT fino al 3% off) → usare Binance/Coinbase SOLO come audit indipendente, mai come
|
`docs/research/RESULTS-0822.md`.
|
||||||
ancora per "ripulire" i dati.
|
- **Quando un risultato cambia una decisione, aggiorna questo file; quando aggiunge racconto, va in
|
||||||
- **Aggiornare lo storico SOLO con `rebuild_history.py`** (ccxt Deribit mainnet, base 5m unica +
|
`docs/memory/`.** Questo file non deve tornare a crescere senza limite.
|
||||||
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 (SOL/XRP/ADA/LTC/DOGE/BNB): FUORI.** Illiquidi (LTC 5m 82% barre flat O=H=L=C, run fino a
|
|
||||||
~3 giorni), divergenti (LTC/DOGE >1% su 10-21% delle barre 2022-23), o non certificabili
|
|
||||||
(XRP delistato da Coinbase per causa SEC; BNB non listato + storia da 2024-10). Sono archiviati in
|
|
||||||
`Old/data/raw`. Riammetterne uno richiede prima una ricertificazione che dimostri liquidità + accordo.
|
|
||||||
|
|
||||||
## 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.
|
- **Nessun segreto nei commit** (token/chiavi). `.env` e `.env.mainnet` sono gitignored.
|
||||||
- Versionamento: `VERSION` (semver) + `scripts/bump_version.py`. `src/version.py` lo legge.
|
- Versionamento: `VERSION` (semver) + `scripts/bump_version.py`; `src/version.py` lo legge.
|
||||||
|
|
||||||
## Archivio `Old/`
|
## 15. Archivio `Old/`
|
||||||
|
|
||||||
Tutto il lavoro pre-reset (preservato in git per consultazione storica): strategie
|
Tutto il lavoro pre-reset (preservato in git): strategie, stack live e portafogli, ricerca/gate, dati
|
||||||
(`Old/scripts/strategies`), stack live e portafogli (`Old/src/live`, `Old/src/portfolio`,
|
non certificati, 60+ diari, test. Consultabile come riferimento ("come facevamo X"), ma **nessun edge
|
||||||
`Old/scripts/portfolios`), ricerca/gate (`Old/scripts/analysis`), dati non certificati
|
li' dentro e' fidato** finche' non e' ri-validato su dati certi.
|
||||||
(`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.
|
|
||||||
```
|
|
||||||
|
|||||||
+11
@@ -0,0 +1,11 @@
|
|||||||
|
FROM python:3.11-slim
|
||||||
|
COPY --from=ghcr.io/astral-sh/uv:latest /uv /usr/local/bin/uv
|
||||||
|
WORKDIR /app
|
||||||
|
COPY pyproject.toml uv.lock ./
|
||||||
|
RUN uv sync --frozen --no-dev
|
||||||
|
COPY src/ src/
|
||||||
|
COPY scripts/ scripts/
|
||||||
|
COPY VERSION ./
|
||||||
|
VOLUME /app/data
|
||||||
|
# Monitor PAPER del portafoglio attivo (TP01+XS01). Esecuzione REALE disabilitata.
|
||||||
|
CMD ["uv", "run", "python", "-m", "src.live.dashboard", "--port", "8787"]
|
||||||
@@ -0,0 +1,191 @@
|
|||||||
|
"""PAPER TRADER — TP01 Trend Portfolio (PORT LF1d), forward-only, simulato.
|
||||||
|
|
||||||
|
Esegue la strategia VINCENTE (src/strategies/trend_portfolio.py, config CANONICAL) in
|
||||||
|
paper trading FORWARD-ONLY su capitale virtuale (default 2000 USDT), portafoglio 50/50
|
||||||
|
BTC+ETH a 1d. Stato persistente -> resume al riavvio.
|
||||||
|
|
||||||
|
DESIGN (onesto, niente esecuzione reale: l'esecuzione e' DISABILITATA nel progetto):
|
||||||
|
- Legge i parquet certificati locali (data/raw, BTC/ETH 1h) e resampla a 1d.
|
||||||
|
- Alla prima esecuzione parte dall'ultima barra 1d CHIUSA disponibile (forward-only:
|
||||||
|
NON include lo storico nel PnL di paper, traccia solo da ora in avanti).
|
||||||
|
- Ad ogni run processa le NUOVE barre 1d chiuse dall'ultima volta: applica il rendimento
|
||||||
|
della posizione tenuta, addebita le fee sul turnover, registra i trade sui cambi di
|
||||||
|
posizione, poi ricalcola la posizione-bersaglio (decisa con dati <= ultima barra chiusa).
|
||||||
|
- Per avere barre fresche, aggiornare prima i dati:
|
||||||
|
uv run python scripts/analysis/rebuild_history.py --asset BTC ETH
|
||||||
|
|
||||||
|
Stato: data/paper_trend/state.json + trades.jsonl (append-only).
|
||||||
|
|
||||||
|
uv run python scripts/live/paper_trend.py # avanza il paper col dato disponibile
|
||||||
|
uv run python scripts/live/paper_trend.py --status # solo stato, non avanza
|
||||||
|
uv run python scripts/live/paper_trend.py --reset # azzera lo stato (riparte da ora)
|
||||||
|
"""
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import json
|
||||||
|
import sys
|
||||||
|
from pathlib import Path
|
||||||
|
|
||||||
|
import numpy as np
|
||||||
|
import pandas as pd
|
||||||
|
|
||||||
|
PROJECT_ROOT = Path(__file__).resolve().parents[2]
|
||||||
|
sys.path.insert(0, str(PROJECT_ROOT))
|
||||||
|
|
||||||
|
from src.backtest.harness import load
|
||||||
|
from src.strategies.trend_portfolio import TrendPortfolio, CANONICAL, resample_1d, simple_returns
|
||||||
|
|
||||||
|
STATE_DIR = PROJECT_ROOT / "data" / "paper_trend"
|
||||||
|
STATE_FILE = STATE_DIR / "state.json"
|
||||||
|
TRADES_FILE = STATE_DIR / "trades.jsonl"
|
||||||
|
ASSETS = ["BTC", "ETH"]
|
||||||
|
WEIGHT = 0.5
|
||||||
|
INITIAL_CAPITAL = 2000.0
|
||||||
|
|
||||||
|
|
||||||
|
def build_bars() -> dict[str, pd.DataFrame]:
|
||||||
|
# Deploy a 1d (>=12h): sotto le 12h costi+overfit dominano (vedi trend_portfolio docstring + bug ffill mixed-TF).
|
||||||
|
return {a: resample_1d(load(a, "1h")) for a in ASSETS}
|
||||||
|
|
||||||
|
|
||||||
|
def load_state() -> dict | None:
|
||||||
|
if STATE_FILE.exists():
|
||||||
|
return json.loads(STATE_FILE.read_text())
|
||||||
|
return None
|
||||||
|
|
||||||
|
|
||||||
|
def save_state(st: dict):
|
||||||
|
STATE_DIR.mkdir(parents=True, exist_ok=True)
|
||||||
|
STATE_FILE.write_text(json.dumps(st, indent=2))
|
||||||
|
|
||||||
|
|
||||||
|
def append_trade(rec: dict):
|
||||||
|
STATE_DIR.mkdir(parents=True, exist_ok=True)
|
||||||
|
with open(TRADES_FILE, "a") as f:
|
||||||
|
f.write(json.dumps(rec) + "\n")
|
||||||
|
|
||||||
|
|
||||||
|
def init_state(dfs) -> dict:
|
||||||
|
last_ts = min(int(dfs[a]["timestamp"].iloc[-1]) for a in ASSETS)
|
||||||
|
tp = TrendPortfolio(**CANONICAL)
|
||||||
|
positions = {}
|
||||||
|
for a in ASSETS:
|
||||||
|
df = dfs[a]
|
||||||
|
df = df[df["timestamp"] <= last_ts]
|
||||||
|
positions[a] = tp.current_target(df)
|
||||||
|
return dict(
|
||||||
|
capital=INITIAL_CAPITAL, initial_capital=INITIAL_CAPITAL,
|
||||||
|
start_ts=last_ts, last_ts=last_ts, positions=positions, n_bars=0,
|
||||||
|
peak=INITIAL_CAPITAL, max_dd=0.0,
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def advance(st: dict, dfs: dict) -> dict:
|
||||||
|
"""Processa tutte le barre 1d chiuse DOPO st['last_ts']."""
|
||||||
|
tp = TrendPortfolio(**CANONICAL)
|
||||||
|
# precompute per-asset: timestamps, returns, target series (causale)
|
||||||
|
data = {}
|
||||||
|
for a in ASSETS:
|
||||||
|
df = dfs[a]
|
||||||
|
c = df["close"].values.astype(float)
|
||||||
|
data[a] = dict(
|
||||||
|
ts=df["timestamp"].values.astype("int64"),
|
||||||
|
dt=pd.to_datetime(df["datetime"]).values,
|
||||||
|
r=simple_returns(c),
|
||||||
|
tgt=tp.target_series(df),
|
||||||
|
)
|
||||||
|
# common new timestamps after last_ts (present in both assets)
|
||||||
|
common = sorted(set(data["BTC"]["ts"]).intersection(data["ETH"]["ts"]))
|
||||||
|
new_ts = [t for t in common if t > st["last_ts"]]
|
||||||
|
if not new_ts:
|
||||||
|
return st
|
||||||
|
|
||||||
|
pos = dict(st["positions"])
|
||||||
|
cap = st["capital"]
|
||||||
|
peak = st.get("peak", cap)
|
||||||
|
max_dd = st.get("max_dd", 0.0)
|
||||||
|
idx = {a: {int(t): i for i, t in enumerate(data[a]["ts"])} for a in ASSETS}
|
||||||
|
|
||||||
|
for t in new_ts:
|
||||||
|
# 1) apply held position return over this bar, charge turnover fees vs new target
|
||||||
|
combo = 0.0
|
||||||
|
new_pos = {}
|
||||||
|
for a in ASSETS:
|
||||||
|
i = idx[a][int(t)]
|
||||||
|
r = float(data[a]["r"][i])
|
||||||
|
held = pos[a]
|
||||||
|
new_t = float(data[a]["tgt"][i])
|
||||||
|
turn = abs(new_t - held)
|
||||||
|
net = held * r - CANONICAL["fee_side"] * turn
|
||||||
|
combo += WEIGHT * net
|
||||||
|
new_pos[a] = new_t
|
||||||
|
# record a trade when the SIGN of position changes (entry/exit/flip)
|
||||||
|
if np.sign(new_t) != np.sign(held):
|
||||||
|
append_trade(dict(
|
||||||
|
ts=int(t), dt=str(pd.Timestamp(data[a]["dt"][i])),
|
||||||
|
asset=a, action="ENTRY" if new_t != 0 else "EXIT",
|
||||||
|
from_pos=round(held, 4), to_pos=round(new_t, 4),
|
||||||
|
capital=round(cap, 2),
|
||||||
|
))
|
||||||
|
cap *= (1.0 + max(combo, -0.99))
|
||||||
|
peak = max(peak, cap)
|
||||||
|
max_dd = max(max_dd, (peak - cap) / peak if peak > 0 else 0.0)
|
||||||
|
pos = new_pos
|
||||||
|
|
||||||
|
st.update(capital=cap, last_ts=int(new_ts[-1]), positions=pos,
|
||||||
|
n_bars=st.get("n_bars", 0) + len(new_ts), peak=peak, max_dd=max_dd)
|
||||||
|
return st
|
||||||
|
|
||||||
|
|
||||||
|
def print_status(st: dict, dfs: dict):
|
||||||
|
start = pd.Timestamp(st["start_ts"], unit="ms", tz="UTC")
|
||||||
|
last = pd.Timestamp(st["last_ts"], unit="ms", tz="UTC")
|
||||||
|
days = (last - start).total_seconds() / 86400
|
||||||
|
cap = st["capital"]
|
||||||
|
ret = cap / st["initial_capital"] - 1
|
||||||
|
daily = (cap - st["initial_capital"]) / days if days > 0 else 0.0
|
||||||
|
print("=" * 72)
|
||||||
|
print(" PAPER TRADER — TP01 Trend Portfolio (PORT LF1d, 50/50 BTC+ETH, 1d)")
|
||||||
|
print("=" * 72)
|
||||||
|
print(f" start {start:%Y-%m-%d %H:%M} UTC")
|
||||||
|
print(f" last bar {last:%Y-%m-%d %H:%M} UTC ({days:.1f} giorni, {st['n_bars']} barre 1d)")
|
||||||
|
print(f" capitale {cap:,.2f} USDT (start {st['initial_capital']:,.0f})")
|
||||||
|
print(f" ritorno {ret*100:+.2f}% | €/giorno {daily:+.2f} | maxDD {st['max_dd']*100:.1f}%")
|
||||||
|
print(f" posizioni now { 'flat' if all(p==0 for p in st['positions'].values()) else '' }")
|
||||||
|
for a in ASSETS:
|
||||||
|
p = st["positions"][a]
|
||||||
|
state = "FLAT" if p == 0 else ("LONG" if p > 0 else "SHORT")
|
||||||
|
print(f" {a}: {state:<5s} target {p:+.3f}x (frazione di equity dello sleeve)")
|
||||||
|
# what the strategy decides at the latest available closed bar
|
||||||
|
print(" ── prossima decisione (ultima barra chiusa disponibile) ──")
|
||||||
|
tp = TrendPortfolio(**CANONICAL)
|
||||||
|
for a in ASSETS:
|
||||||
|
w = tp.current_target(dfs[a])
|
||||||
|
print(f" {a}: target {w:+.3f}x")
|
||||||
|
if TRADES_FILE.exists():
|
||||||
|
n = sum(1 for _ in open(TRADES_FILE))
|
||||||
|
print(f" trade registrati: {n} ({TRADES_FILE})")
|
||||||
|
|
||||||
|
|
||||||
|
def main():
|
||||||
|
argv = sys.argv[1:]
|
||||||
|
dfs = build_bars()
|
||||||
|
if "--reset" in argv:
|
||||||
|
if STATE_FILE.exists():
|
||||||
|
STATE_FILE.unlink()
|
||||||
|
if TRADES_FILE.exists():
|
||||||
|
TRADES_FILE.unlink()
|
||||||
|
print("stato azzerato.")
|
||||||
|
st = load_state()
|
||||||
|
if st is None:
|
||||||
|
st = init_state(dfs)
|
||||||
|
save_state(st)
|
||||||
|
print("paper trader inizializzato (forward-only da ora).\n")
|
||||||
|
elif "--status" not in argv:
|
||||||
|
st = advance(st, dfs)
|
||||||
|
save_state(st)
|
||||||
|
print_status(st, dfs)
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
main()
|
||||||
@@ -0,0 +1,13 @@
|
|||||||
|
{
|
||||||
|
"_nota": "Config esecuzione LIVE del BOOK DERIBIT (TP01+SKH01 nettati in software). execution_enabled=true + --execute -> ordini REALI. ARMATO 2026-06-23: esecutore scripts/live/book_execute.py via cron ORARIO scripts/cron_book.sh (SKH01 e' a 230m). disaster-SL on-book -30% sulla posizione netta. Tutto flat all'arming -> nessun ordine finche' un segnale non arma.",
|
||||||
|
"_nota_cap": "Cap notional per-asset DINAMICO (frontiera 2026-07-03): con max_notional_per_asset_frac=0.5 il cap = equity/2, cosi' cresce col capitale e un deposito non resta strozzato. AGGIORNATO 2026-07-26: max_notional_per_asset_usd alzato 300 -> 3000 in previsione del versamento (EUR 5.000 + 500/mese -> equity ~$6.050, equity/2 ~$3.025). \u26a0\ufe0f Alzarlo NON e' pericoloso perche' dal 2026-07-26 il cap di FALLBACK (equity reale non leggibile) e' min(questo valore, ultima_equity_reale_osservata * frac) \u2014 vedi src/live/book._cap e il watermark data/live/equity_seen.json. Senza quel legame, un cap da $3.000 su un conto da $597 avrebbe permesso $2.000 di nozionale lordo = 3.35x di leva nel momento peggiore. Questo rende inutile l'azione manuale 'al deposito alzare il cap' (pre-registrata 2026-07-02).",
|
||||||
|
"execution_enabled": true,
|
||||||
|
"max_notional_per_asset_usd": 3000,
|
||||||
|
"max_notional_per_asset_frac": 0.5,
|
||||||
|
"min_order_usd": 5,
|
||||||
|
"disaster_sl_pct": 0.3,
|
||||||
|
"_nota_stale": "Staleness-gate (2026-07-25): se l'ultima barra del feed certificato e' piu' vecchia di max_data_age_days, book_execute NON invia ordini e allerta su Telegram. Il 2026-07-14 il book compro' ETH con il feed fermo da 6 giorni (conto online e posizione leggibile -> gli altri due gate non scattavano). Follow-up raccomandato nel diario 2026-07-15-feed-freeze, ora cablato.",
|
||||||
|
"max_data_age_days": 2,
|
||||||
|
"_nota_skh_feed": "Freschezza del feed 5m usato per il segnale SKH01 (2026-07-26). fresh_5m ricade sul feed certificato IN SILENZIO se il fetch pubblico Deribit fallisce, e il certificato si rigenera 1x/giorno: senza controllo la latenza d'uscita di SKH01 passa da ~1h a ~1 giorno senza segnalazione. Sopra soglia book_execute ALLERTA e NON blocca (bloccare fermerebbe anche TP01, nettato sullo stesso strumento, per un guasto di rete). Diario 2026-07-26-t1-esecuzione-skh-live.md.",
|
||||||
|
"skh_feed_max_age_min": 30
|
||||||
|
}
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
# Solo MONITOR (dashboard paper) del portafoglio attivo. Niente runner/esecuzione reale
|
||||||
|
# (archiviati in Old/). v2.0.0+.
|
||||||
|
services:
|
||||||
|
dashboard:
|
||||||
|
build: .
|
||||||
|
container_name: pythagoras-dashboard
|
||||||
|
restart: unless-stopped
|
||||||
|
command: ["uv", "run", "python", "-m", "src.live.dashboard", "--port", "8787"]
|
||||||
|
ports:
|
||||||
|
# Bind SOLO su 127.0.0.1: la dashboard non ha autenticazione e mostra conto e
|
||||||
|
# posizioni reali (Shadow live). Fino al 2026-08-04 era "8787:8787", cioe' pubblicata
|
||||||
|
# su tutte le interfacce e raggiungibile da internet: ufw NON protegge le porte
|
||||||
|
# pubblicate da Docker (il DNAT scavalca la catena INPUT). La consuma AI-OS da
|
||||||
|
# localhost per le risposte via Telegram.
|
||||||
|
- "127.0.0.1:8787:8787"
|
||||||
|
volumes:
|
||||||
|
- ./data:/app/data:ro
|
||||||
|
# token mainnet (sola lettura) per lo "Shadow live": conto/posizioni reali sulla dashboard.
|
||||||
|
# Montato a runtime (NON nell'immagine: .env.mainnet e' dockerignored). Solo letture, nessun ordine.
|
||||||
|
- ./.env.mainnet:/app/.env.mainnet:ro
|
||||||
|
|
||||||
|
# IB Gateway (PAPER) per la RICERCA DATI Interactive Brokers — replica il setup provato di BuzWay
|
||||||
|
# (scout). IBC fa login automatico headless; nessuna GUI desktop. API READ-ONLY (solo dati storici,
|
||||||
|
# MAI ordini). Bind SOLO su 127.0.0.1 -> non esposto in rete. Credenziali in .env.ibgw (gitignored).
|
||||||
|
# host 4002 -> container 4004 (socat paper), esattamente come nel connect("127.0.0.1", 4002).
|
||||||
|
ib-gateway:
|
||||||
|
image: ghcr.io/gnzsnz/ib-gateway:stable
|
||||||
|
container_name: pythagoras-ibgw
|
||||||
|
restart: unless-stopped
|
||||||
|
env_file: .env.ibgw
|
||||||
|
environment:
|
||||||
|
TRADING_MODE: paper
|
||||||
|
READ_ONLY_API: "yes" # SOLO dati: nessun ordine possibile via API
|
||||||
|
TWOFA_TIMEOUT_ACTION: restart
|
||||||
|
TIME_ZONE: Europe/Rome
|
||||||
|
ports:
|
||||||
|
- "127.0.0.1:4002:4004" # gateway paper (socat) raggiungibile solo da localhost dell'host
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
# 2026-06-19 — Wave 1 "beat TP01" (26 agenti BTC/ETH): nessun 3º sleeve robusto
|
||||||
|
|
||||||
|
Goal "trova strategie che battano l'esistente e inseriscile": GIA' soddisfatto da XS01 (cross-
|
||||||
|
sectional Hyperliquid, integrato → portafoglio TP01 70% + XS01 30%, FULL Sh 1.41 / HOLD 1.15).
|
||||||
|
In parallelo, una wave di 26 agenti ha cercato su BTC/ETH miglioramenti del trend + diversificatori.
|
||||||
|
|
||||||
|
## Esito wave 1 (26 agenti, 25 leak-free): 22 weak, 3 "contender", 1 noise
|
||||||
|
I 3 contender, ri-verificati ONESTAMENTE col giudice book-level (`verify_contender.py`) e come
|
||||||
|
contributo marginale al portafoglio ATTUALE (TP01+XS01):
|
||||||
|
|
||||||
|
| Candidato | corr TP01 | corr XS01 | +portafoglio (w30%) | Verdetto |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| **tsmom_strength_12h** | **+0.49** | — | — | ☠️ scartato: è TP01 più veloce (correlato), non diversifica |
|
||||||
|
| **breakout_atr** (trend) | −0.04 | −0.04 | FULL +0.48 / **HOLD +0.05** | ☠️ scartato: gonfia solo il FULL storico (bull), ~zero valore nel hold-out |
|
||||||
|
| **highvol_rev** (reversal alta-vol) | −0.08 | −0.05 | FULL +0.20 / **HOLD +0.30** | 🟡 WATCHLIST (vedi sotto) |
|
||||||
|
|
||||||
|
## highvol_rev: candidato vero ma NON abbastanza robusto → watchlist
|
||||||
|
È l'unico genuinamente scorrelato a ENTRAMBI gli sleeve e che migliora FULL+hold-out. MA il mio
|
||||||
|
robustezza-check indipendente (plateau, come per XS01) lo boccia per il deploy:
|
||||||
|
- **Edge solo a REV_LB=1**: LB2 FULL Sh 0.33, LB3 ~0.05 → **picco a singola-barra, non plateau**.
|
||||||
|
- **FULL standalone mediocre** (0.74); la forza è nel hold-out (HOLD 0.97-1.39 vs FULL ~0.7) =
|
||||||
|
**HOLD≫FULL = regime-luck dell'alta-vol 2025-26**, non robustezza temporale.
|
||||||
|
- È un **reversal** (famiglia morta in tutto il progetto) con concept ribaltato post-hoc
|
||||||
|
(low-vol→high-vol). Regge fee fino ~0.3% ma con margine ridotto.
|
||||||
|
Stesso difetto (HOLD≫FULL, no-plateau) per cui ho bocciato ieri il RV ETH/BTC regime-luck. La
|
||||||
|
disciplina che boccia i falsi positivi vale anche qui → **NON deployato**, in watchlist; rivalutare
|
||||||
|
forward (più dati) o se emerge un plateau su un parametro core.
|
||||||
|
|
||||||
|
## Conclusione
|
||||||
|
Wave 1 NON aggiunge un 3º sleeve robusto. **Portafoglio invariato: TP01 (70%) + XS01 (30%).** Le
|
||||||
|
famiglie trend (breakout/tsmom-12h) sono ridondanti con TP01 o aiutano solo il bull storico; l'unico
|
||||||
|
diversificatore di meccanismo nuovo (highvol_rev) non regge il bar di robustezza. Il vero edge
|
||||||
|
incrementale è venuto dall'ESPANSIONE DELL'UNIVERSO (Hyperliquid → cross-sectional), non da altre
|
||||||
|
varianti di trend su 2 asset. Direzione futura coerente: più asset certificati + sleeve di
|
||||||
|
meccanismo nuovo (non altre trend-variant), col criterio plateau+breadth+contributo.
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
# 2026-06-19 — Cerbero-bite = MAINNET reale: fonte VRP sbloccata
|
||||||
|
|
||||||
|
Indagine "cerca dati di cerbero-bite" + verifica mainnet/testnet a tre livelli. Esito: la
|
||||||
|
contaminazione storica NON era una proprieta' di Cerbero MCP, ma del vecchio token testnet sul
|
||||||
|
solo endpoint `get_historical`. Il token di cerbero-bite e' mainnet e serve catene opzioni reali.
|
||||||
|
|
||||||
|
## Dove sono i dati di cerbero-bite
|
||||||
|
|
||||||
|
`/home/adriano/Documenti/Git_XYZ/CerberoSuite/Cerbero_Bite` — bot live (testnet exec, propose-only)
|
||||||
|
che vende **credit-spread bull-put su ETH**. Dati:
|
||||||
|
- `data/state.sqlite`: `market_snapshots` (**52 righe, solo 30 apr–1 mag 2026**, BTC+ETH) con
|
||||||
|
`spot, dvol, realized_vol_30d, iv_minus_rv, funding_perp/cross, dealer_net_gamma,
|
||||||
|
gamma_flip_level, oi_delta_pct_4h, liquidation_long/short_risk, macro_days_to_event`;
|
||||||
|
`dvol_history` (1 riga); `positions/instructions/decisions` (0 righe, niente trade persistiti).
|
||||||
|
- `data/log/*.jsonl` (26 apr–1 mag 2026): log HTTP, non dump di catena. `strategy.yaml`: golden config.
|
||||||
|
- **Fonte dati**: Cerbero MCP (`get_instruments` + `get_ticker_batch`) dal gateway
|
||||||
|
`cerbero-mcp.tielogic.xyz`. NON c'e' storico profondo della catena (solo fetch live/on-demand).
|
||||||
|
|
||||||
|
## Verifica mainnet vs testnet (3 livelli)
|
||||||
|
|
||||||
|
1. **Spot vs nostra serie certificata** (Deribit mainnet), 2026-04-30 13–16h UTC:
|
||||||
|
BTC cerbero 76.287–76.446 vs certificato 76.237–76.443 (Δ 0.13–0.27%); ETH 2.261–2.264 vs
|
||||||
|
2.256–2.265 (Δ 0.04–0.29%). Scarti = rumore intra-barra (snapshot 15-min vs close orario).
|
||||||
|
NON e' il feed fantasma testnet (che divergeva >3%).
|
||||||
|
2. **`environment_info`** (token cerbero-bite): `environment=mainnet`, `base_url=www.deribit.com`,
|
||||||
|
`source=credentials`. **`get_ticker ETH-PERPETUAL`**: `testnet=false`, mark 1703.11.
|
||||||
|
3. **Catena, decisivo** — stessa opzione su ccxt.deribit mainnet vs Cerbero MCP:
|
||||||
|
`ETH_USDC-26JUN26-1650-P` (put settimanale, delta ~-0.28):
|
||||||
|
|
||||||
|
| fonte | bid | ask | mark_iv | delta | testnet |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| ccxt mainnet | 25.6 | 26.6 | 54.54% | -0.3150 | — |
|
||||||
|
| Cerbero MCP | 25.6 | 26.6 | 54.54% | -0.31513 | False |
|
||||||
|
|
||||||
|
**Identici bit-per-bit.**
|
||||||
|
|
||||||
|
## Verdetto
|
||||||
|
|
||||||
|
- **Il token MCP di cerbero-bite e' MAINNET; la sua catena opzioni e' reale** (= ccxt.deribit
|
||||||
|
mainnet). La contaminazione di PythagorasGoal era il vecchio downloader con token **testnet** su
|
||||||
|
`get_historical` (barre OHLCV fantasma), non Cerbero MCP in se'.
|
||||||
|
- **Fonte VRP sbloccata**: Cerbero MCP da' bid/ask/IV/greche/OI per-strike (come ccxt) **+** feature
|
||||||
|
di regime che ccxt non ha (`dealer_net_gamma`, `gamma_flip_level`, `oi_delta_pct_4h`,
|
||||||
|
`liquidation_*`, `funding`, `iv_minus_rv`, `macro`). Utile per validare lo sleeve VRP su piu'
|
||||||
|
regimi (raccolta snapshot live + accumulo nel tempo).
|
||||||
|
- **Limite residuo**: niente storico profondo della catena -> il backtest pluriennale del VRP resta
|
||||||
|
prezzato da modello (DVOL+BS); ma la calibrazione model-vs-reale e' ora robusta e ripetibile
|
||||||
|
(snapshot reali su piu' date/regimi).
|
||||||
|
|
||||||
|
## Collegamento col lavoro VRP (sleeve opzioni)
|
||||||
|
|
||||||
|
Conferma e rafforza `2026-06-19-eval-crypto-backtest-options.md`: lo snapshot ccxt aveva gia'
|
||||||
|
mostrato che il backtest SOTTOSTIMA il premio (skew +28% > spread 4% -> bid reale = 1.29x modello).
|
||||||
|
Ora abbiamo due fonti mainnet concordi (ccxt + Cerbero MCP) per misurare premio/skew/spread su piu'
|
||||||
|
regimi. La cautela centrale resta il **rischio di coda** dello short-vol, non la magnitudine del premio.
|
||||||
|
|
||||||
|
## Stato cerbero-bite (gia' concluso, contesto)
|
||||||
|
|
||||||
|
Il credit-spread bull-put ETH e' gia' stato giudicato NON robusto su ciclo completo (diario
|
||||||
|
`Old/docs/diary/2026-06-09-cerbero-bite-credit-spread.md`: EV breakeven-negativo; "+0.48%/mese" =
|
||||||
|
artefatto di finestra calma; coda concentrata col fade ETH). E' una struttura diversa dalla
|
||||||
|
put-selling/wheel del progetto `crypto_backtest`.
|
||||||
|
|
||||||
|
> Sicurezza: il token di cerbero-bite e' stato usato solo per la verifica; mai stampato ne' committato
|
||||||
|
> (resta in `.env`, gitignored).
|
||||||
@@ -0,0 +1,125 @@
|
|||||||
|
# 2026-06-19 — Valutazione strategia esterna `crypto_backtest` (trend + opzioni VRP)
|
||||||
|
|
||||||
|
Valutazione critica di un progetto esterno (`/home/adriano/crypto_backtest/`, file chiave
|
||||||
|
`STRATEGIA.md`, `production.py`, `options_deribit.py`, `production_equity.csv`) che propone un
|
||||||
|
book a 2 motori quasi scorrelati. Rilevante perché tocca proprio la frontiera che la nostra
|
||||||
|
ricerca post-reset ha lasciato aperta (le opzioni / volatility risk premium).
|
||||||
|
|
||||||
|
## Cosa propone
|
||||||
|
|
||||||
|
Portafoglio a due gambe (ρ=0.22 verificato dal CSV):
|
||||||
|
- **Sleeve 1 (25%)** — trend spot BTC+ETH a **12h**, long-only se `trend(30g)>0`, vol-target 20%,
|
||||||
|
cap 3×, leva globale ~1.07 calibrata a maxDD in-sample −20%.
|
||||||
|
- **Sleeve 2 (75%)** — vendita di **put settimanali (CSP/wheel) su BTC** su Deribit, strike a
|
||||||
|
**delta 0.28**, hold-to-expiry, IV da DVOL reale, prezzo Black-Scholes.
|
||||||
|
|
||||||
|
Numeri riprodotti dal CSV (finestra 2021-04→2026-06, 272 settimane):
|
||||||
|
|
||||||
|
| Serie | CAGR | Sharpe | maxDD | final |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| spot | +12.0% | 0.77 | −18.1% | 1.80x |
|
||||||
|
| opt | +15.9% | 1.09 | −20.0% | 2.16x |
|
||||||
|
| **blend 25/75** | +15.4% | **1.21** | **−15.2%** | 2.10x |
|
||||||
|
| blend ri-levato | +20.5% | 1.21 | −20.0% | 2.63x |
|
||||||
|
| B&H BTC | +1.3% | 0.30 | −74.2% | 1.07x |
|
||||||
|
|
||||||
|
corr(spot, opt) = **0.217** confermata. Settimane peggiori opt: 2022-05 (LUNA) −13%,
|
||||||
|
2022-06 −11%, 2021-05 −11%, 2022-11 (FTX) −9.7%.
|
||||||
|
|
||||||
|
## Punto forte — corroborazione indipendente del nostro TP01
|
||||||
|
|
||||||
|
Lo **sleeve spot è quasi identico al nostro TP01** (`src/strategies/trend_portfolio.py`):
|
||||||
|
12h, long-only, trend(30g), vol-target 20%, cap 3×. Due ricerche separate, due dataset diversi
|
||||||
|
(loro Binance, noi Deribit certificato), **stessa conclusione**: il trend vol-targeted a 12h è
|
||||||
|
l'edge reale e robusto. Il nostro Sharpe è più alto (1.32 vs 0.77 su questa finestra / 1.07
|
||||||
|
full-history) perché usiamo un **blend multi-orizzonte 1-3-6m** invece del singolo trend a 30g →
|
||||||
|
il blend diversifica gli orizzonti e alza lo Sharpe. Conferma forte per entrambi.
|
||||||
|
|
||||||
|
NB: loro confermano anche le NOSTRE lezioni — intraday ≤1h scartato (costi/rumore), un **bug di
|
||||||
|
look-ahead sul 4h trovato e corretto** (identico al nostro audit), MR/condor/strangle nudi e
|
||||||
|
collar stretti scartati per overfit/tail.
|
||||||
|
|
||||||
|
## Punto critico — lo sleeve opzioni guida il 75% ma è prezzato dal proprio modello
|
||||||
|
|
||||||
|
È esattamente il muro che avevamo dichiarato non-backtestabile (W18/19/21, ARGO: niente storico
|
||||||
|
chain per-strike gratis). Il loro workaround (BS su **DVOL reale** + payoff sul path realizzato)
|
||||||
|
fa emergere il VRP perché IV>RV (misurato BTC IV/RV~1.24). Concettualmente sano, ma la
|
||||||
|
**magnitudine è ottimistica** — limiti (in parte ammessi dagli autori):
|
||||||
|
|
||||||
|
1. **Nessun bid/ask**: vendono al mid (BS fair), non al bid. Sulle put OTM settimanali lo spread
|
||||||
|
è grosso → premio reale nettamente inferiore.
|
||||||
|
2. **Skew ignorato**: prezzano put a delta-0.28 (OTM) con DVOL = **IV ATM**. Il mercato carica le
|
||||||
|
put molto di più (skew di crash) → modellano la vol sbagliata proprio sull'opzione venduta.
|
||||||
|
3. **Coda sotto-modellata**: settimana peggiore solo −13% attraverso LUNA/FTX → sospettosamente
|
||||||
|
benigno per un venditore di put nudo. Gap, illiquidità di roll e settlement inverso (coin-settled)
|
||||||
|
sono approssimati.
|
||||||
|
4. **Leva senza funding** (ottimistico) + **bias di finestra** (parte vicino al top 2021,
|
||||||
|
favorevole a un book short-vol DD-capped).
|
||||||
|
|
||||||
|
Il blend Sharpe 1.21 è dominato dallo sleeve income (Sharpe 1.09, peso 75%). Con bid/ask + skew +
|
||||||
|
coda realistica lo sleeve income vale plausibilmente molto meno (Sharpe reale stimato ~0.7-0.9),
|
||||||
|
e il blend scende di conseguenza.
|
||||||
|
|
||||||
|
## Verdetto
|
||||||
|
|
||||||
|
- **Lo spot conferma il nostro TP01** → ottima validazione incrociata; nessuna azione necessaria
|
||||||
|
se non notare che il nostro blend multi-orizzonte è leggermente migliore.
|
||||||
|
- **Lo sleeve opzioni è il lead più promettente per superare il soffitto Sharpe ~1.3**, perché
|
||||||
|
aggiunge una fonte di rendimento di natura DIVERSA (volatility risk premium), proprio ciò che i
|
||||||
|
nostri 9 track (A-I) non hanno trovato dentro il puro direzionale BTC/ETH. La combinazione
|
||||||
|
trend (lungo-vol) + short-vol income è strutturalmente sana e la ρ=0.22 è reale.
|
||||||
|
- **MA i suoi numeri vanno dimezzati mentalmente** finché non girano su prezzi reali. Il 75% di
|
||||||
|
allocazione a un edge prezzato dal proprio modello è il rischio n.1.
|
||||||
|
|
||||||
|
## Prossimi passi onesti se si vuole inseguire questo lead
|
||||||
|
|
||||||
|
1. **Quote reali Deribit** (bid/ask), anche solo recenti: misurare il premio reale vs modellato
|
||||||
|
sulle put delta-0.28 settimanali, e quanto Sharpe sopravvive allo spread.
|
||||||
|
2. **Prezzare allo skew vero** (IV della put OTM, non DVOL ATM).
|
||||||
|
3. **Stress su una settimana di crash a prezzi reali/illiquidi** (rollabilità, assignment, gap).
|
||||||
|
4. **Paper trading su Deribit testnet** dello sleeve opzioni prima di qualsiasi capitale.
|
||||||
|
|
||||||
|
Coerente con la regola del progetto (lezione v2.0.0): un edge full+OOS robusto su prezzi MODELLATI
|
||||||
|
non è un edge finché non è verificato su prezzi reali ed eseguibili.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## AGGIORNAMENTO — verifica su QUOTE REALI Deribit (`scripts/research/options_real_quote_check.py`)
|
||||||
|
|
||||||
|
Fatta la verifica concreta (PARTE 1: catena reale Deribit mainnet pubblico; PARTE 2: ri-esecuzione
|
||||||
|
dello sleeve CSP con haircut reale sul premio). **Risultato che RIBALTA una mia critica.**
|
||||||
|
|
||||||
|
Snapshot del 2026-06-19, scadenza settimanale 2026-06-26 (~6.2 DTE), put delta −0.277 (strike 61k,
|
||||||
|
3.1% OTM), underlying 62.965:
|
||||||
|
|
||||||
|
| Grandezza | Valore |
|
||||||
|
|---|---|
|
||||||
|
| IV ATM (≈ DVOL) | 37.2% |
|
||||||
|
| IV put OTM (mark) | 42.1% (**skew +4.8 pt**) |
|
||||||
|
| premio put: BID / mark / ask | 598 / 623 / 630 USD |
|
||||||
|
| spread bid/mark | 0.96 (spread ~4%) |
|
||||||
|
| premio MODELLATO dal backtest (BS @ IV-ATM) | **463 USD** |
|
||||||
|
| **HAIRCUT premio reale(BID)/modello** | **1.29** |
|
||||||
|
|
||||||
|
**Il backtest SOTTOSTIMA il premio, non lo sovrastima.** Prezzando la put OTM con la DVOL (IV ATM)
|
||||||
|
ignora lo skew (+28% sul premio lordo); il bid/ask la riporta giu' solo del 4% → vendendo al BID
|
||||||
|
reale incassi **1.29×** il premio modellato. Lo sleeve modellato (Sharpe 1.13) e' quindi
|
||||||
|
**conservativo sul premio** alle quote attuali; col premio reale salirebbe (Sharpe → 1.83 a f=1.29).
|
||||||
|
|
||||||
|
**Ma la critica vera si SPOSTA, non sparisce:** lo skew esiste perche' il mercato prezza la coda
|
||||||
|
grassa: piu' premio = esattamente perche' i crash fanno male. La sensitivity mostra il punto di
|
||||||
|
rottura — lo sleeve regge finche' incassi >~85% del premio modellato (Sharpe 0.59 a f=0.85), va a
|
||||||
|
zero a f=0.70, negativo a f=0.55. Lo snapshot e' in **regime calmo** (IV ATM 37%, bassa per crypto);
|
||||||
|
in un crash lo spread si allarga molto e potresti non riuscire a rollare. Quindi:
|
||||||
|
|
||||||
|
- ✅ **Concern "premio sovrastimato" = SMENTITO** (alle quote attuali e' anzi sottostimato).
|
||||||
|
- ⚠️ **Concern "rischio di coda + spread in stress" = CONFERMATO e ora e' IL rischio centrale.**
|
||||||
|
Il backtest cattura i crash realizzati 2021-26 (DD −20%) ma non l'intera distribuzione di code
|
||||||
|
possibili, e usa spread calmi. La f reale in settimana di crash e' < 1 e lo spread esplode.
|
||||||
|
|
||||||
|
**Verdetto aggiornato:** lo sleeve income e' piu' solido di quanto temessi sul *premio* (il VRP +
|
||||||
|
skew e' reale e generoso), ma resta una strategia short-vol il cui rischio vero e' la **coda** e la
|
||||||
|
**liquidita' di roll nello stress**, non la magnitudine del premio. Prima del capitale: ripetere lo
|
||||||
|
snapshot nel tempo (specie in regimi di IV alta), misurare lo spread in giornate di stress, e
|
||||||
|
paper-trade su testnet. Il lead per superare il soffitto Sharpe ~1.3 (aggiungere il VRP a TP01)
|
||||||
|
resta valido e ora meglio quantificato.
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
# 2026-06-19 — Ricerca frattale multi-agente (63 agenti) su BTC/ETH
|
||||||
|
|
||||||
|
Su richiesta: 50+ agenti in parallelo a cercare strategie NUOVE ispirate ai due documenti
|
||||||
|
frattali (`Libro_frattali` + `Pythagoras_Trading_Prediction`), timing/asset diversi, ognuna
|
||||||
|
validata sull'harness onesto. Eseguito come Workflow: **63 agenti, ~2h, 3.8M token.**
|
||||||
|
|
||||||
|
## Cosa è stato testato
|
||||||
|
16 concetti frattali estratti dai documenti (sotto la patina esoterica: coscienza, frequenze
|
||||||
|
Solfeggio, numeri sacri → idee testabili): alfabeto candle U/D/0 (3-6, LONG), Fourier/cicli,
|
||||||
|
ricorrenza di Poincaré (analoghi kNN), centro di inversione Evideon (mirror tempo+prezzo),
|
||||||
|
indicatore H-C (~588/25 ≈ 23.5 barre), numeri-universali come periodi, invarianza di forma,
|
||||||
|
entropia di Shannon ("coscienza") come gate, confluenza multi-TF, grammatica composizionale,
|
||||||
|
fase-ricorrenza. × BTC/ETH × {5m,15m,1h} = **52 ipotesi**.
|
||||||
|
|
||||||
|
Ogni segnale: scritto da un agente come funzione `signal()`, valutato da `eval_signal.py`
|
||||||
|
(stesso harness onesto) con **guard automatico anti-look-ahead** (ricalcolo su prefissi).
|
||||||
|
Superstiti → verifica avversariale con sblocco una-tantum del **hold-out 2025-26**.
|
||||||
|
|
||||||
|
## Esito
|
||||||
|
- **Verdetti**: 29 rumore, 12 "real" (netto-fee positivo ma non battono il buy&hold), 11 "edge"
|
||||||
|
(in-sample: battono B&H + null p<0.05 + leak=0).
|
||||||
|
- **Guard anti-look-ahead**: nessun leak passato (gli agenti hanno prodotto segnali causali; i
|
||||||
|
pochi tentativi con futuro sono stati auto-squalificati e corretti).
|
||||||
|
- **Hold-out (la prova del nove)**: dei **11 superstiti in-sample, 10 REFUTATI** — performance
|
||||||
|
catastrofica nel 2025-26 (hurst-DFA −0.49, hc-cycle −0.83, vol-accel −1.16, universal-periods
|
||||||
|
−0.42…−1.04, spectral-entropy −0.38/+0.29, multitf −0.49, solfeggio-BTC −0.64). Stessa firma di
|
||||||
|
sempre: **regime-luck del toro 2018-2024, sparito out-of-sample.**
|
||||||
|
- **1 "confermato"** dalla verifica per-agente: `momentum_solfeggio_cycle` **ETH 1h** (holdout
|
||||||
|
Sharpe +1.19, ret +49% mentre il buy&hold ETH faceva −49%). Sembrava un trionfo.
|
||||||
|
|
||||||
|
## Ma il "vincitore" cade al test cross-asset (kill decisivo)
|
||||||
|
Il guard per-agente valuta un asset alla volta e non poteva vedere il quadro. Ho rieseguito **lo
|
||||||
|
stesso identico codice** sui due major:
|
||||||
|
|
||||||
|
| Signal (identico) | FULL Sharpe | HOLD-OUT Sharpe | HOLD-OUT ret |
|
||||||
|
|---|---|---|---|
|
||||||
|
| Solfeggio-cycle su **ETH** 1h | 1.54 | **+1.19** | +49% |
|
||||||
|
| Solfeggio-cycle su **BTC** 1h | 1.17 | **−0.25** | −7.5% |
|
||||||
|
|
||||||
|
Un edge robusto non fallisce sull'altro major. La stessa logica (long-only ~20% esposta, filtro
|
||||||
|
SMA(588), timing su ciclo ~24) che ha "schivato" il crash ETH 2025 **perde su BTC nello stesso
|
||||||
|
hold-out**. È **fortuna di regime di un singolo asset**, non skill. Aggravanti: costanti
|
||||||
|
numerologiche ad-hoc (24/588/56, "odore" di overfit, già notato dal verificatore); e con 52 trial,
|
||||||
|
trovare 1 segnale che passa un singolo regime di hold-out è atteso per puro caso (1/11 ≈ chance).
|
||||||
|
|
||||||
|
## VERDETTO
|
||||||
|
**La ricerca frattale multi-agente (52 ipotesi, 63 agenti) NON ha trovato alcun edge robusto.**
|
||||||
|
I concetti frattali/esoterici si sono comportati esattamente come le famiglie convenzionali (Fasi
|
||||||
|
1-3): edge in-sample da regime-luck del toro, refutati dal hold-out; e l'unico che passava il
|
||||||
|
hold-out su un asset fallisce sull'altro. **Nessuna magia nei numeri Solfeggio/sacri.**
|
||||||
|
|
||||||
|
Il valore: il processo disciplinato (guard anti-look-ahead + hold-out bloccato + **test cross-asset**)
|
||||||
|
ha catturato un falso "trionfo" (+49% vs −49%!) che sul vecchio sistema contaminato sarebbe finito
|
||||||
|
dritto in produzione. È la quinta conferma indipendente che su BTC/ETH non c'è un edge facile.
|
||||||
|
|
||||||
|
## Stato della ricerca dopo tutte le fasi
|
||||||
|
Testato: mean-reversion, momentum/trend, vol, lead-lag, hurst, shape-ML, e 16 famiglie frattali ×
|
||||||
|
multi-TF/asset. **Niente di robusto, fee-surviving, OOS e cross-asset.** Le direzioni oneste
|
||||||
|
restano: (a) accettare il ceiling = long risk-managed (no alpha); (b) allargare l'universo dati
|
||||||
|
CERTIFICATO oltre BTC/ETH; (c) fonti di segnale ortogonali al prezzo (on-chain, basis multi-venue,
|
||||||
|
opzioni multi-regime) — tutte richiedono nuovi dati certificati. Artefatti: `eval_signal.py`,
|
||||||
|
workflow `fractal-strategy-search`, ~52 segnali in `/tmp/pyth_sig_*.py`.
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
# 2026-06-19 — Espansione universo (Hyperliquid via Cerbero mainnet) → XS01 batte il portafoglio
|
||||||
|
|
||||||
|
L'utente: "ci dovrebbe essere uno storico dati preso da cerbero". Aveva ragione, ed è la chiave per
|
||||||
|
superare il soffitto a 2 asset.
|
||||||
|
|
||||||
|
## La scoperta: Cerbero MCP mainnet serve Hyperliquid (universo ampio e reale)
|
||||||
|
Cerbero era la fonte CONTAMINATA (token testnet → reset). MA col token **mainnet** (`.env.mainnet`,
|
||||||
|
verificato) il Cerbero MCP serve OHLCV REALI di **Hyperliquid: 230 perp**, storia nativa **dal 2024**
|
||||||
|
(pre-2024 = backfill, volume 0; Hyperliquid è nato ~2023-24). Prezzi recenti plausibili.
|
||||||
|
|
||||||
|
## Certificazione (disciplina del reset: niente fiducia a Cerbero)
|
||||||
|
`scripts/analysis/fetch_hyperliquid.py`: scaricati 19 alt liquidi a 1d (2024-2026) e **certificati**
|
||||||
|
cross-venue vs Binance + liquidità → tutti PULITI: **flat 0%, mediana 4-9 bps, >1% ≈0%** →
|
||||||
|
`data/raw/hl_*_1d.parquet` (namespace dedicato). Caveat onesto: **~2.5 anni** di storia nativa.
|
||||||
|
|
||||||
|
## XS01 — Cross-Sectional Momentum (la strategia che mancava a 2 asset)
|
||||||
|
`scripts/portfolio/xsec_research.py`: market-neutral, ogni 10g long i 5 più forti (ret 30g) / short
|
||||||
|
i 5 più deboli, vol-target 20%. Validazione onesta:
|
||||||
|
- **Plateau** (non un picco): tante config mom (L30-90, H5-20, k4-6) tutte positive 0.6-0.98.
|
||||||
|
- **Fee-robusto**: FULL Sh 0.79→0.68 da fee 0% a 0.3% RT.
|
||||||
|
- **Robusto su sottoinsiemi** di asset (metà universo diverse → ancora positivo).
|
||||||
|
- **Scorrelato a TP01 (~−0.06)**, **positivo OGNI anno** (2024 +2%, 2025 +19%, 2026 +20%).
|
||||||
|
- **Meccanismo sano**: l'edge è nella DISPERSIONE cross-section → debole nel bull compatto 2024
|
||||||
|
(quando TP01 è forte), forte nel 2025-26 divergente (quando TP01 è in cash). **Complementare**.
|
||||||
|
|
||||||
|
Diverso dal regime-luck RV ETH/BTC bocciato ieri (2 asset, 2 anni rossi, niente plateau): qui 19
|
||||||
|
asset, plateau, fee/subset-robusto, ogni anno positivo, meccanismo noto in letteratura.
|
||||||
|
|
||||||
|
## Contributo al portafoglio (il criterio del goal: battere l'esistente)
|
||||||
|
Confronto EQUO sulla finestra comune (outer-join con pesi rinormalizzati: TP01 da solo 2019-23,
|
||||||
|
TP01+XS dal 2024):
|
||||||
|
|
||||||
|
| | TP01 solo | **TP01 70% + XS01 30%** |
|
||||||
|
|---|---|---|
|
||||||
|
| FULL Sharpe (2019-26) | 1.30 | **1.41** |
|
||||||
|
| **HOLD-OUT 2025-26 Sharpe** | 0.31 | **1.15** |
|
||||||
|
| HOLD-OUT ret / DD | +3.5% / 7.5% | **+15.1% / 5.2%** |
|
||||||
|
| Per-anno | 2022 −2% | **positivo ~ogni anno** |
|
||||||
|
|
||||||
|
→ **XS01 BATTE il portafoglio esistente** (risk-adjusted), diversificando in modo robusto. Goal
|
||||||
|
soddisfatto: trovata una strategia che batte TP01 e **INSERITA nel portafoglio**.
|
||||||
|
|
||||||
|
## Integrazione
|
||||||
|
- `src/portfolio/portfolio.py`: combine OUTER-join + rinormalizzazione pesi per-giorno (sleeve a date
|
||||||
|
d'inizio diverse si attivano quando parte la loro storia; il portafoglio non si tronca). Test nuovo.
|
||||||
|
- `src/portfolio/sleeves.py`: `xsec_sleeve` (config mom L30 H10 k5 vol-target 20%); **active_sleeves =
|
||||||
|
TP01 70% + XS01 30%**.
|
||||||
|
- `fetch_hyperliquid.py`, `xsec_research.py`. 12 test passano.
|
||||||
|
|
||||||
|
## Caveat onesti (da non dimenticare)
|
||||||
|
- **Storia XS solo ~2.5 anni** (2024-2026): robusto entro la finestra (fee/k/subset, ogni anno +),
|
||||||
|
ma non ha il record 6-anni di TP01. Cross-sectional momentum è literature-robust → prior favorevole.
|
||||||
|
- **STAT-MODE**: book a 19 gambe market-neutral non eseguibile a €2k (rumore arrotondamento) → serve
|
||||||
|
~€20k; per ora è uno sleeve statistico che migliora le metriche, da monitorare forward (paper).
|
||||||
|
- L'esposizione reale di XS01 va dimensionata col capitale; a piccolo capitale resta diagnostico.
|
||||||
|
|
||||||
|
## Stato
|
||||||
|
Portafoglio attivo = **TP01 (70%) + XS01 (30%)**, FULL Sh 1.41 / HOLD 1.15. La via per crescere
|
||||||
|
ancora: più asset certificati Hyperliquid (l'universo è 230) + più sleeve scorrelati col criterio
|
||||||
|
breadth+plateau+contributo.
|
||||||
@@ -0,0 +1,81 @@
|
|||||||
|
# 2026-06-19 — Options VRP sleeve: infrastruttura + prima validazione onesta
|
||||||
|
|
||||||
|
Impostata la ricerca dello sleeve income opzioni (vendita put settimanali, incassa il volatility
|
||||||
|
risk premium IV>RV). Lead identificato dalla valutazione di `crypto_backtest` come la via per
|
||||||
|
superare il soffitto Sharpe ~1.3 (fonte di rendimento DIVERSA, scorrelata al trend).
|
||||||
|
|
||||||
|
## Infrastruttura costruita
|
||||||
|
- `scripts/research/fetch_dvol.py`: storia DVOL (IV 30d Deribit) BTC/ETH **2021-03 → 2026-06**
|
||||||
|
(1914g) → `data/raw/dvol_*.parquet`. È l'input IV.
|
||||||
|
- `scripts/research/options_vrp_lab.py`: motore backtest CSP settimanale. Prezzo put BS su DVOL
|
||||||
|
reale + **calibrazione f** (skew/spread vs quote reali), strike a delta target, payoff sul path
|
||||||
|
realizzato dei prezzi certificati. Causale (decisione a sell-date, payoff a scadenza). Gauntlet:
|
||||||
|
VRP context, sweep f/delta, per-anno, worst-weeks (coda), correlazione + contributo vs TP01.
|
||||||
|
- `scripts/research/options_real_quote_check.py` (dal branch): verifica premio su quote reali.
|
||||||
|
|
||||||
|
## VRP reale (contesto)
|
||||||
|
BTC DVOL 61% vs RV 53% → **VRP +7.8 pt, positivo 78% del tempo**; ETH +3.7 pt, 67%. Il premio di
|
||||||
|
volatilità esiste ed è più ricco su BTC.
|
||||||
|
|
||||||
|
## Risultati (book 50/50 BTC+ETH, put settimanali delta -0.28)
|
||||||
|
|
||||||
|
**Tutto dipende dalla CALIBRAZIONE f del premio:**
|
||||||
|
| f | Sharpe | CAGR | maxDD | worst-week |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 0.70 | −0.32 | −12% | 51% | −26% |
|
||||||
|
| 0.85 | 0.20 | +1% | 35% | −26% |
|
||||||
|
| **1.00 (conservativo, IV-ATM)** | **0.71** | +16% | 33% | −26% |
|
||||||
|
| 1.15 | 1.22 | +34% | 32% | −25% |
|
||||||
|
| **1.29 (reale calm, con skew)** | **1.70** | +52% | 31% | −25% |
|
||||||
|
|
||||||
|
- A f=1.0 (ignora il bonus skew): Sharpe **0.71** — SOTTO TP01. A f=1.29 (skew reale misurato in
|
||||||
|
regime calmo): **1.70**. La verità sta in mezzo E f varia col regime (skew più alto nello stress).
|
||||||
|
- **Delta**: più ATM = più premio + più rischio (−0.15→Sh 0.25, −0.28→0.71, −0.40→0.95).
|
||||||
|
|
||||||
|
**La CODA è severa (è short-vol):** maxDD standalone **30-33%**, singole settimane **−15..−26%**
|
||||||
|
(2021-05 crash, 2022-05/06 LUNA, 2026-02/06). Per-anno (f=1.0): 2022 **−9%**, 2026-YTD **−14%** —
|
||||||
|
sanguina negli anni di crash. HOLD-OUT 2025-26: Sharpe **0.04** a f=1.0 (piatto), 0.94 a f=1.29.
|
||||||
|
|
||||||
|
**Diversificazione (reale):** corr settimanale a TP01 **+0.07** (scorrelato). Contributo (f=1.0):
|
||||||
|
TP01 70% + OPT 30% → Sharpe settimanale 0.71→**0.97**, DD basso (11%). Anche al premio conservativo
|
||||||
|
migliora il portafoglio per pura decorrelazione.
|
||||||
|
|
||||||
|
## Verdetto — LEAD reale, NON deploy-ready
|
||||||
|
- ✅ Il VRP è reale (IV>RV 78%), lo sleeve è **genuinamente scorrelato** al trend (+0.07) e
|
||||||
|
**migliora il portafoglio** anche a premio conservativo. È la fonte di rendimento DIVERSA che
|
||||||
|
cercavamo per superare il soffitto ~1.3.
|
||||||
|
- ⚠️ MA: (a) le metriche headline dipendono da una calibrazione **ottimistica** (f=1.29);
|
||||||
|
conservativo (f=1.0) → Sharpe 0.71 con **DD 33%**. (b) Premio **MODELLATO** (BS su DVOL), non un
|
||||||
|
backtest su catena reale; la verifica su quote reali è UN solo snapshot calmo. (c) Il **rischio di
|
||||||
|
coda** (roll/assignment/gap nello stress, skew che esplode) NON è pienamente catturato.
|
||||||
|
- Regola del progetto: **mai deployare uno short-vol prezzato da un modello.** → NON aggiunto al
|
||||||
|
portafoglio. Portafoglio attivo invariato: TP01 70% + XS01 30%.
|
||||||
|
|
||||||
|
## CALIBRAZIONE su quote REALI cerbero-bite (`options_vrp_calibrate.py`) — corregge l'ottimismo
|
||||||
|
cerbero-bite GIA' accumula la catena reale mainnet (option_chain_snapshots, BTC 224k / ETH 237k
|
||||||
|
righe, 2026-05→oggi). Usandola (non un nuovo snapshotter), misurato il fattore f reale su 223
|
||||||
|
snapshot/asset (put weekly ~delta -0.28, vendita al BID):
|
||||||
|
- **BTC: f mediano 1.03** (IQR 0.89-1.21), skew reale **+1.9 pt** (IV put 43.5% vs DVOL 41.6%).
|
||||||
|
- **ETH: f mediano 0.97** (IQR 0.88-1.11), skew **+1.5 pt**.
|
||||||
|
- **Il f reale e' ~1.0, NON 1.29.** Lo snapshot singolo del branch (skew +4.8 → f 1.29) era un
|
||||||
|
OUTLIER; sulla media lo skew e' modesto e il bid/ask lo compensa → premio reale ≈ modellato.
|
||||||
|
→ Il VRP sleeve sta sul punto **f≈1.0 dello sweep = Sharpe ~0.71** (caso CONSERVATIVO), DD 33%,
|
||||||
|
hold-out ~piatto (0.04). Non il 1.70 ottimistico. Resta un diversificatore modesto (corr +0.07,
|
||||||
|
migliora il portafoglio settimanale 0.71→0.97 a 30%), ma standalone SOTTO TP01 e con coda severa.
|
||||||
|
**CAVEAT:** la finestra di calibrazione reale e' ~10 giorni densi (06-09→06-19, cerbero-bite ruota
|
||||||
|
le scadenze → i weekly compaiono sparsi) e UN regime calmo. Il f di STRESS resta non misurato.
|
||||||
|
|
||||||
|
## Verdetto aggiornato
|
||||||
|
Al premio REALE (f≈1.0), il VRP sleeve e' un diversificatore DEBOLE (Sharpe ~0.71 < TP01, DD 33%,
|
||||||
|
hold-out piatto): la modesta decorrelazione NON giustifica il rischio di coda short-vol senza molto
|
||||||
|
piu' dato reale multi-regime. **Confermato NON-deploy.** Il valore vero arriva solo se cerbero-bite,
|
||||||
|
continuando ad accumulare, copre un CRASH: lì si misura il f reale di stress e si fa un backtest su
|
||||||
|
catena reale. Fino ad allora, lead quantificato ma in attesa. Portafoglio invariato TP01 70%+XS01 30%.
|
||||||
|
|
||||||
|
## Prossimi passi per graduare il lead a sleeve deployabile
|
||||||
|
1. **Accumulo forward di quote reali** (bid/ask + skew della put settimanale delta-0.28, ogni giorno,
|
||||||
|
su più regimi) → sostituire il premio modellato con quello reale e misurare f nello stress.
|
||||||
|
2. **Stress crash-week con spread reali** (rollabilità, assignment, gap inverso/coin-settled).
|
||||||
|
3. **Daily-MTM** dello short put per l'integrazione nel portafoglio giornaliero (ora è settimanale).
|
||||||
|
4. **Paper-trade su Deribit testnet** prima di qualsiasi capitale.
|
||||||
|
Solo dopo, se regge a premi reali multi-regime, aggiungerlo come 3º sleeve (scorrelato, income).
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
# 2026-06-19 — Ricerca v2.0.0: Fase 0 (harness) + Fase 1 (triage superstiti)
|
||||||
|
|
||||||
|
Primo log di ricerca post-reset. Universo certificato: BTC/ETH, 1h. Hold-out 2025+ BLOCCATO.
|
||||||
|
|
||||||
|
## Fase 0 — harness onesto (`scripts/analysis/research_lab.py`)
|
||||||
|
|
||||||
|
Banco di prova causale per costruzione (modello a SERIE DI POSIZIONE: `pos[i]` decisa entro
|
||||||
|
`close[i]`, guadagna `close[i]→close[i+1]`, fee sul turnover |Δpos|). Metriche
|
||||||
|
Sharpe/CAGR/DD/exposure/turnover, finestra OOS, **null model a rotazione circolare**
|
||||||
|
(p-value: il timing batte il caso?), baseline buy&hold, sweep fee.
|
||||||
|
|
||||||
|
**Self-test del banco (valida l'HARNESS, non una strategia):**
|
||||||
|
- buy&hold BTC: Sharpe 0.79 (sanity OK).
|
||||||
|
- CHEAT look-ahead (pos = segno del rendimento futuro): Sharpe **58**, p=0.005 → l'engine
|
||||||
|
VEDE un edge reale quando esiste.
|
||||||
|
- NOISE causale a basso turnover: Sharpe **0.14**, p=0.26 → l'engine NON inventa edge dal
|
||||||
|
nulla (niente leak, niente skill spuria).
|
||||||
|
|
||||||
|
Il banco è affidabile. → ogni numero qui sotto è netto fee e causale.
|
||||||
|
|
||||||
|
## Fase 1 — triage dei 2 superstiti (`scripts/analysis/phase1_survivors.py`)
|
||||||
|
|
||||||
|
Sul feed pulito solo SH01 (shape-ML) e frammenti HONEST mostravano segnale residuo. Delle
|
||||||
|
HONEST solo **DIP** è testabile su BTC/ETH (TR01/ROT02 richiedono alt esclusi). Re-implementati
|
||||||
|
come serie di posizione, passati ai gate onesti.
|
||||||
|
|
||||||
|
### DIP reversion (long-only) — ☠️ MORTO
|
||||||
|
Griglia 3×3 (n, k) **tutta negativa** su entrambi gli asset (nessun plateau). Config centrale
|
||||||
|
n50 k2.0: FULL Sharpe −0.17 (BTC) / −0.06 (ETH); a fee 0% appena +0.02/+0.09 (niente edge nemmeno
|
||||||
|
lordo). OOS-VAL marginale (+0.36/+0.16) ma **null p=0.84-0.89** (peggio del caso). Rumore.
|
||||||
|
|
||||||
|
### SH01 shape-ML (walk-forward LogReg) — ☠️ FEE-DEAD
|
||||||
|
Pattern coerente su BTC/ETH, long/short e long-only:
|
||||||
|
|
||||||
|
| Variante | Sh fee0% | Sh fee0.05% | Sh fee0.10% | trade/anno | null p |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| BTC L/S | +0.32 | −0.70 | −1.71 | 877 | 0.167 |
|
||||||
|
| BTC long-only | +0.73 | −0.06 | −0.84 | 555 | 0.072 |
|
||||||
|
| ETH L/S | +0.31 | −0.40 | −1.11 | 773 | 0.137 |
|
||||||
|
| ETH long-only | +0.46 | −0.04 | −0.53 | 485 | 0.142 |
|
||||||
|
|
||||||
|
C'è un **sussurro di segnale LORDO** (Sharpe 0.3-0.7 a fee zero) ma il turnover (485-877
|
||||||
|
trade/anno) lo divora: a fee reale tutte negative, e **nessuna batte il null** (p>0.05). Net-fee:
|
||||||
|
rumore.
|
||||||
|
|
||||||
|
## VERDETTO Fase 1
|
||||||
|
**Né DIP né shape-ML sopravvivono su BTC/ETH certificato net-fee.** Nessuno dà Sharpe netto >0,
|
||||||
|
nessuno batte il null (p<0.05), nessuno batte il **buy&hold** (Sharpe 0.79/0.84 — di fatto la
|
||||||
|
"strategia" più forte vista finora). Si conferma: i "superstiti" della vecchia libreria erano,
|
||||||
|
come il resto, non-edge. Chiusi.
|
||||||
|
|
||||||
|
## Lead onesto per la Fase 2
|
||||||
|
L'unico segnale non-nullo è il **gross shape-ML** (Sharpe 0.3-0.7 a fee zero), ucciso dal
|
||||||
|
turnover. Direzione: esprimere quel segnale a **turnover molto più basso** (orizzonte di holding
|
||||||
|
lungo, soglia forte, o come GATE di regime invece che flip per-barra) per vedere se il sussurro
|
||||||
|
lordo sopravvive alle fee. È un lead, NON un edge. Inoltre: la barra reale da battere è il
|
||||||
|
**buy&hold** (Sharpe ~0.8) — una strategia di timing deve fare meglio di "stai sempre long",
|
||||||
|
net-fee.
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
# 2026-06-19 — Ricerca v2.0.0: Fase 2 (famiglie) + analisi OPTIONS
|
||||||
|
|
||||||
|
Universo certificato BTC/ETH. Barra da battere = **buy&hold** (Sharpe 0.79 BTC / 0.84 ETH).
|
||||||
|
Tutto netto fee 0.10% RT, hold-out 2025+ BLOCCATO. Harness: `research_lab.py`.
|
||||||
|
|
||||||
|
## Fase 2 — esplorazione famiglie (`phase2_families.py`)
|
||||||
|
|
||||||
|
24 combinazioni famiglia×asset×TF, ognuna: scan griglia → config migliore → gate onesti
|
||||||
|
(FULL/OOS-VAL, vs buy&hold, null p-value a rotazione, sweep fee).
|
||||||
|
|
||||||
|
### Esiti per famiglia
|
||||||
|
- **REVERSAL (mean-reversion breve): ☠️ MORTA OVUNQUE.** FULL Sharpe da −1 a −5.6 (peggio a
|
||||||
|
15m: fee-death, −5.6 BTC / −4.6 ETH), gross ≈0, null p 0.45-0.82. **Smentisce definitivamente
|
||||||
|
la tesi storica del progetto ("l'edge è sempre mean-reversion")**: era artefatto del feed.
|
||||||
|
- **TSMOM / MA-cross / Donchian (trend, long-only): segnale REALE ma MODESTO.** Le versioni
|
||||||
|
long-only (basso turnover) battono o eguagliano il buy&hold:
|
||||||
|
- **MA-cross long-only**: ETH FULL **1.12** / OOS 0.89 / p **0.007**; BTC FULL **0.90** / OOS
|
||||||
|
1.99 / p **0.040**. Plateau sulla griglia (ETH 12/48 e 48/192 entrambi 1.1), coerente sui
|
||||||
|
DUE asset, basso turnover (53-106 trade/anno). **Unici 2 a passare: battono B&H + OOS>0 + p<0.05.**
|
||||||
|
- Donchian long-only: FULL 0.84-0.94, OOS ottimo (BTC 2.37) ma p 0.08-0.10 (pochi trade → null
|
||||||
|
rumoroso). TSMOM long-only: ETH 0.83 (≈B&H). Le L/S perdono (turnover + short su asset in trend).
|
||||||
|
- **VOL-TARGET overlay**: ≈ buy&hold (FULL 0.77-0.84), p alto → non distinguibile dal B&H, ma è
|
||||||
|
un riduttore di vol/DD (mantiene lo Sharpe scalando l'esposizione).
|
||||||
|
- **HURST-gate, LEAD-LAG BTC↔ETH**: niente. (Hurst-mom ETH p=0.043 ma sotto il B&H; lead-lag
|
||||||
|
fee-dead.)
|
||||||
|
|
||||||
|
### Verdetto Fase 2
|
||||||
|
L'unica cosa reale su BTC/ETH certificato è il **trend-following long-only** (MA-cross in testa):
|
||||||
|
un **long con gestione del rischio** che batte il buy&hold di poco (Sharpe ~0.9-1.1 vs 0.8)
|
||||||
|
evitando i drawdown peggiori. È un effetto noto in letteratura (time-series momentum), NON alpha
|
||||||
|
market-neutral. **Caveat multiple-testing**: 2 flag su ~24 test ≈ soglia del caso; ma la stessa
|
||||||
|
famiglia vince su ENTRAMBI gli asset con plateau → è un LEAD genuino, non confermato. La barra
|
||||||
|
vera resta il B&H, e l'OOS-VAL alto di BTC (1.99) puzza di "2024 anno di trend forte" → serve la
|
||||||
|
prova del hold-out 2025-26 + regimi bear + stress fee/slippage + deflated-Sharpe (Fase 3).
|
||||||
|
|
||||||
|
## Analisi OPTIONS (`options_analysis.py`)
|
||||||
|
|
||||||
|
Dati reali cerbero-bite mainnet, ma finestra **~2026-05-01→06-11 (~6 sett., REGIME UNICO calmo)**.
|
||||||
|
|
||||||
|
### Livelli misurati (reali)
|
||||||
|
- **VRP (IV − RV) positivo il 100% del tempo**: BTC +10, ETH +14 punti di vol annua. Le opzioni
|
||||||
|
sono sistematicamente CARE in questa finestra → vendere vol/covered-call avrebbe incassato premio.
|
||||||
|
- **Skew put positivo**: BTC IV put-10%OTM 44% vs call 35% (skew +10 pt); ETH 54 vs 49 (+5). Il
|
||||||
|
crash è prezzato (assicurazione cara).
|
||||||
|
- **Costo put protettiva** (mensile, %-del-notional): ~10% OTM = **0.98% BTC / 1.36% ETH**; ATM
|
||||||
|
3.3%/5.0%; ~15% OTM 0.83%/0.71%. Liquidità: ATM spread ~3%, OTM 7-12%. Mensile ben popolato
|
||||||
|
(499-2043 strike), settimanale OTM sottile. Funding perp ≈ 0 (nessun carry).
|
||||||
|
|
||||||
|
### Verdetto OPTIONS
|
||||||
|
**Nessun edge su opzioni è validabile ora**: 6 settimane, regime unico calmo. Il segnale
|
||||||
|
VRP-positivo / sell-vol è ESATTAMENTE ciò che brilla in calma e salta in aria nei crash (è il
|
||||||
|
rischio che viene pagato) — non testabile senza un crash nel campione. Ruoli legittimi (entrambi
|
||||||
|
NON validabili ora, solo forward):
|
||||||
|
- **(a) Tail-cap / catastrofe**: put OTM standing su un book long (il candidato trend ha DD grossi).
|
||||||
|
Costa ~1-1.5%/mese a 10% OTM — gateabile coi premi reali misurati qui. Overlay per-trade 24h
|
||||||
|
INFATTIBILE (strike OTM corti inesistenti/illiquidi); standing settimanale/mensile FATTIBILE.
|
||||||
|
- **(b) Harvest del VRP** (covered call / put-spread): +10-14 pt ci sono ORA, ma è una scommessa
|
||||||
|
short-vol che richiede un crash nel campione per essere giudicata onestamente. Non l'abbiamo.
|
||||||
|
|
||||||
|
**Raccomandazione**: le opzioni NON sono un'avenue di ricerca a breve (manca storia multi-regime).
|
||||||
|
Mosse: (1) lasciare cerbero-bite ad accumulare (gratis, reale, costruisce in avanti il dataset
|
||||||
|
multi-regime); (2) rivalutare quando la finestra attraversa un crash/alta-vol; (3) intanto, l'unico
|
||||||
|
uso giustificato è come OVERLAY (tail-cap su una strategia spot), gateato sui premi reali qui sopra.
|
||||||
|
|
||||||
|
## Prossimo passo
|
||||||
|
Fase 3 sul solo candidato reale (trend-following long-only, MA-cross): sblocco UNA volta del
|
||||||
|
hold-out 2025-26, comportamento nei bear (2018/2022), stress fee×2 + slippage + lag, deflated-Sharpe
|
||||||
|
per il multiple-testing. Se regge → è la prima strategia onesta del progetto v2.0.0 (modesta:
|
||||||
|
migliora il buy&hold, non lo stravolge). Se non regge → anche il trend era sample-luck.
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
# 2026-06-19 — Ricerca v2.0.0: Fase 3, conferma avversariale del candidato trend
|
||||||
|
|
||||||
|
Candidato: **trend-following long-only (MA-cross)**, l'unico a passare i gate base in Fase 2.
|
||||||
|
Protocollo: selezione config solo pre-hold-out → sblocco una-tantum del hold-out 2025-26 →
|
||||||
|
breakdown bear → stress → deflated-Sharpe. Script `phase3_confirm.py`.
|
||||||
|
|
||||||
|
## Esito: ☠️ NON CONFERMATO — era regime-luck del mercato toro
|
||||||
|
|
||||||
|
### (1) Pre-hold-out (2018-2024): forte e robusto
|
||||||
|
Plateau pieno: BTC Sharpe 0.91-1.16, ETH 1.19-1.48 su tutte le config. **Deflated-Sharpe**
|
||||||
|
(N=60 trial): BTC DSR **0.990**, ETH **0.982** → l'effetto trend era REALE e robusto al
|
||||||
|
multiple-testing **sul 2018-2024**.
|
||||||
|
|
||||||
|
### (2) HOLD-OUT 2025-26 (sbloccato una volta) — FALLISCE
|
||||||
|
| | buy&hold | trend 24/96 | trend 96/288 (slow) |
|
||||||
|
|---|---|---|---|
|
||||||
|
| BTC Sharpe | −0.37 | **−0.81** | −0.00 |
|
||||||
|
| BTC ret | −32.9% | −33.6% | −5.0% |
|
||||||
|
| ETH Sharpe | −0.32 | **−0.95** | −0.01 |
|
||||||
|
| ETH ret | −49.3% | −52.0% | −11.3% |
|
||||||
|
|
||||||
|
Il 2025-26 è stato un periodo in DISCESA (buy&hold negativo). Il trend long-only — che "dovrebbe"
|
||||||
|
schivare i bear — si è fatto **frullare** (whipsaw): perde quanto o PIÙ del buy&hold, Sharpe negativo
|
||||||
|
su ogni config. Solo la MA lentissima (96/288) limita i danni a ~flat (−5/−11%), ma è cherry-pick
|
||||||
|
post-hoc e comunque NON positiva.
|
||||||
|
|
||||||
|
### (3) Per anno — il meccanismo
|
||||||
|
Il trend cattura ~70-80% degli anni TORO (2019-2024) e attutisce i bear IN-SAMPLE (2018 −1% vs
|
||||||
|
−39%; 2022 −47% vs −65%). MA nel 2025 OUT-OF-SAMPLE ha fatto **peggio** del buy&hold (BTC −25% vs
|
||||||
|
−7%; ETH −41% vs −11%): frullato in un mercato choppy/discendente. È il classico fallimento del
|
||||||
|
trend-following nei bear laterali. → l'edge 2018-24 era **beta del toro con risk-management**, non
|
||||||
|
alpha persistente.
|
||||||
|
|
||||||
|
### (4) Stress
|
||||||
|
FULL regge modestamente (Sharpe 0.65-0.91 anche a fee2x+lag), ma HOLD-OUT è negativo ovunque
|
||||||
|
(−0.81 → −1.34) e peggiora sotto stress. Fragile.
|
||||||
|
|
||||||
|
### (5) Deflated-Sharpe
|
||||||
|
DSR>0.95 sul pre-hold-out → conferma che l'effetto era statisticamente reale **nel campione di
|
||||||
|
training**. Lezione chiave: **robustezza statistica in-sample ≠ persistenza out-of-sample.** Il
|
||||||
|
hold-out bloccato ha colto ciò che DSR da solo non poteva — il cambio di regime.
|
||||||
|
|
||||||
|
## VERDETTO FINALE (Fasi 0-3)
|
||||||
|
**Nessun edge validato, fee-surviving e out-of-sample esiste su BTC/ETH tra le famiglie testate.**
|
||||||
|
Il trend-following era il miglior candidato: reale 2018-24 (toro), ma **bocciato sul hold-out
|
||||||
|
2025-26** (whipsaw, sotto il buy&hold). La barra realistica resta il **buy&hold** (Sharpe ~0.8
|
||||||
|
sullo storico, ma −0.3/−0.4 nel 2025-26: anche "stai long" è stato duro di recente).
|
||||||
|
|
||||||
|
Il processo disciplinato ha funzionato: **ha evitato di deployare un falso edge** (che, sul vecchio
|
||||||
|
sistema contaminato, sarebbe finito in produzione). Questo è il valore del reset.
|
||||||
|
|
||||||
|
## Implicazioni / direzioni
|
||||||
|
- **Non deployare** il trend come edge: è regime-dipendente, non batte il buy&hold OOS.
|
||||||
|
- Con **solo BTC/ETH prezzo**, il pozzo dei segnali è poco profondo: timing puro non ha edge robusto.
|
||||||
|
- Opzioni: nessun ruolo a breve (confermato). Tenere cerbero-bite ad accumulare per uno studio
|
||||||
|
multi-regime futuro.
|
||||||
|
- Scelte oneste per andare avanti: (a) accettare che il "ceiling" su BTC/ETH è un long risk-managed
|
||||||
|
(no alpha) e ottimizzare quello (vol-target per ridurre DD, non per battere il mercato); (b)
|
||||||
|
allargare l'universo dati CERTIFICATO (servono asset liquidi+puliti oltre BTC/ETH, che Deribit non
|
||||||
|
offre bene → valutare un secondo venue mainnet certificabile); (c) fonti di segnale ortogonali al
|
||||||
|
prezzo (on-chain, funding/basis multi-venue, opzioni multi-regime) — tutte richiedono nuovi dati
|
||||||
|
certificati prima di poterci credere.
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
# 2026-06-19 — Sintesi ricerca post-reset (5 track) e verdetto
|
||||||
|
|
||||||
|
Prima ondata di ricerca sui dati **certificati** BTC/ETH (Deribit mainnet, ~2 bps vs
|
||||||
|
Coinbase USD), con harness onesto condiviso `src/backtest/harness.py` (ingresso eseguibile
|
||||||
|
a `close[i]`, fee 0.10% RT, exit intrabar TP/SL, OOS/per-anno). Branch
|
||||||
|
`strategy-research-2026-06`.
|
||||||
|
|
||||||
|
## I 5 track
|
||||||
|
|
||||||
|
| Track | Famiglia | Esito |
|
||||||
|
|-------|----------|-------|
|
||||||
|
| **A** | Trend/Momentum (TSMOM, Donchian, EMA, vol-scaled) | 5m/15m morti (fee); 1h = residuo reale ma celle singole non robuste |
|
||||||
|
| **B** | ML walk-forward (logistic/GBM su feature di forma) | edge debole ma REALE su BTC (+83% OOS, Sharpe 0.57), ~+0.58 €/d su 2000 |
|
||||||
|
| **C** | Mean-reversion / range (fade, RSI2, VWAP) | **MORTO** — negativo anche a fee=0. Conferma: la vecchia libreria fade era artefatto |
|
||||||
|
| **D** | **Trend portfolio vol-targeted BTC+ETH** | ✅ **DEPLOYABLE** — robusto, positivo ogni anno |
|
||||||
|
| **E** | Cross-sectional BTC↔ETH + ensemble | RV debole (muore a 1.5bps/gamba); ensemble dimezza il DD ma non alza il ritorno |
|
||||||
|
|
||||||
|
## Il vincitore: Track D — trend portfolio (l'unico che guadagna in modo robusto)
|
||||||
|
|
||||||
|
TSMOM multi-orizzonte (blend 1-3-6 mesi su barre 1h), **vol-targeting** (posizione ∝
|
||||||
|
1/vol realizzata, target 20% annuo), portafoglio **50/50 BTC+ETH**, fee 0.10% RT. Un solo
|
||||||
|
set di parametri per entrambi gli asset.
|
||||||
|
|
||||||
|
- **LONG-SHORT 50/50:** CAGR +14.2%, **Sharpe 1.00**, maxDD 18.9%, positivo ogni anno 2019-2026.
|
||||||
|
- **LONG-FLAT 50/50 (migliore risk-adj):** CAGR +15.9%, **Sharpe 1.32**, **maxDD 13.3%**.
|
||||||
|
- Robusto: plateau di Sharpe ~1.0 su griglia target-vol/leva/orizzonti; regge fee fino a 0.40% RT;
|
||||||
|
su entrambi gli asset; **non** è un picco fortunato (a differenza delle "star" di Track A).
|
||||||
|
- Tesi confermata: il valore del trend è **tagliare il drawdown** (B&H DD ~78% → trend DD ~13-19%)
|
||||||
|
con Sharpe ≥ B&H → si può scalare il rischio (target-vol) e diversificare BTC+ETH.
|
||||||
|
- Caveat onesto: l'edge è più forte 2018-21 (Sharpe 1.63) che 2022-26 (Sharpe 0.57). Dimensionare
|
||||||
|
sul regime recente.
|
||||||
|
|
||||||
|
## Il verdetto sul target €50/giorno
|
||||||
|
|
||||||
|
Una strategia che **guadagna** in modo robusto ESISTE (Track D). Ma il target "€50/giorno
|
||||||
|
medio partendo da 2000 in 1-2 anni" **non è raggiungibile onestamente**: sono ~2.5%/giorno.
|
||||||
|
|
||||||
|
La leva NON è la scorciatoia (alza il DD verso la rovina). La vera leva è **target-vol +
|
||||||
|
capitale + tempo**:
|
||||||
|
|
||||||
|
| target-vol | leva usata | CAGR | Sharpe | maxDD | €/giorno (2k) |
|
||||||
|
|-----------|-----------|------|--------|-------|---------------|
|
||||||
|
| 20% | 0.23x | +14% | 1.00 | 19% | +0.73 |
|
||||||
|
| 40% | 0.45x | +28% | 1.00 | 35% | +3.73 |
|
||||||
|
| 60% | 0.68x | +40% | 1.00 | 48% | +7.96 |
|
||||||
|
| 80% | 0.90x | +50% | 0.99 | 60% | +13.78 |
|
||||||
|
|
||||||
|
Per **€50/giorno steady-state** servono ~**137k di capitale** (config conservativa, DD~19%),
|
||||||
|
oppure DD da rovina. Partendo da 2000 a CAGR ~28% (target-vol 40%, DD 35%) il capitale che
|
||||||
|
genera €50/giorno arriva in ~10-13 anni, non in 1-2.
|
||||||
|
|
||||||
|
## Conclusione operativa
|
||||||
|
|
||||||
|
1. **Esiste un edge dispiegabile e onesto**: il trend portfolio vol-targeted (Track D).
|
||||||
|
È il primo risultato robusto post-reset.
|
||||||
|
2. **Non esiste alcuna scorciatoia** verso €50/giorno su 2000 in 1-2 anni con questi dati
|
||||||
|
(BTC/ETH 5m-1h). Il limite è strutturale: due asset, alta correlazione, fee.
|
||||||
|
3. Prossimi passi onesti se si vuole alzare il soffitto: (a) dimensionare Track D a un
|
||||||
|
target-vol/DD tollerabile e farlo girare in paper, (b) cercare edge di **magnitudine
|
||||||
|
diversa** (non più diversificazione di edge deboli) — il che richiede dati che oggi non
|
||||||
|
abbiamo certificati (universo più ampio, microstruttura, funding/opzioni backtestabili).
|
||||||
|
|
||||||
|
Script: `scripts/research/track{A,B,C,D,E}_*.py`. Diari di dettaglio: `2026-06-19-track*.md`.
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
# 2026-06-19 — Caccia al secondo sleeve: nessun diversificatore robusto (TP01-only resta)
|
||||||
|
|
||||||
|
Continuazione naturale del portafoglio: cercare un secondo sleeve SCORRELATO a TP01 (trend
|
||||||
|
long-flat, in cash gran parte del tempo). Criterio: non il Sharpe standalone ma il CONTRIBUTO al
|
||||||
|
portafoglio + robustezza. Tool: `scripts/portfolio/second_sleeve_hunt.py` (riusa le RV di trackE).
|
||||||
|
|
||||||
|
## Candidati testati (relative-value market-neutral ETH/BTC)
|
||||||
|
| Candidato | corr TP01 | FULL Sh | HOLD Sh | esito |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| RV ratio mean-rev 7d/14d | −0.09/−0.05 | −1.36/−1.03 | −0.62/−0.76 | ☠️ morto (mean-rev dead, come sempre) |
|
||||||
|
| RV ratio_trend / xs_momentum 30d | +0.04 | **0.56** | **1.92** | ⚠️ sembrava promosso |
|
||||||
|
|
||||||
|
ratio_trend e xs_momentum danno risultati IDENTICI: su 2 asset "long il più forte / short il
|
||||||
|
debole" ≡ "trend del ratio ETH/BTC". È UN segnale (relative-momentum), non due.
|
||||||
|
|
||||||
|
## Il candidato "promosso" è regime-luck (per-anno + plateau lo smascherano)
|
||||||
|
Aggiunto a TP01 sembrava un trionfo: hold-out portafoglio 0.31 → 1.18 (w20%) / 1.51 (w30%),
|
||||||
|
corr +0.04. MA:
|
||||||
|
- **Hold-out (1.92) >> FULL (0.56)**: bandiera rossa (immagine speculare della trappola di Fase 3).
|
||||||
|
- **Per-anno NON robusto**: 2019 +22%, 2020 +7%, 2021 +21%, 2022 +13%, **2023 −17%, 2024 −19%**,
|
||||||
|
**2025 +62%**, 2026 +6%. Due anni consecutivi negativi; il "guadagno" è concentrato nel 2025
|
||||||
|
(ETH sottoperforma BTC in modo netto e sostenuto). FULL Sharpe mediocre 0.56, DD 41%.
|
||||||
|
- **Nessun plateau**: l'hold-out Sharpe oscilla 0.25→1.92 al variare di (N, hold) → picco
|
||||||
|
config+regime, non altopiano.
|
||||||
|
- Il beneficio FULL al portafoglio è solo **+0.09 Sharpe** (la legittima diversificazione di uno
|
||||||
|
sleeve scorrelato a Sharpe 0.56: √(1.30²+0.56²)≈1.42). Il resto del "miglioramento" è il 2025.
|
||||||
|
|
||||||
|
## Decisione: NON promosso — TP01-only resta il portafoglio deployato
|
||||||
|
La stessa disciplina che ha bocciato i falsi positivi in-sample (Fasi 1-3) e cross-asset (frattali)
|
||||||
|
deve bocciare questo falso positivo nel hold-out. Il relative-momentum BTC/ETH è un edge debole e
|
||||||
|
regime-dipendente (2 anni a −17/−19%), il cui contributo robusto al portafoglio è marginale
|
||||||
|
(+0.09 FULL); il grosso del beneficio è la fortuna del 2025. Aggiungerlo significherebbe
|
||||||
|
scommettere sul ripetersi di quel regime.
|
||||||
|
|
||||||
|
**Lezione/criterio aggiornato per i futuri sleeve:** "migliora il hold-out" da solo NON basta (il
|
||||||
|
hold-out è UN regime). Un secondo sleeve va promosso solo se: causale, corr bassa, **positivo nella
|
||||||
|
maggioranza degli anni** (no 2 anni consecutivi rossi), **plateau** sui parametri, e migliora il
|
||||||
|
portafoglio su FULL E hold-out — non solo per via di un singolo anno fortunato.
|
||||||
|
|
||||||
|
## Stato
|
||||||
|
Portafoglio = **TP01-only** (difensivo, Sharpe FULL 1.30 / hold-out 0.31). `active_sleeves()`
|
||||||
|
invariato. `second_sleeve_hunt.py` resta come tool per valutare candidati futuri col criterio
|
||||||
|
corretto (contributo + breadth per-anno + plateau). Il relative-momentum BTC/ETH è in WATCHLIST,
|
||||||
|
non deployato.
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
# 2026-06-19 — Portafoglio di strategie estensibile (TP01 primo sleeve)
|
||||||
|
|
||||||
|
Creato un contenitore di portafoglio (`src/portfolio/`) con TP01 come unico sleeve attivo per ora,
|
||||||
|
progettato per aggiungerne altri (ognuno validato col gauntlet onesto).
|
||||||
|
|
||||||
|
## Design
|
||||||
|
- **Sleeve** = una strategia validata che produce una serie di rendimenti netti per-barra
|
||||||
|
(datetime-indexed, CAUSALE, netto fee). Opzionale `pos_fn` per le posizioni correnti (live).
|
||||||
|
- **StrategyPortfolio**: porta ogni sleeve su griglia GIORNALIERA comune (compounding intra-giorno
|
||||||
|
→ mixa TF diversi in modo coerente), combina per PESO rinormalizzato sui giorni comuni
|
||||||
|
(= equal-capital-by-weight ribilanciato di continuo). Metriche FULL + HOLD-OUT 2025-26 (bloccato)
|
||||||
|
+ per-anno + standalone per-sleeve, vs benchmark buy&hold 50/50.
|
||||||
|
- **Estensibilità**: aggiungere uno sleeve = una riga in `src/portfolio/sleeves.active_sleeves`
|
||||||
|
(dopo validazione: research_lab + hold-out + cross-asset + causality guard). Niente sleeve non validati.
|
||||||
|
|
||||||
|
## Stato attuale (1 sleeve = TP01, peso 100%)
|
||||||
|
`scripts/portfolio/run_portfolio.py`:
|
||||||
|
- **FULL** Sharpe 1.30 / ret +201% / DD 14.3% / ~€1.52/g su 2k (n=2655 giorni 2019-2026)
|
||||||
|
- **HOLD-OUT 2025-26** Sharpe 0.31 / +3.5% / DD 7.5% (buy&hold 50/50: Sharpe −0.32 / −39% / DD 59%)
|
||||||
|
- Per-anno positivo quasi ovunque (2022 −2.1%, 2026-YTD −0.7%)
|
||||||
|
- Posizione corrente: **flat** (TP01 in cash nel regime attuale = difensivo)
|
||||||
|
|
||||||
|
## File
|
||||||
|
- `src/portfolio/{__init__,portfolio,sleeves}.py`, `scripts/portfolio/run_portfolio.py`,
|
||||||
|
`tests/test_portfolio.py` (6 test, passano). CLAUDE.md aggiornato.
|
||||||
|
|
||||||
|
## Prossimo
|
||||||
|
Il portafoglio è pronto per ospitare nuovi sleeve. Candidati naturali (da validare prima):
|
||||||
|
un secondo edge scorrelato a TP01 (TP01 è trend long-flat → serve qualcosa di diverso, es. una
|
||||||
|
strategia che lavori quando TP01 è flat). Finché non c'è un secondo edge che regge il gauntlet,
|
||||||
|
il portafoglio = TP01 difensivo. Quando arriverà, basta una riga in sleeves.py.
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
# 2026-06-19 — TP01: look-ahead ffill mixed-TF, ri-verifica e adozione bassa frequenza (>=12h)
|
||||||
|
|
||||||
|
Segnalazione utente/agente: un look-ahead **ffill MIXED-TIMEFRAME su barre open-labeled**
|
||||||
|
(`resample(label="left")`) gonfiava il 4h a Sharpe ~1.60; il risultato reale è ~1.1.
|
||||||
|
Conclusione: **NON scendere sotto le 12h** — costi e overfitting dominano.
|
||||||
|
|
||||||
|
## Cosa ho verificato (`scripts/analysis/tp01_lowfreq.py`)
|
||||||
|
Ricalcolo TP01 PULITO **per singolo TF** (barre discrete, posizione shiftata +1, NESSUN
|
||||||
|
ffill/combine mixed-TF), con un **guard di causalità esplicito** (ricalcolo `target_series` su
|
||||||
|
prefisso → `tgt[i]` invariato). Esito (fee 0.10% RT, hold-out 2025-26 bloccato):
|
||||||
|
|
||||||
|
| TF | leak | FULL Sh | FULL ret | HOLD Sh | HOLD ret | HOLD DD |
|
||||||
|
|---|---|---|---|---|---|---|
|
||||||
|
| 4h | **0** | 1.36 | +204% | 0.27 | +2.8% | 8.3% |
|
||||||
|
| 6h | **0** | 1.42 | +217% | 0.21 | +2.1% | 7.9% |
|
||||||
|
| 12h | **0** | 1.32 | +198% | 0.22 | +2.3% | 8.6% |
|
||||||
|
| **1d** | **0** | 1.30 | +201% | **0.31** | **+3.5%** | 7.5% |
|
||||||
|
| buy&hold 50/50 1d | — | 0.92 | +1671% | **−0.32** | **−39%** | 59% |
|
||||||
|
|
||||||
|
## Lettura
|
||||||
|
- **Il path single-TF che ho usato in verify/stress è LEAK-FREE** (guard=0 su ogni TF): il
|
||||||
|
gonfiaggio 1.60 stava nel path **mixed-TF ffill** (ensemble/combine, es. trackE), NON nel
|
||||||
|
portafoglio single-TF. Per questo il mio 4h era 1.36 (non 1.60).
|
||||||
|
- **La conclusione "≥12h" è comunque CORRETTA e la adotto**: il FULL Sharpe è PIATTO ~1.3 da 12h
|
||||||
|
a 4h → scendere sotto le 12h NON dà vantaggio reale, aggiunge solo costi/turnover e rischio
|
||||||
|
overfit/look-ahead (lo stress mostrava il margine hold-out del 4h fragile a lag/fee). **1d è il
|
||||||
|
migliore**: hold-out Sharpe 0.31 (il più alto), DD 7.5%, turnover/costi minimi, leak-free.
|
||||||
|
- Allinea anche col numero dell'agente: il "reale ~1.1" è del path mixed-TF corretto; il mio
|
||||||
|
single-TF pulito dà ~1.3 FULL. In ogni caso **edge difensivo modesto**, non alpha.
|
||||||
|
|
||||||
|
## Decisioni applicate
|
||||||
|
- **Canonica deploy → PORT LF1d** (era LF4h). `trend_portfolio.py`: docstring aggiornata + nota
|
||||||
|
look-ahead; aggiunti `resample_tf`/`resample_1d`, `resample_4h` marcato deprecato per il deploy.
|
||||||
|
- **Paper trader → 1d** (`paper_trend.py`: `resample_1d`, `build_bars`, etichette 1d; gira, 5 test ok).
|
||||||
|
- **CLAUDE.md**: TP01 ridescritta come DIFENSIVA, canonica ≥12h/1d, gotcha look-ahead documentato.
|
||||||
|
- **Gotcha riusabile:** mai ffill/combine MIXED-TIMEFRAME su timestamp open-labeled (`label="left"`):
|
||||||
|
la close del bar (nota solo a fine bar) verrebbe propagata indietro all'open-label → look-ahead.
|
||||||
|
Il calcolo per-singolo-TF a barre discrete (posizione +1) è sicuro; il guard prefix-recompute lo prova.
|
||||||
|
|
||||||
|
## Verdetto invariato
|
||||||
|
TP01 resta la prima strategia onesta del progetto: **difensiva** (taglia il DD ~6× vs buy&hold,
|
||||||
|
hold-out 2025-26 positivo su entrambi gli asset), modesta nel ritorno. Deploy a **1d**, forward-only
|
||||||
|
paper trader, prima di qualsiasi capitale reale.
|
||||||
@@ -0,0 +1,84 @@
|
|||||||
|
# 2026-06-19 — Verifica TP01 (branch strategy-research-2026-06) col gauntlet onesto
|
||||||
|
|
||||||
|
Una ricerca PARALLELA (branch `strategy-research-2026-06`, AdrianoDev) dallo stesso baseline
|
||||||
|
v2.0.0 ha trovato TP01 come "unica vincitrice". La mia linea (Fasi 2-3) aveva bocciato il trend
|
||||||
|
sul hold-out 2025-26. Ho riprodotto TP01 VERBATIM (`scripts/analysis/verify_tp01.py`) e l'ho
|
||||||
|
passato al mio gauntlet. **TP01 REGGE — la mia conclusione precedente era incompleta.**
|
||||||
|
|
||||||
|
## TP01 = TSMOM 30/90/180g, **vol-target 20%**, leva cap 2x, **long-flat**, portafoglio 50/50 BTC+ETH (4h)
|
||||||
|
|
||||||
|
## Esiti del gauntlet
|
||||||
|
|
||||||
|
**(A) Multi-TF (4h cherry-picked?) — NO, plateau robusto:**
|
||||||
|
| TF | FULL Sharpe | HOLD-OUT Sharpe |
|
||||||
|
|---|---|---|
|
||||||
|
| 15m | 0.93 | −0.31 |
|
||||||
|
| 1h | 1.32 | +0.20 |
|
||||||
|
| **4h** | **1.36** | **+0.27** |
|
||||||
|
| 1d | 1.30 | +0.31 |
|
||||||
|
1h/4h/1d danno tutti FULL ~1.3 e hold-out positivo → non è un artefatto di un singolo TF (solo il 15m, fee-sensibile, fallisce).
|
||||||
|
|
||||||
|
**(C) HOLD-OUT 2025-26 (il test che ha ucciso il mio trend 1h) — TP01 PROTEGGE:**
|
||||||
|
| | Sharpe | ret | DD |
|
||||||
|
|---|---|---|---|
|
||||||
|
| **TP01 portfolio** | **+0.27** | **+2.8%** | **8.3%** |
|
||||||
|
| buy&hold 50/50 | −0.35 | **−39.4%** | 59.8% |
|
||||||
|
|
||||||
|
**(D) Cross-asset nel hold-out — regge su ENTRAMBI** (BTC sleeve +2.9% Sh 0.24, ETH +2.4% Sh 0.24).
|
||||||
|
A differenza del "vincitore" frattale (+ETH/−BTC), TP01 protegge coerentemente su BTC E ETH.
|
||||||
|
|
||||||
|
**(B) Per anno:** positiva quasi ogni anno 2019-2026 (eccezioni piccole: 2022 −2.4%, 2026-YTD −0.9%),
|
||||||
|
DD annui 1-12%. Il claim "positiva ogni anno" è lievemente ottimistico ma sostanzialmente vero.
|
||||||
|
|
||||||
|
## Perché TP01 regge dove il MIO trend (Fase 3) è caduto
|
||||||
|
La differenza chiave è il **VOL-TARGETING** (che NON avevo combinato col trend): TP01 scala
|
||||||
|
l'esposizione ∝ 1/vol_realizzata → nel crollo 2025-26 la vol è esplosa e TP01 si è messo
|
||||||
|
quasi in cash, schivando il drawdown. Il mio MA-cross 1h aveva esposizione fissa ed è rimasto
|
||||||
|
long nel chop → frullato. Concorrono: TSMOM multi-orizzonte (più liscio del MA-cross), long-flat
|
||||||
|
(niente perdite short), diversificazione 50/50. **La mia "trend = regime-luck" era vera per il
|
||||||
|
trend NUDO; TP01 = trend + vol-target + portafoglio è un'altra cosa, e robusta.**
|
||||||
|
|
||||||
|
## Cosa È onestamente TP01 (no oversell)
|
||||||
|
- **Edge DIFENSIVO, non alpha**: FULL Sharpe 1.36 vs buy&hold 0.92 — MA CAGR +16.6% vs +48.1%.
|
||||||
|
Su tutto il toro il buy&hold ha reso ~8x di più. Il valore di TP01 è il **DD** (13.8% vs 77.5%
|
||||||
|
full; 8% vs 60% nel hold-out) e la **protezione dai crash**.
|
||||||
|
- Nel hold-out 2025-26 ha fatto solo +2.8% (Sharpe 0.27, basso): ha **protetto, non profittato**.
|
||||||
|
- Un solo regime di hold-out, ma il vol-targeting è meccanico (high vol → low expo) → generalizza
|
||||||
|
per costruzione meglio di un timing fittato.
|
||||||
|
- Config canonica (30/90/180, vol20%, lev2x) non iper-tunata; 4h non cherry-picked (plateau).
|
||||||
|
|
||||||
|
## VERDETTO
|
||||||
|
**TP01 è la PRIMA strategia onesta e robusta del progetto post-reset.** Supera il mio gauntlet
|
||||||
|
(hold-out positivo su entrambi gli asset, plateau multi-TF, causale, fee-aware). È modesta e
|
||||||
|
difensiva (Sharpe ~1.3, soffitto strutturale dichiarato corretto), ma è reale: migliora il
|
||||||
|
rischio/rendimento del buy&hold tagliando i drawdown e proteggendo nei crash. La ricerca parallela
|
||||||
|
ha fatto centro proprio sul pezzo che la mia linea non aveva combinato (vol-target sul trend).
|
||||||
|
|
||||||
|
**Raccomandazione:** integrare il branch su main (modulo `trend_portfolio.py` + paper trader),
|
||||||
|
trattare TP01 come baseline operativa difensiva. Aspettative oneste verso il target €50/g: a
|
||||||
|
Sharpe 1.3 / CAGR 16.6% servono molto capitale o leva (con più DD) — TP01 è un fondamento solido,
|
||||||
|
non una scorciatoia.
|
||||||
|
|
||||||
|
## STRESS-TEST (`scripts/analysis/stress_tp01.py`, integrato e rieseguito sul modulo vero)
|
||||||
|
|
||||||
|
| Dimensione | Esito |
|
||||||
|
|---|---|
|
||||||
|
| **Sweep fee** | FULL robusto fino a **0.40% RT** (Sh 1.44→1.36→1.28→1.13). HOLD-OUT SOTTILE: +2.8%/Sh0.27 a 0.10% → ~flat (Sh 0.03) a 0.40% |
|
||||||
|
| **Lag/slippage** | FULL robusto (1.29-1.43). HOLD-OUT si erode: lag1(4h)→Sh0.12, lag2→−0.02, lag1+fee0.20%→0.04 |
|
||||||
|
| **Plateau parametri** | OTTIMO — target_vol/leva/orizzonti/vol_win tutti reggono o migliorano (orizzonti 20/60/120 → Sh 1.61). **NON un picco cherry-picked** |
|
||||||
|
| **Deflated-Sharpe** | DSR **0.999** a N=10/40/100 trial → il Sharpe FULL non è artefatto di multiple-testing |
|
||||||
|
|
||||||
|
**Verdetto stress (onesto):**
|
||||||
|
- **Robustezza FULL-period: FORTE.** TP01 supera fee 0.40%, lag, ampio plateau di parametri, e
|
||||||
|
deflated-Sharpe. NON è overfit né cherry-picked — la proprietà robusta è il **taglio del
|
||||||
|
drawdown** (13.8% vs 77.5% full; 8% vs 60% hold-out), invariante a tutto lo stress.
|
||||||
|
- **Edge di RITORNO nel hold-out: REALE ma SOTTILE e sensibile alla frizione.** Nel 2025-26 ha
|
||||||
|
schivato il crash in modo affidabile (DD 8% vs 60%) ma ha **protetto più che profittato** (+2.8%,
|
||||||
|
Sh 0.27), e quel sottile positivo si assottiglia a zero sotto fee2x o lag 2 barre.
|
||||||
|
|
||||||
|
**Conclusione:** la proprietà **deployabile e robusta di TP01 è la PROTEZIONE del drawdown**, non
|
||||||
|
la generazione di alpha. È una strategia difensiva genuina (prima del progetto a superare gauntlet
|
||||||
|
+ stress), ma a basso ritorno: il valore è "Sharpe ~1.3 con DD ~6× più piccolo del buy&hold",
|
||||||
|
non "battere il mercato". Per il capitale reale: il vol-targeting + long-flat sono meccanici e
|
||||||
|
generalizzano; il rischio residuo è la frizione di esecuzione sul filo del sottile edge di ritorno
|
||||||
|
nei regimi avversi → da monitorare col paper trader forward-only prima di scalare.
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
# 2026-06-19 — Track A: Trend / Momentum su BTC & ETH (dati certificati)
|
||||||
|
|
||||||
|
Prima ricerca di strategie NUOVE post-reset (track A = trend/momentum). Tool:
|
||||||
|
`scripts/research/trackA_trend.py` (harness onesto `src/backtest/harness.py`, fee 0.10% RT,
|
||||||
|
IS/OOS 65/35, griglia su entrambi gli asset, fee sweep, stress leva). Run:
|
||||||
|
`uv run python scripts/research/trackA_trend.py`.
|
||||||
|
|
||||||
|
## Cosa è stato testato
|
||||||
|
- **TSMOM** (segno del ritorno N-barre, hold H) long/short e long-only.
|
||||||
|
- **EMA crossover** (fast/slow) come filtro di trend.
|
||||||
|
- **Donchian breakout** (entry ONESTO: breakout rilevato con `close[i]`, fill a `close[i]`).
|
||||||
|
- **Vol-scaled / regime-gated TSMOM** (momentum preso solo se |z| > gate, z = ritorno/vol).
|
||||||
|
- Griglia ampia su **BTC e ETH**, **1h / 15m / 5m**. 480 celle OOS totali.
|
||||||
|
|
||||||
|
Tutto entry-eseguibile: direzione e prezzo decisi con dati ≤ `close[i]`, fill a `close[i]`.
|
||||||
|
Nessun uso di `returns[i]` (che codifica `close[i+1]`). Hold approssimato come catena di
|
||||||
|
posizioni non sovrapposte di H barre (la fee si ammortizza su H barre — costo onesto).
|
||||||
|
|
||||||
|
## Risultati — la fotografia onesta
|
||||||
|
|
||||||
|
**Celle positive OOS per timeframe:**
|
||||||
|
| TF | celle positive / totali |
|
||||||
|
|----|----|
|
||||||
|
| **1h** | 39 / 160 |
|
||||||
|
| **15m** | **0 / 160** |
|
||||||
|
| **5m** | **0 / 160** |
|
||||||
|
|
||||||
|
→ **Trend intraday (5m/15m) è MORTO**: lo drag della fee (più trade = più 0.10% RT) annienta
|
||||||
|
qualsiasi segnale. Drawdown 80-99%, Sharpe da −0.6 a −2.2. Niente da salvare.
|
||||||
|
|
||||||
|
**Su 1h** c'è qualche cella positiva, ma il contesto la ridimensiona:
|
||||||
|
- La finestra **OOS è un singolo regime**: il taglio 65% cade a **set/dic 2023**, quindi
|
||||||
|
l'OOS è ~2023→2026 (in gran parte toro 2024). Tutto il 2018-2022 (orso 2018, crash 2020,
|
||||||
|
toro 2021, orso 2022) è IN-SAMPLE. "Positivo OOS" qui ≈ "il trend ha fatto soldi nel toro 2024".
|
||||||
|
- **Benchmark buy & hold sulla stessa finestra OOS**: BTC **+134%**, ETH **−21%**.
|
||||||
|
- Tutte le `TSMOM_LONG` e metà delle celle BTC fanno **MENO** del B&H → è **beta**, non edge.
|
||||||
|
- Le poche che battono il B&H lo fanno **solo su ETH** (dove il B&H era negativo): catturano
|
||||||
|
anche i ribassi. Quello è timing reale — ma vedi sotto.
|
||||||
|
|
||||||
|
**Le "star":** VOLSCALED_TSMOM BTC 1h (N=20,H=48,vw=100,z=0.5) = +367% OOS, Sh 0.91, DD 32%,
|
||||||
|
€/d(2k) +2.56; ETH 1h (N=20,H=48,vw=50,z=1.0) = +197% OOS, Sh 0.60. **MA sono celle fortunate:**
|
||||||
|
i vicini di griglia crollano (stesso N/H, vw=50 invece di 100 → +21% invece di +367%; z=1.0 → +34%).
|
||||||
|
Non è un altopiano robusto, è un picco isolato. E il P&L è concentrato nel 2024 (+110% su BTC),
|
||||||
|
con 2025/2026 deboli o negativi per molte celle.
|
||||||
|
|
||||||
|
**Consistenza cross-asset (un edge vero regge su ENTRAMBI):** su 480 celle, solo **2** sono
|
||||||
|
positive OOS su BTC *e* ETH:
|
||||||
|
- `TSMOM_LONG 1h N=200 H=48` → ma è long-only ≈ beta (fa meno del B&H su BTC).
|
||||||
|
- `DONCHIAN 1h N=200 H=12` → l'unico candidato "vero" simmetrico, ma **marginale**:
|
||||||
|
OOS BTC +9% / ETH +15%, **Sharpe 0.15-0.19**, troppo debole per dispiegarlo.
|
||||||
|
|
||||||
|
**Fee sweep / leva:** le star reggono lo sweep 0.0005-0.002 (è 1h, poche operazioni), e lo Sharpe
|
||||||
|
è invariante alla leva (come deve) — ma la leva 3x porta i DD a 75-91% e affonda le celle marginali.
|
||||||
|
|
||||||
|
## Verdetto
|
||||||
|
|
||||||
|
**Nessun edge trend/momentum dispiegabile, onestamente, su BTC/ETH oggi.**
|
||||||
|
- 5m/15m: morti per fee. Chiuso.
|
||||||
|
- 1h: esiste un **residuo di segnale trend** (le celle che battono il B&H negativo di ETH non sono
|
||||||
|
solo beta), ma è (a) testato su **un solo regime OOS** (toro 2023-2026), (b) **non robusto** di
|
||||||
|
griglia (picchi isolati), (c) sull'unica cella simmetrica robusta-su-entrambi (Donchian N=200)
|
||||||
|
**troppo debole** (Sharpe ~0.17). Sharpe netti ~0.3-0.9 nel caso migliore = sotto la soglia per
|
||||||
|
rischiare capitale reale.
|
||||||
|
|
||||||
|
Conferma la lezione del reset (il superstite storico era trend-following, non mean-reversion): il
|
||||||
|
trend è la direzione *meno sbagliata*, ma sui dati certi non basta a fare un edge. Coerente con
|
||||||
|
Track C (mean-reversion = artefatto).
|
||||||
|
|
||||||
|
## Prossimi passi possibili (non ancora edge)
|
||||||
|
- Walk-forward multi-regime (non un singolo taglio 65/35) per stressare Donchian-1h-N200 su orso 2018/2022.
|
||||||
|
- Trend 1h **con filtro di volatilità/regime più ricco** o portafoglio BTC+ETH per diversificare il
|
||||||
|
rischio di regime — ma solo se emerge robustezza di griglia, non altri picchi fortunati.
|
||||||
|
- Restare scettici: finché un trend non è positivo su griglia + su entrambi gli asset + su ≥2 regimi
|
||||||
|
OOS, **non si dispiega**.
|
||||||
@@ -0,0 +1,93 @@
|
|||||||
|
# 2026-06-19 — Track B: ML / feature-prediction su BTC & ETH (walk-forward onesto)
|
||||||
|
|
||||||
|
Esperimento di ricerca sulla direzione **machine-learning** post-reset, su dati Deribit
|
||||||
|
mainnet certificati (solo BTC/ETH). Tool: `scripts/research/trackB_ml.py` (runnable
|
||||||
|
`uv run python scripts/research/trackB_ml.py`). Tutto netto fee, strict walk-forward,
|
||||||
|
held-out tail mai usato per scegliere i config.
|
||||||
|
|
||||||
|
## Metodologia (anti look-ahead — la lezione della v2.0.0)
|
||||||
|
|
||||||
|
- **Feature** (21): ritorni multi-lag (1/2/3/6/12/24), geometria candela (body/upper/lower
|
||||||
|
shadow su range, range normalizzato, body lag-1), momentum48 + accelerazione, RSI14,
|
||||||
|
estensione ATR-normalizzata vs EMA24, vol realizzata 24/72 + ratio, posizione del close
|
||||||
|
nel range 24/72, z-score del volume. **Tutte backward** (note solo a `close[i]`).
|
||||||
|
- **Label**: segno del ritorno forward su H barre, `sign(close[i+H]/close[i])`.
|
||||||
|
- **Strict walk-forward**: per predire il blocco che inizia a `b`, si addestra
|
||||||
|
scaler+modello SOLO su indici `< b-H` (gap di H → label completamente realizzata nel
|
||||||
|
passato), finestra rolling delle ultime W barre. Retrain ogni K=250 barre. Mai fit sul
|
||||||
|
futuro. **Nessun leakage** (verificato: la label più recente del train usa `close[b-1]`).
|
||||||
|
- **Esecuzione**: entry a `close[i]` nella direzione predetta, hold fino a H barre
|
||||||
|
(no TP/SL); il no-overlap dell'harness distanzia i trade ≥ H barre.
|
||||||
|
- **Modello**: `LogisticRegression(class_weight='balanced')`. Soglia di probabilità per
|
||||||
|
filtrare i segnali deboli (long se p>0.5+thr, short se p<0.5-thr, altrimenti flat).
|
||||||
|
- **Selezione su DEV** (primo 75%), **conferma una volta sola** sull'held-out tail (ultimo 25%).
|
||||||
|
- Griglia: W∈{4000,8000,16000}, H∈{6,12,24,48}, thr∈{0,0.03,0.06,0.10}, BTC & ETH, 1h.
|
||||||
|
Fee-sweep 0.05/0.10/0.15/0.20% RT. Turnover/time-in-market sempre riportati.
|
||||||
|
|
||||||
|
## Risultato — esiste un segnale, ma è debole e a basso turnover
|
||||||
|
|
||||||
|
**Pattern netto e robusto della griglia**: la positività compare SOLO nelle celle a basso
|
||||||
|
turnover → **W grande (16000) + H lungo (24) + soglia alta (0.10)**. Tutto ciò che gira
|
||||||
|
veloce (thr basso, H corto, e soprattutto il **15m**) **muore sulle fee**.
|
||||||
|
|
||||||
|
- **15m**: 0/12 celle positive in dev (la migliore −47%, le altre −99%). Stesso win-rate
|
||||||
|
52–56% del 1h, ma il turnover lo polverizza. Conferma di prim'ordine: l'edge per-trade è
|
||||||
|
minuscolo, sopravvive solo se si tradano poche barre.
|
||||||
|
- **1h, dev**: 19/96 celle net-positive con Sharpe>0. Famiglie threshold-robuste:
|
||||||
|
`BTC W16000 H12`, `BTC W8000 H12`, `BTC W16000 H24`, più ETH W16000 H12/H48 marginali.
|
||||||
|
|
||||||
|
### Held-out tail (2024→2026, mai toccato in sviluppo)
|
||||||
|
|
||||||
|
| config | trades | wr% | net% | Sharpe | DD% | mkt% | €/g(2k) | long% | B&H tail |
|
||||||
|
|---|---|---|---|---|---|---|---|---|---|
|
||||||
|
| **BTC W16000 H24 thr0.10** | 333 | 52.9 | **+83.7** | 0.57 | 23 | 12 | **+0.58** | 44 | +3.9% |
|
||||||
|
| BTC W16000 H12 thr0.10 | 382 | 53.4 | +37.6 | 0.35 | 25 | 7 | +0.26 | 54 | +3.9% |
|
||||||
|
| ETH W16000 H12 thr0.10 | 364 | 57.7 | +23.7 | 0.24 | 35 | 7 | +0.18 | 68 | −38.4% |
|
||||||
|
| ETH W16000 H48 thr0.06 | 215 | 55.3 | −13.3 | 0.08 | 64 | 16 | −0.10 | 67 | −38.4% |
|
||||||
|
|
||||||
|
**Non è solo beta.** Il B&H sul tail è +3.9% (BTC) e −38.4% (ETH), eppure le celle migliori
|
||||||
|
fanno +37…+84% (BTC) con **long ~44–54%** (bilanciato long/short), e ETH +23.7% **mentre ETH
|
||||||
|
scendeva −38%** (short corretti). Quindi c'è segnale direzionale genuino, non cattura di trend
|
||||||
|
rialzista. Payoff asimmetrico: ~53% WR ma avgWin>avgLoss (BTC: +2.04% vs −1.63%).
|
||||||
|
|
||||||
|
### Fee-sweep (held-out)
|
||||||
|
|
||||||
|
- `BTC W16000 H12 thr0.10`: 0.05%→+66.6 | **0.10%→+37.6** | 0.15%→+13.7 | 0.20%→−6.1.
|
||||||
|
Sopravvive fino a ~0.15% RT, poi muore. Margine sottile.
|
||||||
|
- `BTC W8000 H12 thr0.06`: positivo solo a 0.05%, già −35% a 0.10%. Fragile.
|
||||||
|
- ETH e le celle a turnover medio: muoiono tra 0.10 e 0.15%.
|
||||||
|
|
||||||
|
### Stabilità per-anno (full walk-forward, BTC W16000 H24 thr0.10)
|
||||||
|
|
||||||
|
`+11% (2020) / +188% (2021) / +14% (2022) / −38% (2023) / +13% (2024) / +75% (2025) / +7% (2026)`,
|
||||||
|
CAGR full ~22%, ma **DD 56%** e fortissima concentrazione su 2021/2025 con un 2023 a −38%.
|
||||||
|
|
||||||
|
## Verdetto onesto — NON deployabile verso l'obiettivo
|
||||||
|
|
||||||
|
1. **L'edge è reale ma minuscolo.** A differenza della vecchia libreria (artefatto puro), qui
|
||||||
|
il segnale sopravvive a strict walk-forward, a fee 0.10% RT e batte il B&H sul tail. È un
|
||||||
|
risultato genuino e va registrato: la direzione ML **non è morta**.
|
||||||
|
2. **Ma è incompatibile col target.** €/giorno su €2000 = +0.26…+0.58 baseline (anche la stima
|
||||||
|
rosea full-WF CAGR 22% → ~€1–3/g). Il target è **€50/g** → siamo ~100x sotto.
|
||||||
|
3. **Fragilità**: vive solo a basso turnover (thr alto, H lungo, W grande), DD 23–56%,
|
||||||
|
ritorni concentrati in pochi anni con un anno a −38%, e l'edge si assottiglia già a
|
||||||
|
0.15% RT. Un singolo cambio di regime lo annulla.
|
||||||
|
4. **ETH ≠ "specialmente buono"** (contrariamente all'indizio dello shape-ML precedente): qui
|
||||||
|
ETH è più sottile e più rumoroso di BTC sull'held-out; l'unico merito è aver shortato
|
||||||
|
correttamente il drawdown 2024-25.
|
||||||
|
|
||||||
|
**Conclusione**: la logistic-regression walk-forward su feature di forma+momentum trova un
|
||||||
|
debole edge **momentum direzionale a basso turnover** su BTC (più tenue su ETH), onesto e
|
||||||
|
netto-fee, ma **troppo piccolo, troppo concentrato e troppo fee-sensibile** per essere
|
||||||
|
deployato standalone. Al massimo un **componente** di un futuro ensemble, e solo nelle
|
||||||
|
configurazioni a bassissimo turnover. Nessun config raggiunge, neanche lontanamente, i €50/g.
|
||||||
|
|
||||||
|
## Prossimi passi possibili (non eseguiti)
|
||||||
|
|
||||||
|
- Provare **predizione di magnitudine/asimmetria** (large-up vs large-down) e position-sizing
|
||||||
|
proporzionale alla confidenza, invece del semplice segno.
|
||||||
|
- **GradientBoosting / feature non lineari** (flag `--gbm` predisposto) — ma attenzione
|
||||||
|
all'overfit; il rischio è di "trovare" edge che il walk-forward onesto non conferma.
|
||||||
|
- **Ensemble** del segnale ML a basso turnover con un filtro di regime (vol/trend) per tagliare
|
||||||
|
il 2023. Ma serve dimostrare che il filtro non è scelto col senno di poi.
|
||||||
|
- Restare scettici: finché €/g resta ~100x sotto target, l'ML da solo NON è la risposta.
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
# 2026-06-19 — Track C: mean-reversion / range re-examination (HONEST) → DEAD
|
||||||
|
|
||||||
|
Obiettivo: stabilire rigorosamente se **un qualunque** edge di mean-reversion / range a
|
||||||
|
breve orizzonte sopravvive su BTC/ETH **certificati** (Deribit mainnet) con **ingresso
|
||||||
|
eseguibile onesto**, oppure confermarne definitivamente la morte. Entrambi gli esiti sono
|
||||||
|
validi; nessun risultato forzato.
|
||||||
|
|
||||||
|
Tool: `scripts/research/trackC_meanrev.py` (self-contained, runnable), sopra l'harness
|
||||||
|
onesto `src/backtest/harness.py` (direzione+prezzo decisi con dati ≤ `close[i]`, fill a
|
||||||
|
`close[i]`, exit intrabar TP/SL da `i+1`, fee netto). Universo: BTC/ETH × {1h,15m,5m}.
|
||||||
|
|
||||||
|
## Cosa è stato testato (5 famiglie, ingresso onesto)
|
||||||
|
|
||||||
|
- **ZFADE** — Bollinger/z-score fade: `z(close,lookback)` ≤ −thr → long, ≥ +thr → short.
|
||||||
|
TP al mean mobile o a `tp_atr·ATR`; SL a `sl_atr·ATR`. **Entry a close[i]**, NON al tocco
|
||||||
|
della banda (era proprio quello l'artefatto storico).
|
||||||
|
- **RSI2** — RSI(2) oversold/overbought (+ variante con filtro trend SMA200).
|
||||||
|
- **RETREV** — return reversal: fade del rendimento cumulato estremo (|z| > thr·σ).
|
||||||
|
- **VWAP** — reversione sulla distanza dal VWAP rolling (in unità di σ della distanza).
|
||||||
|
- **SESSION** — autocorrelazione next-bar per ora UTC (descrittivo).
|
||||||
|
|
||||||
|
Metodologia applicata: OOS 65/35, griglia parametri su **entrambi** gli asset, fee-sweep
|
||||||
|
{0, 0.5, 1.0, 1.5, 2.0} bps RT, cross-check liquidità (flat-bar O=H=L=C) e time-in-market.
|
||||||
|
|
||||||
|
## Sanity liquidità
|
||||||
|
|
||||||
|
Flat-bar O=H=L=C: BTC/ETH 1h ≈ 0.01%, 15m 0.09–0.14%. Book vivo → l'eventuale edge NON
|
||||||
|
potrebbe nascondersi in barre ferme (a differenza degli alt archiviati). Confermato pulito.
|
||||||
|
|
||||||
|
## Risultati — tutto negativo, su ogni asse
|
||||||
|
|
||||||
|
**PASS 1 (screen 1h, fee 0.10% RT):** ogni famiglia OOS negativa su entrambi gli asset.
|
||||||
|
Es. ZFADE z2/mean: BTC OOS −85%, ETH OOS −83%. RSI2 10/90: BTC −92%, ETH −96%.
|
||||||
|
RETREV/VWAP idem. Win-rate spesso "alto" (RSI2 ~63%, VWAP ~64%) ma **perde lo stesso** →
|
||||||
|
le poche perdite sono enormi, la reversione non paga il rischio + fee.
|
||||||
|
|
||||||
|
**PASS 2 (griglia 1h):** ZFADE **0/18** celle con OOS>0 su entrambi; RSI2 **0/36**. La
|
||||||
|
cella meno-peggio (ZFADE lookback20 z3) resta BTC −40% / ETH −33% OOS. Nessun sopravvissuto.
|
||||||
|
|
||||||
|
**PASS 3 (fee-sweep, incl. fee=0 GROSS):** il colpo decisivo. **Anche a fee=0** (lordo)
|
||||||
|
la z-fade è negativa: BTC full −74% / OOS −46%, ETH full −98% / OOS −48%. Quindi non è
|
||||||
|
"morte da fee": **la direzione stessa della fade è sbagliata** sul feed pulito. Salendo le
|
||||||
|
fee degrada monotòno fino a −100%.
|
||||||
|
|
||||||
|
**PASS 4 (timeframe 5m/15m/1h):** più veloce = peggio. A 5m full −100% su entrambi
|
||||||
|
(41.889 / 38.660 trade), €/giorno su 2000 ≈ −0.70/−0.75. Coerente con "molte operazioni =
|
||||||
|
morte per fee", ma il PASS 3 mostra che il problema è a monte: niente edge nemmeno lordo.
|
||||||
|
|
||||||
|
**PASS 5 (sessione UTC):** esiste una **debole** autocorrelazione negativa next-bar in
|
||||||
|
poche ore (BTC 13h −0.166, 2h −0.154, 21h −0.129; ETH 13h −0.152, 4h −0.117), e una
|
||||||
|
positiva alle 03h UTC (BTC +0.158, ETH +0.202 = ora "trending"). Struttura reale ma
|
||||||
|
debolissima (|ρ|≤0.17): non sopravvive a fee + dimensionamento del rischio (lo conferma il
|
||||||
|
fatto che tutte le versioni *tradate* perdono anche lorde).
|
||||||
|
|
||||||
|
## Verdetto
|
||||||
|
|
||||||
|
**Nessuna** configurazione MR produce OOS netto>0 su entrambi BTC ed ETH a fee baseline.
|
||||||
|
Più forte: **a fee zero la fade è già negativa** → l'edge MR storico (+201%/+1238% "OOS")
|
||||||
|
era un **artefatto del feed contaminato** (wick fantasma testnet + entry su estremi mai
|
||||||
|
scambiati), non una proprietà del mercato. Sul dato certificato, con ingresso eseguibile,
|
||||||
|
la mean-reversion a breve orizzonte **non è un edge**: è morta sia lorda che netta.
|
||||||
|
|
||||||
|
Coerente con la tesi del reset (`2026-06-19-deribit-history.md`, §3): FADE morto ogni anno.
|
||||||
|
Track C chiusa come direzione di alpha. La debole struttura intraday-by-hour (PASS 5) è
|
||||||
|
annotata ma non azionabile da sola; semmai un *filtro* futuro, non una strategia.
|
||||||
|
|
||||||
|
## Artefatti
|
||||||
|
|
||||||
|
- `scripts/research/trackC_meanrev.py` — riproducibile: `uv run python
|
||||||
|
scripts/research/trackC_meanrev.py [--quick]` (~40s quick, ~3min full).
|
||||||
@@ -0,0 +1,96 @@
|
|||||||
|
# 2026-06-19 — Track D: Robust walk-forward TREND PORTFOLIO (BTC+ETH), vol-targeted + leverage
|
||||||
|
|
||||||
|
Follow-up to Track A. Thesis under test: trend-following's real value in crypto is **drawdown
|
||||||
|
reduction** vs buy & hold (it sidesteps crashes), and that lower DD lets you apply **leverage** and
|
||||||
|
**diversify** BTC+ETH into a deployable, risk-adjusted *earning* system — even if each single signal
|
||||||
|
has modest Sharpe. Tool: `scripts/research/trackD_trendport.py` (run
|
||||||
|
`uv run python scripts/research/trackD_trendport.py`).
|
||||||
|
|
||||||
|
## Method (honest, no look-ahead)
|
||||||
|
Equity built directly from a **target-position series** (the harness's documented "build your own
|
||||||
|
equity" path), NOT per-trade chaining:
|
||||||
|
- `target[i]` decided with data **≤ close[i]**; **held during the next bar** (close[i]→close[i+1]).
|
||||||
|
- `pnl[t] = target[t-1]·r[t]`, `r[t]=close[t]/close[t-1]-1` — positions **shifted +1 bar** ⇒ no leakage.
|
||||||
|
- Fees on **turnover**: `0.05%/side·|target[t-1]-target[t-2]|` (0.10% RT baseline; swept 0.10–0.40% RT).
|
||||||
|
- **Vol-targeting** (main lever): `target = direction · (target_vol / realized_vol)`, clipped to the
|
||||||
|
leverage cap. `realized_vol` = annualized rolling std of past bar returns (30d window), ≤ close[i].
|
||||||
|
- **Portfolio** = 50/50 BTC+ETH net-return series, rebalanced each bar on common timestamps.
|
||||||
|
|
||||||
|
Leakage sanity check passed: an *oracle* target using next-bar sign explodes (10^119×) — proving the
|
||||||
|
engine holds `target[i-1]` over bar `i` — while our signals (TSMOM blend, MA-slope, Donchian) only use
|
||||||
|
`close[i]` and earlier. Zero-position equity = exactly 1.0.
|
||||||
|
|
||||||
|
## What was tested
|
||||||
|
TSMOM multi-horizon blend (1/3/6-month-equiv on 1h bars), MA-slope (EMA200 slope), Donchian breakout
|
||||||
|
with trailing channel stop — each vol-targeted, long-short **and** long-flat, per-asset and combined.
|
||||||
|
Grid: target-vol × leverage-cap × horizon-set; explicit EARLY(2018-21)/LATE(2022-26) split;
|
||||||
|
fee & leverage sweep; full per-year 2018-2026.
|
||||||
|
|
||||||
|
## Results — the honest picture
|
||||||
|
|
||||||
|
**1) The thesis holds: massive DD reduction, and diversification helps.**
|
||||||
|
| Strategy (50/50 port, tvol20%, LS) | CAGR | Sharpe | maxDD | volA |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| **B&H 50/50** | +48% | 0.92 | **77.8%** | 70% |
|
||||||
|
| TSMOM 1-3-6m blend | +14.2% | **1.00** | **18.9%** | 14% |
|
||||||
|
| MA-slope | +14.1% | 0.79 | 21.9% | 19% |
|
||||||
|
| Donchian-trailing | +14.7% | 0.89 | 17.7% | 17% |
|
||||||
|
|
||||||
|
Trend cuts maxDD from ~78% to ~18% while keeping a Sharpe **above** buy&hold (1.00 vs 0.92). The
|
||||||
|
portfolio Sharpe (1.00) **beats both sleeves** (BTC 0.95, ETH 0.75) — diversification works as claimed.
|
||||||
|
The **long-flat** variant is even cleaner: Sharpe **1.32**, maxDD **13.3%** (no short funding/borrow risk).
|
||||||
|
|
||||||
|
**2) It is genuinely robust (not a lucky cell).**
|
||||||
|
- *Per-year (headline LS):* every full year **positive** 2019-2025 (+19/+36/+19/+6/+2/+14/+4%) and 2026 +8%.
|
||||||
|
- *Grid:* Sharpe ≈1.00 across **all** target-vol (10-40%) × leverage caps — flat plateau (vol-targeting
|
||||||
|
just scales). DD scales ~linearly with target-vol (10%→DD10%, 40%→DD35%).
|
||||||
|
- *Horizon-set:* every subset (1m/3m/6m/1-3m/3-6m/1-2-4m/2-4-8m) is **positive**; Sharpe 0.37→1.39.
|
||||||
|
Shorter horizons (1m, 1-2-4m) score best (Sharpe 1.34-1.39) — a real plateau, not one combo.
|
||||||
|
- *Fee:* survives to 0.40% RT (Sharpe 1.00→0.39, still positive at 4× baseline fee).
|
||||||
|
|
||||||
|
**3) The honest caveat — most of the edge is the EARLY regime.**
|
||||||
|
Walk-forward split, same param set both assets:
|
||||||
|
- **EARLY 2018-2021:** CAGR +26%, Sharpe **1.63**, DD 18%.
|
||||||
|
- **LATE 2022-2026:** CAGR +7.3%, Sharpe **0.57**, DD 19%.
|
||||||
|
The signal is real and still net-positive every late year, but its quality **halved** post-2021
|
||||||
|
(crypto vol compressed, trends choppier). This is the same warning Track A raised, now quantified: the
|
||||||
|
edge is strongest 2019-2021 and merely *modest* in the 2022-26 regime.
|
||||||
|
|
||||||
|
**4) Leverage is a red herring; target-vol is the real dial — and it costs DD linearly.**
|
||||||
|
At tvol=20% on 60-80% crypto vol, positions stay **sub-1x** (avg gross 0.23×): the leverage cap
|
||||||
|
**never binds**. To deploy real leverage you raise target-vol; Sharpe stays ~1.0, DD scales:
|
||||||
|
|
||||||
|
| target_vol | avg gross | CAGR | Sharpe | maxDD |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 20% | 0.23× | +14% | 1.00 | 19% |
|
||||||
|
| 40% | 0.45× | +28% | 1.00 | 35% |
|
||||||
|
| 60% | 0.68× | +40% | 1.00 | 48% |
|
||||||
|
| 80% | 0.90× | +50% | 1.00 | 60% |
|
||||||
|
| 100% | 1.12× | +58% | 0.99 | 69% |
|
||||||
|
|
||||||
|
## Verdict — is this a deployable earning system?
|
||||||
|
|
||||||
|
**Yes as a risk-adjusted system; NO as a fast path to €50/day on €2000.**
|
||||||
|
|
||||||
|
- This is the **first post-reset config that is genuinely robust**: Sharpe ~1.0 (long-flat 1.3),
|
||||||
|
positive every year 2018-2026, robust across grid/horizon/fee, on both assets, on certified data,
|
||||||
|
with honest no-look-ahead accounting. It is a real, deployable trend portfolio and a clear
|
||||||
|
improvement over Track A's lucky single cells. The thesis (DD reduction → leverageable, diversifiable)
|
||||||
|
is **confirmed**.
|
||||||
|
- **But the earnings are modest.** Headline (tvol20%, 2x cap, LS): CAGR **+14.2%**, DD 19% ⇒ steady-state
|
||||||
|
**~€0.73/day on €2000**. To average **€50/day at this CAGR you need ~€137k capital**, not €2000.
|
||||||
|
- **Leverage can't close the gap cheaply.** Pushing target-vol to 80% gives CAGR ~50% (DD **60%**) — and
|
||||||
|
at €2000, 50%/yr is still only ~€2.7/day in steady state. Reaching €50/day in 1-2 years from €2000
|
||||||
|
would require both heavy leverage (DD 60-70%, near-ruin) **and** lucky path — not a sane plan.
|
||||||
|
- **Regime risk:** the edge is much weaker post-2021 (Sharpe 0.57 LATE). Deploy sized for the LATE
|
||||||
|
regime, not the EARLY one.
|
||||||
|
|
||||||
|
**Recommendation:** treat this as the **core risk engine** (compounding ~14%/yr at DD<20%, or
|
||||||
|
long-flat ~16%/yr at DD 13%), deployable now at low size to validate live execution. It grows €2000,
|
||||||
|
but to *€50/day* the lever is **capital + time**, not leverage. Realistic near-term: ~€0.7-1.5/day on
|
||||||
|
€2000; €50/day needs ~€70-140k or a second uncorrelated edge stacked on top.
|
||||||
|
|
||||||
|
## Deliverable
|
||||||
|
`scripts/research/trackD_trendport.py` — self-contained, prints B&H benchmark, broad scan, grid
|
||||||
|
robustness, horizon robustness, walk-forward early/late, fee+leverage sweep, headline config per-year,
|
||||||
|
and the path-to-€50/day table. Reusable building blocks (vol-targeting, target→equity, portfolio).
|
||||||
@@ -0,0 +1,140 @@
|
|||||||
|
# 2026-06-19 — Track E: Cross-sectional BTC↔ETH relative-value + ENSEMBLE synthesis
|
||||||
|
|
||||||
|
Due parti, entrambe oneste e su dati Deribit-mainnet certificati (solo BTC/ETH). Tool:
|
||||||
|
`scripts/research/trackE_xsec_ensemble.py` (runnable, self-contained, riusa il walk-forward
|
||||||
|
ML di Track B e il Donchian di Track A). Harness onesto: direzione/posizione decise con dati
|
||||||
|
≤ `close[i]`, realizzo sul bar successivo (shift di 1 barra, niente look-ahead). Fee
|
||||||
|
turnover-based: `|Δpos|·fee_rt/2` **per gamba** (un flip +1↔−1 = un round-trip = 0.10% RT).
|
||||||
|
|
||||||
|
Run: `uv run python scripts/research/trackE_xsec_ensemble.py` (`--quick` salta lo sleeve ML;
|
||||||
|
`--no-cache` ricalcola la proba ML). Il proba ML viene cacheato (`.cache_trackE_*.npy`).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PART 1 — Relative value (spread BTC↔ETH, 1h, market-neutral)
|
||||||
|
|
||||||
|
**Premessa strutturale.** BTC/ETH log-ret 1h sono correlati **0.84**. Con due soli asset
|
||||||
|
l'unica struttura tradabile è lo **spread**. E con due asset, *"long il più forte / short il
|
||||||
|
più debole"* (XS-momentum) è **algebraicamente identico** a *"trada il trend del ratio
|
||||||
|
ETH/BTC"* — infatti nel codice (A) e (B) producono numeri identici. Sono lo stesso edge.
|
||||||
|
|
||||||
|
**Lead-lag: nullo.** `corr(rB[i], rE[i+1]) = −0.018`, `corr(rE[i], rB[i+1]) = −0.007`,
|
||||||
|
autocorrelazioni −0.01..−0.02. Nessun potere predittivo cross-asset → lead-lag **non**
|
||||||
|
perseguito come sleeve (sarebbe rumore moltiplicato per le fee).
|
||||||
|
|
||||||
|
**(A/B) XS momentum / ratio trend (griglia N∈{24,72,168,336}, hold∈{6,24,72}):**
|
||||||
|
- Solo **4/12 celle** OOS net-positive, e sparse (N24/h24, N24/h72, N72/h72, N168/h24).
|
||||||
|
- Le celle FULL forti (N168/h24: +150% full, Sharpe 0.68, DD 27%) hanno **OOS debole**
|
||||||
|
(+11%, Sh 0.30). La migliore per OOS-Sharpe è N24/h24 (OOS Sh 0.31, OOS net +11%).
|
||||||
|
- **Fee sweep (N24/h24):** gross (0bp) FULL +356%/OOS +74% Sh 1.20 → a 1.0bp/gamba FULL +27%/
|
||||||
|
OOS +11% Sh 0.31 → **muore già a 1.5bp/gamba** (OOS −11%). Margine fee sottilissimo.
|
||||||
|
- **Per-anno** concentrato sui grandi movimenti del ratio 2020-2021 (e 2024), piatto/negativo
|
||||||
|
altrove (2022 −9%, 2023 −19%, 2025 −6%, 2026 −16%). Non è un altopiano: è un edge debole,
|
||||||
|
fee-sensibile, regime-dipendente.
|
||||||
|
|
||||||
|
**(C) Ratio mean-reversion (z-fade di log(ETH/BTC)):** negativa ovunque (es. lb168/zin2.0:
|
||||||
|
FULL −85%, OOS −44%, Sh −1.56). Coerente con Track C: anche sullo spread la MR a breve non è
|
||||||
|
un edge sul dato pulito.
|
||||||
|
|
||||||
|
**Verdetto PART 1:** esiste un **debole** edge di relative-value (XS-momentum ≡ ratio-trend),
|
||||||
|
net-positivo OOS solo in alcune celle, Sharpe OOS ~0.3, che **muore a ~1.5bp/gamba** ed è
|
||||||
|
concentrato in pochi anni. È **reale ma marginale** — degno di entrare in un ensemble come
|
||||||
|
sleeve diversificante, non come strategia standalone. La sua virtù: è **quasi scorrelato**
|
||||||
|
dagli edge direzionali (vedi sotto).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## PART 2 — Ensemble (3 sleeve residui in UN portafoglio)
|
||||||
|
|
||||||
|
Sleeve combinati (gross 1 ciascuno, equal-weight 1/N → gross totale ~1):
|
||||||
|
- **S1 = BTC-ML** (Track B, cella onesta a basso turnover W16000 H24 thr0.10, 1h).
|
||||||
|
- **S2 = BTC-Trend** (Track A, l'unica cella trend robusta cross-asset: Donchian N=200 H=12).
|
||||||
|
- **S3 = Relative-value** (PART 1, miglior cella OOS: XS-momentum N=24 hold=24).
|
||||||
|
|
||||||
|
**Finestra comune attiva** (dove tutti e 3 sono live, dopo il warmup ML): 2020-06 → 2026-06,
|
||||||
|
52.636 barre.
|
||||||
|
|
||||||
|
### Matrice di correlazione degli sleeve (ret per-barra, finestra comune)
|
||||||
|
|
||||||
|
| | S2_trend | S3_relval | S1_ml |
|
||||||
|
|----------|----------|-----------|--------|
|
||||||
|
| S2_trend | +1.000 | +0.010 | −0.063 |
|
||||||
|
| S3_relval| +0.010 | +1.000 | −0.010 |
|
||||||
|
| S1_ml | −0.063 | −0.010 | +1.000 |
|
||||||
|
|
||||||
|
→ **Sleeve quasi perfettamente scorrelati** (|ρ| ≤ 0.06). In teoria, terreno ideale per la
|
||||||
|
diversificazione.
|
||||||
|
|
||||||
|
### Per-sleeve (finestra comune, scala $ uguale)
|
||||||
|
|
||||||
|
| sleeve | net | Sharpe | maxDD | €/g(2k) |
|
||||||
|
|-----------|-------|--------|-------|---------|
|
||||||
|
| S2_trend | +5% | +0.15 | 34% | +0.04 |
|
||||||
|
| S3_relval | +8% | +0.16 | 41% | +0.07 |
|
||||||
|
| **S1_ml** | +382% | **+0.87** | 56% | +3.51 |
|
||||||
|
|
||||||
|
### Ensemble
|
||||||
|
|
||||||
|
| portafoglio | net | Sharpe | maxDD | CAGR | €/g(2k) |
|
||||||
|
|----------------------|-------|--------|-------|-------|---------|
|
||||||
|
| best single (S1_ml) | +382% | +0.87 | 56% | +30% | +3.51 |
|
||||||
|
| **EQUAL-WEIGHT 1/N** | +109% | **+0.83** | **30%** | +13% | +1.00 |
|
||||||
|
| inverse-vol (IS wts) | +76% | +0.70 | 29% | +10% | +0.69 |
|
||||||
|
| EQ-WEIGHT **OOS**(65/35)| +32% | **+1.02** | **12%** | +14% | +0.83 |
|
||||||
|
|
||||||
|
Per-anno equal-weight: 2020 +16%, 2021 +50%, 2022 +2%, **2023 −13%** (vs −38% dell'ML da
|
||||||
|
solo!), 2024 +18%, 2025 +19%, 2026 −3%. **Molto più liscio**, niente anno-catastrofe.
|
||||||
|
|
||||||
|
### La diversificazione aiuta? Sì sul rischio, NO sul rendimento risk-adjusted
|
||||||
|
|
||||||
|
- **Sharpe:** ensemble 0.83 vs best-single 0.87 → **non batte** il miglior sleeve singolo.
|
||||||
|
- **maxDD:** ensemble **30%** vs best-single 56% → **dimezzato**. E OOS 12% vs ML-solo molto
|
||||||
|
più profondo. Per-anno senza il −38% del 2023.
|
||||||
|
- **Risk-matched** (levare l'ensemble 1.84x per pareggiare il 56% DD dell'ML): €/g +2.23
|
||||||
|
contro €/g +3.51 dell'ML da solo → a pari drawdown l'ensemble rende **MENO** (ratio 0.64).
|
||||||
|
|
||||||
|
**Perché?** Gli sleeve sono scorrelati ma **enormemente diseguali** (Sharpe 0.87 vs 0.15 vs
|
||||||
|
0.16). L'equal-weight 1/N "annacqua" l'unico sleeve forte con due deboli: la matematica
|
||||||
|
della diversificazione alza lo Sharpe solo se gli sleeve sono di *qualità comparabile*. Qui
|
||||||
|
non lo sono, quindi 1/N non può superare il singolo migliore. Pesare verso l'ML (quality-
|
||||||
|
weighting) converge banalmente a "esegui solo l'ML" — e sarebbe in-sample.
|
||||||
|
|
||||||
|
**Il guadagno vero dell'ensemble è la ROBUSTEZZA, non il rendimento:** stesso Sharpe del
|
||||||
|
miglior sleeve a **metà del drawdown**, per-anno molto più stabile, niente dipendenza da un
|
||||||
|
singolo modello/regime (l'ML da solo concentra tutto in 2021/2025 con un −38% nel 2023). Per
|
||||||
|
chi deve *sopravvivere*, l'ensemble è preferibile; per chi massimizza il rendimento a pari
|
||||||
|
rischio, l'ML puro vince di un soffio.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Verdetto onesto — è un motore da €50/giorno? NO.
|
||||||
|
|
||||||
|
1. **Relative-value:** edge debole, reale ma marginale (Sharpe OOS ~0.3), fee-sensibile
|
||||||
|
(muore a 1.5bp/gamba), concentrato 2020-2021/2024. Utile **solo** come sleeve scorrelato.
|
||||||
|
Lead-lag e ratio-MR: nulli/negativi.
|
||||||
|
2. **Ensemble:** gli sleeve sono **quasi scorrelati** (|ρ|≤0.06) — risultato genuino e bello.
|
||||||
|
L'ensemble equal-weight ottiene **Sharpe ~0.83 a metà del drawdown** del miglior sleeve e
|
||||||
|
un per-anno molto più liscio. **Ma NON alza il tetto risk-adjusted** (a pari DD rende meno
|
||||||
|
dell'ML puro) perché un solo sleeve domina.
|
||||||
|
3. **Distanza dal target:** ensemble **€1.00/giorno su €2000** (best single €3.51 ma a DD
|
||||||
|
56% e concentrato). Il target è **€50/giorno → ~50x sotto** (l'ML puro ~14x sotto ma con
|
||||||
|
rischio/concentrazione inaccettabili). Levare per colmare il gap moltiplica il drawdown
|
||||||
|
ben oltre il tollerabile (1.84x già porta al 51% DD per ~€2.2/g).
|
||||||
|
|
||||||
|
**Conclusione:** la sintesi di Track E conferma la fotografia dei track A/B/C — esistono
|
||||||
|
**edge residui deboli ma reali e scorrelati** su BTC/ETH. Combinarli in un ensemble **migliora
|
||||||
|
la robustezza** (DD dimezzato, per-anno stabile, niente single-point-of-failure) ma **non crea
|
||||||
|
rendimento dal nulla**: il sistema combinato rende ~€1/giorno su €2000, ~50x sotto l'obiettivo,
|
||||||
|
e non è un motore dispiegabile. Il miglior uso pratico dei risultati: se un giorno si tradasse,
|
||||||
|
l'ensemble equal-weight (ML + trend + relative-value) è la forma **più onesta e meno fragile**
|
||||||
|
del poco edge disponibile — ma serve un edge **di un'altra magnitudine** per avvicinare i €50/g.
|
||||||
|
|
||||||
|
## Prossimi passi possibili (non eseguiti)
|
||||||
|
- Cercare uno sleeve **di qualità comparabile all'ML** (Sharpe ≥0.5 indipendente) — solo
|
||||||
|
allora 1/N alzerebbe lo Sharpe oltre il singolo. Senza, l'ensemble resta solo "risk smoother".
|
||||||
|
- Relative-value su **timeframe diversi** del ratio (giornaliero?) o con **position sizing**
|
||||||
|
proporzionale alla forza del segnale, restando scettici sul fee-margin sottile.
|
||||||
|
- Non aumentare la leva per inseguire €50/g: il DD esplode prima del rendimento.
|
||||||
|
|
||||||
|
## Artefatti
|
||||||
|
- `scripts/research/trackE_xsec_ensemble.py` — riproducibile (`uv run ...`, ~8s con cache ML).
|
||||||
@@ -0,0 +1,77 @@
|
|||||||
|
# Track F — Calendar seasonality (hour-of-day / day-of-week) on BTC & ETH
|
||||||
|
|
||||||
|
**Data:** 2026-06-19 · **Script:** `scripts/research/trackF_seasonality.py`
|
||||||
|
**Dati:** Deribit mainnet certificati, BTC/ETH 1h UTC. Fee baseline 0.10% RT (`fee_side=0.0005`).
|
||||||
|
|
||||||
|
## Domanda
|
||||||
|
Esiste un edge di calendario *sistematico e tradeable* (ora del giorno, giorno della
|
||||||
|
settimana, interazione ora×giorno) su BTC ed ETH, netto fee, OOS, per-anno, su entrambi gli asset?
|
||||||
|
|
||||||
|
## Metodologia (anti-overfit, anti-leakage)
|
||||||
|
- `ret[i]=close[i]/close[i-1]-1` è noto a `close[i]`; una posizione decisa a `close[i]` guadagna
|
||||||
|
`ret[i+1]`. La statistica che decide il trade usa **solo barre ≤ i** (mai la barra tradata né futuro).
|
||||||
|
- **Tradeable test onesto = ADAPTIVE EXPANDING sign**: a `close[i]` guardo il bucket di calendario
|
||||||
|
della barra `i+1` (il clock è noto, zero look-ahead) e prendo il **segno della media passata** di
|
||||||
|
quel bucket (espandente, warmup-gated). Long-flat o long-short. Fee solo su `|Δposizione|`.
|
||||||
|
È l'analogo onesto di "tradare il seasonal": i dati scelgono il segno di ogni bucket **dal vivo**.
|
||||||
|
- Tabelle descrittive per-ora/per-giorno split IS(65%)/OOS(35%) come diagnostica.
|
||||||
|
- Regola discreta ottimizzata in-sample (entra a ora H, tieni W barre, dir migliore) mostrata solo
|
||||||
|
per **esporre il gap IS→OOS** (384 celle testate/asset).
|
||||||
|
- Benchmark **buy-and-hold** come controllo del long-bias.
|
||||||
|
|
||||||
|
## Risultati
|
||||||
|
|
||||||
|
### 1. Descrittive (bp/barra, IS vs OOS)
|
||||||
|
- **Hour-of-day:** sign-agreement IS/OOS solo **12/24 (BTC)** e **8/24 (ETH)** → caso. Le ore "US
|
||||||
|
close" 21:00–22:00 UTC sono positive in entrambi gli split su entrambi gli asset (l'unico pattern
|
||||||
|
con un minimo di coerenza), ma il resto è rumore che cambia segno tra IS e OOS.
|
||||||
|
- **Day-of-week:** più stabile. **Giovedì negativo** su BTC ed ETH in IS *e* OOS; Lun/Mer positivi.
|
||||||
|
Sign-agreement 6/7 (BTC), 5/7 (ETH).
|
||||||
|
|
||||||
|
### 2. Adaptive expanding-sign (il test tradeable)
|
||||||
|
| Strategia | BTC Sharpe | ETH Sharpe | Note |
|
||||||
|
|---|---|---|---|
|
||||||
|
| HOUR long-short | **−5.39** | **−4.04** | DD 100%. Annientata dalle fee. |
|
||||||
|
| HOUR long-flat | −2.92 | −2.09 | DD 100%. Idem. |
|
||||||
|
| DOW long-short | +0.64 | +0.83 | DD 82–84%, −66% nel 2022 |
|
||||||
|
| DOW long-flat | +0.81 | +0.96 | DD 75–78%, −64/−66% nel 2022 |
|
||||||
|
| HOUR×WEEKDAY (168 buckets) | −5.05 | −3.96 | DD 100%. Overfit puro + fee. |
|
||||||
|
|
||||||
|
### 3. Il controllo che smonta il DOW — **buy-and-hold**
|
||||||
|
- BTC buy-hold: **Sharpe 0.79, CAGR 34.9%, DD 77%** → DOW long-flat: Sh 0.81, CAGR 34.2%, DD 77.5%.
|
||||||
|
- ETH buy-hold: **Sharpe 0.84, CAGR 42.4%, DD 81%** → DOW long-flat: Sh 0.96, CAGR 52.7%, DD 74%.
|
||||||
|
- Il DOW long-flat è **long il 78% del tempo** (`mean_pos≈+0.78`). È **buy-and-hold travestito**:
|
||||||
|
guadagna perché crypto sale, non perché esiste un edge di giorno. Lo "skip del giovedì" aggiunge
|
||||||
|
pochissimo e non giustifica un deploy.
|
||||||
|
|
||||||
|
### 4. Fee sweep (HOUR long-short adaptive)
|
||||||
|
A fee **0%**: Sh +0.61 (BTC) / +0.80 (ETH) — solo long-drift. A 0.10% RT: **−5.4 / −4.0**. Turnover
|
||||||
|
**~8.000 flip/anno** (segno orario instabile, cambia quasi ogni barra) → morte istantanea per fee.
|
||||||
|
Le strategie hour-of-day sono ad alta frequenza per costruzione: le fee sono di prim'ordine e le
|
||||||
|
uccidono.
|
||||||
|
|
||||||
|
### 5. Regola discreta ottimizzata in-sample (trappola multiple-testing)
|
||||||
|
- BTC: best IS H=05 hold=24h dir=+1 → **IS Sh +4.25 → OOS Sh +1.47** (+3.7 bp/trade).
|
||||||
|
- ETH: best IS H=13 hold=24h dir=+1 → **IS Sh +7.35 → OOS Sh +0.90** (+3.2 bp/trade).
|
||||||
|
- Collasso IS→OOS classico. Inoltre "hold 24h dir+1" = ancora **long-bias** (entra una volta/giorno
|
||||||
|
e tiene 24h ≈ sempre long). Il margine OOS (~3 bp/trade su 10 bp RT) è marginale e fragile.
|
||||||
|
|
||||||
|
## Multiple-testing
|
||||||
|
199 celle di calendario/asset (24 ore + 7 giorni + 168 ora×giorno) + 384 (H,W,dir)/asset. Con così
|
||||||
|
tante celle, bucket "significativi" spuri sono **garantiti**. Filtri applicati: segno scelto dal vivo
|
||||||
|
su soli dati passati, deve reggere OOS, per-anno, e su **entrambi** BTC ed ETH.
|
||||||
|
|
||||||
|
## Verdetto — **SPURIO / NON deployable**
|
||||||
|
- **Nessun edge di calendario netto-fee robusto** su BTC ed ETH.
|
||||||
|
- **Hour-of-day:** morto (fee + segno instabile). L'unica regolarità (US-close 21–22 UTC positiva) è
|
||||||
|
troppo debole e non sopravvive al turnover.
|
||||||
|
- **Day-of-week:** l'unico risultato "positivo" è **long-bias mascherato** (≈ buy-and-hold,
|
||||||
|
Sharpe ~0.8–0.96 < trend portfolio 1.32, DD 75–84% rovinoso, −65% nel 2022). Non è un edge
|
||||||
|
seasonal sfruttabile; è esposizione direzionale al drift di crypto.
|
||||||
|
- **Hour×weekday:** overfit puro (IS −3.6 → OOS −8.0).
|
||||||
|
- Coerente con la lezione del progetto: dove l'unica "direzione" che funziona è essere long, non c'è
|
||||||
|
alpha di timing — c'è beta. Il trend portfolio (TP01) cattura quel beta in modo vol-targeted e
|
||||||
|
con DD ~12%, infinitamente meglio di qualunque regola di calendario qui.
|
||||||
|
|
||||||
|
**Azione:** track F chiuso negativo. Non aggiungere nulla al portafoglio. Il soffitto Sharpe ~1.3 su
|
||||||
|
BTC/ETH regge.
|
||||||
@@ -0,0 +1,85 @@
|
|||||||
|
# Track G — Prior-period level breakouts / range (BTC & ETH, calendar-anchored)
|
||||||
|
|
||||||
|
**Data:** 2026-06-19 · **Script:** `scripts/research/trackG_prior_levels.py`
|
||||||
|
**Harness:** `src/backtest/harness.py` (honest, entry decided at `close[i]`, fill `close[i]`).
|
||||||
|
|
||||||
|
## Domanda
|
||||||
|
|
||||||
|
Esistono edge net-positivi OOS, robusti su BTC **e** ETH, definiti rispetto a un **periodo
|
||||||
|
calendario precedente** (giorno/settimana/opening-range)? E soprattutto: i breakout di livello
|
||||||
|
**continuano** (trend) o **rientrano** (fade)?
|
||||||
|
|
||||||
|
## No look-ahead (garanzie)
|
||||||
|
|
||||||
|
- Livelli prior-day/week costruiti aggregando a barre giornaliere/settimanali (UTC) e poi
|
||||||
|
**`shift(1)`** sul frame del periodo *chiuso*: il periodo corrente vede solo il precedente
|
||||||
|
totalmente chiuso. Mai "oggi"/"questa settimana" nel livello.
|
||||||
|
- Opening-range usato **solo** sulle barre dopo la chiusura della finestra di apertura.
|
||||||
|
- Direzione + prezzo decisi a `close[i]`, fill a `close[i]`. Mai entry sul livello esatto intrabar.
|
||||||
|
- Bug iniziale corretto: mismatch tz-aware vs tz-naive nel mapping dei livelli (dava 0 trade).
|
||||||
|
|
||||||
|
## Risultati (1h, fee 0.10% RT, leva 1x, OOS 65/35)
|
||||||
|
|
||||||
|
### Continuation vs FADE — il verdetto è netto
|
||||||
|
|
||||||
|
| Regola (PD = prior-day) | BTC OOS | ETH OOS | Sharpe OOS |
|
||||||
|
|---|---|---|---|
|
||||||
|
| **PD-high CONT (long su rottura max ieri)** | **+25%** | **+16%** | +0.5 / +0.3 |
|
||||||
|
| PD-high FADE | **−68%** | **−68%** | −1.6 / −1.2 |
|
||||||
|
| PD-low CONT (short su rottura min ieri) | −33% | −60% | −0.5 / −0.8 |
|
||||||
|
| PD-low FADE | −36% | −8% | −0.6 / +0.1 |
|
||||||
|
|
||||||
|
- **I breakout CONTINUANO, non rientrano.** Il lato FADE è robustamente **negativo** su entrambi
|
||||||
|
gli asset (sia high che low), su prior-day, prior-week e opening-range. Conferma diretta della
|
||||||
|
tesi del reset: la mean-reversion / fade è morta su dati certificati.
|
||||||
|
- **Asimmetria long-only:** funziona solo la rottura del **massimo** (long), non quella del
|
||||||
|
**minimo** (short). Cioè non è un edge di breakout *simmetrico/direzione-neutro*: è cattura del
|
||||||
|
**drift/trend rialzista** del cripto. La PD-low-cont (short sui breakdown) perde perché in questo
|
||||||
|
campione il cripto sale.
|
||||||
|
|
||||||
|
### Grid robustness (PASS 6) — survivor = OOS>0 su ENTRAMBI
|
||||||
|
|
||||||
|
- **PD-high CONT: 3/3 celle** (buffer 0/0.1%/0.3%) positive OOS su BTC **e** ETH → robusto al buffer.
|
||||||
|
- PD-high fade, PD-low cont/fade, OR-fade: **0 survivor**.
|
||||||
|
- **OR-cont:** positiva solo su ETH, negativa su BTC su tutte le finestre (3/6/8/12h) → artefatto
|
||||||
|
mono-asset, scartato dalla regola "entrambi".
|
||||||
|
|
||||||
|
### Anchor-hour sweep (PASS 5) — non è un'ora fortunata
|
||||||
|
|
||||||
|
PD-high cont positiva su **21/24** ore UTC (BTC) e **20/24** (ETH). Non dipende da un singolo
|
||||||
|
anchor → coerente con un edge reale (ma vedi sotto: è beta di trend).
|
||||||
|
|
||||||
|
### Fee sweep + per-anno (PD-high cont, full sample)
|
||||||
|
|
||||||
|
```
|
||||||
|
BTC RT%: 0.00→+571 0.05→+289 0.10→+126 0.15→ +31 0.20→ −24 (OOS: +84/+52/+25/+3/−15)
|
||||||
|
ETH RT%: 0.00→+1754 0.05→+1012 0.10→+567 0.15→+299 0.20→+139 (OOS: +67/+39/+16/−3/−19)
|
||||||
|
BTC per-anno: 2019 +39 2020 +104 2021 +7 2022 −42 2023 +24 2024 +27 2025 −16 2026 +3
|
||||||
|
ETH per-anno: 2020 +164 2021 +160 2022 +7 2023 +1 2024 +12 2025 −4 2026 +7
|
||||||
|
Sharpe full: BTC +0.48 (maxDD 55%, €/d 2k +0.88) · ETH +0.86 (maxDD 34%, €/d 2k +4.27)
|
||||||
|
```
|
||||||
|
|
||||||
|
- **Fee-fragile:** alla baseline 0.10% RT sopravvive (OOS +25/+16%), ma muore già a ~0.15-0.20% RT.
|
||||||
|
Margine di fee sottile (≈1.5x baseline e l'edge sparisce su OOS). ~1000-1100 trade in 8 anni.
|
||||||
|
- **Drawdown enormi** (BTC 55%) e anni negativi (2022 −42% BTC, 2025 −16%).
|
||||||
|
|
||||||
|
## Verdetto
|
||||||
|
|
||||||
|
- **Sì, esiste un edge net-positivo OOS su entrambi gli asset:** *PD-high continuation* (long
|
||||||
|
quando `close` supera il massimo di ieri, exit a fine giornata UTC). Robusto al buffer e
|
||||||
|
all'anchor-hour. **MA non è deployabile come miglioramento:**
|
||||||
|
1. È **long-only drift capture**, non un breakout simmetrico (il lato short fallisce) → è una
|
||||||
|
versione **più debole e ridondante** del Trend Portfolio TP01 (Sharpe 0.48-0.86 vs 1.32).
|
||||||
|
2. **Fee-fragile** (muore a ~1.5x la fee baseline) e con **drawdown** molto peggiori.
|
||||||
|
- **Il contributo scientifico vero è la conferma della direzione:** sui dati certificati i
|
||||||
|
breakout di livello-calendario **CONTINUANO**; il fade è morto (negativo robusto su PD/PW/OR,
|
||||||
|
entrambi gli asset). Nessuna sorpresa mean-reversion nascosta nei livelli giornalieri/settimanali.
|
||||||
|
- **Niente di nuovo da mettere in produzione.** TP01 resta la strategia vincente; i breakout
|
||||||
|
prior-period non aggiungono Sharpe (stessa beta di trend, peggio eseguita).
|
||||||
|
|
||||||
|
## Come riprodurre
|
||||||
|
|
||||||
|
```bash
|
||||||
|
uv run python scripts/research/trackG_prior_levels.py # full (1h + 15m, ~25s)
|
||||||
|
uv run python scripts/research/trackG_prior_levels.py --quick # 1h only
|
||||||
|
```
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
# Track H — Volume, Range & Volatility-Regime signals (BTC/ETH, certified, >=12h)
|
||||||
|
|
||||||
|
**Date:** 2026-06-19
|
||||||
|
**Script:** `scripts/research/trackH_volume_vol.py` (runnable, self-contained)
|
||||||
|
**Question:** does any volume / range / volatility-regime signal ADD to the deployed winner
|
||||||
|
TP01 (vol-targeted trend portfolio, 12h, Sharpe ~1.32) — i.e. net-positive OOS on BOTH BTC &
|
||||||
|
ETH AND uncorrelated (|corr|<~0.3) — OR work as a regime filter that lifts TP01's Sharpe / cuts
|
||||||
|
its DD?
|
||||||
|
|
||||||
|
## Method (honest)
|
||||||
|
- Same causal per-bar engine as `TrendPortfolio.net_returns`: build a continuous TARGET decided
|
||||||
|
with data `<= close[i]`, HOLD it during bar `i+1` (`pos_held[t]=target[t-1]`), gross = pos×ret,
|
||||||
|
fee on `|Δpos|`. Identical in spirit to `harness.backtest_signals` (decide≤close[i], fill at
|
||||||
|
close[i]); two discrete signals cross-checked through `backtest_signals` directly.
|
||||||
|
- All features (volume z-score, OBV, ranges, realized vol) use prior/rolling windows shifted so
|
||||||
|
bar `i` sees only `<= i`. 12h/1d resampled from certified 1h via `resample_tf` (label='left'),
|
||||||
|
consumed index-based with the +1 hold → no open-label leak.
|
||||||
|
- Fee 0.10% RT baseline + sweep 0.00–0.40% RT. OOS 65/35 + per-year. Grid on BOTH assets.
|
||||||
|
Turnover and correlation-to-TP01 reported for every signal.
|
||||||
|
- **>=12h only** (12h + 1d). Sub-12h excluded per the standing lesson (fees + HF-noise overfit +
|
||||||
|
the 4h open-label look-ahead trap).
|
||||||
|
|
||||||
|
## Signals tested
|
||||||
|
VT-long (volatility-managed long), VolBreakout (volume-z-confirmed Donchian), OBV-trend,
|
||||||
|
VW-mom (volume-weighted momentum), RangeExpand (range-expansion breakout), NR7-break
|
||||||
|
(narrowest-range breakout), DeclVolRev (declining-volume fade/reversal). Plus regime overlays on
|
||||||
|
TP01: keep-low-vol, keep-high-vol, vol-managed ×1.5, OBV-up confirmation.
|
||||||
|
|
||||||
|
## Results (12h headline, fee 0.10% RT)
|
||||||
|
| signal | corr→TP01 | OOS Sharpe BTC/ETH | note |
|
||||||
|
|---|---|---|---|
|
||||||
|
| VT-long | 0.66 / 0.69 | 0.80 / 0.14 | trend-in-disguise; weak OOS ETH |
|
||||||
|
| VolBreakout | 0.69 / 0.71 | 0.54 / 0.49 | profitable but correlated |
|
||||||
|
| OBV-trend | 0.61 / 0.63 | 0.96 / 0.68 | profitable but correlated; turnover ~75/yr |
|
||||||
|
| VW-mom | 0.64 / 0.67 | 0.98 / 0.74 | basically TSMOM; correlated |
|
||||||
|
| RangeExpand | 0.48 / 0.49 | 0.37 / 1.04 | lower corr but BTC weak; ETH negative on 1d |
|
||||||
|
| NR7-break | 0.48 / 0.49 | 0.79 / 0.02 | fails OOS on ETH |
|
||||||
|
| DeclVolRev | -0.15 / -0.11 | -1.15 / -0.44 | **negative even at zero fee** |
|
||||||
|
|
||||||
|
Grid robustness (12h, % cells positive full+OOS on both assets): VW-mom 100%, VT-long 100%,
|
||||||
|
VolBreakout 96%, RangeExpand 96%, OBV-trend 75% — but the robust ones are precisely the ones
|
||||||
|
that are highly correlated to TP01. Fee sweep: trend-family signals survive to 0.40% RT;
|
||||||
|
DeclVolRev gets worse with fees (it trades constantly).
|
||||||
|
|
||||||
|
## Regime filters on TP01 (12h, 50/50 portfolio)
|
||||||
|
| variant | full Sharpe | OOS Sharpe | maxDD | CAGR | turn/y |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| **TP01 baseline** | **1.32** | 0.90 | 13.3% | 16.2% | 11.5 |
|
||||||
|
| × keep LOW-vol | 0.94 | 1.11 | 14.1% | 7.7% | 9.5 |
|
||||||
|
| × keep HIGH-vol | 0.98 | 0.18 | 9.9% | 7.9% | 4.9 |
|
||||||
|
| × vol-managed ×1.5 | 1.33 | 0.96 | 17.9% | 18.1% | 15.4 |
|
||||||
|
| × OBV-up only | 1.49 | 1.04 | 10.1% | 14.4% | 18.2 |
|
||||||
|
|
||||||
|
OBV-up filter across EMA span: full Sharpe 1.49–1.52 (span 15–30), DD 7–10%, but OOS gain is
|
||||||
|
marginal (0.90→1.04 at span 30) and fades for span≥45 (OOS 0.69–0.73). It cuts ~2pp CAGR and
|
||||||
|
raises turnover ~60%.
|
||||||
|
|
||||||
|
## Verdict (honest)
|
||||||
|
- **No uncorrelated additive edge exists.** Every *profitable* volume/range/vol signal is trend
|
||||||
|
in disguise (corr 0.61–0.75 to TP01) → cannot raise the 50/50 portfolio Sharpe. The genuinely
|
||||||
|
lower-corr signals (RangeExpand, NR7 ~0.48) fail OOS on at least one asset.
|
||||||
|
- **Mean-reversion / declining-volume fade is dead** — negative net AND at zero fee on both
|
||||||
|
assets. Reconfirms the v2.0.0 contamination lesson; MR is not a real edge on certified data.
|
||||||
|
- **Vol-regime gating hurts** (keep-low / keep-high both drop Sharpe to ~0.95). The vol-managed
|
||||||
|
overlay is Sharpe-neutral but DD-worse.
|
||||||
|
- **The only non-harmful overlay is OBV-up trend-confirmation:** it cuts DD (13.3%→10.1%) and
|
||||||
|
nudges full Sharpe to ~1.49, but it is trend double-confirmation (de-risking), not new alpha;
|
||||||
|
it costs CAGR, raises turnover, and the OOS Sharpe gain is within noise and span-sensitive. It
|
||||||
|
is worth keeping in mind as a **defensive DD overlay**, not as a Sharpe improver.
|
||||||
|
- **Bottom line:** the ~1.3 portfolio-Sharpe ceiling on BTC/ETH-only **holds**. TP01 stays the
|
||||||
|
deployable winner. Volume/range/vol add nothing uncorrelated.
|
||||||
@@ -0,0 +1,99 @@
|
|||||||
|
# Track I — Alternative momentum formulations + long-horizon reversal (2026-06-19)
|
||||||
|
|
||||||
|
**Script:** `scripts/research/trackI_momentum_reversal.py` (self-contained, runnable).
|
||||||
|
**Universe:** BTC & ETH only. **TF:** 12h + 1d (sub-12h excluded by rule). **Harness:** identical
|
||||||
|
honest machinery to TP01 — direction decided `<= close[i]`, positions held next bar (`pos_held[1:]
|
||||||
|
= tgt[:-1]`), vol-target by inverse PAST-ONLY realized vol (target 20%, lev cap 2x), NET fee 0.10%
|
||||||
|
RT on turnover, 50/50 BTC+ETH. OOS 65/35 + per-year + fee sweep (0.00–0.40% RT). Correlation to
|
||||||
|
TP01 net returns reported for every candidate.
|
||||||
|
|
||||||
|
## Goal
|
||||||
|
(A) A momentum formulation that BEATS or DIVERSIFIES the canonical 1-3-6m sign-blend (TP01,
|
||||||
|
Sharpe ~1.32). (B) Does the classic LONG-HORIZON REVERSAL (fade ~12m winners) give an
|
||||||
|
uncorrelated positive overlay?
|
||||||
|
|
||||||
|
## PART A — momentum formulations (12h, long-flat, vs TP01 Sharpe 1.32 / OOS 0.90 / DD 13.3%)
|
||||||
|
|
||||||
|
| formulation | Sharpe | IS | **OOS** | CAGR | maxDD | corr→TP01 | BTC | ETH |
|
||||||
|
|---|---|---|---|---|---|---|---|---|
|
||||||
|
| baseline sign-blend 1-3-6m | 1.32 | 1.54 | 0.90 | +16% | 13.3% | 1.00 | 1.15 | 1.10 |
|
||||||
|
| (i) z-score cum-return (tanh) | **1.35** | 1.63 | 0.85 | +12% | **8.4%** | 0.96 | 1.30 | 1.00 |
|
||||||
|
| (ii) risk-adjusted momentum | 1.27 | 1.49 | 0.84 | +13% | 9.5% | 0.97 | 1.21 | 1.00 |
|
||||||
|
| (iii) EMA-cross trend | 0.81 | 0.91 | 0.62 | +11% | 25.1% | 0.85 | 0.89 | 0.53 |
|
||||||
|
| (iii-b) MACD (calendar spans) | **1.50** | **1.87** | 0.74 | +22% | 17.7% | 0.69 | 1.30 | 1.32 |
|
||||||
|
| (iv) Donchian breakout | 1.10 | 1.36 | 0.57 | +17% | 25.0% | 0.86 | 1.08 | 0.82 |
|
||||||
|
| (v) acceleration (Δ-momentum) | 1.28 | 1.82 | 0.35 | +14% | 14.2% | 0.66 | 1.25 | 0.81 |
|
||||||
|
| (vi) 12-1 skip momentum | 0.67 | 0.79 | 0.47 | +9% | 24.5% | 0.68 | 0.70 | 0.49 |
|
||||||
|
|
||||||
|
Results are essentially identical at 1d. Read-out:
|
||||||
|
|
||||||
|
- **Nothing cleanly beats the sign-blend OOS on both assets.** The headline-Sharpe leaders are
|
||||||
|
artefacts of in-sample fit: **MACD** posts IS 1.87 but OOS collapses to 0.74 (gap = overfit) with
|
||||||
|
a worse DD (17.7%); **acceleration** IS 1.82 → OOS **0.35** (worst OOS decay of all). Both fail.
|
||||||
|
- **(i) z-score continuous momentum** is the one mild, honest refinement: Sharpe 1.35 (≈baseline)
|
||||||
|
but **maxDD 8.4% vs 13.3%** — the continuous score scales down position when the cumulative move
|
||||||
|
is statistically small, de-risking the tails. OOS 0.85 (slightly below baseline 0.90), CAGR drops
|
||||||
|
16%→12%. It's a smoother sibling of TP01, **not a new edge** (corr 0.96).
|
||||||
|
- (vi) 12-1 skip (classic equity "12-1" momentum) **does NOT help crypto**: skipping the recent
|
||||||
|
month removes the strongest part of the signal here → Sharpe 0.67, corr 0.68. Crypto momentum
|
||||||
|
lives in the recent window, opposite to the equity stylised fact.
|
||||||
|
- Breakout/Donchian and EMA-cross are strictly worse (high DD, weak OOS).
|
||||||
|
|
||||||
|
## PART B — long-horizon reversal (fade past winners), 12h
|
||||||
|
|
||||||
|
Long-short reversal (short ~12/18/24m winners, long losers, vol-targeted):
|
||||||
|
|
||||||
|
| reversal LS | Sharpe | OOS | CAGR | maxDD | corr→TP01 |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| 12m | -0.77 | -1.15 | -14% | 73% | -0.51 |
|
||||||
|
| 18m | -0.36 | -0.75 | -8% | 58% | -0.47 |
|
||||||
|
| 24m | **+0.04** | -0.07 | -1% | 43% | **-0.32** |
|
||||||
|
| 12-18-24m | -0.46 | -0.72 | -8% | 57% | -0.54 |
|
||||||
|
|
||||||
|
- **Long-horizon reversal is NOT a standalone edge.** Standalone it LOSES money (12m/18m strongly
|
||||||
|
negative; only 24m is ~flat at Sharpe 0.04, OOS −0.07, and even that fails "net-positive OOS on
|
||||||
|
both assets": BTC +0.10 / ETH −0.03). Fading crypto winners over a year just shorts the trend.
|
||||||
|
- It IS genuinely negatively correlated to TP01 (24m: corr −0.32; 12-18-24: −0.54), as expected
|
||||||
|
(it's the opposite sign of medium-term momentum).
|
||||||
|
- **Momentum + reversal blend** (long 1-6m momentum, brake on very-long extension): the variant
|
||||||
|
`mom(1-3-6) − 0.5·rev(12-24)` is the most interesting single-strategy result — Sharpe **1.38**,
|
||||||
|
**OOS 0.98** (> baseline 0.90), **maxDD 10.6%** (< 13.3%), both assets positive (BTC 1.25/ETH
|
||||||
|
1.05), corr 0.91, fee-robust (1.43→1.22 across 0.00–0.40% RT). CAGR drops 16%→12%. It is TP01
|
||||||
|
with a long-term-extension brake: a modest *risk-adjusted* improvement, not more return.
|
||||||
|
|
||||||
|
## COMBINED — TP01 + best diversifier (blend net returns)
|
||||||
|
|
||||||
|
TP01 alone: Sharpe 1.321, CAGR +16%, maxDD 13.3%, OOS 0.90.
|
||||||
|
|
||||||
|
| combo | Sharpe | CAGR | maxDD | OOS | corr |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| TP01 + 20% reversal-24m (LS) | **1.411** | +13% | 11.5% | **1.06** | -0.32 |
|
||||||
|
| TP01 + 30% reversal-24m (LS) | 1.366 | +12% | 11.8% | 1.06 | -0.32 |
|
||||||
|
| TP01 + 20% reversal-12-18-24 (LS) | 1.350 | +11% | 10.6% | 0.84 | -0.54 |
|
||||||
|
| TP01 + 50% z-score | 1.348 | +14% | 9.5% | 0.89 | +0.96 |
|
||||||
|
|
||||||
|
- Adding a small slice of **reversal-24m long-short** lifts portfolio Sharpe 1.32→1.41 and OOS
|
||||||
|
0.90→1.06 while cutting DD to 11.5%. **But be skeptical:** the overlay is a ~zero-mean stream
|
||||||
|
(standalone Sharpe 0.04). The benefit is almost entirely **variance reduction from the negative
|
||||||
|
correlation, not added alpha** — and it COSTS return (CAGR 16%→13%). With a true-zero-edge
|
||||||
|
diversifier this Sharpe bump is fragile (it leans on the −0.32 correlation persisting OOS, and the
|
||||||
|
OOS sample is one 2022-24 crypto cycle). I would NOT deploy capital on a standalone-losing sleeve
|
||||||
|
to chase a 0.09 Sharpe point that is really de-risking.
|
||||||
|
|
||||||
|
## Fee sweep (12h portfolio Sharpe)
|
||||||
|
baseline 1.37→1.18, z-score 1.38→1.24, MACD 1.52→1.45 (lowest turnover), blend 1.43→1.22,
|
||||||
|
reversal-24m 0.07→−0.02 (0.00→0.40% RT). All trend formulations survive realistic fees; reversal
|
||||||
|
has no positive margin to survive on.
|
||||||
|
|
||||||
|
## VERDICT (honest)
|
||||||
|
- **Is there a momentum formulation that beats the 1-3-6m sign-blend? No — not OOS, not on both
|
||||||
|
assets.** MACD/acceleration look better in-sample but decay OOS (overfit + higher DD). The only
|
||||||
|
honest refinement is **continuous z-score momentum**, which matches the Sharpe with materially
|
||||||
|
lower drawdown (8.4% vs 13.3%) — a smoother variant of the SAME edge, not a new one (corr 0.96).
|
||||||
|
- **Does long-horizon reversal give an uncorrelated positive overlay? No, not a real one.** It is
|
||||||
|
uncorrelated/negatively-correlated (good) but **not positive** standalone (it loses, or at best is
|
||||||
|
flat at 24m and fails the both-assets bar). The combined-Sharpe lift (→1.41) is variance reduction
|
||||||
|
from a near-zero-mean stream and sacrifices CAGR — fragile, not bankable alpha.
|
||||||
|
- **The ~1.3 structural Sharpe ceiling on BTC/ETH-only holds.** TP01 remains the deployable winner.
|
||||||
|
If anything, swap the sign-blend for the **z-score continuous score** (or the `mom − 0.5·rev`
|
||||||
|
brake) for a lower-DD profile at equal Sharpe — a risk-management tweak, not a return upgrade.
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
# 2026-06-19 — Strato trend multi-asset sui 52 alt: RIDONDANTE col trend di TP01
|
||||||
|
|
||||||
|
Tentativo: aggiungere un terzo sleeve = TSMOM (stessa logica TP01 CANONICAL, long-flat vol-target)
|
||||||
|
applicato a OGNI alt dei 52 Hyperliquid certificati, equal-weight ragged. Idea: trend più
|
||||||
|
diversificato che diversifichi TP01 (BTC/ETH). `scripts/portfolio/trend_multiasset.py`.
|
||||||
|
|
||||||
|
## Esito: ridondante e peggiore
|
||||||
|
- **TREND-52 standalone**: FULL Sh 0.66, **HOLD-OUT −1.03** (negativo), anni+ 33%. Gli alt sono
|
||||||
|
stati long nel calo 2025-26 e hanno sanguinato — a differenza di TP01 (BTC/ETH) che il
|
||||||
|
vol-target+trend portò in cash. I trend degli alt sono più rumorosi/whippy.
|
||||||
|
- **corr a TP01 = +0.74** (stessa beta direzionale, come previsto) | corr a XS01 −0.05.
|
||||||
|
- **Contributo al portafoglio (TP01 70 + XS 30):** +TREND-52 w20% → FULL −0.01, **HOLD −0.16**;
|
||||||
|
w30% → FULL −0.02, **HOLD −0.27**. PEGGIORA.
|
||||||
|
|
||||||
|
## Lezione
|
||||||
|
Broadenizzare il TREND su molti alt NON diversifica: è la **stessa direzionalità** (corr 0.74 con
|
||||||
|
TP01) su asset più rumorosi → aggiunge perdita/rumore, non edge. La dimensione trend è già catturata
|
||||||
|
in modo pulito da TP01 (BTC/ETH, vol-targeted). L'unica espansione che diversifica davvero resta
|
||||||
|
quella **market-neutral** (XS01 cross-sectional), perché è ortogonale alla beta direzionale.
|
||||||
|
|
||||||
|
## Conclusione (chiusura del filone "espansione universo")
|
||||||
|
Esplorate tutte le vie di espansione sui certificati Hyperliquid:
|
||||||
|
1. XS su 52-all → diluito (memecoin), negativo.
|
||||||
|
2. XS top-liquidità dinamico → peggiore del fisso-19 (liquidità ≠ qualità).
|
||||||
|
3. Trend multi-asset su 52 → ridondante (corr 0.74) + hold-out negativo.
|
||||||
|
Nessuna migliora il portafoglio. **Configurazione validata e invariata: TP01 70% + XS01 (19 major)
|
||||||
|
30% — FULL Sh 1.41 / HOLD 1.15.** I margini reali per crescere NON sono nell'universo crypto-
|
||||||
|
direzionale (saturo), ma in un MECCANISMO diverso (opzioni VRP, in attesa di dati di stress reali).
|
||||||
@@ -0,0 +1,35 @@
|
|||||||
|
# 2026-06-19 — Affinamento XS01: blend di lookback [30,90]
|
||||||
|
|
||||||
|
Come TP01 fonde gli orizzonti 30/90/180, XS01 ora fonde piu' lookback del momentum cross-sectional
|
||||||
|
(z-score cross-sectional per lookback, mediato) invece del singolo L=30. `scripts/portfolio/xsec_blend.py`.
|
||||||
|
|
||||||
|
## Sweep lookback (19 major, 899g) — FULL/OOS/DD/anni+/corrTP
|
||||||
|
| lookbacks | FULL | OOS25 | DD% | anni+ | corrTP |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| [30] (prima) | 0.80 | 1.20 | 21 | 100% | −0.06 |
|
||||||
|
| [90] | 0.88 | 0.90 | 17 | 100% | −0.05 |
|
||||||
|
| **[30,90]** | **1.10** | **1.03** | **14** | **100%** | **−0.12** |
|
||||||
|
| [20,40,90] | 0.51 | 0.67 | 25 | 100% | −0.12 |
|
||||||
|
| [30,60,120] | 0.68 | 0.74 | 16 | 100% | −0.13 |
|
||||||
|
|
||||||
|
**[30,90] e' il sweet spot**: fonde i DUE singoli robusti (30 e 90), FULL Sh 0.80→1.10, DD 21→14%,
|
||||||
|
corr a TP01 −0.06→−0.12 (diversifica meglio), 100% anni+. Non e' un cell fortunato: e' la
|
||||||
|
combinazione dei due lookback gia' validati (anti-overfit, come il multi-orizzonte di TP01).
|
||||||
|
|
||||||
|
## Effetto sul portafoglio (TP01 70% + XS01 30%)
|
||||||
|
| | XS01 [30] | XS01 blend [30,90] |
|
||||||
|
|---|---|---|
|
||||||
|
| XS01 standalone FULL / DD | 0.80 / 21% | **1.10 / 14%** |
|
||||||
|
| Portafoglio FULL Sharpe | 1.41 | **1.48** |
|
||||||
|
| Portafoglio HOLD-OUT Sharpe | 1.15 | 1.06 |
|
||||||
|
| Portafoglio DD | 5.2% | **4.6%** |
|
||||||
|
| ~€/giorno (2k) | +1.65 | +1.78 |
|
||||||
|
|
||||||
|
Migliora FULL Sharpe + DD + robustezza (due orizzonti) al costo di un hold-out marginalmente piu'
|
||||||
|
basso (−0.09, dentro il rumore di una singola finestra). Giudizio: il blend e' piu' robusto
|
||||||
|
(meno dipendente da un singolo lookback) e diversifica meglio -> PROMOSSO.
|
||||||
|
|
||||||
|
## Azione
|
||||||
|
`src/portfolio/sleeves.XS_CFG`: `L=30` -> `lookbacks=(30,90)`; engine `_xsec_returns` usa lo score
|
||||||
|
blended (media z-score cross-sectional per lookback). **Portafoglio attivo: TP01 70% + XS01 blend
|
||||||
|
30%, FULL Sh 1.48 / HOLD 1.06 / DD 4.6%.** 12 test ok. Sleeve sempre sui 19 major.
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
# 2026-06-19 — Affinamento XS01: gate di dispersione (p30)
|
||||||
|
|
||||||
|
Il momentum cross-sectional vive nella DISPERSIONE (winners/losers distanti). In regime compatto
|
||||||
|
(tutti gli asset insieme) e' rumore. Gate: entra solo se la dispersione cross-section del momentum
|
||||||
|
supera il percentile ESPANDENTE causale `disp_pct`; altrimenti flat. Sul blend [30,90] dei 19 major.
|
||||||
|
`scripts/portfolio/xsec_dispgate.py`. (È il concetto del vecchio XS01 pre-reset, disp_min=p50.)
|
||||||
|
|
||||||
|
## Sweep soglia (19 major, 899g) — XS01 standalone + contributo portafoglio
|
||||||
|
| soglia | XS FULL | XS OOS | PORT FULL | PORT HOLD | %flat |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| no gate | 1.10 | 1.03 | 1.50 | 1.06 | 0% |
|
||||||
|
| p15 | 1.32 | 1.39 | 1.64 | 1.36 | 28% |
|
||||||
|
| p20 | 1.46 | 1.63 | 1.72 | 1.52 | 31% |
|
||||||
|
| p25 | 1.46 | 1.63 | 1.72 | 1.52 | 31% |
|
||||||
|
| **p30** | **1.50** | **1.71** | **1.74** | **1.56** | 35% |
|
||||||
|
| p35 | 1.60 | 1.90 | 1.81 | 1.69 | 37% |
|
||||||
|
| p40-p50 | 1.0 | 0.8 | 1.36-1.38 | 0.77-0.93 | 42-49% |
|
||||||
|
|
||||||
|
**PLATEAU robusto p15-p35** (cinque punti, tutti molto > no-gate); il crollo a p40+ e' OVER-gating
|
||||||
|
(salta troppo). Scelto **p30** (centro sicuro del plateau, lontano dal cliff p40). Non un knife-edge.
|
||||||
|
|
||||||
|
## Effetto sul portafoglio (TP01 70% + XS01 30%)
|
||||||
|
| XS01 | PORT FULL | PORT HOLD | PORT DD |
|
||||||
|
|---|---|---|---|
|
||||||
|
| [30] originale | 1.41 | 1.15 | 5.2% |
|
||||||
|
| + blend [30,90] | 1.48 | 1.06 | 4.6% |
|
||||||
|
| + dispersion gate p30 | **1.55** | **1.55** | **4.4%** |
|
||||||
|
|
||||||
|
XS01 standalone: FULL 1.10→1.50, HOLD 1.03→1.71, DD 14%→10.8%, ~€/g 1.64→2.36. Il gate alza SIA
|
||||||
|
FULL SIA hold-out (a differenza del solo blend, che barattava un po' di hold-out).
|
||||||
|
|
||||||
|
## Meccanismo + caveat onesti
|
||||||
|
- **Causale**: soglia = percentile espandente della dispersione PASSATA; nessun look-ahead.
|
||||||
|
- **Perche' funziona**: tiene XS attivo nei regimi DISPERSI (2025-26, dove gli alt divergono) e flat
|
||||||
|
nei bull compatti (2024). L'hold-out 2025-26 e' ad alta dispersione -> il gate concentra
|
||||||
|
l'attivita' di XS proprio li' -> hold-out forte. E' il comportamento voluto, ma NB che il salto
|
||||||
|
del hold-out riflette anche che il 2025-26 e' stato un regime ad alta dispersione.
|
||||||
|
- Caveat XS01 invariati: storia ~2.5 anni; STAT-MODE (book 19 gambe non eseguibile a 2k).
|
||||||
|
|
||||||
|
## Azione
|
||||||
|
`src/portfolio/sleeves.XS_CFG`: aggiunto `disp_pct=30`; engine `_xsec_returns` gatea su dispersione.
|
||||||
|
**Portafoglio attivo: TP01 70% + XS01 (blend [30,90] + gate disp p30) 30% — FULL Sh 1.55 / HOLD 1.55
|
||||||
|
/ DD 4.4%.** 12 test ok. Affinamenti del SEGNALE (blend + gate) hanno funzionato dove l'espansione
|
||||||
|
universo no: i margini su XS sono nella struttura del segnale, non nel numero di asset.
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
# 2026-06-19 — Espandere l'universo XS01: PIÙ asset DILUISCONO (i 19 major sono il sweet spot)
|
||||||
|
|
||||||
|
Richiesta: aggiungere altri asset Hyperliquid certificati per rafforzare XS01 (cross-sectional
|
||||||
|
momentum). Fatto il lavoro, esito ONESTO: **non rafforza — diluisce.**
|
||||||
|
|
||||||
|
## Cosa ho fatto
|
||||||
|
- Esteso `fetch_hyperliquid.py` a ~54 candidati alt maggiori (mappa Binance auto SYM/USDT, k-prefissi
|
||||||
|
esclusi). **52 certificati** (cross-venue 4-11 bps vs Binance, flat 0%, storia 2024+): aggiunti
|
||||||
|
ATOM DYDX APE CRV LDO STX GMX SNX BCH COMP WLD UNI TRX FIL RUNE ENA ORDI JUP WIF PYTH FET AR ETC
|
||||||
|
ALGO GALA SAND AXS DOT BLUR JTO PENDLE ONDO TAO. Esclusi MKR (delistato HL 2025-09) e FXS
|
||||||
|
(migrazione Frax 2026-01) via nuovo gate "ultima barra recente".
|
||||||
|
|
||||||
|
## Il finding: il cross-section dei 52 è NEGATIVO; i 19 major sono positivi
|
||||||
|
Stessa finestra (2024-04 → 2026-06, 807g), mom L*/H10:
|
||||||
|
|
||||||
|
| Universo | k | FULL Sharpe (L30/L60/L90) |
|
||||||
|
|---|---|---|
|
||||||
|
| **52 asset** | 5 | −0.13 / −0.21 / −0.35 |
|
||||||
|
| **52 asset** | 8-12 | tutti negativi (k grande non aiuta) |
|
||||||
|
| **19 major** | 5 | +0.30 / +0.36 / **+0.67** (OOS 0.91) |
|
||||||
|
|
||||||
|
I ~33 small/new-cap aggiunti (WIF, JUP, ORDI, PYTH, TAO, GALA, AR, BLUR…) sono idiosincratici/
|
||||||
|
mean-reverting: il loro rumore **rovescia** il momentum relativo. Cross-sectional momentum su crypto
|
||||||
|
funziona fra i MAJOR liquidi, non sul long tail. Allargare l'universo NON è gratis.
|
||||||
|
|
||||||
|
## Azione
|
||||||
|
- **XS01 resta sui 19 major** (sweet spot già validato: plateau/fee/subset). Lo sleeve
|
||||||
|
`_xsec_returns` ora usa una **lista esplicita `XS_UNIVERSE` (19)**, non più glob-all (così
|
||||||
|
aggiungere parquet certificati non lo cambia/rompe — avevo inavvertitamente fatto vedere allo
|
||||||
|
sleeve 52 asset = negativo).
|
||||||
|
- I 52 parquet certificati restano su disco: dato valido per ricerca futura (uno strato diverso —
|
||||||
|
es. trend-following multi-asset, o un XS ristretto ai top-liquidità — potrebbe usarli), ma NON XS01.
|
||||||
|
- Portafoglio invariato e ripristinato: **TP01 70% + XS01 30%, FULL Sh 1.41 / HOLD 1.15.**
|
||||||
|
|
||||||
|
## Lezione
|
||||||
|
"Più asset = più robusto" è FALSO per il cross-sectional momentum: il long tail di alt piccoli
|
||||||
|
diluisce/inverte l'edge. La breadth utile è quella dei major liquidi (corr-strutturata), non il
|
||||||
|
numero grezzo.
|
||||||
|
|
||||||
|
## Tentativo 2: UNIVERSO TOP-LIQUIDITÀ DINAMICO (`xsec_dynuniverse.py`) — anch'esso PEGGIORE
|
||||||
|
Provato a selezionare a ogni ribilancio i top-N per dollar-volume 30g (causale) dai 52, poi XS
|
||||||
|
momentum fra quelli (adattivo, ragged-aware). Esito:
|
||||||
|
|
||||||
|
| Universo | FULL Sh | OOS25 | anni+ |
|
||||||
|
|---|---|---|---|
|
||||||
|
| top12 dinamico (L30H10k5) | 0.65 | 0.54 | 67% (2026 −4%) |
|
||||||
|
| top15/20/25 dinamico | 0.14-0.38 | ≤0.30 | 33-67% |
|
||||||
|
| **fisso-19 major (L30H10k5)** | **0.80** | **1.20** | **100%** |
|
||||||
|
| fisso-19 major (L90H10k5) | 0.88 | 0.90 | 100% |
|
||||||
|
Contributo: TP01+DYN 70/30 = FULL 1.10 / HOLD 0.60 vs **TP01+XS19 = FULL 1.25 / HOLD 1.15**.
|
||||||
|
|
||||||
|
**Perché fallisce:** la classifica per dollar-volume ammette comunque i MEMECOIN ad alto volume
|
||||||
|
(WIF, ORDI, JUP, PEPE...) che hanno volumi enormi ma momentum erratico/mean-reverting →
|
||||||
|
diluiscono. **Liquidità ≠ qualità** nelle crypto. I 19 major *curati* (established, corr-strutturati,
|
||||||
|
non solo alto volume) restano il sweet spot.
|
||||||
|
|
||||||
|
## Conclusione
|
||||||
|
Né più nomi (52) né top-liquidità dinamico migliorano XS01. **XS01 resta sui 19 major curati**
|
||||||
|
(FULL 0.80 / OOS 1.20, 100% anni+). Portafoglio invariato: TP01 70% + XS01 30% (FULL 1.41/HOLD 1.15).
|
||||||
|
Per rafforzarlo davvero servirebbe una curatela di QUALITÀ (established majors), che è già ciò che i
|
||||||
|
19 sono. Coerente con la disciplina: nessuna espansione senza che migliori il gauntlet. I 52 parquet
|
||||||
|
certificati restano per ricerca futura (es. trend multi-asset, dove il long tail non diluisce).
|
||||||
@@ -0,0 +1,167 @@
|
|||||||
|
# Sweep "strategie alternative su Deribit" — 104 ipotesi, 153 agenti (2026-06-20)
|
||||||
|
|
||||||
|
## Cosa
|
||||||
|
Ondata di ricerca onesta richiesta esplicitamente con >=100 agenti: **studiare strategie di
|
||||||
|
trading ALTERNATIVE** a TP01/XS01/VRP01 sull'universo certificato Deribit (**BTC/ETH** OHLCV +
|
||||||
|
**DVOL**). Catalogo di **104 ipotesi distinte** su 11 famiglie, **un agente-finder per ipotesi**,
|
||||||
|
poi **verifica avversariale a 3 scettici** per ogni finding promettente, poi sintesi. Totale
|
||||||
|
**153 agenti**, ~5.86M token, ~2h (workflow `scripts/research/alt/wf_altstrat.js`,
|
||||||
|
run `wf_0f3659fc-809`).
|
||||||
|
|
||||||
|
Famiglie: BRK (breakout/canali), TRD (trend non-TSMOM), MRV (mean-reversion gated), VOL (DVOL +
|
||||||
|
vol realizzata, Deribit-specific), XAS (cross-asset BTC/ETH: ratio/lead-lag/cointegrazione/RS),
|
||||||
|
SEA (stagionalità/ora-del-giorno), RSK (overlay difensivi), OPT (strutture opzioni modellate su
|
||||||
|
DVOL), MIC (microstruttura/candele), STA (ML walk-forward), CMB (combinazioni/filtri).
|
||||||
|
|
||||||
|
## Harness condiviso (nuovo, validato)
|
||||||
|
`scripts/research/alt/altlib.py` — libreria di valutazione ONESTA e **vettoriale** usata da tutti
|
||||||
|
gli agenti, così il no-look-ahead è strutturalmente impossibile:
|
||||||
|
- `eval_weights(df, target)`: posizione decisa con dati `<= close[i]`, **tenuta durante la barra
|
||||||
|
i+1** (lo shift lo fa la libreria), fee su turnover, **fee-sweep** 0.00–0.30% RT incorporato.
|
||||||
|
- `study_weights/study_signals`: ogni ipotesi girata su **entrambi gli asset** + **HOLD-OUT 2025+**
|
||||||
|
+ per-anno, con verdetto conservativo PASS/WEAK/FAIL (richiede min-asset full>=0.5 **e** hold>=0.2
|
||||||
|
**e** sopravvivenza fee).
|
||||||
|
- DVOL allineato **causalmente** (`merge_asof` backward), storia dal 2021-03.
|
||||||
|
- **Calibrazione:** la replica TSMOM riproduce i numeri noti leak-free di TP01 (BTC full 1.12 /
|
||||||
|
hold 0.31, DD 77%→23%); buy&hold correttamente FALLISCE l'hold-out (full 0.79, hold −0.37).
|
||||||
|
104 script riproducibili in `scripts/research/alt/runs/`.
|
||||||
|
|
||||||
|
## Esito — NIENTE di nuovo batte o diversifica lo stack esistente
|
||||||
|
Su 104 ipotesi: **16 promettenti**, **1 sola sopravvissuta** alla verifica avversariale (STA05),
|
||||||
|
e anch'essa **ridondante/non deployabile**. È il risultato pulito e atteso per un progetto al suo
|
||||||
|
**soffitto strutturale BTC/ETH-direzionale ~1.3** (già documentato). Lo stack
|
||||||
|
**TP01 (55%) + XS01 (25%) + VRP01 (20%) resta imbattuto** da questa ondata.
|
||||||
|
|
||||||
|
Il segnale ricorrente: decine di trend-follower prendono **FULL Sharpe alto (~1.0–1.3)** ma
|
||||||
|
**HOLD-OUT 2025 negativo** (Supertrend, ADX-EMA, Heikin-Ashi, Turtle, SMA200-regime,
|
||||||
|
Donchian+Chandelier, Kalman, OBV, body-ratio, ...): è **trend-beta del toro**, non alpha, e si
|
||||||
|
rompe nell'hold-out. I PASS apparenti erano quasi tutti **(a)** singola cella fortunata
|
||||||
|
sull'hold-out, oppure **(b)** TP01/TSMOM con un overlay attaccato sopra.
|
||||||
|
|
||||||
|
### L'unico sopravvissuto: STA05 — EWMA-cross ensemble vote (LEAD, non sleeve)
|
||||||
|
Voto d'insieme su 13 coppie EMA (fast {5,10,20,40} × slow {40,80,120,200}, fast<slow),
|
||||||
|
posizione = voto medio firmato, vol-target 20%/cap 2x, 1d. Verifica: **leak-free** (perturbazione
|
||||||
|
barre future = 0), **plateau** di parametri, **non** fortuna di un singolo anno (jackknife
|
||||||
|
drop-one-year 0.55–0.96), sopravvive fee a 0.30% RT. Ho rieseguito il **blend test** raccomandato
|
||||||
|
(50/50 BTC+ETH, mia stessa griglia di TP01, fee 0.10% RT):
|
||||||
|
|
||||||
|
| variante | FULL Sh | DD | HOLD Sh | corr→TP01 (full/hold) |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| TP01 (canonico, controllo) | **+1.30** | 14.3% | +0.31 | — |
|
||||||
|
| STA05 long-only | +1.24 | 16.3% | +0.21 | **0.93 / 0.94** → ridondante |
|
||||||
|
| STA05 **long-short** | +0.87 | 28.6% | **+0.86** | **0.71 / 0.53** |
|
||||||
|
|
||||||
|
Blend TP01+STA05_LS: `0.75·TP01 + 0.25·LS` → **FULL 1.24, HOLD 0.31→0.59, DD 16.1%**;
|
||||||
|
`0.50/0.50` → FULL 1.13, **HOLD 0.75**, DD 18.8%.
|
||||||
|
|
||||||
|
**Lettura onesta (più precisa della sintesi del workflow, che lo aveva liquidato come "dominato
|
||||||
|
su ogni asse"):** la versione **long-only** è ridondante con TP01 (corr 0.94). La versione
|
||||||
|
**long-short** invece è solo moderatamente correlata (**0.53 nell'hold-out**) e **migliora
|
||||||
|
davvero l'hold-out del blend** (0.31→0.59 a peso 25%), al costo di un po' di FULL Sharpe
|
||||||
|
(1.30→1.24) e DD (14%→16%). MA: l'hold-out è **solo 536 giorni** (include lo stub 2026 corto) →
|
||||||
|
classica trappola "bello OOS ma OOS breve", e standalone ha DD 28.6%. **Verdetto: LEAD da
|
||||||
|
monitorare forward, NON deploy, NON sleeve confermato.** Da rivalutare quando l'hold-out cresce.
|
||||||
|
|
||||||
|
## Famiglie confermate MORTE / ridondanti (negativi onesti)
|
||||||
|
- **BRK** breakout (Donchian/Keltner/Bollinger/ORB/NR7/inside-bar): ogni variante rompe l'hold-out
|
||||||
|
BTC; l'unico PASS (BRK04) è cella singola overfit con maxDD 63%.
|
||||||
|
- **TRD** trend non-TSMOM: tutto trend-beta del toro ridondante con TP01; i 4 PASS (TRD02/07/08/10)
|
||||||
|
sono fortuna di singola cella sull'hold-out, dominati dal TSMOM.
|
||||||
|
- **MRV** mean-reversion: la crypto **tende, non torna**; molti negativi anche a fee zero, **0 PASS**
|
||||||
|
→ conferma su dati certi la lezione v2.0.0 ("il fade è artefatto").
|
||||||
|
- **VOL** gate/overlay DVOL su TSMOM: ogni overlay (VOL03/04/08/09/11) è **peso morto netto-negativo**;
|
||||||
|
la parte robusta è sempre TP01 nudo, la componente DVOL/EWMA aggiunge anti-valore.
|
||||||
|
- **XAS** spread BTC/ETH (ratio/lead-lag/cointegrazione/RS/dual-mom): gli spread **tendono non
|
||||||
|
revertono** (negativi a fee zero); le "rotazioni" PASS (XAS03/04/09) sono TP01 travestito con
|
||||||
|
selezione fortunata sull'hold-out.
|
||||||
|
- **SEA** stagionalità: fee-killed a 1h, artefatti di regime a 1d, nessun hold-out cross-asset.
|
||||||
|
- **RSK** overlay di rischio (circuit breaker/kill-switch/DD-scaling/inverse-vol RP): o seguono il
|
||||||
|
prezzo (buy&hold travestito) o aggiungono frizione senza proteggere dove serve.
|
||||||
|
- **MIC** micro-pattern candele: hold-out crolla cross-asset; l'unico "survivor" MIC05 è l'artefatto
|
||||||
|
di **un singolo evento** (short del crash 2026-01-29 su ~13 trade).
|
||||||
|
- **STA** ML su feature di prezzo (Ridge/Logistic/RF/Kalman/SGD/AR1/k-means): nessun potere
|
||||||
|
predittivo OOS; l'unico PASS (STA05) è l'ensemble di trend = TP01.
|
||||||
|
- **CMB** combinazioni: ogni combo è TP01 più un filtro che distrugge valore.
|
||||||
|
- **OPT** strutture opzioni (modellate su DVOL ATM, niente skew): code severe (ETH maxDD 96% su
|
||||||
|
iron condor), **lead-only** al meglio → conferma la regola VRP01 "niente short-vol da modello in
|
||||||
|
deploy". Numeri tipo OPT02/OPT04 hold-out 2.4/1.96 sono artefatto del premio modellato + asset
|
||||||
|
asimmetrico (ETH fallisce) → giustamente NON promettenti.
|
||||||
|
|
||||||
|
## Lezioni metodologiche (azionabili)
|
||||||
|
1. **L'harness deve premiare lo Sharpe MARGINALE vs un baseline TP01, non lo Sharpe ASSOLUTO.**
|
||||||
|
`study_weights` valuta lo Sharpe assoluto: così ogni overlay-su-TSMOM **eredita** lo Sharpe di
|
||||||
|
trend di TP01 e prende un PASS fasullo (VOL03/04/08/09/11, CMB04/06). Per la prossima ondata:
|
||||||
|
valutare il **contributo incrementale** rispetto a TP01 nudo, così gli overlay non possono
|
||||||
|
ereditare un PASS.
|
||||||
|
2. **Prima di gradare PASS, esigere (a) un PLATEAU di parametri (non una cella isolata) e (b) un
|
||||||
|
jackknife drop-one-month / drop-best-day sull'hold-out.** Questi due check da soli hanno ucciso
|
||||||
|
**13 dei 14** falsi positivi in verifica avversariale.
|
||||||
|
3. La verifica avversariale a 3 scettici con angoli diversi (leak / overfit-robustezza /
|
||||||
|
plausibilità-economica-vs-TP01) ha funzionato: ha distinto i 15 falsi positivi dall'1 robusto.
|
||||||
|
|
||||||
|
## Raccomandazione
|
||||||
|
**Non aggiungere nulla di questa ondata al portafoglio live.** Lo spazio
|
||||||
|
**BTC/ETH-direzionale single-asset è esaurito**: ogni PASS era hold-out-fitting o un overlay su TP01.
|
||||||
|
Redirigere il budget di ricerca verso **meccanismi davvero diversi** dove il soffitto non morde:
|
||||||
|
espandere/monitorare forward **XS01** (cross-sectional sui 51 alt Hyperliquid certificati — l'unico
|
||||||
|
che abbia mai battuto il soffitto) e **VRP01 reale** (quando cerbero-bite cattura skew live + uno
|
||||||
|
stress). Tenere **STA05_LS** in lista LEAD per il forward-monitor dell'hold-out.
|
||||||
|
|
||||||
|
Artefatti: `scripts/research/alt/altlib.py`, `scripts/research/alt/runs/*.py` (104),
|
||||||
|
`scripts/research/alt/wf_altstrat.js`, verifica blend `/tmp/verify_sta05.py`.
|
||||||
|
|
||||||
|
## Follow-up — MARGINAL SCORER implementato (non più solo raccomandazione)
|
||||||
|
La lezione #1 ("valutare lo Sharpe MARGINALE vs baseline TP01, non assoluto") è ora **codice**
|
||||||
|
in `altlib.py`:
|
||||||
|
- `tp01_baseline_daily()` — TP01 CANONICAL 50/50 BTC+ETH, rendimenti netti giornalieri (cache).
|
||||||
|
Riproduce il canonico (full 1.30 / hold 0.31) — bloccato da test.
|
||||||
|
- `marginal_vs_tp01(cand_daily)` — corr a TP01 (full/hold), **uplift del blend** (Sharpe di
|
||||||
|
TP01+w·cand meno TP01, full & hold-out, w∈{0.25,0.5}), **beta a TP01 + alpha residua** (parte
|
||||||
|
ortogonale al trend), e un **verdetto**: ADDS / REDUNDANT / DILUTES / NEUTRAL.
|
||||||
|
- `study_marginal(name, target_fn)` — valuta un candidato **sia** in assoluto (`study_weights`)
|
||||||
|
**sia** marginale; `earns_slot = (abs_grade != FAIL) AND (marginal_verdict == ADDS)`.
|
||||||
|
- Convenzione pulita `target_fn(df, asset)` (via `_call_target`) per le strategie DVOL/cross-asset
|
||||||
|
— niente più inferenza-asset hacky (il VOL03 dell'agente la sbagliava, usava DVOL BTC anche per ETH).
|
||||||
|
- Demo riproducibile `scripts/research/alt/marginal_demo.py` + test `tests/test_marginal_scorer.py`.
|
||||||
|
|
||||||
|
**Dimostrazione (la prova che il fix discrimina):**
|
||||||
|
|
||||||
|
| candidato | assoluto | marginale | earns_slot |
|
||||||
|
|---|---|---|---|
|
||||||
|
| TP01-itself (sanity) | WEAK | REDUNDANT (corr 1.0, uplift 0) | False |
|
||||||
|
| **STA05 long-short** (il lead) | PASS | **ADDS** (corr-hold 0.53, blend-hold +0.29) | **True** |
|
||||||
|
| STA05 long-only | WEAK | REDUNDANT (corr 0.93/0.94) | False |
|
||||||
|
| VOL03 DVOL-gated TSMOM (overlay) | WEAK | NEUTRAL (corr 0.93, uplift triviale) | False |
|
||||||
|
| **CMB04 momentum+low-vol (overlay)** | **PASS** | **NEUTRAL** (corr 0.94) | False |
|
||||||
|
|
||||||
|
Il punto chiave è l'ultima riga: **CMB04 prendeva un PASS assoluto col vecchio harness, ma il
|
||||||
|
marginal scorer lo declassa correttamente** — il suo "Sharpe 1.0" è trend di TP01 ereditato al 94%,
|
||||||
|
non alpha nuovo. Regola operativa d'ora in poi: una nuova strategia direzionale BTC/ETH si giudica su
|
||||||
|
`study_marginal` (earns_slot), non sullo Sharpe assoluto.
|
||||||
|
|
||||||
|
## "Resta qualche candidato?" — gate marginale + jackknife su TUTTI i contendenti forti
|
||||||
|
Passati i 7 promettenti più forti non-ancora-marginal-testati (`marginal_remaining.py`):
|
||||||
|
Vortex/Hull (FAIL nella ricostruzione pulita), VOL11 kill-switch (corr 0.94 → REDUNDANT), XAS03/09
|
||||||
|
rotazioni (NEUTRAL, anzi RS-rotation **diluisce** l'hold-out −0.20), **TRD07 KAMA** e **VOL08**
|
||||||
|
(entrambi marginale=ADDS). Ma il marginal-point-estimate **può essere ingannato da un singolo mese**:
|
||||||
|
ho aggiunto al gate il **jackknife OOS** (`robust_oos` = uplift positivo nell'anno OOS pulito 2025
|
||||||
|
**e** sopravvive al drop-best-month). Risultato:
|
||||||
|
|
||||||
|
| candidato | clean-2025 uplift | drop-best-month | robust_oos | earns_slot |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| TRD07 KAMA | +0.089 | **−0.034** | False | **False** (era ADDS!) |
|
||||||
|
| VOL08 RV-term | +0.158 | +0.034 | True | **True** |
|
||||||
|
| STA05 long-short | +0.039 | +0.131 | True | True (ma 2025 ~0, il grosso è lo stub 2026) |
|
||||||
|
|
||||||
|
**KAMA è il falso-positivo istruttivo:** ingannava il marginal scorer (uplift +0.056) ma muore al
|
||||||
|
jackknife (−0.034 togliendo il mese migliore) → il gate rinforzato (`earns_slot` ora esige
|
||||||
|
`robust_oos`) lo uccide correttamente. Codificata così la lezione #2 in `marginal_vs_tp01`.
|
||||||
|
|
||||||
|
### Verdetto finale: NESSUN candidato deployabile
|
||||||
|
Dopo il gate più severo (abs≠FAIL + marginale=ADDS + jackknife OOS), i 104 collassano a **2 LEAD
|
||||||
|
fragili**: **VOL08** (overlay term-structure di vol realizzata) e **STA05_LS** (ensemble EMA
|
||||||
|
long-short). Entrambi sono **famiglia-trend su BTC/ETH** (non un meccanismo nuovo), moderatamente
|
||||||
|
correlati a TP01 (0.53–0.61 hold-out), con uplift piccolo e concentrato su un OOS di ~1.5 anni →
|
||||||
|
**forward-monitor, NON sleeve.** E sono correlati tra loro (entrambi trend) → di fatto **un solo
|
||||||
|
tema**: "una costruzione di trend-timing alternativa, modestamente decorrelata a TP01 nel 2025-26".
|
||||||
|
La diversificazione vera resta fuori dallo spazio direzionale single-asset (→ XS01 / opzioni reali).
|
||||||
@@ -0,0 +1,86 @@
|
|||||||
|
# 2026-06-20 — Correzione estrazione cerbero MCP: il backfill sintetico (vol=0) ingannava la certificazione
|
||||||
|
|
||||||
|
## Contesto
|
||||||
|
|
||||||
|
Richiesta: "analizza cerbero MCP correggendo l'estrazione dati storici secondo le analisi fatte".
|
||||||
|
Le analisi del progetto avevano già fissato un principio — *"storia nativa Hyperliquid solo dal 2024,
|
||||||
|
pre-2024 = backfill, volume 0"* — e `fetch_hyperliquid.py` lo gestiva con un floor `START=2024-01-01`.
|
||||||
|
**Il floor non basta.**
|
||||||
|
|
||||||
|
## Il difetto
|
||||||
|
|
||||||
|
`fetch_hl` chiedeva a cerbero MCP `get_historical` dal 2024-01-01 e certificava ogni asset con tre
|
||||||
|
gate: **flat-bar** (O==H==L==C), **cross-venue** (mediana |close − Binance| < 60 bps), **recency**.
|
||||||
|
Nessuno guardava il **volume**. Risultato: gli asset listati su HL *dopo* lo START passavano come
|
||||||
|
PULITO pur essendo in gran parte **backfill sintetico**.
|
||||||
|
|
||||||
|
Ispezione del volume sui parquet (leading run di barre a volume 0):
|
||||||
|
|
||||||
|
| asset | barre | leading vol=0 | primo trade reale | % sintetico |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| **AXS** | 902 | **748** | 2026-01-18 | **82.9%** |
|
||||||
|
| ALGO | 902 | 338 | 2024-12-04 | 37.5% |
|
||||||
|
| SAND | 902 | 338 | 2024-12-04 | 37.5% |
|
||||||
|
| AR | 902 | 58 | 2024-02-28 | 6.4% |
|
||||||
|
| ETC | 902 | 11 | 2024-01-12 | 1.2% |
|
||||||
|
| BTC/ETH + 19 major | 902 | 0 | 2024-01-01 | 0% |
|
||||||
|
|
||||||
|
AXS era **certificato PULITO** (flat 0%, cross-venue 9.5 bps) pur avendo solo ~5 mesi di trading reale.
|
||||||
|
|
||||||
|
## Verifica diretta su cerbero MCP (token mainnet)
|
||||||
|
|
||||||
|
Interrogato l'endpoint `cerbero-mcp.tielogic.xyz/mcp/tools/get_historical` (bot-tag
|
||||||
|
`pythagoras-mainnet`):
|
||||||
|
|
||||||
|
- **BTC**: 902 barre, leading vol=0 = 0, volume reale dal 2024-01-01 (V=699, 2437, 5306…). Nativo. ✓
|
||||||
|
- **AXS**: 902 barre, **748 leading vol=0**, primo vol>0 = 2026-01-18. Le barre a volume 0 hanno
|
||||||
|
prezzi (O/H/L/C) che **coincidono con Binance**:
|
||||||
|
|
||||||
|
| data | cerbero close | binance close | Δ |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 2024-01-01 | 9.262 | 9.26 | 2.2 bps |
|
||||||
|
| 2024-01-02 | 8.949 | 8.94 | 10.1 bps |
|
||||||
|
| 2024-01-03 | 7.937 | 7.95 | 16.4 bps |
|
||||||
|
|
||||||
|
**Diagnosi provata:** cerbero MCP riempie il periodo pre-quotazione con barre **sintetiche — volume 0,
|
||||||
|
prezzi copiati da un venue di riferimento (Binance)**. Per questo i vecchi gate venivano ingannati:
|
||||||
|
- cross-venue passa → i prezzi *sono* Binance (Δ 1–16 bps);
|
||||||
|
- flat passa → le barre non sono flat (hanno movimento di prezzo);
|
||||||
|
- ma **volume 0** → su HL quelle candele **non erano negoziabili**. È esattamente il caso v2.0.0
|
||||||
|
(edge su un book che non c'era).
|
||||||
|
|
||||||
|
## Correzione (`scripts/analysis/fetch_hyperliquid.py`)
|
||||||
|
|
||||||
|
1. **Il VOLUME è il rivelatore del backfill** → `trim_backfill()` taglia il run iniziale di barre a
|
||||||
|
volume 0; si tiene solo la **serie nativa**.
|
||||||
|
2. **Gate storia nativa** `MIN_NATIVE_DAYS=365`: dopo il taglio serve ≥ 1 anno di vita reale →
|
||||||
|
scarta chi è troppo corto (AXS, 154 barre reali → fuori).
|
||||||
|
3. **Gate vol=0 interno** `INTERIOR_VOL0_MAX=5%`: gap di liquidità oltre il taglio iniziale.
|
||||||
|
4. **cross-venue/flat ricalcolati SOLO sulle barre reali** (non più sui sintetici).
|
||||||
|
5. **I parquet degli asset scartati vengono rimossi** (disco == set certificato; niente file
|
||||||
|
contaminati a riposo).
|
||||||
|
|
||||||
|
## Risultato
|
||||||
|
|
||||||
|
- Universo certificato: **52 → 51** (AXS scartato).
|
||||||
|
- ALGO/SAND (−338 barre), AR (−58), ETC (−11) ripuliti dal backfill → ora start reale corretto.
|
||||||
|
- **I 19 major di XS01 hanno 0 backfill → invariati**: la strategia live (`XS_UNIVERSE` esplicito) NON
|
||||||
|
è toccata. Verificato: portafoglio 3-way (TP01+XS01+VRP01) gira identico, FULL Sh 1.68 / HOLD 1.67.
|
||||||
|
- Re-fetch end-to-end su cerbero reale: 51 PULITO, sweep su tutti i file → 0 backfill residuo.
|
||||||
|
|
||||||
|
## Nota su una conclusione precedente
|
||||||
|
|
||||||
|
Il diario `2026-06-19-xsec-universe-expansion.md` concludeva "cross-section dei 52 = negativo". Quella
|
||||||
|
finestra includeva i sintetici (AXS 83%, ALGO/SAND 37% di barre vol=0 con ritorni non eseguibili): la
|
||||||
|
magnitudine del risultato era **in parte un artefatto**. La conclusione qualitativa (il long-tail
|
||||||
|
diluisce XS01; i 19 major sono il sweet spot) resta valida, ma il numero netto è 51 e il test andrebbe
|
||||||
|
ri-girato sui dati puliti se si volesse riusare quell'universo.
|
||||||
|
|
||||||
|
## Lezione
|
||||||
|
|
||||||
|
`flat` + cross-venue **non bastano** a certificare un feed che fa backfill copiando un altro venue: il
|
||||||
|
backfill è plausibile sui prezzi proprio perché è copiato. Il **volume** (=liquidità reale) è il gate
|
||||||
|
che mancava. Coerente con la regola di prim'ordine v2.0.0: certificare il dato — anche il *volume*,
|
||||||
|
non solo il prezzo — prima della strategia.
|
||||||
|
|
||||||
|
File: `scripts/analysis/fetch_hyperliquid.py`. Universo: `data/raw/hl_*_1d.parquet` (51, serie native).
|
||||||
@@ -0,0 +1,93 @@
|
|||||||
|
# 2026-06-20 — Analisi strategie FinanceOld + VRP v2 (defined-risk + gate IV-rank)
|
||||||
|
|
||||||
|
## Contesto
|
||||||
|
|
||||||
|
Richiesta: analizzare le strategie in `../FinanceOld`, provare a migliorarle, testarle su dati storici.
|
||||||
|
Quattro progetti esaminati. Verdetto di **backtestabilità onesta** sui dati certificati (BTC/ETH
|
||||||
|
Deribit mainnet + DVOL):
|
||||||
|
|
||||||
|
| Progetto | Strategia | Backtestabile sui dati certi? |
|
||||||
|
|---|---|---|
|
||||||
|
| **FundingRateArbitrage** | Spread funding cross-exchange (perp-perp, spot-hedge) | ❌ Nessun dato funding storico nel repo (solo `exchange_settings.json`). Edge = differenza cross-venue, non ricostruibile. |
|
||||||
|
| **Polybot** | Latency-arb Polymarket (BS digital-option) + sure-bet delta-neutral | ❌ `dataVPS/collector.db` (645MB) ha solo **~3 giorni** di `poly_books`+`funding`, e la tabella `ticks` (prezzi perp = cuore dell'edge) è **corrotta** ("database disk image is malformed"). L'edge è la latenza: non riproducibile su barre OHLC comunque. |
|
||||||
|
| **OptionSpalping** (→Cerbero) | LLM autonomo su opzioni Deribit + perp Hyperliquid | ⚠️ È un agente LLM, non una regola meccanica. Il *concetto* (income short-vol su Deribit) è testabile. |
|
||||||
|
| **OptionsAgent** | **Bear Call Spread + Long VIX hedge** su IWM, con 5 gate d'ingresso | ✅ Il *concetto* (vendi premio rischio-definito, incassa VRP, gate su IV-rank/regime) mappa direttamente sul nostro `options_vrp_lab.py`. |
|
||||||
|
|
||||||
|
→ Scelta operatore: **focus VRP opzioni**. L'unico filone con dati veri + metodologia onesta.
|
||||||
|
|
||||||
|
## Baseline (options_vrp_lab.py, ora con fee)
|
||||||
|
|
||||||
|
Vendita put NUDA settimanale delta -0.28, premio BS su DVOL reale. f = premio_reale/modellato.
|
||||||
|
|
||||||
|
- `f=1.0` (conservativo): **FULL Sh 0.78, DD 33%, worst-week -16.6%, HOLD-OUT Sh -0.25** → muore OOS.
|
||||||
|
- Il rischio è la **CODA**: worst-week su LUNA (2022-06), crash 2021-05. Anno 2022 = -9%.
|
||||||
|
|
||||||
|
## VRP v2 — 3 idee di OptionsAgent portate nel framework
|
||||||
|
|
||||||
|
Nuovo script `scripts/research/options_vrp_v2.py`. Tutto **causale** (strike/premio/gate da dati
|
||||||
|
≤ sell-date; payoff a scadenza sui prezzi certificati). Fee opzioni Deribit modellate (12.5% del
|
||||||
|
premio netto per round-trip = cap del fee reale). Capitale = strike corto (cash-secured) per
|
||||||
|
entrambe le strutture → DD/worst comparabili.
|
||||||
|
|
||||||
|
1. **Rischio definito (PUT CREDIT SPREAD)** — vendi put -0.28, COMPRI put -0.10. Il long wing
|
||||||
|
**cappa la coda per costruzione**: worst-week -16.6% → **-7.4%**, DD 33% → 21%, Sh 0.78 → 0.99.
|
||||||
|
2. **Gate IV-RANK > 0.30** (cond. d'ingresso di OptionsAgent) — vendi vol solo quando ricca
|
||||||
|
(percentile espandente causale di DVOL). Trada il **58%** delle settimane → **Sh 1.35** e
|
||||||
|
ribalta **HOLD-OUT da -0.25 a +0.28**. È l'alpha vero: il filtro di regime, non la struttura.
|
||||||
|
3. **Crash-skip IV-rank > 0.90** (NO-GO, come "VIX>35" di OptionsAgent) — marginale da solo.
|
||||||
|
4. **Gate VRP>0** (DVOL>RV30 causale) — marginale (il VRP è >0 il 78% del tempo, poco selettivo).
|
||||||
|
|
||||||
|
### Risultati chiave (book 50/50 BTC+ETH, f=1.0 conservativo)
|
||||||
|
|
||||||
|
| Config | FULL Sh | DD | worst-wk | HOLD-OUT Sh | attivo |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| naked (baseline) | 0.78 | 33% | -16.6% | **-0.25** | 100% |
|
||||||
|
| spread | 0.99 | 21% | -7.4% | -0.26 | 100% |
|
||||||
|
| spread + ivr30 | **1.35** | 14% | -7.4% | **+0.28** | 58% |
|
||||||
|
| **COMBO** (spread+vrp+ivr30+crashskip) | 1.10 | 12% | -7.4% | **+0.60** | 41% |
|
||||||
|
|
||||||
|
COMBO f=1.0 per-anno: 2021 +26%, 2022 **-6%**, 2023 +2%, 2024 +18%, 2025 -0%, 2026 +5%
|
||||||
|
(il 2022, anno-crash che dimezzava il nudo, è quasi piatto: la coda è tagliata).
|
||||||
|
|
||||||
|
A `f=1.29` (skew reale misurato in regime calmo) la COMBO fa FULL Sh 1.87 / HOLD 1.45 / DD 9%.
|
||||||
|
|
||||||
|
### Contributo al portafoglio (COMBO f=1.0 vs TP01)
|
||||||
|
|
||||||
|
- Corr settimanale **+0.07** (scorrelato, come il VRP nudo).
|
||||||
|
- TP01 70% + OPT 30% → Sh **1.00** (TP01 solo 0.73), DD **7%**.
|
||||||
|
- TP01 50% + OPT 50% → Sh **1.19**, DD 7%.
|
||||||
|
|
||||||
|
## Conclusione onesta
|
||||||
|
|
||||||
|
Le idee di OptionsAgent **migliorano davvero** lo sleeve VRP, in modo OOS-robusto:
|
||||||
|
- la **struttura defined-risk** taglia la coda (worst -16.6%→-7.4%, DD -19pt) → meno dipendenza dal
|
||||||
|
f di stress, che era il rischio non catturato del lead nudo;
|
||||||
|
- il **gate IV-rank** è l'alpha: ribalta l'HOLD-OUT da negativo a positivo vendendo solo vol ricca.
|
||||||
|
|
||||||
|
Resta un **lead, non un deploy**: premio MODELLATO su DVOL ATM (skew non esplicito), book a 1d, e
|
||||||
|
serve la catena reale (cerbero-bite) per il f di stress in un crash. Ma è un miglioramento netto,
|
||||||
|
quantificato e onesto, del miglior lead income che avevamo. Prossimo passo: rivalutare il f di stress
|
||||||
|
quando cerbero-bite cattura un crash, e validare lo skew reale sul long wing (-0.10).
|
||||||
|
|
||||||
|
Script: `scripts/research/options_vrp_v2.py`. Baseline: `scripts/research/options_vrp_lab.py`.
|
||||||
|
|
||||||
|
## Integrazione come sleeve (VRP01)
|
||||||
|
|
||||||
|
La COMBO è stata integrata nel portafoglio come **VRP01** (`src/portfolio/sleeves._vrp_combo_returns`,
|
||||||
|
`vrp_sleeve()`). Implementazione self-contained in `src/` (niente import da `scripts/`): pricing BS +
|
||||||
|
strike-from-delta + gate causali inline, DVOL da `data/raw/dvol_*.parquet`.
|
||||||
|
|
||||||
|
**Settimanale → giornaliero (onesto):** il rendimento settimanale è piazzato sul **giorno di
|
||||||
|
scadenza**, 0.0 sugli altri giorni dello span. Questo PRESERVA lo Sharpe annualizzato (niente
|
||||||
|
smoothing che gonfierebbe il daily Sharpe) e tiene lo sleeve presente ogni giorno → peso costante
|
||||||
|
nell'outer-join del portafoglio. Verificato: lo sleeve daily replica i numeri settimanali
|
||||||
|
(FULL Sh 1.09, HOLD 0.60, DD 12%), corr daily vs TP01 = +0.01.
|
||||||
|
|
||||||
|
**Pesi (per evidenza, engine reale):** TP01+VRP01 monotòno fino al 40% VRP (FULL 1.30→1.55,
|
||||||
|
HOLD 0.31→0.52, DD fermo 14%). Essendo VRP un lead MODELLATO (non deploy pieno), non lo sovrappeso:
|
||||||
|
registry = **TP01 0.55 / XS01 0.25 / VRP01 0.20** (TP01 resta maggioranza, l'unico deployable pieno).
|
||||||
|
La validazione 3-way completa richiede i dati Hyperliquid (XS01, gitignored, token Cerbero) → gira
|
||||||
|
locale con `scripts/portfolio/run_portfolio.py`.
|
||||||
|
|
||||||
|
Test: `tests/test_vrp_sleeve.py` (5 pass: monotonìa BS, ordering strike, determinismo+griglia
|
||||||
|
giornaliera, gate riducono l'attività, coda tagliata <-15%).
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
# VRP01 + gestione attiva intra-trade — A/B onesto (NEGATIVO)
|
||||||
|
|
||||||
|
**Data:** 2026-06-20
|
||||||
|
**Script:** `scripts/research/options_vrp_managed.py`
|
||||||
|
**Esito:** la gestione attiva del documento credit-spread **distrugge l'edge**. VRP01
|
||||||
|
**hold-to-expiry resta superiore.** → scartata.
|
||||||
|
|
||||||
|
## Cosa testava
|
||||||
|
|
||||||
|
Innesta sul put credit spread di VRP01 le regole intra-trade del doc `strategia-credit-spread-eth`:
|
||||||
|
profit-take 50% del credito, stop-loss 1.5× il credito, **VOL-STOP** (chiudi se DVOL sale ≥10 punti
|
||||||
|
dall'apertura — regola crypto-specifica nuova), **delta-exit** (chiudi se |delta| short put ≥0.30),
|
||||||
|
time-stop 7 DTE. A/B sugli **stessi ingressi gated** (VRP>0 + IV-rank>0.30) e dati certificati;
|
||||||
|
MTM giornaliero dello spread via BS sul path certificato + DVOL reale (causale).
|
||||||
|
BASE = hold-to-expiry (come VRP01) vs MANAGED = stesso trade gestito.
|
||||||
|
|
||||||
|
## Risultato (combo 50/50 BTC+ETH, sleeve-level)
|
||||||
|
|
||||||
|
| variante | Sharpe | DD | ret | HOLD Sh |
|
||||||
|
|----------|--------|------|------|---------|
|
||||||
|
| 14d hold-to-expiry (BASE) | **0.96** | 11.7% | +39% | +1.52 |
|
||||||
|
| 14d + solo vol-stop | 0.12 | 10.1% | +3% | +1.01 |
|
||||||
|
| 14d FULL managed | **−1.29** | 14.8% | −15% | −1.17 |
|
||||||
|
|
||||||
|
Per-asset: la gestione FULL ribalta entrambi (ETH 0.33→−1.15, BTC 1.88→−0.89). Il **delta-exit**
|
||||||
|
domina le uscite (18-25 trade su ~33-45) e taglia i vincenti prima della decadenza theta; persino
|
||||||
|
il **vol-stop da solo** quasi azzera il ritorno (combo Sh 0.12). Win-rate crolla 80-94% → ~40%.
|
||||||
|
|
||||||
|
## Lettura
|
||||||
|
|
||||||
|
Per un venditore di premio short-vol l'edge È la decadenza theta tenuta fino a scadenza: ogni
|
||||||
|
uscita anticipata (delta, vol-stop, PT) **monetizza meno theta e/o realizza la coda** invece di
|
||||||
|
lasciarla riassorbire. Le regole di "difesa" del doc azionario/ETH non trasferiscono al VRP crypto
|
||||||
|
modellato: l'unica gestione che non danneggia è **non gestire** (hold-to-expiry, come VRP01 già fa).
|
||||||
|
|
||||||
|
**Caveat invariato:** premio MODELLATO su DVOL ATM (no skew) + nessun fill di stress reale → tutto
|
||||||
|
ciò resta a livello di LEAD, non deploy. Ma la conclusione relativa (BASE > MANAGED) è robusta
|
||||||
|
perché è un A/B sugli **stessi** trade e dati.
|
||||||
|
|
||||||
|
## Azione
|
||||||
|
|
||||||
|
Nessuna modifica a VRP01 (`sleeves._vrp_combo_returns`, hold-to-expiry). Script conservato come
|
||||||
|
riferimento dell'esperimento scartato.
|
||||||
@@ -0,0 +1,133 @@
|
|||||||
|
# Sweep strategie cross-sectional su Hyperliquid (xsec) — 43 script / 257 config
|
||||||
|
|
||||||
|
**Data:** 2026-06-20
|
||||||
|
**Harness:** `scripts/research/xsec/xslib.py` (nuovo) + 43 script in `scripts/research/xsec/runs/`
|
||||||
|
**Verifica:** `scripts/research/xsec/verify_survivors.py` (3 scettici, deterministico)
|
||||||
|
**Esito in una riga:** niente di deployabile; il cluster vincente appariscente è **una sola
|
||||||
|
scommessa di regime (short alt-beta)**, ma **2 lead genuini** (XM09 trend-gated x-sec momentum,
|
||||||
|
XR02 reversal vol-gated) sopravvivono a tutti gli scettici → **forward-monitor, non sleeve.**
|
||||||
|
|
||||||
|
## Contesto e motivazione
|
||||||
|
|
||||||
|
Dopo che il sweep BTC/ETH a 104 ipotesi (`2026-06-20-alt-strategies-100agent-sweep.md`) ha
|
||||||
|
esaurito lo spazio direzionale single-asset confermando il soffitto ~1.3, la frontiera indicata era
|
||||||
|
**cross-sectional / multi-asset** sul panel Hyperliquid certificato, dove quel soffitto non vincola
|
||||||
|
e dove c'è spazio DISTINTO da XS01 (x-sec momentum semplice sui 19 major).
|
||||||
|
|
||||||
|
Nuova harness condivisa `xslib.py`: il panel è N asset × ~810 giorni (universo `all` = **49 alt**
|
||||||
|
con ≥700g dopo il fix backfill; `majors` = 19 di XS01). Una strategia = uno **score per-asset
|
||||||
|
causale** (dati ≤ close[i]); l'harness lo classifica cross-section ad ogni ribilanciamento, va long
|
||||||
|
i top-k / short i bottom-k (market-neutral) o long-only, vol-targeta al 20%, addebita fee sul
|
||||||
|
turnover, e — strutturalmente leak-free — il peso deciso a `i` incassa il return di `i+1` (stessa
|
||||||
|
convenzione di `src.portfolio` xs_book / `sleeves._xsec_returns`).
|
||||||
|
|
||||||
|
**Scoring onesto** (`study_xs`): un candidato guadagna `earns_slot=True` SOLO se
|
||||||
|
`full Sharpe>0 AND hold-out 2025+ Sharpe>0 AND marginal_vs(active)=="ADDS" AND corr(XS01)<0.6`.
|
||||||
|
`ADDS` a sua volta richiede `holdUplift_w20 ≥ 0.05 AND robust_oos` (uplift hold-out >0.02 **e**
|
||||||
|
jackknife drop-one-month tutti positivi). È il marginal scorer del sweep precedente, portato sul
|
||||||
|
cross-sectional: si giudica **l'apporto al portafoglio live** (TP01+XS01+VRP01), non lo Sharpe
|
||||||
|
assoluto.
|
||||||
|
|
||||||
|
**Caveat cotto dentro l'harness:** il panel è **~2.5 anni** (2024-26). Ogni risultato è
|
||||||
|
SUGGESTIVO, non robusto come i 6 anni di BTC/ETH. E l'hold-out (2025-26) è **un singolo regime**
|
||||||
|
(alt-bear/chop relativo a BTC).
|
||||||
|
|
||||||
|
## Find phase — 43 script, 257 sotto-config
|
||||||
|
|
||||||
|
11 famiglie cross-sectional: MOM (varianti momentum), REV (reversal), VOL/RISK (low-vol, low-beta,
|
||||||
|
BAB, semivarianza, vol-of-vol), DIST (skew/coskew lottery), LIQ (Amihud/turnover/volume),
|
||||||
|
VAL (distanza da MA, RSI), STRUCT (double-sort, ensemble z-vote, risk-parity, low-corr, trend-R²,
|
||||||
|
lead-lag BTC), UNIV (sweep di universo). **Esito: 42/257 config `earns_slot=True`.**
|
||||||
|
|
||||||
|
Sembra molto. Ma **due tell** accomunano quasi tutti gli slot-earner:
|
||||||
|
1. corr a TP01 **fortemente negativa** (−0.2…−0.4) — è *per questo* che "aggiungono";
|
||||||
|
2. PnL **concentrato nel 2025** (ritorni +22%…+84% nel 2025).
|
||||||
|
|
||||||
|
Top per Sharpe/uplift (rappresentante per famiglia):
|
||||||
|
|
||||||
|
| id | meccanismo | univ | FULL Sh | HOLD Sh | upliftHold | jackknife | corr TP01 | corr XS01 |
|
||||||
|
|----|-----------|------|---------|---------|-----------|-----------|-----------|-----------|
|
||||||
|
| XR02-L3-p70-maj | reversal gated alta-vol | maj | 1.40 | **2.27** | 1.078 | 0.744 | 0.02 | 0.08 |
|
||||||
|
| XV02_majors_H10k5 | low **idio**-vol | maj | 1.32 | 1.95 | 1.196 | 0.792 | −0.20 | −0.06 |
|
||||||
|
| XL02-vz60r20-maj | vol-trend momentum | maj | **1.83** | 1.84 | 0.568 | 0.125 | 0.13 | 0.08 |
|
||||||
|
| XM09_all | trend-gated x-sec mom | all | 1.29 | 1.59 | 0.556 | 0.355 | −0.07 | 0.25 |
|
||||||
|
| XS01b-MAJ | double-sort mom×low-vol | maj | 1.36 | 1.23 | 0.427 | 0.16 | −0.29 | 0.38 |
|
||||||
|
| XU02/XV01 lowvol | low realized-vol | maj | 1.05 | 0.98 | 0.425 | 0.186 | −0.34 | 0.16 |
|
||||||
|
| XV03 lowbeta (BAB) | −beta | all | 0.36 | 0.71 | 0.22 | 0.051 | −0.38 | 0.19 |
|
||||||
|
| XS06b lowcorr | −corr(asset,market) | all | 0.74 | 1.00 | 0.286 | 0.092 | −0.19 | 0.18 |
|
||||||
|
|
||||||
|
## Verify phase — 3 scettici (`verify_survivors.py`)
|
||||||
|
|
||||||
|
Ipotesi sotto test: *"non sono N edge indipendenti, ma UNA scommessa di regime — short la
|
||||||
|
spazzatura high-beta nell'alt-bear 2024-26 — travestita da 30 maschere; il jackknife è robusto solo
|
||||||
|
DENTRO quel regime."* Ricostruito il book più forte per famiglia e:
|
||||||
|
|
||||||
|
**S1 — matrice di correlazione mutua (>0.6 = stessa scommessa).** Esito SFUMATO:
|
||||||
|
- Il cluster low-vol È una sola scommessa: **XV01 = XU02 = 1.00** (identici), XV01↔XV02 0.65,
|
||||||
|
XV01↔XV03 0.67, XV02↔XV03 0.44.
|
||||||
|
- MA **XM09, XL02, XS06b, XR02 sono distinti** dal cluster e tra loro (corr media off-diagonale
|
||||||
|
solo **+0.20**, solo 18% delle coppie |r|>0.6). L'ipotesi "tutto una scommessa" è **parzialmente
|
||||||
|
falsa**.
|
||||||
|
|
||||||
|
**S2 — carico su short-beta / short-market** (factor di riferimento sullo stesso panel:
|
||||||
|
SHORTBETA = book su −beta; SHORTMKT = −market alt equal-weight):
|
||||||
|
- **Cluster low-vol = short-alt-beta confermato:** XV03 1.00/0.70, XV01/XU02 **0.67/0.64**,
|
||||||
|
XV02 0.44/0.37. *Non* market-neutral: è un tilt short del mercato alt.
|
||||||
|
- **NON short-beta:** XM09 0.08/0.15, XR02 −0.21/−0.18, XL02 0.19/0.26, XS06b 0.36/0.39.
|
||||||
|
|
||||||
|
**S3 — Sharpe per anno solare (l'edge è ~solo 2025?):**
|
||||||
|
|
||||||
|
| survivor | 2024 | 2025 | 2026 |
|
||||||
|
|----------|------|------|------|
|
||||||
|
| XV02_lowidiovol | 0.07 | 1.87 | 2.12 |
|
||||||
|
| XV01/XU02 lowvol | 1.17 | 1.52 | **−0.09** |
|
||||||
|
| XV03_lowbeta | −0.25 | 0.98 | 0.12 |
|
||||||
|
| XS06b_lowcorr | 0.26 | 1.34 | 0.32 |
|
||||||
|
| **XM09_trendgmom** | **0.82** | **0.50** | **0.74** |
|
||||||
|
| XL02_voltrendmom | 0.30 | **−0.14** | **−0.43** |
|
||||||
|
| **XR02_revgated** | **0.84** | **0.40** | **2.68** |
|
||||||
|
|
||||||
|
## Conclusioni (oneste)
|
||||||
|
|
||||||
|
1. **Cluster low-vol / low-beta (XV01, XU02, XV02 in parte, XV03) = tilt short-alt-beta di regime.**
|
||||||
|
S2 lo inchioda (carico 0.44-0.70 su short-market): non è un fattore market-neutral, è "short la
|
||||||
|
spazzatura" mentre gli alt sanguinano vs BTC. XV01/XU02 **già in decadimento (2026 −0.09).** Non
|
||||||
|
può dimostrare di sopravvivere a un flip alt-bull. → **RIGETTATO come sleeve.** Conferma
|
||||||
|
l'osservazione 4874 (XS04b = regime-dependent short-beta tilt) generalizzata all'intera famiglia.
|
||||||
|
|
||||||
|
2. **XL02 (vol-trend momentum) = overfit al panel iniziale.** FULL Sharpe più alto (1.83) ma S3 lo
|
||||||
|
uccide: 2025 −0.14, 2026 −0.43. Il numero full è guidato dal 2024, ora è morto. → **RIGETTATO.**
|
||||||
|
|
||||||
|
3. **2 LEAD genuini** — distinti (S1), NON short-beta (S2), positivi in **tutti e 3 gli anni** (S3):
|
||||||
|
- **XM09 — cross-sectional momentum gated dal trend di mercato.** Long top-k/short bottom-k alt,
|
||||||
|
attivo solo quando la somma trailing del mercato equal-weight è >0. Sharpe 0.82/0.50/0.74,
|
||||||
|
short-beta-load 0.08, corr TP01 −0.07, uplift hold 0.556 / jackknife 0.355. È il candidato più
|
||||||
|
regime-robusto. **Caveat:** stessa FAMIGLIA di XS01 (x-sec momentum) su universo più largo (49)
|
||||||
|
con gate diverso (trend di mercato vs dispersione) → più un **possibile affinamento di XS01**
|
||||||
|
che una sleeve nuova; corr XS01 0.25, ma marginal scorer dice che ADDS oltre XS01.
|
||||||
|
- **XR02 — short-term reversal gated da alta-vol.** Reversal a 3g attivo solo quando la vol
|
||||||
|
realizzata di mercato è nel regime alto (>p70 espandente). Sharpe 0.84/0.40/**2.68**,
|
||||||
|
short-beta-load −0.21, corr a tutto il resto ~0/negativa, hold-out Sharpe 2.27. Microstruttura
|
||||||
|
reale (overreaction in panico). **Caveat:** H=3 → **turnover alto**; il reversal vive proprio
|
||||||
|
sull'illiquidità che lo rende costoso da eseguire (l'harness addebita fee sul turnover e regge,
|
||||||
|
ma il fill reale su alt minori è ottimistico).
|
||||||
|
|
||||||
|
## Perché NON deployabili adesso (caveat trasversali)
|
||||||
|
|
||||||
|
- **Panel ~2.5 anni a regime unico.** Anche i 2 lead hanno hold-out = 2025-26 = stesso macro-regime.
|
||||||
|
Suggestivi, non robusti come i 6 anni BTC/ETH.
|
||||||
|
- **STAT-MODE di esecuzione.** Un book cross-sectional a 10-19 gambe (long-k+short-k) su alt non è
|
||||||
|
eseguibile col capitale attuale (conto reale ~$600; servono ~$20k per gambe sensate, come già
|
||||||
|
notato per XS01). Sono segnali da monitorare, non ordini.
|
||||||
|
- **Lezione confermata (di nuovo):** su un panel corto a regime unico il jackknife drop-one-month
|
||||||
|
certifica la robustezza DENTRO il regime, non ATTRAVERSO i regimi. Il discriminante decisivo è
|
||||||
|
stato **S2 (carico su short-beta) + S3 (consistenza per-anno)**, non lo Sharpe né l'uplift
|
||||||
|
hold-out (che il cluster regime-bet aveva altissimi: upliftHold fino a 1.20).
|
||||||
|
|
||||||
|
## Azioni
|
||||||
|
|
||||||
|
- **Nessuna modifica al portafoglio live** (TP01 55% + XS01 25% + VRP01 20% invariato).
|
||||||
|
- **Forward-monitor** i 2 lead (XM09, XR02) quando il panel HL accumula un secondo regime.
|
||||||
|
- **XM09 come affinamento candidato di XS01** (gate trend di mercato + universo 49) da valutare a
|
||||||
|
parità di sleeve, NON come sleeve aggiuntiva, in una prossima iterazione.
|
||||||
|
- Harness `xslib.py` + 43 script + `verify_survivors.py` committati come riferimento riusabile.
|
||||||
@@ -0,0 +1,111 @@
|
|||||||
|
# 2026-06-21 — Blind signal fleet: 52 agenti "esperti di segnali" su curve anonime BTC/ETH
|
||||||
|
|
||||||
|
## Obiettivo (richiesta utente)
|
||||||
|
|
||||||
|
Far partire ~50 subagenti **esperti di segnali** a cui passare lo storico di **ETH e BTC
|
||||||
|
in forma ANONIMA** ("senza dire di cosa sono, con curve sovrapposte"): devono trovare come
|
||||||
|
**anticipare l'andamento**, liberi di scrivere script o reti neurali ad hoc. L'**orchestratore**
|
||||||
|
valuta la validità su **PnL e maxDD**.
|
||||||
|
|
||||||
|
L'idea forte del setup cieco: se gli agenti non sanno che sono BTC/ETH, non possono
|
||||||
|
pattern-matchare a memoria il crash COVID 2020 / l'orso 2022 / l'halving 2024 — devono trovare
|
||||||
|
un timing **trasferibile**, non riconoscere l'era. È anche un test di onestà del metodo: l'edge
|
||||||
|
deve reggere su un hold-out che gli agenti non hanno mai visto.
|
||||||
|
|
||||||
|
## Setup — harness cieco e leak-free (prima degli agenti)
|
||||||
|
|
||||||
|
> 50 agenti su un harness che perde = 50 fantasie (lezione fondante del progetto). Quindi prima
|
||||||
|
> l'infrastruttura, poi la flotta.
|
||||||
|
|
||||||
|
- `scripts/research/blind/make_blind.py` — esporta BTC/ETH **1d** (via il path certificato
|
||||||
|
`altlib.get`) come **"Series A" / "Series B"**: rebase a **100** (curve sovrapposte, il livello
|
||||||
|
non urla più "$60k bitcoin"), **calendario sintetico** dal 2001 (niente era-crypto da
|
||||||
|
riconoscere), volume normalizzato alla mediana. Split **70% train (visibile agli agenti) / 30%
|
||||||
|
test (solo orchestratore)**. Mapping A=BTC, B=ETH tenuto FUORI dal meta visibile.
|
||||||
|
- `scripts/research/blind/blindlib.py` — l'unico modulo che un agente importa. Evaluator
|
||||||
|
leak-free: la posizione decisa a `close[i]` è **shiftata** e tenuta nella barra `i+1` (impossibile
|
||||||
|
leakare moltiplicando un peso per il rendimento della stessa barra), fee su turnover (Deribit
|
||||||
|
0.10% RT). Toolkit di indicatori causali ri-esportati da altlib.
|
||||||
|
- **Guardia di causalità automatica** (`causality_ok`): ri-chiama `signal()` su un **prefisso
|
||||||
|
troncato** e pretende che la coda combaci con `signal()` sull'array intero. Qualunque segnale che
|
||||||
|
sbircia il futuro (shift(-k), finestre centrate, fit globale, statistiche full-sample) **diverge →
|
||||||
|
squalificato**. È ciò che rende onesta anche la "rete neurale ad hoc": un modello fittato sul df
|
||||||
|
intero (che a test-time contiene il futuro) fallisce la guardia; passa solo l'expanding/walk-forward.
|
||||||
|
- `score_all.py` — il **giudice unico dell'orchestratore**: per ogni modulo gira la guardia, valuta
|
||||||
|
sul **test held-out** A e B, ordina per PnL/maxDD vs benchmark buy&hold.
|
||||||
|
- `verify_top.py` — secondo strato avversariale: corr al trend canonico TSMOM, fee-stress 0.20% RT,
|
||||||
|
jackknife drop-block.
|
||||||
|
|
||||||
|
Verifica dell'harness: momentum onesto → causale ok, OOS +44% a 19% DD; segnale **deliberatamente
|
||||||
|
leaky** (guarda domani) → Sharpe 18 assurdo ma **correttamente squalificato**. Benchmark buy&hold
|
||||||
|
OOS sul tail = **−7% PnL, 68% DD, Sharpe 0.22** (il tail 2024-26 contiene un drawdown brutale →
|
||||||
|
anticipare il movimento ha spazio reale per vincere).
|
||||||
|
|
||||||
|
## Flotta — 52 agenti, 52 ipotesi distinte
|
||||||
|
|
||||||
|
Workflow `blind-signal-fleet` (52 agenti in parallelo, ~2h, 2.5M token, 971 tool-call). A ognuno
|
||||||
|
**un'ipotesi diversa** (per non riscoprire tutti il momentum): 11 famiglie — trend/TSMOM,
|
||||||
|
breakout (Donchian/Keltner/squeeze/pivot/volbreak), mean-rev/oscillatori (RSI/Bollinger/zrev/stoch/
|
||||||
|
DPO/WillR), vol-regime (vol-target/regime-switch/ATR-ride/dd-derisk/**vol-of-vol**), struttura
|
||||||
|
(HHLL/channel-pos), statistici (Hurst/autocorr/efficiency/skew/entropy), ciclo (FFT/Kalman),
|
||||||
|
volume (OBV/PVT/vol-div), **8 ML** (Ridge, logistic, MLP-reg, MLP-clf, GBM, kNN-analog, RLS,
|
||||||
|
RandomForest) e 5 meta/ensemble.
|
||||||
|
|
||||||
|
**Esito flotta: 52/52 riportati, 52/52 passano la guardia di causalità** (zero look-ahead — la
|
||||||
|
disciplina dell'harness ha tenuto su tutta la flotta, ML inclusi).
|
||||||
|
|
||||||
|
## Risultati OOS (orchestratore — PnL & maxDD sul test held-out)
|
||||||
|
|
||||||
|
Benchmark buy&hold OOS: **PnL −7%, maxDD 68%**. Top per Sharpe-min (peggiore tra A e B):
|
||||||
|
|
||||||
|
| # | strategia | PnL_A | PnL_B | DD worst | Sh_min | famiglia |
|
||||||
|
|---|---|---|---|---|---|---|
|
||||||
|
| 1 | macd | +23% | +19% | **11%** | 0.84 | trend |
|
||||||
|
| 2 | accel | +40% | +22% | 12% | 0.79 | trend (2ª diff) |
|
||||||
|
| 3 | vol_of_vol | +30% | +32% | 21% | 0.69 | vol-regime |
|
||||||
|
| 4 | regime_switch | +25% | +46% | 20% | 0.63 | vol-regime |
|
||||||
|
| 5 | rf (ML) | +12% | +8% | **7%** | 0.62 | ML walk-fwd |
|
||||||
|
| 6 | obv | +22% | +20% | 16% | 0.60 | volume |
|
||||||
|
|
||||||
|
Tutti i top sono varianti **trend/vol-regime**. Mean-reversion e ML (logistic/gbm/mlp) in fondo →
|
||||||
|
ri-conferma cieca di "mean-rev morto" e "ML walk-forward debole" del progetto. Lo **Sharpe OOS ~0.84
|
||||||
|
decade dal train ~1.4** (firma classica di overfit/regime). Ma vs buy&hold (−7%/68% DD) i top trend
|
||||||
|
**ribaltano il segno e tagliano il DD ~3-6×**: è il valore reale, identico alla lezione TP01.
|
||||||
|
|
||||||
|
## Verifica avversariale — 3 scettici indipendenti (REFUTE, non confirm)
|
||||||
|
|
||||||
|
1. **Regime-luck** → **REFUTED ×3.** I top-5 bar su ~800 OOS forniscono il **67-102% di tutto il
|
||||||
|
PnL**; togliendo 10 bar la serie va **negativa**; `accel` crolla nel terzo finale (COMB Sharpe
|
||||||
|
**−1.21**); A e B non concordano su *quando* funziona. Edge concentrato, non distribuito.
|
||||||
|
2. **Trend-redundancy** → **REFUTED ×4.** Regressione `cand ~ α + β·TSMOM` (Newey-West HAC):
|
||||||
|
**t(α) = +0.92..+1.51, nessuno supera 1.96**. corr-al-trend 0.34-0.74, β 0.45-0.73; media residua
|
||||||
|
+0.05-0.08/anno = rumore. Sono TSMOM meglio tarati, **non alpha ortogonale**; contro il TP01 reale
|
||||||
|
(~1.3) il margine svanisce.
|
||||||
|
3. **Overfit/robustezza** → MACD **non-refuted** (plateau vero a un asse, 0% celle <0.5) ma Sharpe OOS
|
||||||
|
onesto **0.84, non 1.40** (numero da docstring = in-sample). `accel` **REFUTED** (il termine di
|
||||||
|
accelerazione, la sua tesi, **danneggia** l'OOS; LAG knife-edge: −20% → −63% Sharpe; corner
|
||||||
|
congiunti negativi). `vol_of_vol` **REFUTED** (gate threshold-fit: PCTL 0.80→0.60 distrugge il 73%
|
||||||
|
dello Sharpe OOS). Fee = drag secondario ~10%, non il killer; il killer è la sensibilità ai parametri.
|
||||||
|
|
||||||
|
## Verdetto
|
||||||
|
|
||||||
|
**52 agenti ciechi, orchestratore che valuta PnL e maxDD su hold-out, e NIENTE di nuovo
|
||||||
|
sopravvive alla verifica avversariale.** Ogni "vincitore" è trend-beta di due curve strutturalmente
|
||||||
|
rialziste; soffitto Sharpe OOS **~0.84** su questo singolo hold-out; nessun alpha statisticamente
|
||||||
|
distinguibile dal TSMOM. È una **ri-conferma INDIPENDENTE e CIECA del soffitto direzionale ~1.3** del
|
||||||
|
progetto e del pattern "TSMOM travestito" — raggiunta da agenti che non sapevano nemmeno fossero
|
||||||
|
BTC/ETH. Il più solido è **macd** (plateau vero, OOS Sharpe 0.84, DD 11%): classe-TP01,
|
||||||
|
**forward-monitor al più, non deploy**. Conferma le regole: (a) giudicare lo Sharpe **marginale vs
|
||||||
|
TP01**, non assoluto; (b) un hold-out corto premia chi è stato fortunato in pochi bar.
|
||||||
|
|
||||||
|
### Valore metodologico (cosa resta)
|
||||||
|
|
||||||
|
L'harness cieco riusabile: `data/blind/` + `blindlib`/`blind_eval`/`score_all`/`verify_top`. La
|
||||||
|
**guardia di causalità online** ha tenuto 52 strategie (ML incluso) leak-free senza intervento
|
||||||
|
manuale → strumento da riusare per ogni futura flotta. La pipeline "anonimizza → fan-out cieco →
|
||||||
|
giudice unico OOS → 3 scettici (regime-luck / trend-redundancy / overfit)" ha ucciso ogni falso
|
||||||
|
positivo che lo Sharpe assoluto avrebbe promosso.
|
||||||
|
|
||||||
|
File: `scripts/research/blind/{make_blind,blindlib,blind_eval,score_all,verify_top}.py`,
|
||||||
|
`agents/agent_00..51_*.py` (52 moduli), `leaderboard.json`, `verify_top.json`,
|
||||||
|
`SKEPTIC_VERDICTS.json`. Dati rigenerabili: `data/blind/` (gitignored).
|
||||||
@@ -0,0 +1,88 @@
|
|||||||
|
# 2026-06-21 — Asse intraday/microstruttura: il lead più vicino al reale, ma NON deployabile
|
||||||
|
|
||||||
|
## Perché (utente: "cerchiamo qualcosaltro")
|
||||||
|
|
||||||
|
Direzionale e relative-value su BTC/ETH esauriti (flotte blind + ortho). L'unico asse mai
|
||||||
|
sfruttato dopo il reset = il **tempo intraday** (feed certificati 5m/15m/1h; tutto era a 1d).
|
||||||
|
Meccanismi diversi da trend e relative-value: bias ora/sessione (perp con funding a 00/08/16 UTC),
|
||||||
|
reversione post-evento (vol/volume/gap), breakout del range del giorno prima.
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
`scripts/research/intraday/intra_score.py`: wrappa `altlib.study_marginal` a un TF a scelta
|
||||||
|
(compone i rendimenti intraday a daily, li valuta col **marginal scorer indurito** = multi-cut +
|
||||||
|
edge-in-sample + hedge-vs-alpha) e riporta **turnover + fee-sweep a 0.20% RT**. Il muro: a 0.10% RT
|
||||||
|
il churn intraday è morte (un flip orario fa 2152 trade/anno → −8.6 Sharpe netto). Vincolo agli
|
||||||
|
agenti: **basso turnover**, l'intraday come informazione (timing/sizing/gating), non HFT.
|
||||||
|
|
||||||
|
## Flotta — 16 agenti
|
||||||
|
|
||||||
|
16 ipotesi low-turnover. Esito grezzo: 16 riportati, **10 "earns_slot"** (di nuovo gonfiato).
|
||||||
|
|
||||||
|
## Diagnosi orchestratore — separare ortogonale vero da trend-beta
|
||||||
|
|
||||||
|
Per corr-a-TP01 (`meta_intra.py`): 2 sono **trend-beta** (close_location 0.81, trend_quality 0.75 —
|
||||||
|
Sharpe in-sample alto ma preso in prestito dal trend), 3 **mixed**, **5 genuinamente ortogonali**
|
||||||
|
(|corr|<0.4): open_drive (0.13), prevday_range_breakout (0.15), vol_event_revert_15m (−0.1),
|
||||||
|
volume_spike_revert (0.14), gap_fill (0.04) — 2 famiglie (breakout-continuation + capitulation-revert),
|
||||||
|
mutuamente de-correlate. **Combo dei 5: Sharpe standalone 1.80, corr-TP01 0.17, uplift +0.33/+0.27/
|
||||||
|
+0.34/+0.34/+0.53 a OGNI cut** (non solo 2025).
|
||||||
|
|
||||||
|
## Gauntlet deterministico (`verify_intra.py`) — passa TUTTO ciò che uccise le onde precedenti
|
||||||
|
|
||||||
|
- **In-sample pre-2025 Sharpe 1.75; uplift pre-2025-ONLY +0.281** (l'ortho faceva +0.027 = null).
|
||||||
|
- **Walk-forward selection** (scegli su solo passato, testa avanti): **+0.303 / +0.368** (l'ortho dava −0.07).
|
||||||
|
- **Drop-one robusto** (+0.24..+0.31 pre-2025), **fee-robusto a 0.30% RT**, **leak-free**
|
||||||
|
(online-consistency: max_tail_diff = 0.0 su tutti e 5). Sembrava IL lead.
|
||||||
|
|
||||||
|
## Verifica avversariale (3 scettici indipendenti) — il verdetto vero
|
||||||
|
|
||||||
|
1. **Execution/microstruttura:** **open_drive = ARTEFATTO di etichettatura UTC.** Spostando il
|
||||||
|
confine del giorno di 4h l'uplift va NEGATIVO (−0.10); togliendo l'ancora UTC (trailing-8h) Sharpe
|
||||||
|
0.01; funziona solo a 00:00 UTC, solo alle ore 3 e 7. **Scartare.** `prevday_range_breakout` invece
|
||||||
|
**REGGE** (plateau su k, robusto allo shift del confine, fill eseguibili a close) = unico candidato
|
||||||
|
onesto, ma la decorrelazione viene tutta dalla gamba SHORT che si appoggia al regime down 2025-26;
|
||||||
|
anchor=1 only. **Caveat $600:** il vol-target fa ~8500 ribilanciamenti/anno, 97-98% < $1 di nozionale
|
||||||
|
→ la fee proporzionale modellata su trade infinitesimi è **finzione** a $300/gamba (vale anche per TP01).
|
||||||
|
2. **Hedge + tail:** **REFUTED.** L'uplift pre-2025 +0.281 sta al **20-24° percentile del null di un
|
||||||
|
asset a corr-zero** (mediana null +0.371) — essendo a corr +0.175 (non 0) e bassa vol, **aggiunge
|
||||||
|
MENO del rumore scorrelato**. È **hedge** (corr Sharpe-TP01/uplift −0.57..−0.80; TP01-down uplift
|
||||||
|
+0.79 vs TP01-up +0.20) e **tail-luck** (le gambe revert: top-5 giorni = 76-83% del PnL, <10
|
||||||
|
eventi/anno, front-loaded 2019-21; combo: metà uplift in ~10 giorni).
|
||||||
|
3. **Overfit/robustezza:** **ROBUST-PLATEAU** (243-cell joint grid pre-2025 uplift min +0.134/med
|
||||||
|
+0.211, 99% celle >+0.15; ogni anno positivo). MA segnala lui stesso il **null-pctl 0.20**: "il
|
||||||
|
beneficio è la matematica di diversificazione di uno stream ortogonale a Sharpe 1.75, NON timing-alpha
|
||||||
|
specifico-TP01" + storia corta sulle gambe revert + fill modellati vs reali.
|
||||||
|
|
||||||
|
## Verdetto
|
||||||
|
|
||||||
|
**Niente in live.** L'asse intraday ha prodotto il lead **più vicino al reale** di tutta la ricerca,
|
||||||
|
ma sotto 3 scettici: **open_drive è artefatto** (UTC-labeling); la combo **fallisce il null a
|
||||||
|
corr-zero** (aggiunge meno del rumore), è **hedge-shaped** e **tail-luck**; e lo Sharpe modellato è
|
||||||
|
gonfiato dal micro-ribilanciamento sub-dollaro a $600. Lo Sharpe standalone 1.80 NON è affidabile
|
||||||
|
(artefatto + coda + finzione di fill). **Resta solo TP01.**
|
||||||
|
|
||||||
|
**Lead reale (forward-monitor, non deploy):** `prevday_range_breakout` — l'unico segnale sopravvissuto
|
||||||
|
allo scettico d'esecuzione (breakout del range del giorno prima, eseguibile, leak-free), con caveat
|
||||||
|
short-leg/regime-2025. Trattamento = come `dvol_spread` / XS01 / STA05.
|
||||||
|
|
||||||
|
### Lezioni harness — CODIFICATE (il vero ritorno)
|
||||||
|
|
||||||
|
1. ✅ **`altlib.day_boundary_robust(target_fn, tf)`** — shifta il confine del giorno UTC e ri-misura
|
||||||
|
l'uplift marginale: INVARIANT (segnale di prezzo, spread 0) / ROBUST (effetto calendario vero,
|
||||||
|
resta positivo) / **ARTIFACT-RISK** (l'uplift si inverte = etichettatura). Verificato: riproduce
|
||||||
|
da solo il verdetto degli scettici — open_drive → ARTIFACT-RISK (+0.23→−0.33), prevday_breakout
|
||||||
|
→ ROBUST. Test `tests/test_harness_realism.py`.
|
||||||
|
2. ✅ **`altlib.eval_weights_smallcap(df, target, capital=600, min_order=5)`** — salta i
|
||||||
|
ribilanciamenti sub-min_order (la finzione del micro-trading a $600), riporta lo Sharpe haircut
|
||||||
|
reale vs modellato. Vale per ogni sleeve a questo capitale, TP01 incluso. Test idem.
|
||||||
|
3. ✅ **`altlib.causality_ok(target_fn, tf)`** — guardia look-ahead/online-consistency (ricalcola
|
||||||
|
il target su un prefisso e pretende che la coda combaci con il full): eval_weights shifta la
|
||||||
|
posizione ma NON vede una feature non-causale (finestra centrata / shift(-k) / stat full-sample).
|
||||||
|
Integrata in `intra_score` (un leak è squalificato prima dello scoring). + il calendar-artifact
|
||||||
|
gate (`day_boundary_robust`) ora gira dentro `intra_score`: **open_drive/weekly_seasonality/
|
||||||
|
overnight → CAL-ARTIFACT, fuori dagli slot da soli**; prevday_breakout resta (ROBUST). Il lab
|
||||||
|
intraday ora auto-becca leak e artefatti-calendario che ieri richiedevano gli scettici. Test idem.
|
||||||
|
|
||||||
|
File: `scripts/research/intraday/{intra_score,meta_intra,verify_intra}.py`,
|
||||||
|
`agents/agent_00..15_*.py`, `intra_leaderboard.json`.
|
||||||
@@ -0,0 +1,99 @@
|
|||||||
|
# 2026-06-21 — Caccia all'ORTOGONALE a TP01: relative-value BTC/ETH (eseguibile a $600)
|
||||||
|
|
||||||
|
## Perché (richiesta utente: "cerca ortogonale a TP01")
|
||||||
|
|
||||||
|
La flotta cieca (stesso giorno) ha confermato: niente di NUOVO in direzionale BTC/ETH — tutto è
|
||||||
|
trend-beta di TP01 (soffitto ~1.3). L'unica via a un nuovo slot LIVE è un meccanismo **ortogonale**
|
||||||
|
(bassa correlazione, alpha residua). Il più promettente **eseguibile al capitale reale ~$600** è un
|
||||||
|
**book RELATIVE-VALUE a 2 gambe BTC/ETH** (long una / short l'altra), grosso modo market-neutral →
|
||||||
|
correlazione naturale bassa col trend, e a 2 gambe è eseguibile (a differenza del book a 19 gambe di
|
||||||
|
XS01 che serve ~$20k).
|
||||||
|
|
||||||
|
## Setup — ortho-lab + giudice MARGINALE (non Sharpe assoluto)
|
||||||
|
|
||||||
|
`scripts/research/ortho/ortholib.py`: BTC/ETH 1d allineati su date comuni; `eval_book(book_fn)` con
|
||||||
|
`book(btc,eth)->(w_btc,w_eth)`, **shift di entrambe le gambe** (no leak), fee su entrambe, serie netta
|
||||||
|
**giornaliera**; guardia di causalità online; check **eseguibilità a $600** (max gamba ≤ 0.5 = cap
|
||||||
|
$300/asset). Il giudice è `altlib.marginal_vs_tp01`: **corr a TP01, uplift OOS del blend, alpha
|
||||||
|
residua, robust_oos** (clean-year + jackknife drop-month). Verdetto = ADDS, **non** Sharpe assoluto.
|
||||||
|
`ortho_score.py` (giudice), `meta_ortho.py` (corr mutua + persistenza multi-cut), `sleeve_rv.py`.
|
||||||
|
|
||||||
|
Sanity: ratio-momentum → ADDS (corr 0.05); ratio-mean-reversion → DILUTES. L'harness discrimina.
|
||||||
|
|
||||||
|
## Flotta — 18 agenti relative-value (~40 min)
|
||||||
|
|
||||||
|
18 ipotesi distinte: ratio-momentum multi-orizzonte, XS a 2 asset, beta-neutral residuo, Donchian
|
||||||
|
sul ratio, EMA-cross, accel, carry lento, Kalman-spread, gate-correlazione, gate-vol, inverse-vol,
|
||||||
|
rebalance-harvest, lead-lag, **DVOL-spread**, **VRP relativo**, dispersione, ensemble.
|
||||||
|
|
||||||
|
**Esito grezzo: 18 riportati, 17 "ADDS / earns_slot".** → **bandiera rossa**: non esistono 17 alpha.
|
||||||
|
Gli agenti stessi l'hanno annotato ("hold-out corto ~537g", "uplift dipende dal regime ETH-bleed
|
||||||
|
2025", "forward-monitor non full-weight").
|
||||||
|
|
||||||
|
## Diagnosi dell'orchestratore — il "17 slot" è gonfiato
|
||||||
|
|
||||||
|
1. **Una scommessa o tante?** corr mutua media **0.43** → collassano a **8 rappresentanti**
|
||||||
|
de-correlati. Non 17, non 1.
|
||||||
|
2. **Persistente o solo finestra 2025?** `marginal_vs_tp01` fissa l'hold-out al 2025-01-01 = proprio
|
||||||
|
la finestra dove ETH ha perso vs BTC e TP01 è debole. Ri-misurando l'uplift a **più cut**
|
||||||
|
(2022/23/24/25): il basket selection-free era +0.06/+0.06/+0.11/+0.38 (positivo ovunque ma
|
||||||
|
crescente verso il 2025). Smaschera anche i **falsi** che il robust_oos fisso-2025 non vede:
|
||||||
|
`kalman_spread` (−0.14/−0.16/−0.10 poi +0.37) e `xs2_zscore` sono **2025-only**.
|
||||||
|
3. **Selezione walk-forward (senza hindsight):** scegliere i top-4 per uplift sul **solo passato** e
|
||||||
|
testare in avanti → uplift **−0.07** (sel <2023) / +0.05 (<2024) / +0.43 (<2025). **Scegliere la
|
||||||
|
variante vincente in anticipo è inaffidabile**; il mio "curated 4" è in parte hindsight.
|
||||||
|
|
||||||
|
## Verifica avversariale (scettico indipendente) — REFUTED
|
||||||
|
|
||||||
|
Sul **basket selection-free** (equal-weight di tutti i book market-neutral, NESSUN cherry-picking):
|
||||||
|
- standalone Sharpe **0.61**, maxDD 15%, **corr a TP01 0.05** (genuinamente ortogonale).
|
||||||
|
- **uplift full +0.078 = pre-2025 +0.027 / solo-2025+ +0.401.** Il pre-2025 **+0.027 sta al 49°
|
||||||
|
percentile di 500 asset-rumore a corr-zero** (+0.029 per costruzione) → è **matematica di
|
||||||
|
diversificazione, non segnale**.
|
||||||
|
- **corr(Sharpe annuo TP01, uplift annuo basket) = −0.87**; condizionato: TP01 su → +0.014, TP01 giù
|
||||||
|
→ +0.369. **È un hedge dei drawdown di TP01, non un premio autonomo.** Paga nel 2022 (orso) e
|
||||||
|
2025-26 (ETH-bleed) — i due anni peggiori di TP01 — rumore altrove (2023 −0.06, 2024 −0.12).
|
||||||
|
- Block-bootstrap P(uplift>0): full 90%, **pre-2025 66% (testa o croce)**, 2025+ 99%.
|
||||||
|
- Fee: a **0.30% RT il pre-2025 va NEGATIVO** (−0.021); sopravvive solo il numero del regime 2025.
|
||||||
|
- Eseguibilità OK ($264/gamba, turnover 12/yr) — non è quello il problema.
|
||||||
|
|
||||||
|
## Verdetto
|
||||||
|
|
||||||
|
**Niente di questa flotta merita uno slot LIVE.** Il meccanismo relative-value BTC/ETH è REALE e
|
||||||
|
genuinamente ortogonale (corr ~0.05), ma è un **hedge della debolezza di TP01 travestito da alpha**:
|
||||||
|
il suo contributo pre-2025 è indistinguibile da un asset-rumore a corr-zero (49° percentile del null)
|
||||||
|
e muore a fee realistiche; l'unico payoff vero è una singola finestra di 537 giorni (2025-26).
|
||||||
|
Deployarlo = deployare un backtest mono-regime. **Resta live solo TP01** (l'unica cosa che supera
|
||||||
|
tutto questo scrutinio). Coerente con XS01 (stessa famiglia cross-sectional): diversificatore
|
||||||
|
da monitorare, non alpha da eseguire — e la versione a 2 asset è ancora più sottile della 19-gambe.
|
||||||
|
|
||||||
|
### Valore metodologico (cosa resta, ed è importante)
|
||||||
|
|
||||||
|
- **Il marginal scorer fisso-2025 è ingannabile** (17/18 "ADDS"). Ciò che ha ucciso i falsi positivi:
|
||||||
|
**persistenza multi-cut** + **selezione walk-forward** + **bootstrap vs null a corr-zero**. Lezione
|
||||||
|
da cablare nello scorer: testare PIÙ cut e confrontare l'uplift col **null di un asset-rumore
|
||||||
|
ortogonale** (un'asset scorrelato con drift positivo "aggiunge" +0.03 per pura matematica — non è
|
||||||
|
un edge). Un basso-corr che paga solo quando il core è debole è un **hedge**, va prezzato come tale.
|
||||||
|
- Lab riusabile: `ortholib`/`ortho_score`/`meta_ortho` (giudice marginale + persistenza). I 18 book +
|
||||||
|
`sleeve_rv.py` (curated, **selection-biased — non deployare**) restano come riferimento.
|
||||||
|
|
||||||
|
File: `scripts/research/ortho/{ortholib,ortho_score,meta_ortho,sleeve_rv}.py`,
|
||||||
|
`agents/agent_00..17_*.py`, `ortho_leaderboard.json`, skeptic `skeptic_{basket,regime,null}.py`.
|
||||||
|
|
||||||
|
## AGGIORNAMENTO — lezione codificata in `altlib.marginal_vs_tp01` (stesso giorno)
|
||||||
|
|
||||||
|
I tre gate sono ora **codice**, non solo prosa (test `tests/test_marginal_scorer.py`, +5 test):
|
||||||
|
1. **persistenza multi-cut** (`multicut_uplift`/`multicut_persistent`): uplift a ogni inizio anno,
|
||||||
|
non solo all'HOLDOUT fisso → uccide i 2025-only (es. `kalman_spread`, negativo a ogni cut pre-2025).
|
||||||
|
2. **edge in-sample** (`has_insample_edge`): lo Sharpe standalone PRE-holdout dev'essere ≥0.5. È il
|
||||||
|
discriminante onesto (la basket faceva 0.29). I `null_pctl_*` (vs asset-rumore a corr-zero) restano
|
||||||
|
come CONTESTO — mostrano che un low-corr "aggiunge" ~+0.03 per matematica, vero per sleeve buoni e
|
||||||
|
cattivi, quindi non possono essere IL gate; l'edge in-sample sì.
|
||||||
|
3. **hedge vs alpha** (`is_hedge`): `corr(Sharpe-TP01, uplift annuo)` molto negativa + paga solo
|
||||||
|
quando TP01 è giù → HEDGE, non alpha.
|
||||||
|
|
||||||
|
Verdetti nuovi **HEDGE** e **NOISE**; `earns_slot` ora pretende ADDS + robust_oos + has_insample_edge
|
||||||
|
+ not is_hedge. **Sull'onda ortho lo scorer indurito ribalta 17/18 "ADDS" → 1** (`dvol_spread`, unico
|
||||||
|
con edge in-sample reale 0.57; gli altri 16 → NOISE/HEDGE). Controllo: un sleeve sintetico Sharpe~1.3
|
||||||
|
scorrelato resta **ADDS** (non rigetta i diversificatori veri — XS01-like). La verifica avversariale
|
||||||
|
di 3 giorni è ora una chiamata di funzione.
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
# PREVDAY block-bootstrap — coda-fortuna vs persistente (blocker #2/#3)
|
||||||
|
|
||||||
|
**Data:** 2026-06-21 (chiude la trilogia: fill-haircut → turnover/hedge → bootstrap)
|
||||||
|
**Script:** `scripts/research/intraday/prevday_bootstrap.py`
|
||||||
|
**Esito:** PREVDAY-full **non** è più coda-fortuna di TP01 e l'edge è **bootstrap-robusto** (full
|
||||||
|
99% / hold-out 93% dei resample con uplift>0). MA la gamba short (= tutto il valore) è
|
||||||
|
**tail-dipendente** (top-5 giorni = 130% del suo netto). PREVDAY = tail-hedge legittimo dal payoff
|
||||||
|
grumoso. Resta forward-monitor.
|
||||||
|
|
||||||
|
## Chiarimento di scope
|
||||||
|
|
||||||
|
Il "top-5 giorni = 76-83% del PnL" del diario intraday era sulle GAMBE REVERT del combo a 5 segnali
|
||||||
|
(vol_event/volume_spike/gap_fill), poi SCARTATE. Il sopravvissuto è PREVDAY (breakout-continuation).
|
||||||
|
Qui si testa PREVDAY STESSO — e la sua gamba SHORT, che (prevday_turnover) è l'intero valore di
|
||||||
|
portafoglio. Block bootstrap circolare (blocchi 20g, B=3000) per preservare autocorrelazione/regime.
|
||||||
|
|
||||||
|
## [A] Concentrazione del PnL nei top-K giorni
|
||||||
|
|
||||||
|
| serie | n | totRet | top5 | top10 | top20 | giorni→50% gain |
|
||||||
|
|-------|--:|-------:|-----:|------:|------:|----------------:|
|
||||||
|
| PREVDAY full | 2869 | +182% | 22% | 36% | 59% | 411 (14.3%) |
|
||||||
|
| **PREVDAY short-only** | 2869 | **+28%** | **130%** | 218% | 345% | 312 (10.9%) |
|
||||||
|
| PREVDAY long-only | 2869 | +154% | 18% | 30% | 49% | 287 (10.0%) |
|
||||||
|
| TP01 (riferimento) | 2657 | +116% | 19% | 33% | 55% | 213 (8.0%) |
|
||||||
|
|
||||||
|
- **PREVDAY-full NON è più coda-fortuna di TP01**: top5 22% vs 19%, e per il 50% del guadagno serve
|
||||||
|
*più* tempo (14.3% dei giorni vs 8.0% → più distribuito). Il tail-luck del diario era sulle gambe
|
||||||
|
revert scartate, non su PREVDAY.
|
||||||
|
- **Gamba short tail-dipendente:** top5 = **130% del netto** → togliendo i 5 giorni migliori la short
|
||||||
|
va in perdita (gli altri 2864 giorni nettano −8%). Sono i giorni-crash dove la short paga.
|
||||||
|
|
||||||
|
## [B] Circular block bootstrap (20g, B=3000)
|
||||||
|
|
||||||
|
| campione | PREVDAY Sharpe (mediana [5°,95°], %>0) | blend 80/20 uplift (mediana [5°,95°], %>0, %>+0.10) |
|
||||||
|
|----------|----------------------------------------|------------------------------------------------------|
|
||||||
|
| full (2018-08→2026-06) | +1.24 [+0.64,+1.80] 100% | +0.28 [+0.09,+0.47] 99% / 93% |
|
||||||
|
| hold-out (2025+) | +1.27 [−0.01,+2.46] 95% | +0.53 [−0.05,+1.21] 93% / 88% |
|
||||||
|
| short-only hold-out | +1.12 [−0.32,+2.41] 90% | +0.53 [−0.08,+1.31] 92% / 87% |
|
||||||
|
|
||||||
|
- **Full sample: edge robustissimo** — 99% dei resample dà uplift>0 (mediana +0.28). Non è "un blocco
|
||||||
|
fortunato".
|
||||||
|
- **Hold-out: regge con coda più larga** (5° pctl appena negativo: hold-out corto ~536g + short
|
||||||
|
tail-dipendente), ma 93% dei resample >0, 88% >+0.10.
|
||||||
|
|
||||||
|
## Verdetto blocker #2/#3
|
||||||
|
|
||||||
|
- **#3 tail-luck — DECLASSATO per PREVDAY-full, CONFERMATO per la gamba short.** La strategia intera
|
||||||
|
non è più concentrata di TP01 (che già deployamo); il motore di valore (la short) sì: vive su <10
|
||||||
|
giorni-crash/anno. Bootstrap-robusto (non un singolo blocco), ma il forward sarà GRUMOSO, non un
|
||||||
|
liscio +0.56/periodo.
|
||||||
|
- **#2 null-corr-zero — RIDIMENSIONATO.** L'uplift è genuinamente positivo (93-99% dei resample), non
|
||||||
|
rumore; il punto era di *efficienza relativa* (rende meno di un ipotetico asset perfettamente
|
||||||
|
scorrelato), non di esistenza dell'edge.
|
||||||
|
|
||||||
|
## Sintesi della trilogia (fill-haircut + turnover/hedge + bootstrap)
|
||||||
|
|
||||||
|
PREVDAY, dopo tre attacchi avversariali:
|
||||||
|
1. **Eseguibile alla taglia reale** ($600): haircut di fill +0.01 (blocker #4 smontato).
|
||||||
|
2. **Già a turnover efficiente**: ridurlo erode l'edge; nessuna ottimizzazione (config congelata).
|
||||||
|
3. **È un HEDGE, non alpha**: tutto il valore è la gamba short → tail-hedge di regime-down, additivo
|
||||||
|
alla flat-stance di TP01 (blocker #1 inchiodato).
|
||||||
|
4. **Edge bootstrap-robusto** ma **payoff grumoso** (il valore è in pochi giorni-crash) (blocker #3
|
||||||
|
declassato sul full, confermato sulla short; #2 ridimensionato).
|
||||||
|
|
||||||
|
→ **Candidato tail-hedge legittimo**, non sleeve-alpha. Resta in FORWARD-MONITOR: la domanda forward
|
||||||
|
non è più "è eseguibile / è overfit", ma **"la gamba short continua a pagare nei prossimi crash fuori
|
||||||
|
da 2022 e 2025-26?"**. Se sì → si valuta come overlay di tail-hedge (peso piccolo, atteso payoff
|
||||||
|
lumpy); se no → era beta-corto del regime down 2025-26.
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
# PREVDAY fill-haircut a basso capitale — il blocker d'esecuzione è BENIGNO (1/4 smontato)
|
||||||
|
|
||||||
|
**Data:** 2026-06-21 (follow-up di `2026-06-21-intraday-microstructure.md`)
|
||||||
|
**Script:** `scripts/research/intraday/fill_haircut.py`
|
||||||
|
**Esito:** l'haircut del fill reale a $600 è **+0.01 Sharpe** (trascurabile). Lo scettico
|
||||||
|
d'esecuzione (blocker #4) è **benigno**. Gli altri 3 blocker (hedge / null-corr-zero / tail-luck)
|
||||||
|
restano → PREVDAY resta in **forward-monitor, non deploy**.
|
||||||
|
|
||||||
|
## Domanda
|
||||||
|
|
||||||
|
Lo scettico d'esecuzione dell'onda intraday aveva segnalato: il vol-target di PREVDAY fa ~8500
|
||||||
|
ribilanciamenti/anno per gamba, 97-98% < $1 di nozionale a $600; a quel capitale (min_order $5) NON
|
||||||
|
puoi piazzarli, quindi il libro MODELED (ribilanciamento continuo, frictionless) è una finzione e lo
|
||||||
|
Sharpe modellato è gonfiato. Il forward-monitor traccia MODELED-$2000 vs REAL-$600 per misurarlo nei
|
||||||
|
mesi a venire — qui lo stimiamo SUBITO su tutto lo storico, replicando la STESSA logica dei due libri
|
||||||
|
di `paper_prevday.py` ma sull'intero path 1h (2019-03 → 2026-06, 63.732 barre).
|
||||||
|
|
||||||
|
Due libri identici tranne il fill:
|
||||||
|
- **MODELED**: ribilancia ad ogni barra (fee proporzionale su ogni |Δ|).
|
||||||
|
- **REAL-$C**: salta i ribilanciamenti con nozionale `|Δpos|·leg_cap < $5` (posizione stale →
|
||||||
|
tracking error, ma niente fee sui trade infinitesimi). Sweep C ∈ {600, 2000, 20000}.
|
||||||
|
|
||||||
|
## Risultati
|
||||||
|
|
||||||
|
| libro | FULL Sh | HOLD Sh | CAGR | DD | rebal/yr | skip% | fee-drag/yr |
|
||||||
|
|-------|---------|---------|------|----|---------:|------:|------------:|
|
||||||
|
| MODELED ($∞) | +1.23 | +1.27 | +24.3% | −27% | 17.484 | 0.0% | 2.49% |
|
||||||
|
| REAL-$20k | +1.23 | +1.27 | +24.4% | −27% | 3.747 | 78.6% | 2.47% |
|
||||||
|
| REAL-$2000 | +1.23 | +1.27 | +24.4% | −27% | 677 | 96.1% | 2.42% |
|
||||||
|
| REAL-$600 | +1.22 | +1.26 | +24.2% | −27% | 277 | 98.4% | 2.39% |
|
||||||
|
|
||||||
|
**HAIRCUT $600 (MODELED − REAL): FULL Sharpe +0.01, HOLD-OUT +0.01.**
|
||||||
|
|
||||||
|
Domanda-soldi (l'uplift del blend regge col fill reale?):
|
||||||
|
|
||||||
|
| PV | w | FULL (uplift) | HOLD (uplift) |
|
||||||
|
|----|---|---------------|---------------|
|
||||||
|
| MODELED | 20% | 1.58 (+0.28) | 0.86 (+0.56) |
|
||||||
|
| MODELED | 30% | 1.65 (+0.36) | 1.08 (+0.78) |
|
||||||
|
| **REAL-$600** | 20% | 1.58 (+0.28) | 0.86 (**+0.55**) |
|
||||||
|
| **REAL-$600** | 30% | 1.65 (+0.35) | 1.08 (**+0.77**) |
|
||||||
|
|
||||||
|
(TP01 solo: FULL +1.30, HOLD +0.31.) L'uplift hold-out sopravvive **quasi intatto**.
|
||||||
|
|
||||||
|
## Lettura
|
||||||
|
|
||||||
|
Saltare il **98.4%** dei micro-ribilanciamenti a $600 non costa quasi nulla perché quei trade sono
|
||||||
|
*individualmente infinitesimi*: sia la fee risparmiata sia il tracking-error introdotto sono
|
||||||
|
trascurabili. Il PnL è dominato dai ~50 flip di direzione/anno + la deriva lenta del vol-target, che
|
||||||
|
il libro $600 cattura comunque sui movimenti grandi (la fee-drag passa solo da 2.49% a 2.39%). La
|
||||||
|
"finzione della fee sub-dollaro" è quindi **benigna**: non gonfia lo Sharpe modellato (MODELED e
|
||||||
|
REAL-$600 coincidono a ±0.01). NB: lo Sharpe **non si degrada** scendendo di capitale → l'edge
|
||||||
|
modellato di PREVDAY è eseguibile alla taglia reale; il blocker era altrove.
|
||||||
|
|
||||||
|
## Conseguenza sul verdetto
|
||||||
|
|
||||||
|
Dei 4 blocker che tenevano PREVDAY fuori dal deploy, il **#4 (fill a basso capitale) è SMONTATO**.
|
||||||
|
Restano in piedi i 3 strutturali (dall'onda intraday, non rivalutati qui):
|
||||||
|
1. **hedge-shaped** — l'uplift viene dai regimi TP01-down (uplift +0.79 TP01-down vs +0.20 TP01-up);
|
||||||
|
2. **fallisce il null a corr-zero** — uplift pre-2025 al 20-24° pctl del null di un asset random
|
||||||
|
scorrelato (aggiunge MENO del rumore);
|
||||||
|
3. **tail-luck** — top-5 giorni = 76-83% del PnL delle gambe revert, <10 eventi/anno.
|
||||||
|
|
||||||
|
PREVDAY resta il lead **più solido sull'esecuzione** di tutta la ricerca post-reset (il dubbio più
|
||||||
|
"fisico" è caduto), ma **forward-monitor, non deploy**, finché il track record forward non scioglie
|
||||||
|
hedge/coda/null. Lezione harness: `eval_weights_smallcap` (il gate min-order) va sempre eseguito
|
||||||
|
PRIMA di scartare un lead per "fill irreale" — qui avrebbe evitato di sopravvalutare il blocker #4.
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
# PREVDAY come overlay di tail-hedge sul portafoglio — simulazione d'impatto (NON deploy)
|
||||||
|
|
||||||
|
**Data:** 2026-06-21 (segue la trilogia fill-haircut / turnover-hedge / bootstrap)
|
||||||
|
**Script:** `scripts/portfolio/prevday_overlay.py`
|
||||||
|
**Esito:** a peso 10%, PREVDAY taglia il maxDD FULL del portafoglio **14.3% → 9.9% (−31%)** e alza
|
||||||
|
l'hold-out Sharpe **1.66 → 1.97 (+0.31)**. 10% è vicino all'ottimo di DD. MA è tutto IN-SAMPLE: il
|
||||||
|
prize si materializza solo SE l'edge di PREVDAY persiste forward. PREVDAY resta FORWARD-MONITOR.
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
Simulazione che NON tocca il registry di produzione: prende il portafoglio attivo (TP01 55% + XS01
|
||||||
|
25% + VRP01 20%), riscala i tre sleeve a (1−W) mantenendone le proporzioni, e aggiunge PREVDAY a
|
||||||
|
peso W. Sweep W ∈ {0,5,10,15,20%}. PREVDAY = libro 1h breakout-continuation, parametri congelati,
|
||||||
|
50/50 BTC+ETH, fee 0.10% RT. Outer-join del portafoglio: PREVDAY dal 2018, VRP01 dal 2021, XS01 dal
|
||||||
|
2024 → nel 2019-20 PREVDAY pesa di fatto >W (solo TP01 accanto); nell'hold-out 2025+ (tutti e 4
|
||||||
|
attivi) pesa esattamente ~W → **l'HOLD-OUT è il confronto pulito a "10%"**.
|
||||||
|
|
||||||
|
## Sweep peso overlay
|
||||||
|
|
||||||
|
| peso PREVDAY | FULL Sharpe | FULL DD | HOLD Sharpe | HOLD DD | HOLD ret |
|
||||||
|
|--------------|------------:|--------:|------------:|--------:|---------:|
|
||||||
|
| BASELINE (55/25/20) | 1.68 | 14.3% | 1.66 | 3.4% | +16.7% |
|
||||||
|
| 5% | 1.80 | 11.1% | 1.83 | 3.3% | +17.8% |
|
||||||
|
| **10%** | **1.88** | **9.9%** | **1.97** | 3.3% | **+19.0%** |
|
||||||
|
| 15% | 1.93 | 10.3% | 2.06 | 3.3% | +20.2% |
|
||||||
|
| 20% | 1.95 | 10.6% | 2.09 | 3.4% | +21.4% |
|
||||||
|
|
||||||
|
(PREVDAY standalone: FULL Sh 1.23 / DD 26.7%; HOLD Sh 1.28 / DD 10.8%.)
|
||||||
|
|
||||||
|
## Lettura a 10%
|
||||||
|
|
||||||
|
- **FULL: Sharpe +0.20 (1.68→1.88), maxDD 14.3%→9.9% (−4.4pp ≈ −31%).** Comportamento da tail-hedge:
|
||||||
|
la gamba short ammortizza i crash storici (2019-21, 2022).
|
||||||
|
- **HOLD-OUT: Sharpe +0.31 (1.66→1.97), ret +16.7%→+19.0%, DD 3.4%→3.3% (già bassissimo).** Nel
|
||||||
|
regime recente il beneficio è rendimento/Sharpe, non taglio DD.
|
||||||
|
- **10% ≈ ottimo di DD.** Oltre, lo Sharpe sale ancora (1.93→1.95) ma il maxDD FULL smette di
|
||||||
|
scendere (10.3→10.6%): stai solo aggiungendo rischio direzionale short. Argomento per ~10% in
|
||||||
|
chiave hedge (massimizza il taglio-coda per unità di rischio aggiunto).
|
||||||
|
|
||||||
|
## Per anno (baseline → overlay 10%)
|
||||||
|
|
||||||
|
| anno | ret | DD |
|
||||||
|
|------|-----|----|
|
||||||
|
| 2019 | +11.3 → +15.2 | 10.3 → 8.2 |
|
||||||
|
| 2020 | +51.1 → +53.1 | 8.4 → 6.3 |
|
||||||
|
| 2021 | +32.5 → +28.3 | 5.2 → 4.3 |
|
||||||
|
| 2022 | −3.0 → −1.6 | 3.7 → 3.0 |
|
||||||
|
| 2023 | +11.2 → +11.4 | 9.2 → 9.9 |
|
||||||
|
| 2024 | +24.4 → +25.7 | 3.9 → 3.4 |
|
||||||
|
| 2025 | +12.0 → +12.0 | 3.4 → 3.3 |
|
||||||
|
| 2026 | +4.2 → +6.2 | 2.6 → 2.2 |
|
||||||
|
|
||||||
|
Migliora o pareggia quasi ovunque; costa solo nel toro 2021 (premio d'assicurazione atteso per un
|
||||||
|
hedge) e leggermente sul DD 2023; paga nel bear 2022 e nel 2026.
|
||||||
|
|
||||||
|
## Verdetto
|
||||||
|
|
||||||
|
L'overlay 10% è **attraente in simulazione** — taglia il drawdown FULL di ~31% e alza l'hold-out
|
||||||
|
Sharpe +0.31, con 10% vicino all'ottimo di DD. Ma:
|
||||||
|
1. **È in-sample.** I guadagni assumono che l'edge di PREVDAY persista — il forward-monitor esiste
|
||||||
|
proprio per verificarlo. Questa simulazione quantifica il PRIZE, non lo prova.
|
||||||
|
2. **Outer-join:** il taglio-DD storico è gonfiato dal peso effettivo >10% nel 2019-20; il read
|
||||||
|
pulito a 10% è l'hold-out (prize = Sharpe +0.31).
|
||||||
|
3. Incidentale: il 3-way TP01+XS01+VRP01 baseline qui fa FULL 1.68 / HOLD 1.66.
|
||||||
|
|
||||||
|
**Azione: nessuna.** PREVDAY resta FORWARD-MONITOR (registry di produzione invariato). Quando il
|
||||||
|
track record forward avrà ~2-3 mesi, ri-valutare l'overlay 10% con la stessa metrica (taglio-DD +
|
||||||
|
hold-out Sharpe) su dati VERAMENTE fuori campione. Lo script è il riferimento per quel confronto.
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
# PREVDAY — la fee viene dai FLIP (no free lunch sul turnover) + è un HEDGE, non alpha
|
||||||
|
|
||||||
|
**Data:** 2026-06-21 (follow-up di `2026-06-21-prevday-fill-haircut.md`)
|
||||||
|
**Script:** `scripts/research/intraday/prevday_turnover.py`
|
||||||
|
**Esito:** (1) ridurre il turnover di PREVDAY erode l'edge — la config congelata è già efficiente.
|
||||||
|
(2) Il test long-only inchioda il blocker #1: **tutto il valore di portafoglio è la gamba SHORT** →
|
||||||
|
PREVDAY è un **hedge di regime-down**, non alpha. Resta forward-monitor.
|
||||||
|
|
||||||
|
## Premessa (da fill_haircut)
|
||||||
|
|
||||||
|
Il libro REAL-$600 salta il 98.4% dei ribilanciamenti del vol-target e la fee-drag scende solo
|
||||||
|
2.49% → 2.39%/anno. Quindi la fee (~2.6%/anno) NON viene dal churn sub-dollaro ma dai **~70 flip di
|
||||||
|
direzione/anno**. Un deadband d'esecuzione è inutile; l'unica leva è ridurre i flip a LIVELLO DI
|
||||||
|
SEGNALE. Qui sweep delle leve (buffer, anchor, min-hold) + long-only vs long-short. Libro MODELED
|
||||||
|
(l'haircut di fill è +0.01, irrilevante). Metrica che conta = **uplift hold-out del blend 80/20**.
|
||||||
|
|
||||||
|
## (1) Turnover-reduction — no free lunch
|
||||||
|
|
||||||
|
| config | flip/yr | fee/yr | FULL Sh | HOLD Sh | DD | corrTP | blend HOLD upl |
|
||||||
|
|--------|--------:|-------:|--------:|--------:|---:|-------:|---------------:|
|
||||||
|
| **BASE** (anchor=1, k=0.30, LS) | 70 | 2.59% | +1.23 | +1.27 | −27% | +0.15 | **+0.56** |
|
||||||
|
| k=0.50 | 48 | 1.86% | +1.23 | +0.99 | −15% | +0.20 | +0.40 |
|
||||||
|
| k=0.75 | 32 | 1.31% | +1.06 | +0.13 | −16% | +0.27 | +0.00 |
|
||||||
|
| k=1.00 | 23 | 1.01% | +0.88 | +0.72 | −22% | +0.36 | +0.22 |
|
||||||
|
| anchor=2 | 39 | 1.55% | +0.89 | +0.54 | −22% | +0.25 | +0.20 |
|
||||||
|
| anchor=3 | 27 | 1.14% | +0.67 | −0.18 | −22% | +0.29 | −0.12 |
|
||||||
|
| anchor=5 | 15 | 0.75% | +1.15 | +0.70 | −19% | +0.41 | +0.25 |
|
||||||
|
| min_hold=24h | 70 | 2.59% | +1.22 | +1.37 | −32% | +0.15 | **+0.60** |
|
||||||
|
| min_hold=72h | 65 | 2.39% | +0.86 | +0.67 | −33% | +0.12 | +0.27 |
|
||||||
|
| combo-LT (k.75+anc2+24h) | 16 | 0.79% | +0.79 | +0.69 | −20% | +0.34 | +0.24 |
|
||||||
|
|
||||||
|
- **Allargare buffer/anchor taglia fee e turnover ma l'uplift cala monotonicamente** (k: 0.56→0.40→
|
||||||
|
0.00). Anchor multi-giorno tutto peggio → conferma il "anchor=1 only" del diario. I flip SONO
|
||||||
|
l'edge: meno flip = meno edge.
|
||||||
|
- **min_hold=24h** è l'unico ritocco "quasi gratis" (uplift +0.56→+0.60 a parità di fee) ma
|
||||||
|
**peggiora il DD −27%→−32%** → non vale cambiare una strategia congelata in forward-monitor.
|
||||||
|
- **Verdetto: la config base è già sulla frontiera efficiente turnover↔edge. Si lascia congelata.**
|
||||||
|
|
||||||
|
## (2) Long-only vs long-short — il blocker #1 inchiodato
|
||||||
|
|
||||||
|
| | FULL Sh | HOLD Sh | corrTP | blend HOLD upl | fee/yr |
|
||||||
|
|--|--------:|--------:|-------:|---------------:|-------:|
|
||||||
|
| **long-only** (no short) | **+1.55** | +0.52 | **+0.64** | **+0.09** | 1.30% |
|
||||||
|
| long-short (BASE) | +1.23 | +1.27 | +0.15 | +0.56 | 2.59% |
|
||||||
|
|
||||||
|
La versione **long-only ha Sharpe standalone più ALTO** (1.55 vs 1.23) ma è **correlata +0.64 a TP01
|
||||||
|
e non aggiunge quasi nulla al blend** (+0.09). **Tutto il valore di portafoglio viene dalla gamba
|
||||||
|
SHORT:** la short *abbassa* lo Sharpe standalone (shortare crypto nel toro 2019-24 perde) ma fornisce
|
||||||
|
**tutta** la decorrelazione (corrTP 0.64→0.15) e l'uplift hold-out (0.09→0.56).
|
||||||
|
|
||||||
|
→ **PREVDAY non è alpha: è strutturalmente un HEDGE di crash/regime-down.** Costa nel toro, paga
|
||||||
|
nell'orso (2022, 2025-26 down/chop). È additivo a TP01, che va *flat* nel risk-off ma non *short*.
|
||||||
|
Questo conferma e affina il blocker #1 dell'onda intraday ("l'uplift viene dai regimi TP01-down"):
|
||||||
|
non è solo conditional sui regimi down, è **interamente la gamba short** = una scommessa direzionale
|
||||||
|
che i ribassi continuino.
|
||||||
|
|
||||||
|
## Conseguenza sul verdetto
|
||||||
|
|
||||||
|
- Niente da ottimizzare: la config congelata è già efficiente; nessun cambio.
|
||||||
|
- **Riframing utile:** se PREVDAY un giorno avrà un ruolo, è come **overlay di tail-hedge** (non
|
||||||
|
sleeve-alpha), additivo alla difensività di TP01. Ma resta soggetto agli altri due blocker
|
||||||
|
(fallisce il null a corr-zero; tail-luck: top-5 giorni = 76-83% del PnL delle gambe revert).
|
||||||
|
- **Forward-monitor invariato.** Il test forward decisivo: la gamba short continua a pagare fuori da
|
||||||
|
2022 e 2025-26? Se sì → candidato tail-hedge; se no → era regime-luck.
|
||||||
@@ -0,0 +1,62 @@
|
|||||||
|
# 2026-06-22 — Sweep 65-agenti: crypto -> mercati IB (mercati × timing × anni)
|
||||||
|
|
||||||
|
## Obiettivo (goal utente)
|
||||||
|
Usare >=50 agenti per prendere l'anticipazione crypto->equity e trovare la MIGLIORE soluzione,
|
||||||
|
provando diversi mercati e timing, su piu' anni.
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
- **Dati**: universo IB esteso a **26 ETF certificati** (azioni US/settori/intl/bond/credito/oro/
|
||||||
|
commodity/REIT), cache su disco (`fetch_ib_equities.py` + BROAD2). Crypto BTC/ETH 1h (Deribit).
|
||||||
|
- **Harness onesto** (`crypto_lead_harness.py`): per ogni sessione equity, lead = crypto nella
|
||||||
|
finestra equity-CHIUSO [P 21:00 -> D 13:00 UTC] (overnight; il weekend e' il caso lungo). Predice
|
||||||
|
gap/intraday/full. Metriche: corr, **t incrementale vs sessione equity precedente**, Sharpe
|
||||||
|
eseguibile (sign(lead)*predict, net costi) FULL/IS/OOS, **hit per-anno**.
|
||||||
|
- **Workflow** (`wf_crypto_lead.js`): grid 416 config (2 lead × 26 mercati × 2 giorni × 2 predict ×
|
||||||
|
2 finestre). **52 agenti sweep** -> **12 agenti verifica avversariale** (stress 10bps + OOS 2024+ +
|
||||||
|
multi-anno) -> **1 sintesi**. Totale **65 agenti**, 1.7M token.
|
||||||
|
|
||||||
|
## Risultato
|
||||||
|
|
||||||
|
### Fenomeno fortissimo: crypto overnight -> GAP di apertura equity
|
||||||
|
Cluster coerente in cima, TUTTI predict=gap/overnight, su ogni target risk-on:
|
||||||
|
| lead->target | t-incr | Sh OOS@4bps | @10bps | OOS-recente | anni+ |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| ETH->IWM gap | 17.1 | 2.49 | 1.96 | 2.41 | 7/8 |
|
||||||
|
| ETH->QQQ gap | 17.9 | 2.36 | 1.83 | 2.31 | 7/8 |
|
||||||
|
| ETH->XLK gap | 17.4 | 2.40 | 1.93 | 2.30 | 7/8 |
|
||||||
|
| **BTC->QQQ gap** | 15.0 | 2.31 | 1.78 | 2.16 | **9/9** |
|
||||||
|
| BTC->SPY gap | 14.4 | 2.14 | 1.69(lf) | 2.03 | 9/9 |
|
||||||
|
|
||||||
|
Statisticamente schiacciante (t 14-18, sopra Bonferroni su 416 test), regge stress costi e OOS
|
||||||
|
recente, **positivo 8-9 anni su 8-9**.
|
||||||
|
|
||||||
|
### Ma DUE killer (i verificatori avversariali concordi)
|
||||||
|
1. **NON tradabile via ETF**: il gap e' gia' prezzato all'open dell'ETF -> serve un FUTURE indice
|
||||||
|
tenuto overnight (MNQ/MES/M2K). A $0.5-2k il margin overnight di anche un micro consuma il
|
||||||
|
capitale e rischia la liquidazione su un gap avverso -> **fuori portata per costruzione**.
|
||||||
|
2. **E' RISK-BETA, non alpha**: la finestra-lead crypto e' quasi CONTEMPORANEA al gap (stesso shock
|
||||||
|
macro overnight, equity chiuso). t enorme = co-movimento risk-on/off, non ETH/BTC che *anticipa*.
|
||||||
|
Firma: la forza e' negli anni alta-vol (2022 hit 0.71-0.75), piatta negli anni calmi (2019/21/23).
|
||||||
|
corr ~0.37 -> beta implicito ~37%, alpha residuo piccolo.
|
||||||
|
|
||||||
|
### L'unico tradabile via ETF e' troppo debole
|
||||||
|
ETH->XLE intraday 6h (compri XLE al day-open, chiudi +6h): Sh OOS 0.48@4bps **-> 0.15@10bps** (annuo
|
||||||
|
4.1%->1.0%), t-incr 2.38 **sotto Bonferroni** (~3.5 su 416 test). Edge netto onesto ~ZERO.
|
||||||
|
|
||||||
|
## Verdetto (sintesi multi-agente)
|
||||||
|
**Nessun edge proprietario deployabile a basso capitale.** Il fenomeno crypto->equity-overnight e'
|
||||||
|
statisticamente reale e robustissimo su 9 anni, ma e' (a) risk-beta condiviso, non anticipazione
|
||||||
|
sfruttabile, e (b) catturabile solo con futures overnight, fuori dal nostro capitale. L'unica
|
||||||
|
versione ETF-eseguibile e' dentro il rumore da multiple-testing. Coerente col soffitto del progetto:
|
||||||
|
"niente di nuovo regge" alla verifica onesta.
|
||||||
|
|
||||||
|
**Migliore soluzione (come FENOMENO da forward-monitor, non deploy):** BTC->QQQ gap overnight — la
|
||||||
|
storia piu' lunga (9/9 anni), lead noto prima dell'open. Da monitorare; deployabile solo con capitale
|
||||||
|
~>$20-30k su micro-futures indice e con i costi notturni modellati.
|
||||||
|
|
||||||
|
## Lezione
|
||||||
|
Anche con 65 agenti e una ricerca esaustiva su mercati/timing/anni, la disciplina onesta
|
||||||
|
(tradabilita' al capitale reale + multiple-testing + beta-vs-alpha) riduce un "Sharpe 2.5 su 9 anni"
|
||||||
|
a un non-edge per noi. Il valore della ricerca: aver QUANTIFICATO e CLASSIFICATO il fenomeno
|
||||||
|
(risk-beta overnight) invece di scambiarlo per alpha.
|
||||||
|
Artefatti: `crypto_lead_harness.py`, `wf_crypto_lead.js`.
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
# 2026-06-22 — Crypto × mercati IB: correlazioni e ANTICIPAZIONI (lead-lag)
|
||||||
|
|
||||||
|
## Obiettivo
|
||||||
|
Cercare correlazioni e soprattutto ANTICIPAZIONI tra crypto e mercati IB: un mercato fa capire
|
||||||
|
l'andamento dell'altro? Dati: cache su disco (BTC/ETH Deribit 1h->1d UTC; ETF eq_* con OPEN). Nessun
|
||||||
|
IB online. Disciplina: attenzione ai tranelli di timing daily (crypto chiude 00:00 UTC, US equity
|
||||||
|
21:00 -> lag-0 contaminato), test del segno + OOS + multiple-testing.
|
||||||
|
Script: `crypto_macro_leadlag.py`, `crypto_weekend_signal.py`.
|
||||||
|
|
||||||
|
## (1) Correlazione contemporanea
|
||||||
|
Crypto = asset RISK-ON: corr BTC/ETH ~ **+0.32/0.37** con SPY/QQQ/IWM, **+0.25/0.28** con HYG
|
||||||
|
(credito), **+0.13** GLD, **~-0.02** TLT (bond). Atteso.
|
||||||
|
|
||||||
|
## (2) Lead-lag giornaliero: NIENTE
|
||||||
|
corr(BTC_{t-k}, ETF_t) ha picco a **k=0** (~0.32) e crolla a rumore (±0.05) per |k|>=1. Al daily
|
||||||
|
**nessuno anticipa l'altro** (ne' crypto->equity ne' viceversa). Honest negative.
|
||||||
|
|
||||||
|
## (3) EFFETTO WEEKEND: anticipazione PULITA, significativa, OOS-robusta
|
||||||
|
La crypto si muove Sab+Dom (azionario chiuso) -> quel movimento e' info PRIOR al lunedi'.
|
||||||
|
- **Anticipa il GAP del lunedi'**: corr +0.22/+0.24 (SPY/QQQ/IWM/HYG), hit 59-62%, e **si RAFFORZA
|
||||||
|
OOS (2022+): +0.30/+0.36**. Coerente su 4 ETF (non cherry-pick).
|
||||||
|
- Intraday del lunedi' (open->close) piu' debole ma presente (corr 0.10-0.15, OOS 0.18-0.22).
|
||||||
|
|
||||||
|
### Validazione avversariale
|
||||||
|
- **(A) INCREMENTALE vs venerdi'**: regressione `Mon ~ weekend_crypto + friday_eq`. Coeff weekend
|
||||||
|
crypto significativo ovunque (QQQ gap **t=+4.7**, intr t=+2.9; SPY +4.4/+2.0; IWM +4.7/+2.7);
|
||||||
|
friday_eq NON significativo. -> e' info CRYPTO-SPECIFICA del weekend, non momentum equity.
|
||||||
|
- **(B) TRADABILE** (osservo weekend crypto Dom 24:00, entro Monday OPEN, esco CLOSE, net 4bps):
|
||||||
|
| ETF | hit | Sharpe FULL / IS / OOS22+ | long-flat OOS | ann |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| QQQ | 60% | 1.46 / 1.61 / 1.33 | **1.91** | ~+9-11% |
|
||||||
|
| SPY | 60% | 0.96 / 0.91 / 1.01 | 1.70 | ~+5% |
|
||||||
|
| IWM | 56% | 0.89 / 0.73 / 1.04 | 1.07 | ~+6% |
|
||||||
|
|
||||||
|
## Verdetto
|
||||||
|
**Trovata UNA anticipazione reale**: il weekend crypto anticipa il lunedi' azionario (massimo su QQQ,
|
||||||
|
risk-on/tech). Significativa (t>4 sul gap), incrementale al venerdi', tradabile net costi, **regge e
|
||||||
|
si rafforza OOS**, coerente su piu' ETF. Meccanismo economico sensato: crypto = proxy 24/7 del
|
||||||
|
risk-sentiment; nel weekend l'equity e' chiuso e lunedi' "recupera" la direzione crypto.
|
||||||
|
|
||||||
|
### Caveat onesti
|
||||||
|
- **Capacita' bassa**: ~52 lunedi'/anno, intraday -> ~+9%/yr sul capitale impiegato il lunedi', non
|
||||||
|
una macchina da compounding. E' un segnale TATTICO, non un cornerstone.
|
||||||
|
- Il GAP (t=4.7) e' piu' forte dell'intraday (t=2.9) ma per catturarlo serve entrare PRIMA del Monday
|
||||||
|
open -> via **futures indice IB (MNQ/MES, aperti la domenica sera)**: enhancement eseguibile da
|
||||||
|
validare (cattura gap+sessione).
|
||||||
|
- Multiple-testing 3 ETF x 2 target: ma TUTTI significativi e coerenti -> effetto ampio, non fortuna.
|
||||||
|
- Niente IB online qui (cache); per il deploy servirebbe il feed crypto live la domenica sera.
|
||||||
|
|
||||||
|
## Prossimo (se si procede)
|
||||||
|
Validare la variante FUTURES (MNQ domenica sera -> cattura il gap del lunedi') e il sizing a basso
|
||||||
|
capitale; eventualmente paper-trade. E' la prima ANTICIPAZIONE cross-mercato trovata: crypto come
|
||||||
|
lead di sentiment sul lunedi' equity.
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
# 2026-06-22 — Combo DEPLOYABLE: TP01 (Deribit) + GTAA (IB)
|
||||||
|
|
||||||
|
## Perche'
|
||||||
|
Il combo crypto-pieno (TP01+XS01+VRP01)+GTAA diversificava (Sharpe 1.81), ma XS01/VRP01 sono
|
||||||
|
STAT-MODE (non eseguibili a $600). Validazione del combo ONESTO/eseguibile: solo le gambe deployable
|
||||||
|
a basso capitale — TP01 (gia' armato live su Deribit) + GTAA vt12 (eseguibile su IB, frazioni,
|
||||||
|
switch mensile). `eq_tp01_gtaa_combo.py`. TP01 compoundato sul calendario giorni-di-borsa.
|
||||||
|
|
||||||
|
## Risultati (finestra comune 2019-03 .. 2026-06, ~7y)
|
||||||
|
| | Sharpe | CAGR | volAnn | maxDD |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| TP01 (crypto, Deribit) | 1.25 | 16.4% | 12.9% | 14% |
|
||||||
|
| GTAA vt12 (equity, IB) | 1.12 | 6.0% | 5.3% | 8% |
|
||||||
|
| **blend 50/50** | **1.48** | 11.3% | 7.5% | **8%** |
|
||||||
|
| blend 40/60 (best cap-mix) | 1.52 | 10.2% | 6.6% | 8% |
|
||||||
|
| risk-parity (29c/71e) | 1.52 | 9.1% | 5.9% | 8% |
|
||||||
|
|
||||||
|
**corr TP01<->GTAA = +0.21**. Il blend (1.48-1.52) batte entrambe le gambe (best solo 1.25),
|
||||||
|
maxDD 14%->8%. **DIVERSIFICA anche da deployable.**
|
||||||
|
|
||||||
|
## Caveat onesti
|
||||||
|
- Per-anno 50/50: 2019 2.11, 2020 2.51, 2021 1.66, **2022 -2.64**, 2023 1.40, 2024 1.73, 2025 0.98,
|
||||||
|
2026 0.94. Anni boom iniziali gonfiano lo Sharpe assoluto; il **2022 e' negativo** (trend whipsaw
|
||||||
|
su entrambe le gambe nel bear). Recenti ~0.95. -> il numero robusto e' il GUADAGNO da
|
||||||
|
diversificazione (+0.27 Sharpe del blend vs solo), non il livello assoluto.
|
||||||
|
- **Costo deployability**: crypto-pieno+GTAA = 1.81 vs deployable = 1.48. I ~0.33 di Sharpe persi sono
|
||||||
|
cio' che XS01/VRP01 darebbero se eseguibili (servirebbe ~20k).
|
||||||
|
- **Cross-venue** Deribit+IB: due conti, capitale split. Entrambe switch mensile/basso turnover,
|
||||||
|
frazionabili a $0.5-2k.
|
||||||
|
|
||||||
|
## Verdetto
|
||||||
|
Combo deployable VALIDO: due trend difensivi scorrelati (corr 0.21) su mercati diversi -> Sharpe
|
||||||
|
~1.5 / maxDD ~8%, meglio di ciascuna gamba. E' il candidato concreto per un paper-trade cross-venue.
|
||||||
|
NON risolve EUR50/g (resta capitale), ma e' la migliore configurazione rischio-aggiustata
|
||||||
|
EFFETTIVAMENTE eseguibile trovata finora. Lezione cross-mercato confermata: il salto di qualita' non
|
||||||
|
e' un nuovo alpha ma un SECONDO mercato scorrelato.
|
||||||
|
|
||||||
|
## Prossimo (se si procede)
|
||||||
|
Paper-trade della gamba GTAA su IB (forward-only, come paper_trend per TP01), per validare
|
||||||
|
l'esecuzione cross-venue a rischio zero prima di qualunque capitale reale.
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
# 2026-06-22 — EQ-GTAA01 (trend multi-asset) + COMBO cross-mercato equity×crypto
|
||||||
|
|
||||||
|
## (1) EQ-GTAA01 — trend difensivo multi-asset (GTAA)
|
||||||
|
|
||||||
|
EQ-TREND01 (trend su SPY) taglia il DD. Diversificare le SORGENTI di trend (azioni US/tech/small +
|
||||||
|
bond + oro + high-yield) migliora il rischio-aggiustato. `eq_gtaa_trend.py`: ogni asset gestito col
|
||||||
|
proprio trend long-flat (TSMOM multi-orizzonte), equal-weight tra gli asset disponibili (outer-join,
|
||||||
|
cash dove off/assente). Universo SPY/QQQ/IWM/TLT/GLD/HYG. Causale, netto fee, OOS 2015+.
|
||||||
|
|
||||||
|
| strategia | CAGR | Sharpe (pre15/OOS) | maxDD | corr SPY |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| SPY buy&hold | 9.7% | 0.58 (0.45/0.82) | 55% | — |
|
||||||
|
| EW statico (no trend) | 9.4% | 0.59 | 62% | 0.89 |
|
||||||
|
| SPY-trend mono | 5.5% | 0.56 (/0.78) | 30% | 0.72 |
|
||||||
|
| **GTAA lf vt12%** | 3.8% | **0.64** (0.53/**0.89**) | **15%** | **0.64** |
|
||||||
|
| GTAA vt12 (6-asset, 2016+) | 5.6% | **1.08** | **8%** | 0.60 |
|
||||||
|
|
||||||
|
DD nei bear (GTAA vs SPY): dot-com 32%/49% · GFC **14%/55%** · COVID **10%/34%** · 2022 11%/24%.
|
||||||
|
Marginale vs SPY: corr 0.64; 50/50 uplift +0.041 FULL / **+0.086 OOS** (meglio del mono-SPY). Plateau
|
||||||
|
stabile (Sh 0.55-0.61, DD 25-35%). **Migliore sleeve equity**: Sharpe più alto, maxDD bassissimo
|
||||||
|
(8-15%), corr SPY più bassa (0.64) = diversificatore migliore. Tradeoff: CAGR molto più basso
|
||||||
|
(fortemente difensiva). Caveat: la finestra 6-asset (Sh 1.08) è tutta OOS ma un solo regime (toro).
|
||||||
|
|
||||||
|
## (2) COMBO cross-mercato — equity-trend × crypto
|
||||||
|
|
||||||
|
La via che alza il Sharpe COMPLESSIVO senza nuovo alpha: combinare due book scorrelati.
|
||||||
|
`eq_crypto_combo.py`: crypto = portafoglio attivo TP01+XS01+VRP01 (`StrategyPortfolio.combined_daily`,
|
||||||
|
rinormalizzato); equity = GTAA lf vt12%. Crypto compoundato sul calendario giorni-di-borsa (cattura
|
||||||
|
i weekend). Finestra comune = era crypto (2019-03 .. 2026-06, 1827 giorni di borsa).
|
||||||
|
|
||||||
|
| | Sharpe | CAGR | volAnn | maxDD |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| crypto TP01+XS01+VRP01 | 1.60 | 18.7% | 11.1% | 14% |
|
||||||
|
| equity GTAA vt12 | 1.12 | 6.0% | 5.3% | 8% |
|
||||||
|
| **blend 50/50** | **1.81** | 12.4% | 6.6% | **7%** |
|
||||||
|
| risk-parity (32c/68e) | 1.78 | 10.1% | 5.5% | 8% |
|
||||||
|
|
||||||
|
**Correlazione crypto↔equity = +0.167** (bassissima). Il blend 50/50 fa **Sharpe 1.81 > di ciascuno**
|
||||||
|
(crypto 1.60, equity 1.12), **maxDD dimezzato 14%→7%**. VERDETTO: DIVERSIFICA (blend > miglior solo
|
||||||
|
di +0.21 Sharpe). È il guadagno STRUTTURALE: due fonti di rischio scorrelate alzano il Sharpe
|
||||||
|
complessivo senza cercare un nuovo edge.
|
||||||
|
|
||||||
|
### Caveat onesti
|
||||||
|
- **Finestra crypto corta (~7y) e favorevole**: il crypto Sharpe 1.60 e' alto (regime toro + XS01/VRP01
|
||||||
|
STAT-MODE a storia corta). Gli SHARPE ASSOLUTI sono ottimistici. Ma il PUNTO della diversificazione
|
||||||
|
(corr 0.17, blend > solo, DD dimezzato) è robusto al livello assoluto.
|
||||||
|
- **Cross-venue**: crypto su Deribit, equity su IB → due conti, due percorsi d'esecuzione. A $0.5-2k
|
||||||
|
totali, ogni sleeve è minuscola. La parte equity (GTAA) e la TP01 sono entrambe eseguibili a basso
|
||||||
|
capitale; XS01/VRP01 restano STAT-MODE (il blend "reale" deployable è ~TP01 + GTAA).
|
||||||
|
|
||||||
|
## Lettura strategica
|
||||||
|
Il fronte equity da' due cose: (a) una sleeve difensiva robusta (GTAA, maxDD ~10%), (b) — piu'
|
||||||
|
importante — un DIVERSIFICATORE quasi-scorrelato al crypto che alza il Sharpe del portafoglio
|
||||||
|
complessivo da ~1.6 a ~1.8. Non risolve €50/g (resta capitale), ma e' il primo miglioramento
|
||||||
|
STRUTTURALE del rischio-aggiustato complessivo trovato in tutta la ricerca post-reset, ed e' del tipo
|
||||||
|
giusto (diversificazione vera, non alpha fittizio). Prossimo: validare il combo deployable TP01+GTAA
|
||||||
|
(solo le due gambe eseguibili), e valutare l'operativita' cross-venue.
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
# 2026-06-22 — Fronte EQUITY aperto + EQ-MOM01 (momentum settoriale): NON batte SPY
|
||||||
|
|
||||||
|
## Apertura fronte (branch research/equities-ib)
|
||||||
|
|
||||||
|
Le 4 ondate crypto hanno esaurito gli angoli su BTC/ETH (soffitto ~1.3). L'unico modo di superarlo è
|
||||||
|
un **mercato diverso**. Aperto il fronte azioni/ETF via IB (paper, `gnzsnz/ib-gateway`, read-only).
|
||||||
|
|
||||||
|
**Dati certificati + cache su disco** (`fetch_ib_equities.py` → `data/raw/eq_*.parquet`, ADJUSTED_LAST
|
||||||
|
div+split, gitignored = cache locale; loader `eqlib.py` con lru_cache → ricerca legge da disco, MAI
|
||||||
|
da IB). Universo: 9 SPDR settoriali classici dal **1998 (27.5y)** + XLRE(2015)/XLC(2018) + SPY(1996,
|
||||||
|
30y)/QQQ/IWM/GLD/HYG/TLT. Tutti integri (monotoni, no dup, no spike>50%, 0 gap lunghi).
|
||||||
|
NB bug timestamp risolto: `pd.Timestamp` a risoluzione µs → salvati in secondi, corretti a ms.
|
||||||
|
|
||||||
|
## EQ-MOM01 — momentum cross-sectional settoriale
|
||||||
|
|
||||||
|
Costruzione causale (`eq_sector_momentum.py`): ogni 21g, momentum = blend lookback [63,126,252]g con
|
||||||
|
skip-21 (12-1 classico), z-score cross-sectional. long-only top-k (full-invested, confronto
|
||||||
|
like-for-like con SPY) e long-short (dollar-neutral, test alpha puro). Netto fee, hold-out OOS 2015+.
|
||||||
|
|
||||||
|
### Risultati (9 settori, 1998-2026)
|
||||||
|
| strategia | CAGR | Sharpe (pre15/OOS15+) | maxDD | corr SPY |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| **SPY buy&hold** | 8.2% | **0.51** (0.31/0.82) | 55% | — |
|
||||||
|
| EW 9 settori | 8.9% | 0.56 (0.44/0.76) | 53% | 0.96 |
|
||||||
|
| MOM long top-3 | 7.7% | 0.50 (0.32/0.76) | 47% | 0.85 |
|
||||||
|
| MOM long vol-target 15% | 7.3% | 0.52 | 39% | 0.75 |
|
||||||
|
| **MOM long-short top-3** | −0.9% | **−0.08** (−0.19/0.08) | 32% | −0.20 |
|
||||||
|
|
||||||
|
### Verdetto: NESSUN edge vs SPY
|
||||||
|
- **Long-short Sharpe −0.08** → l'alpha cross-sectional di momentum settoriale è **morto** su 27 anni
|
||||||
|
(decadimento post-2000 noto in letteratura). Niente alpha market-neutral.
|
||||||
|
- **Long-only ≈ SPY**: corr 0.85, **uplift marginale ~0.00** (blend 75/25 +0.012 FULL / +0.001 OOS;
|
||||||
|
50/50 +0.015 / −0.010). È un SPY a beta più basso, non un edge. Plateau stabile ma sempre ~0.50
|
||||||
|
(vs SPY 0.51); sugli 11 settori (2018+) fa peggio (0.69 vs 0.82). Fee-robusto (ma niente da salvare).
|
||||||
|
- L'unico beneficio (maxDD 55%→39%) è del **vol-target**, non del momentum (lo daresti a SPY stesso).
|
||||||
|
|
||||||
|
## Lezione (coerente col progetto)
|
||||||
|
Il momentum **relative-value** è morto anche in equity, come nel crypto (ortho wave). Il baseline
|
||||||
|
equity da battere è SPY buy&hold (Sharpe ~0.51 full / 0.82 OOS), ostico come il toro crypto.
|
||||||
|
|
||||||
|
## Prossimo angolo plausibile (NON ancora testato)
|
||||||
|
L'analogo equity di TP01 (l'unica cosa che ha retto nel crypto = trend DIFENSIVO): **time-series
|
||||||
|
trend su SPY long-flat/long-bonds** — non per battere il CAGR ma per **tagliare il 55% di drawdown**
|
||||||
|
restando vicino al ritorno. È il punto dove vive il valore robusto in equity (e dove il cross-section
|
||||||
|
NON guarda). Da provare con lo stesso gauntlet: marginale vs SPY, OOS lungo, plateau.
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
# 2026-06-22 — EQ-TREND01: trend DIFENSIVO su SPY = edge difensivo REALE (analogo di TP01)
|
||||||
|
|
||||||
|
## Contesto
|
||||||
|
Il momentum cross-sectional settoriale è morto (EQ-MOM01: long-short Sharpe −0.08, long-only ≈ SPY).
|
||||||
|
Ma nel crypto l'unica cosa che ha retto NON era relative-value: era **TP01**, un trend DIFENSIVO che
|
||||||
|
taglia il drawdown. L'equity ha lo stesso buco: SPY buy&hold Sharpe ~0.54 ma maxDD **55%**.
|
||||||
|
|
||||||
|
## Costruzione (causale, stile TP01)
|
||||||
|
`eq_spy_trend.py`. TSMOM multi-orizzonte [21,63,126,252]g, target = frazione di orizzonti in
|
||||||
|
trend-up (allocazione graduale 0..1), opz. vol-target. Posizione decisa a ≤i-1, tenuta da i. Netto
|
||||||
|
fee. Varianti: long-flat (cash in risk-off), long-bonds (TLT, solo 2016+), SMA-200 (Faber). Dati da
|
||||||
|
cache eqlib (ADJUSTED, nessun IB). Periodo 1997-2026, OOS 2015+.
|
||||||
|
|
||||||
|
## Risultati
|
||||||
|
| strategia | CAGR | Sharpe (pre15/OOS) | maxDD | in-mkt |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| SPY buy&hold | 9.0% | 0.54 (0.38/0.82) | 55% | 99% |
|
||||||
|
| **SMA-200 (Faber)** | 7.0% | **0.65** (0.52/0.88) | **29%** | 76% |
|
||||||
|
| TSMOM lf cap1.0 | 5.7% | 0.57 (0.44/0.78) | 30% | 92% |
|
||||||
|
| TSMOM lf vt15% | 5.7% | 0.62 (0.51/0.78) | **25%** | 92% |
|
||||||
|
|
||||||
|
**Drawdown nei bear (TSMOM vs SPY):** dot-com 26%/49% · GFC **19%/55%** · COVID 17%/34% · 2022 16%/24%.
|
||||||
|
|
||||||
|
**Plateau** (long-flat): ogni config Sharpe 0.56-0.65 (> SPY 0.54), maxDD 25-31% (~metà di SPY).
|
||||||
|
SMA-200 il più semplice E il migliore (Sh 0.65, OOS 0.88, DD 29%). **Fee-robusto** (Sh 0.48 a
|
||||||
|
0.10%/lato), basso turnover.
|
||||||
|
|
||||||
|
**Marginale vs SPY:** corr 0.73. blend 50/50 uplift +0.035 FULL / +0.031 OOS (modesto positivo);
|
||||||
|
100% trend uplift −0.012 / −0.041 (nel toro recente la difesa costa).
|
||||||
|
|
||||||
|
## Verdetto: edge DIFENSIVO reale (non alpha) — analogo di TP01
|
||||||
|
- ✅ Sharpe 0.54→0.62/0.65, **maxDD dimezzato** (55%→~27%, nei bear lenti più che dimezzato),
|
||||||
|
plateau robusto, fee-robusto, **eseguibile a $0.5-2k** (switch mensile SPY/cash).
|
||||||
|
- ⚠️ NON genera ritorno (CAGR −2/3pp): è risk-management, come TP01.
|
||||||
|
- ⚠️ I tagli grossi (dot-com/GFC) sono IN-SAMPLE; l'OOS 2015-26 è quasi tutto toro → lì ha seguito
|
||||||
|
SPY a beta minore (ma COVID, OOS, dimezzato). La difesa "serve" nei bear, rari nell'OOS.
|
||||||
|
- ⚠️ long-bonds (TLT) non convince (TLT distrutto 2022).
|
||||||
|
|
||||||
|
## Lettura strategica
|
||||||
|
Primo positivo del fronte equity, e dello stesso TIPO che ha retto nel crypto: trend difensivo, non
|
||||||
|
relative-value. Conferma la lezione cross-mercato: **il valore robusto è nel ridurre il rischio
|
||||||
|
(trend long-flat), non nel battere il buy&hold**. Da solo non risolve €50/g (problema di capitale).
|
||||||
|
|
||||||
|
## Prossimo angolo plausibile
|
||||||
|
**Trend multi-asset / GTAA** sull'universo ETF in cache (SPY/QQQ/IWM + TLT/GLD/HYG): un portafoglio
|
||||||
|
di trend long-flat su classi d'attivo diverse di solito batte il trend mono-SPY sul rischio-aggiustato
|
||||||
|
(diversificazione dei trend). + domanda cross-mercato: la sleeve equity-trend DIVERSIFICA il
|
||||||
|
portafoglio crypto (TP01+XS01+VRP01)? (esecuzione split Deribit+IB).
|
||||||
@@ -0,0 +1,96 @@
|
|||||||
|
# 2026-06-22 — Funding-CARRY cross-sectional su Hyperliquid (FC01): LEAD fragile, NON regge
|
||||||
|
|
||||||
|
## Contesto
|
||||||
|
|
||||||
|
Onda "nuova ricerca mirata" (l'utente ha chiesto di cercare un angolo non coperto dalle due grandi
|
||||||
|
ondate — sweep 104-ipotesi e ortho relative-value, entrambe esaurite sul *prezzo* BTC/ETH). L'unico
|
||||||
|
meccanismo con una **fonte di ritorno diversa** non ancora testato su dati certi è il **carry da
|
||||||
|
funding**: incassare il cashflow dei perp stando delta-neutral.
|
||||||
|
|
||||||
|
### Scan di fattibilità dati (prima di tutto, lezione v2.0.0)
|
||||||
|
- **Funding price-clock** (drift attorno agli stamp 00/08/16) sul feed Deribit certificato →
|
||||||
|
già testato nell'onda intraday (`agent_03_funding_clock_15m`) = **FAIL** ("il funding è un cashflow
|
||||||
|
perp-vs-spot; il prezzo index non ha drift tradabile attorno allo stamp al netto del trend").
|
||||||
|
- **Funding carry su Deribit** (dove eseguiamo) → ccxt `fetch_funding_rate_history` = **0 righe**
|
||||||
|
(bloccato), Cerbero MCP espone solo `get_historical` (candele), endpoint funding = 404.
|
||||||
|
- **Funding carry su Hyperliquid** → API pubblica `/info {"type":"fundingHistory"}` = **disponibile**,
|
||||||
|
oraria, tokenless, serie native dal 2023-05. HL è già l'universo certificato di XS01.
|
||||||
|
|
||||||
|
### Dato scaricato e certificato
|
||||||
|
`scripts/research/fetch_hl_funding.py` (backoff anti-429) → **19 major** (gli stessi di XS01),
|
||||||
|
`data/raw/hlfund_<sym>_1h.parquet`. Certificazione: cadenza ~1h, **0 gap**, copertura 98-100%,
|
||||||
|
funding annualizzato per asset da **APT +1.0%** a **NEAR +21.6%** (mediana ~+11.7%). Pochi `cap_hit`
|
||||||
|
(ore con |funding|>0.06%/h) su INJ/TIA/SEI, plausibili in alt ad alta vol. Dato pulito.
|
||||||
|
|
||||||
|
## Ipotesi e costruzione (FC01)
|
||||||
|
|
||||||
|
Book dollar-neutral che **SHORTA i k perp ad alto funding** e **COMPRA i k a basso** → incassa il
|
||||||
|
premio (chi è long paga il funding). Ritorno perp per un long = `price_ret − funding`. Causale come
|
||||||
|
XS01: ogni H=10 giorni, segnale = media causale del funding giornaliero realizzato sugli ultimi L
|
||||||
|
giorni (shift 1), rank cross-section, vol-target 20%, fee 0.05%/lato sul turnover.
|
||||||
|
`scripts/research/funding_carry_hl.py`. Domanda chiave: **edge reale e ORTOGONALE a XS01**, o XS01
|
||||||
|
travestito? (gli alt ad alto funding sono spesso i pompati = quelli che XS01 *compra*; qui li
|
||||||
|
*shortiamo* → potenziale anti-correlazione, oppure il carry domina).
|
||||||
|
|
||||||
|
## Risultati
|
||||||
|
|
||||||
|
### Premio reale ma direzione-dipendente
|
||||||
|
`carry` (short alto-funding) batte sistematicamente `anti` (long alto-funding, sempre molto negativo)
|
||||||
|
→ **il premio di funding esiste**: shortare i perp ad alto funding paga, in aggregato.
|
||||||
|
|
||||||
|
### Ma il book NON regge il gauntlet (19 asset, 2024-2026, 904g)
|
||||||
|
- **Standalone base (L=7 k=5): FULL Sharpe −0.12, in-sample 0.44, HOLD −0.50, DD 28.6%**, −2.8%/anno.
|
||||||
|
Decadimento netto: 2024 **+0.44** → 2025 −0.06 → 2026 **−1.42**.
|
||||||
|
- Correlazioni: TP01 −0.02, **XS01 −0.19** (ortogonale, come da ipotesi — NON è XS01 travestito),
|
||||||
|
VRP01 +0.05.
|
||||||
|
- **`marginal_vs_tp01` = DILUTES**: `has_insample_edge=False` (in-sample 0.44 < 0.5),
|
||||||
|
`multicut_persistent=False`, blend w25 uplift FULL −0.21 / HOLD −0.39.
|
||||||
|
- **Non aggiunge a XS01**: uplift w25 FULL −0.04 / HOLD −0.19.
|
||||||
|
|
||||||
|
### Il colpo di grazia: FRAGILITÀ all'universo
|
||||||
|
Un preview su 17 asset (mancavano NEAR e AAVE) dava FULL **+0.62**, ADDS, +0.22 uplift — un PASS
|
||||||
|
tentatore. Sui 19 completi: **DILUTES**. Jackknife lascia-fuori-uno (base L=7 k=5):
|
||||||
|
|
||||||
|
```
|
||||||
|
19 asset: FULL -0.12 HOLD -0.50
|
||||||
|
-SUI FULL -0.39 ... -BTC FULL +0.17
|
||||||
|
-SEI FULL -0.31 -AAVE FULL +0.26
|
||||||
|
-BNB FULL -0.29 -NEAR FULL +0.30
|
||||||
|
=> FULL oscilla in [-0.39, +0.30] togliendo UN solo asset (range 0.70), attraversa lo zero.
|
||||||
|
```
|
||||||
|
|
||||||
|
Togliere **NEAR o AAVE** (i due assenti nel preview) **recupera il segno** → il preview era fortunato
|
||||||
|
*proprio* perché quei due non c'erano ancora. **Un edge robusto non cambia segno per un singolo nome.**
|
||||||
|
Le poche celle "buone" del plateau (es. L=7 k=3: HOLD 0.91) hanno **in-sample debole + hold-out forte**
|
||||||
|
= la firma del hold-out-luck che la metodologia indurita uccide.
|
||||||
|
|
||||||
|
## Perché fallisce (meccanismo)
|
||||||
|
|
||||||
|
Tensione fondamentale **carry vs momentum**: il funding-carry shorta i forti (alto funding = domanda
|
||||||
|
long aggressiva), ma in un mercato alt toro i forti **continuano a correre** (NEAR/AAVE: alto funding
|
||||||
|
*e* prezzo su → shortarli perde più del premio incassato). Il premio di funding è reale in aggregato,
|
||||||
|
ma il book cross-sectional equal-weight top-k è dominato da pochi nomi a funding estremo che *anche*
|
||||||
|
trendano, e su 2.5 anni / 19 nomi questo basta a ribaltare il segno.
|
||||||
|
|
||||||
|
## Verdetto
|
||||||
|
|
||||||
|
**FC01 NON è uno sleeve.** Né deploy (è STAT-MODE: 10 gambe market-neutral, non eseguibile a $600),
|
||||||
|
né lead affidabile: fragile all'universo (sign-flip su un nome), DILUTES vs TP01, non aggiunge a XS01,
|
||||||
|
in-sample edge < 0.5, niente persistenza multi-cut, decadimento 2026. Conferma — di nuovo — il
|
||||||
|
soffitto del progetto: promettente su un sottoinsieme fortunato, collassa sotto il gauntlet onesto.
|
||||||
|
**Win metodologico:** lo scorer indurito + il jackknife d'universo hanno intercettato un falso
|
||||||
|
positivo che il preview a 17 asset avrebbe promosso.
|
||||||
|
|
||||||
|
## Lascito / lavoro futuro (NON inseguire ora)
|
||||||
|
- I 19 parquet funding (`hlfund_*`) restano certificati per ricerca futura. Il fetcher NON va in cron
|
||||||
|
(FC01 fallito → niente da monitorare in forward).
|
||||||
|
- Idee se mai si tornasse sul carry (NON ora): (a) **gate sul LIVELLO** di funding (short solo quando
|
||||||
|
estremo, regime-filter alla VRP01 IV-rank) invece dello short-top-k incondizionato; (b) cap sul peso
|
||||||
|
per-nome / neutralizzazione momentum per togliere il dominio NEAR/AAVE. Entrambe rischiano
|
||||||
|
overfitting su storia corta — soglia di prova alta.
|
||||||
|
|
||||||
|
## Nota IB (thread parallelo, stessa sessione)
|
||||||
|
Esplorato come fonte per il **basis CME crypto** (cugino eseguibile del carry). Gateway paper
|
||||||
|
`gnzsnz/ib-gateway` su `127.0.0.1:4002` (read-only, `docker-compose.yml`), sonda `ib_probe.py`.
|
||||||
|
Esito dati: **backtest del basis NON fattibile** (ContFuture back-adjusted; contratti scaduti = 1
|
||||||
|
barra). IB resta valido per esecuzione/forward, non per scoprire l'edge. Dettagli nel corpo sessione.
|
||||||
@@ -0,0 +1,33 @@
|
|||||||
|
# 2026-06-23 — Combo DEPLOYABLE in PAPER: TP01 (Deribit) + GTAA (IB), cross-venue
|
||||||
|
|
||||||
|
## Decisione
|
||||||
|
Dopo aver esaurito (onestamente) la ricerca di nuovi edge e anticipazioni cross-mercato, l'unica cosa
|
||||||
|
VERA e deployabile e' la DIVERSIFICAZIONE: TP01 (crypto, Deribit) + GTAA (equity, IB), corr ~0.21 ->
|
||||||
|
blend Sharpe ~1.5, maxDD dimezzato (diari 2026-06-22-deployable-combo). Si va in PAPER cross-venue.
|
||||||
|
|
||||||
|
## Costruito
|
||||||
|
- **`src/portfolio/gtaa.py`** — GTAA come sleeve di prima classe: trend difensivo long-flat TSMOM
|
||||||
|
[21/63/126/252g], vol-target 12%, EW su SPY/QQQ/IWM/TLT/GLD/HYG. Espone `gtaa_returns()` (Sharpe
|
||||||
|
full 0.64, 7542 barre 1996+) e `gtaa_weights()` (pesi ETF CORRENTI azionabili). Legge cache eq_*.
|
||||||
|
- **`scripts/live/paper_combo.py`** — paper-tracker FORWARD-ONLY del blend 50/50 TP01+GTAA (crypto
|
||||||
|
compoundato sul grid giorni-di-borsa). Stato in data/paper_combo/. Mostra le posizioni azionabili
|
||||||
|
su entrambi i venue. SOLO le gambe eseguibili (XS01/VRP01 STAT-MODE esclusi).
|
||||||
|
- **`fetch_ib_equities.py --only SPY,QQQ,...`** — refresh mirato dei 6 ETF GTAA (per il cron).
|
||||||
|
- **`scripts/cron_daily.sh`** — aggiunto: up gateway IB (idempotente) -> refresh ETF GTAA ->
|
||||||
|
avanza paper_combo. Dipendenza cross-venue gestita (gateway paper sempre-up, restart unless-stopped).
|
||||||
|
|
||||||
|
## Stato iniziale (2026-06-23)
|
||||||
|
Paper combo init a 2000, forward da 2026-06-22. Posizioni azionabili:
|
||||||
|
- TP01 (Deribit): BTC/ETH 0.0x (flat, TSMOM risk-off — coerente col live).
|
||||||
|
- GTAA (IB): SPY 13% / QQQ 8% / IWM 9% / TLT 17% / GLD 2% / HYG 17% / cash 34% (difensivo).
|
||||||
|
Catena end-to-end testata: gateway -> refresh ETF -> avanza paper. OK.
|
||||||
|
|
||||||
|
## Onesta'
|
||||||
|
- E' PAPER (rischio zero). Valida l'OPERATIVITA' cross-venue prima di capitale reale.
|
||||||
|
- Sharpe atteso ~1.5 e' ottimistico (finestra crypto corta/favorevole); il dato robusto e' la
|
||||||
|
diversificazione (corr 0.21, DD dimezzato), non il livello assoluto.
|
||||||
|
- A capitale reale e' un portafoglio su DUE conti (Deribit ~$600 + IB); GTAA frazionabile a basso
|
||||||
|
capitale, TP01 gia' armato. Prossimo passo eventuale: dashboard del combo + (molto dopo) capitale.
|
||||||
|
|
||||||
|
## Prossimo
|
||||||
|
Lasciar girare il paper forward (cron giornaliero) e ricontrollare l'equity tra qualche settimana.
|
||||||
@@ -0,0 +1,38 @@
|
|||||||
|
# 2026-06-23 — Cross-market crypto-lead OLTRE l'SP500: bond, commodity, indici esteri -> niente
|
||||||
|
|
||||||
|
## Obiettivo
|
||||||
|
Estendere il test "crypto anticipa il mercato?" oltre SP500/azionario USA: commodity, bond, indici
|
||||||
|
ESTERI (Europa/Asia, fasi orarie diverse = il caso a priori piu' favorevole a un lead vero).
|
||||||
|
|
||||||
|
## Dati (IB, orari, cache fut_*_1h)
|
||||||
|
ES/NQ/RTY (gia'); + ZN (T-note 10y), ESTX50 (Euro Stoxx50), DAX, NKD (Nikkei). Storia ~2-2.4y (2024+).
|
||||||
|
Commodity GC/CL/HG: VUOTE (market-data subscription COMEX/NYMEX mancante sul paper) -> non testate.
|
||||||
|
|
||||||
|
## Test (`fut_leadlag_generic.py`): crypto[T-8h->T] -> future[T->T+6h], non-sovrapposto, controllo=moto proprio future
|
||||||
|
- ES/NQ/RTY: nessun edge (gia' noto).
|
||||||
|
- ZN (bond): NEGATIVO (0/3 anni).
|
||||||
|
- NKD (Nikkei): debole (t_crypto 0.2, Sharpe 0.66 ~ overnight drift, non crypto).
|
||||||
|
- **ESTX50 / DAX: forte all'apparenza** — BTC->T0h: t_crypto ~7.8, Sharpe 2.5, ann ~22%, 3/3 anni.
|
||||||
|
|
||||||
|
## Ma e' un ARTEFATTO DI CONFINE UTC (deep-dive `eu_overnight_deepdive.py`)
|
||||||
|
- **Picco a coltello a T=00:00 UTC**: t/Sharpe salgono T20->T0 (2.5->7.8 / 0.24->2.45) e CROLLANO a
|
||||||
|
T=1h (t 1.3, Sharpe -0.09). Un lead vero non e' a coltello su una sola ora.
|
||||||
|
- **GAP test**: inserendo 1h tra fine-segnale (00:00) e inizio-cattura, l'effetto MUORE
|
||||||
|
(Sharpe 2.45 -> -0.52, t 7.8 -> 1.6).
|
||||||
|
- **Singola ora**: T=0h/H=1h (cattura 00:00->01:00) Sharpe +2.93 (t 8.7); T=1h/H=1h (01:00->02:00)
|
||||||
|
Sharpe -1.02. L'INTERO "edge" e' la barra di confine 00:00->01:00.
|
||||||
|
- vs SEMPRE-LONG: always-long overnight e' negativo (-0.8/-1.2), quindi non e' overnight-drift; ma
|
||||||
|
l'uplift del crypto e' tutto nella barra di confine.
|
||||||
|
-> Firma esatta di `day_boundary_robust` (CLAUDE.md): effetto che vive/muore spostando il confine del
|
||||||
|
giorno UTC di poche ore = etichettatura/contaminazione, NON anticipazione economica.
|
||||||
|
|
||||||
|
## Verdetto
|
||||||
|
NIENTE di tradabile oltre l'SP500 nemmeno. Su TUTTI i mercati il legame crypto->X e' o co-movimento
|
||||||
|
contemporaneo (risk-beta) o artefatto di confine. L'anticipazione crypto->altri-mercati sfruttabile
|
||||||
|
NON esiste su dati onesti (finestre non-sovrapposte + boundary-robust + gap). Conferma definitiva del
|
||||||
|
soffitto del progetto, ora anche cross-mercato.
|
||||||
|
|
||||||
|
## Cosa resta di valore (immutato)
|
||||||
|
La diversificazione TP01(crypto)+GTAA(equity), corr 0.21 -> Sharpe portafoglio ~1.5, DD dimezzato.
|
||||||
|
Quello e' strutturale e deployabile; l'anticipazione cross-mercato no.
|
||||||
|
Script: fetch_ib_futures.py (multi-exchange), fut_leadlag_generic.py, eu_overnight_deepdive.py.
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
# 2026-06-23 — "Monitor Deribit / trade IB": il gap crypto->equity e' LOOK-AHEAD
|
||||||
|
|
||||||
|
## Idea testata (utente)
|
||||||
|
Guardare crypto live su Deribit (24/7) e tradare l'indice su IB sul segnale del gap overnight.
|
||||||
|
|
||||||
|
## Trappola trovata
|
||||||
|
Il segnale crypto [P 21:00 -> D 13:00 UTC] e il "gap" equity [P close -> D open 13:30] coprono QUASI
|
||||||
|
LE STESSE ORE. Condizionare il gap sul crypto-overnight = correlare due ritorni dello STESSO intervallo
|
||||||
|
notturno -> look-ahead. All'entrata (D 13:00, pre-open) il gap e' GIA' avvenuto: non catturabile.
|
||||||
|
|
||||||
|
## Prova (net 2bps, sqrt(252))
|
||||||
|
| target | OVERLAP gap (look-ahead) | TRADABILE intraday (post-entrata) |
|
||||||
|
|---|---|---|
|
||||||
|
| SPY | Sharpe 3.60 (OOS 5.23) | -0.03 (OOS 0.12) |
|
||||||
|
| QQQ | Sharpe 4.01 (OOS 5.47) | 0.25 (OOS 0.43) |
|
||||||
|
| IWM | Sharpe 3.98 (OOS 5.72) | 0.15 (OOS 0.44) |
|
||||||
|
|
||||||
|
Lo "Sharpe 5" e' artefatto. L'edge REALE tradabile via ETF (intraday, entri all'open) ~0, muore a costi.
|
||||||
|
NB: anche i Sharpe "gap" del workflow 65-agenti erano (a) look-ahead di overlap e (b) sotto-annualizzati
|
||||||
|
(sqrt(52) invece di sqrt(252)); il verdetto "non deployabile" resta, rafforzato.
|
||||||
|
|
||||||
|
## Cosa resta possibile (non testato, serve dato)
|
||||||
|
L'unica versione onesta dell'idea: entrare a META' notte via FUTURES IB e vedere se crypto [P21:00->T]
|
||||||
|
predice il future indice [T->open] su finestre NON sovrapposte (crypto come sensore di rischio piu'
|
||||||
|
veloce). Richiede dati INTRADAY dei futures (ES/NQ/RTY), non in cache -> data step se si vuole indagare.
|
||||||
|
|
||||||
|
## Lezione
|
||||||
|
Un risultato "troppo bello" (Sharpe 5) e' un test di disciplina: era overlap di finestre. Catturato.
|
||||||
|
Script: crypto_overnight_equity.py (versione artefatto), crypto_overnight_honest.py (decomposizione).
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
# 2026-06-23 — "Monitor Deribit / trade IB" su futures: test ONESTO non-sovrapposto -> edge ~0
|
||||||
|
|
||||||
|
## Idea
|
||||||
|
Monitorare crypto live (Deribit 24/7) ed entrare sul FUTURE indice IB (ES/NQ/RTY, tradato di notte)
|
||||||
|
a meta' notte, catturando il moto SUCCESSIVO -> finestre NON sovrapposte (no look-ahead, vs il "gap"
|
||||||
|
che era contemporaneo al segnale).
|
||||||
|
|
||||||
|
## Dati
|
||||||
|
`fetch_ib_futures.py` -> data/raw/fut_{es,nq,rty}_1h.parquet (ContFuture orario, UTC). ES 3y (2023-06+),
|
||||||
|
NQ 2.75y, RTY 2.3y. (NB: ContFuture NON accetta endDateTime -> chiamata singola "4 Y" = ~3y max orari.)
|
||||||
|
|
||||||
|
## Test (`fut_overnight_leadlag.py`)
|
||||||
|
entrata a T (ora UTC notturna): segnale = crypto[P21:00->T]; controllo = future[P21:00->T] (moto
|
||||||
|
PROPRIO del future); cattura = future[T->open 13:00]. Incrementale: crypto predice la cattura OLTRE il
|
||||||
|
moto proprio del future? Trade: sign(crypto[P21:00->T]) * future[T->open], net 2bps. T in {0,3,6,9}h.
|
||||||
|
|
||||||
|
## Risultati
|
||||||
|
| future | miglior Sharpe (trade crypto) | t_crypto incrementale | esito |
|
||||||
|
|---|---|---|---|
|
||||||
|
| ES (S&P500) | ~0 / negativo (-0.03..-0.93) | 0..1.5 | NESSUN edge |
|
||||||
|
| NQ (Nasdaq) | 0.41 (T=3h) | 0.5 (debole) | momentum del future, non crypto |
|
||||||
|
| RTY (Russell) | 0.40-0.77 | 2.0-2.7 (BTC->RTY) | soffio debole, non robusto |
|
||||||
|
|
||||||
|
- **SP500: NIENTE.** Il crypto della prima notte non predice l'ES della seconda. Il "Sharpe 5" del gap
|
||||||
|
era interamente look-ahead (finestre sovrapposte): catturato e ucciso.
|
||||||
|
- **RTY (small-cap)** e' l'unico con t_crypto incrementale ~2-2.7 e crypto che AGGIUNGE oltre il moto
|
||||||
|
proprio del future (futOwn Sharpe negativo). MA: Sharpe 0.4-0.5 modesto, 24 config (multiple-testing),
|
||||||
|
storia 2.3y, per-anno INCOERENTE (BTC->RTY T=3h: 2024 +0.99 / 2025 +0.52 / 2026 -0.31).
|
||||||
|
|
||||||
|
## Verdetto
|
||||||
|
L'idea "monitor Deribit / trade IB" NON da' un edge tradabile, men che meno su SP500. Il forte
|
||||||
|
fenomeno crypto<->equity e' CO-MOVIMENTO contemporaneo (risk-beta overnight), non anticipazione: quando
|
||||||
|
si impone una finestra causale non-sovrapposta, l'edge svanisce (efficienza di mercato). L'unico
|
||||||
|
residuo (crypto->small-cap overnight) e' debole, borderline su multiple-testing e instabile per anno
|
||||||
|
-> forward-monitor al piu', NON deploy. Coerente col soffitto del progetto.
|
||||||
|
|
||||||
|
Script: fetch_ib_futures.py, fut_overnight_leadlag.py. (look-ahead documentato: 2026-06-23-crypto-overnight-lookahead.md)
|
||||||
@@ -0,0 +1,141 @@
|
|||||||
|
# 2026-06-23 — SKH01 "Skyhook": porting onesto del sistema ES dual-timeframe su BTC/ETH
|
||||||
|
|
||||||
|
Branch: `strategy_skyhook`. Engine: `src/strategies/skyhook.py`. Harness: `scripts/research/skyhook/skyhooklib.py`.
|
||||||
|
Test: `tests/test_skyhook.py` (5 pass). Ricerca: `scripts/research/skyhook/{sweep,grid,check_v1}.py` + `runs/`.
|
||||||
|
|
||||||
|
## Il brief
|
||||||
|
|
||||||
|
Sistema "Skyhook" (origine ES / E-mini S&P, genetico, a doppio timeframe), da portare su crypto:
|
||||||
|
- **data2 = 690 min (segnale)**, **data1 = 230 min (esecuzione)**. NB **690 = 3 × 230**.
|
||||||
|
- NON trend-follower: entra **solo** quando coincidono (a) un **regime** di volatilità/volume e
|
||||||
|
(b) un **pattern** di breakout.
|
||||||
|
- Pipeline per barra: indicatori (BuzVola su ATR, BuzVolume su volume, tipo-Chande 0-100) →
|
||||||
|
fasce regime → pattern (Donchian/breakout su data2) → composer (regime AND pattern) →
|
||||||
|
ingresso (max 1/giorno, stop-and-reverse) → uscite (time-based asimmetrico uscitalong=24 /
|
||||||
|
uscitashort=18 + stop/profit).
|
||||||
|
- Ancore demo: trend lineare → **BuzVola=50** (vol steady → neutro), **BuzVolume=100** (volume in rampa).
|
||||||
|
|
||||||
|
## Ricostruzione (fedele + onesta)
|
||||||
|
|
||||||
|
- **Resample dal feed 5m certificato** con `origin='epoch'`: 230 min = 46×5m, 690 min = 138×5m,
|
||||||
|
e i confini 690 sono un **sottoinsieme** dei confini 230 → una barra HTF chiude esattamente su
|
||||||
|
una chiusura LTF. Merge HTF→LTF causale: `merge_asof` backward sulla **chiusura HTF** (≤ chiusura
|
||||||
|
LTF), così una barra HTF è usata solo quando è davvero chiusa. (~2287 barre/anno LTF, ~762 HTF.)
|
||||||
|
- **BuzVola / BuzVolume = `chande01`** (Chande Momentum Oscillator normalizzato 0-100): serie
|
||||||
|
steady → 50, rampa-su → 100, rampa-giù → 0. Le ancore demo sono soddisfatte a livello di
|
||||||
|
indicatore (è la lettura fedele: "vol steady → neutro"). NB: l'EMA-ATR su un *linspace* sintetico
|
||||||
|
dà 100 per drift di warm-up/floating-point, non per comportamento reale — su BTC reale BuzVola
|
||||||
|
oscilla intorno a 50 (EMA-ATR vs SMA-ATR corr 0.90).
|
||||||
|
- **Pattern** = Donchian breakout leak-free (shift(1)) su HTF, `ptn_n` barre (default 13 da 13/13/1).
|
||||||
|
- **Regime** = bande-soglia tunabili su BuzVola/BuzVolume (i magici interi 4/3/2 - 4/2/2 non sono
|
||||||
|
nel brief; ricostruiti come `[vola_lo,vola_hi]` × `[vol_lo,vol_hi]`).
|
||||||
|
- **Composer** = regime AND pattern. **Ingressi** ≤1/giorno (prima barra qualificante).
|
||||||
|
- **Uscite**: time-based asimmetrico (`uscitalong`/`uscitashort` barre LTF) + hard stop/profit. Lo
|
||||||
|
"stop 2000 / profit 5000" in $ del sistema ES → **multipli di ATR LTF** (scale-free): default
|
||||||
|
`sl_atr=2.0`, `tp_atr=5.0` (~ rapporto 40:100 pt ES), con modalità `pct` alternativa.
|
||||||
|
- Engine espresso come **entries `{dir,tp,sl,max_bars}`** per `backtest_signals` (motore onesto del
|
||||||
|
progetto: TP/SL intrabar, max_bars, non-overlap). Causalità verificata con prefix-recompute
|
||||||
|
(0 mismatch).
|
||||||
|
|
||||||
|
## Baseline → V1 (lever scout + grid, inline, veloce)
|
||||||
|
|
||||||
|
- **Baseline** (default 13/13, sl2/tp5, vola[35,95], vol_lo50): causale, fee-surviving, FULL Sharpe
|
||||||
|
BTC +0.91 / ETH +0.64, ma **HOLD-OUT debole** (BTC −0.09 / ETH +0.17) → FAIL del gate onesto.
|
||||||
|
- **Lever scout** (`sweep.py`): gli **short servono** (long_only → HOLD −0.52); il **regime gate
|
||||||
|
conta** (togliere la banda vola → HOLD −0.80); il **floor di volume** a 50 *frenava* l'hold-out
|
||||||
|
(vol_lo=40 o 0 → PASS); **breakout più lento** (ptn_n=55) e **stop più larghi** (sl2.5/tp6)
|
||||||
|
alzano l'hold-out.
|
||||||
|
- **Grid combinato** (`grid.py`): vincitrice **SKH01-V1**
|
||||||
|
`SkyhookParams(ptn_n=55, sl_atr=2.5, tp_atr=6.0, vola_lo=35, vola_hi=95, vol_lo=0.0)`:
|
||||||
|
- **min-asset FULL +0.69, HOLD-OUT +0.64** (BTC 0.64 / ETH 0.64), **PASS**, fee-surviving a 0.30%RT.
|
||||||
|
- BTC FULL +0.69/+275% DD49% ; ETH FULL +1.01/+871% DD31% ; entrambi HOLD-OUT positivi.
|
||||||
|
- **Marginal vs TP01 = ADDS** e regge i gate induriti: **corr 0.06** (ortogonale, NON trend-beta),
|
||||||
|
`has_insample_edge=True` (Sharpe in-sample standalone 1.15), `is_hedge=False`, multi-cut
|
||||||
|
persistente. Blend **0.75·TP01 + 0.25·SKH01: HOLD Sharpe 0.31 → 0.74 (+0.44), DD 11.9%**;
|
||||||
|
blend 50/50 HOLD 0.88, DD 17.8%.
|
||||||
|
- Unico sub-gate fallito: `clean_year_uplift` +0.014 (sotto 0.02) → `earns_slot=False` per un pelo,
|
||||||
|
nonostante tutto il resto sia forte. **Debolezza principale: DD standalone alto (40-49%).**
|
||||||
|
|
||||||
|
→ SKH01 è un **diversificatore quasi-ortogonale** reale (non un TP01 travestito): da solo è
|
||||||
|
volatile, ma come sleeve al 25% migliora moltissimo l'hold-out del portafoglio a DD bassissimo.
|
||||||
|
|
||||||
|
## Onda 1 (`skyhook-improve`, 30 agenti) — winner intermedio
|
||||||
|
|
||||||
|
Famiglie: param (RR, ptn_n, regime bands, exit bars, chande, local), regime-redef (percentile,
|
||||||
|
realized-vol, vol-expansion, LTF), pattern (confirmation, ROC, Keltner, NR, dual), exit + overlay,
|
||||||
|
ognuna verificata da 2 scettici. Risultato: **winner intermedio**
|
||||||
|
`SkyhookParams(ptn_n=45, sl_atr=2.5, tp_atr=7.0, uscitalong=24, uscitashort=16, vola_lo=35, vola_hi=95, vol_lo=0)`
|
||||||
|
— **minFull +0.83, minHold +0.81** (vs V1 +0.69/+0.64), causale, fee-surviving 0.30%RT, marginal
|
||||||
|
**ADDS** (corr 0.05, has_insample_edge, robust_oos, multicut, clean_year_uplift +0.37), blend w25
|
||||||
|
uplift_hold +0.58. **MA standalone maxDD ancora 34% (BTC) / 31% (ETH) → l'unico goal mancato era il DD<30%.**
|
||||||
|
|
||||||
|
## Onda 2 (`skyhook-improve-v2`, 14 famiglie DD-reduction) — SKH01-V2-DD vince
|
||||||
|
|
||||||
|
Obiettivo: tagliare il **DD standalone <30%** tenendo hold-out + `earns_slot`, e alzare l'uplift di
|
||||||
|
portafoglio. 14 famiglie (ensemble param/struct, vol-target, DD kill-switch, RR/stop grid, regime
|
||||||
|
tight, percentile, vol-expansion, breakout confirmation, dual-TF, asimmetria L/S, cadenza, chande,
|
||||||
|
Keltner), ognuna verificata da 2 scettici avversariali (window-luck/multicut/jackknife +
|
||||||
|
causalità/fee/plateau/overfit). Esito: **il winner intermedio cade.** Nuovo campione **SKH01-V2-DD**
|
||||||
|
(famiglia ASYM_LS, `src/strategies/skyhook.py:SKH01_V2_DD`, run `runs/SKH2_ASYM_LS.py`):
|
||||||
|
|
||||||
|
- **Config:** stesso SEGNALE del winner (`ptn_n=45, vola_lo=35, vola_hi=95, vol_lo=0, exit-bars 24/16`)
|
||||||
|
ma EXIT commutati da ATR a **percentuale fissa ASIMMETRICA** — long `sl=4% / tp=10%`, short
|
||||||
|
`sl=2% (più stretto) / tp=8%`. Motivazione meccanica: in crypto lo short si fa steamrollare da uno
|
||||||
|
spike vola e lo stop-ATR si allarga lasciando correre la perdita → il %-SL stretto sullo short
|
||||||
|
**cappa la perdita per-trade** che FORMA il maxDD. (Implementato come override per-direzione nel
|
||||||
|
motore, backward-compatible: campi `*_short=None` → comportamento simmetrico invariato.)
|
||||||
|
- **Numeri veri (verificati indipendentemente via `sk.study(SKH01_V2_DD)`):** standalone maxDD
|
||||||
|
**BTC 21.4% / ETH 27.4%** (<30% ✓, vs 34.4/30.5 del winner) — **goal RAGGIUNTO**; minFull **+0.99**,
|
||||||
|
minHold **+1.26**; causalità **0/400** entrambi gli asset; fee@0.30%RT BTC +1.05 / ETH +0.80
|
||||||
|
(positiva anche a 0.40%). Marginal vs TP01 **ADDS** (corr 0.09, has_insample_edge, is_hedge=False,
|
||||||
|
robust_oos, multicut, clean_year_uplift +0.57). **Blend 0.75·TP01 + 0.25·SKH: uplift_hold +0.87**
|
||||||
|
(vs +0.58 del winner); **blend 50/50: full 1.84 / hold 1.59 / DD 10.7%**. earns_slot=True,
|
||||||
|
beats_winner=True. **Plateau reale** (i vicini Spct_mb14/16 sl2% tengono DD 27-28%), non knife-edge.
|
||||||
|
Entrambi gli scettici: holds_up=True, confidence high, killer_finding=null.
|
||||||
|
|
||||||
|
**Top-3 dell'onda 2 (criteri onesti):**
|
||||||
|
|
||||||
|
| # | Famiglia | maxDD (BTC/ETH) | minHold | w25 uplift_hold | Verifica |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| **1** | **ASYM_LS → SKH01-V2-DD** | 27.4% (21.4/27.4) | +1.26 | **+0.87** | 2/2 high, killer=null ✅ |
|
||||||
|
| 2 | ENS_STRUCT (3-regime ensemble) | **22.9%** (21.2/22.8) | +1.00 | +0.67 | 2/2 high — ma 3 motori da eseguire |
|
||||||
|
| 3 | TPSL_DD (%-SL/TP hard) | 28.0% (28/25.5) | +1.11 | +0.75 | 1/1 (rate-limit) — caveat hedge-like |
|
||||||
|
|
||||||
|
**Lezioni anti-DD:**
|
||||||
|
- **Ha funzionato (STRUTTURA dell'exit, non i parametri):** cambiare il MECCANISMO di uscita — %-SL
|
||||||
|
hard, asimmetria L/S, o ensemble di exit/regime diversi (decorrelazione). Il DD del winner nasce
|
||||||
|
dalla coda intra-trade negli spike ATR; il %-SL la cappa.
|
||||||
|
- **NON ha funzionato (la leva non raggiunge il DD vincolante):** DD kill-switch entry-only (sopprime
|
||||||
|
solo le NUOVE entry, non chiude il trade aperto che forma il maxDD → floor 33-36%); vol-target
|
||||||
|
causale (DD<30 e uplift≥0.55 mutuamente esclusivi; cap>1 PEGGIORA il DD levereggiando nel pre-crash);
|
||||||
|
cadenza/FREQ (accorciare gli hold short fa esplodere ETH a 50-66%); dual-TF (LTF è resample dello
|
||||||
|
stesso prezzo → quasi-tautologico, DD invariato).
|
||||||
|
- **Bocciato dagli scettici come overfit:** PATTERN_CONF (sub-30 solo a vola_lo=45, knife-edge: sl_atr
|
||||||
|
±0.5 → ETH 40-47%; la conferma "close_loc" da sola NON taglia il DD). Esempio canonico del perché
|
||||||
|
serviva la doppia verifica.
|
||||||
|
- **Non promuovibili:** PCTL_DD (numeri spettacolari ma **0 verifiche**, le 2 sono morte per rate-limit
|
||||||
|
→ forward-monitor, non fidato); ENS_PARAM / TPSL_DD (battono i gate ma uplift recency/hedge-loaded,
|
||||||
|
concentrato nei regimi TP01-down → forward-monitor).
|
||||||
|
|
||||||
|
**Promozione (questa sessione):** `SKH01_V2_DD` canonico nel motore + override exit-short
|
||||||
|
asimmetrici (backward-compatible, V1/winner invariati) + 3 test nuovi (8/8 pass).
|
||||||
|
|
||||||
|
**Sleeve cablato @0.25 effettivo** (`src/portfolio/sleeves.skyhook_sleeve` → `active_sleeves`): i tre
|
||||||
|
sleeve preesistenti scalati nel restante 0.75 mantenendo il rapporto 55:25:20 → **TP01 41.25% / XS01
|
||||||
|
18.75% / VRP01 15% / SKH01 25%**. Report del portafoglio (4 sleeve, `run_portfolio.py`):
|
||||||
|
|
||||||
|
| | FULL Sharpe | FULL DD | HOLD-OUT Sharpe | HOLD-OUT DD |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 3 sleeve (TP01+XS01+VRP01) | 1.68 | 14.3% | 1.63 | 3.4% |
|
||||||
|
| **+ SKH01 @25%** | **2.13** | **7.8%** | **2.30** | 3.5% |
|
||||||
|
| Δ | **+0.45** | **−6.5pt** | **+0.67** | ~0 |
|
||||||
|
|
||||||
|
→ aggiungere Skyhook **alza lo Sharpe full +0.45 e DIMEZZA il DD full (14.3→7.8%)**, e alza l'hold-out
|
||||||
|
+0.67 a DD invariato. Portafoglio combinato: FULL Sh 2.13 / ret +365% / DD 7.8%, HOLD Sh 2.30 / DD 3.5%,
|
||||||
|
positivo ogni anno (2019-26, DD annuo ≤7.8%) vs buy&hold 50/50 FULL Sh 0.93 / DD 76%.
|
||||||
|
|
||||||
|
**Caveat onesti / NON deploy:** è un portafoglio di **ricerca** (peso fisso, no costi di ribilanciamento
|
||||||
|
reale a $600; lo Sharpe daily-step di Skyhook è la convenzione del lens). ETH DD standalone 27.4% ha
|
||||||
|
margine sottile vs 30%. Prima di un eventuale deploy: ri-verificare la causalità sul **codice di
|
||||||
|
esecuzione reale** (qui è l'harness di ricerca) e i costi del book a 230m (ribilanciamento più frequente
|
||||||
|
del resto). XS01/VRP01 restano STAT-MODE/lead. Per ora: research win + sleeve cablato, forward-monitor.
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
# 2026-06-23 — Tail-hedge / protezione DD del combo (incl. OPZIONI): vince la guardia-drawdown
|
||||||
|
|
||||||
|
## Obiettivo (goal utente)
|
||||||
|
Trovare uno sleeve/overlay da AGGIUNGERE al combo (TP01+GTAA) per proteggere il drawdown e gli anni
|
||||||
|
tipo 2022. Valutare anche le opzioni.
|
||||||
|
|
||||||
|
## Diagnosi del rischio (decisiva)
|
||||||
|
Il MaxDD del combo (1x) e' **8.4%** e il 2022 fu **-4.4%**: NON un crash, un **grind lento** (peggior
|
||||||
|
giorno -2.8%, peggior mese 2022 -1.6%). Il doppio trend (TP01+GTAA long-flat) gia' taglia i crash
|
||||||
|
veloci. Il tail residuo = (a) whipsaw da mercato choppy (2022), (b) gap/crash overnight LATENTE (TP01
|
||||||
|
non reagisce intraday, non nel campione storico), (c) la LEVA.
|
||||||
|
|
||||||
|
## Candidati testati (`tail_hedge_lab.py`)
|
||||||
|
| protezione | MaxDD | 2022 | Sharpe | CAGR |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| combo baseline | 8.4% | -4.4% | 1.48 | 11.3% |
|
||||||
|
| **+ guardia-DD -4%** | **5.8%** | **-1.8%** | 1.38 | 9.2% |
|
||||||
|
| + vol-target 5% | 8.4% | -5.9% | 1.46 | 8.0% |
|
||||||
|
| + opzioni (put/put-spread, budget 3%/y) | 8.4% | -4.4% | 1.48 | 11.3% |
|
||||||
|
|
||||||
|
### OPZIONI (valutate): NON adatte al 2022
|
||||||
|
- Put-spread/long-put LONG su indice 50/50 BTC/ETH (mirror di VRP01), premio BS su DVOL reale, payoff
|
||||||
|
sul path. Strike corretti (compra -0.30delta, vende -0.10delta).
|
||||||
|
- Sempre-on costa **~50%/anno** di premio -> con budget 3%/anno size ~0.06-0.10x = effetto ~nullo.
|
||||||
|
- Nel 2022 (grind, niente crash settimanali) **sanguinano** (scadono inutili) -> Δ2022 ~0.
|
||||||
|
- Pagano SOLO nei crash secchi: stress -30% overnight -> put paga **+25% netto**, put-spread +3.8%.
|
||||||
|
- Verdetto: assicurazione BLACK-SWAN cara e fuori-bersaglio per il grind. Utile solo come piccola
|
||||||
|
copertura del gap overnight latente, NON come fix del 2022.
|
||||||
|
|
||||||
|
### GUARDIA DRAWDOWN: centra il rischio
|
||||||
|
De-risk (esposizione 1.0->0.4) quando il DD da picco supera -4%, ri-rischia a -1.6%. Targetizza il
|
||||||
|
grind: MaxDD 8.4%->5.8%, 2022 -4.4%->-1.8%, ogni anno DD intra <=5.4%. Costo: Sharpe 1.48->1.38,
|
||||||
|
CAGR -2.1pp (de-risca sui cali, perde rimbalzo — prezzo onesto della protezione).
|
||||||
|
|
||||||
|
### A LEVA (dove il tail morde)
|
||||||
|
guard applicato pre-leva: 2x 2022 -15.6%->-10.9%, MaxDD 28%->24%; 3x resta MARGIN-CALL (DD 39%>=33%).
|
||||||
|
-> la protezione rende il 2x sopportabile; il 3x va evitato comunque.
|
||||||
|
|
||||||
|
## Raccomandazione
|
||||||
|
AGGIUNGERE una **guardia-drawdown a livello di portafoglio** al combo (overlay, niente premio):
|
||||||
|
e' la protezione che colpisce il rischio reale (grind/2022) a costo Sharpe minimo. Le opzioni NO come
|
||||||
|
fix del 2022; eventualmente una micro-allocazione deep-OTM come assicurazione black-swan separata.
|
||||||
|
Vol-target NON aiuta (il 2022 non e' uno spike di vol).
|
||||||
|
|
||||||
|
## Onesta'
|
||||||
|
- Il guard e' REATTIVO (de-risca dopo l'inizio del DD, restituisce un po' di rimbalzo) -> costa CAGR.
|
||||||
|
- Trade: -2.1pp CAGR per dimezzare il MaxDD e azzerare quasi il 2022. Sensato se la priorita' e' il DD.
|
||||||
|
- Parametri (-4% trigger) semplici; il meccanismo (non la soglia esatta) e' la sostanza.
|
||||||
|
Script: tail_hedge_lab.py.
|
||||||
|
|
||||||
|
## Aggiornamento — protezioni CLASSICHE (stop-loss), goal "prova anche SL" (`stops_lab.py`)
|
||||||
|
Confronto equo (trigger/re-entry sul NAV di mercato, non sull'equity congelata):
|
||||||
|
| protezione | Sharpe | MaxDD | 2022 | CAGR | in-mkt |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| baseline | 1.48 | 8.4% | -4.4% | 11.3% | 100% |
|
||||||
|
| **soft-guard -4% (0.4x)** | **1.38** | **5.8%** | **-1.8%** | 9.2% | 100% |
|
||||||
|
| trail-stop -4% (uscita tot.) | 1.07 | 7.5% | +0.0% | 6.6% | 42% |
|
||||||
|
| trail-stop -6% (re:newhigh) | 1.34 | 6.6% | -2.1% | 9.0% | 72% |
|
||||||
|
| trail-stop -8% | 1.41 | 8.3% | -4.2% | 10.0% | 87% |
|
||||||
|
| stop mensile -5% | 1.48 | 8.4% | -4.4% | 11.3% | 100% (mai scatta) |
|
||||||
|
| vol-stop (>90pctl) | 1.48 | 8.4% | -4.4% | 10.4% | 100% |
|
||||||
|
|
||||||
|
VERDETTO: lo SL classico funziona solo a -6% (e resta inferiore al soft-guard); a -4% fa WHIPSAW
|
||||||
|
(Sh 1.48->1.07, fuori mercato 58%) perche' l'uscita TOTALE viene choppata nel grind. Il soft-guard
|
||||||
|
alla stessa soglia non whippa (de-risk parziale 0.4x). Stop mensile/vol inutili (bersaglio sbagliato).
|
||||||
|
Conferma: per un DD da grind, de-risk PARZIALE > stop-loss duro. Soft-guard -4% confermato come scelta.
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
# 2026-06-26 — Cash-and-carry (basis trade) delta-neutral su HL (CC01): premio REALE, Sharpe ARTEFATTO, NON deployabile
|
||||||
|
|
||||||
|
**Goal utente:** dopo lo scarto del gamma scalping, "provare" gli altri due angoli proposti —
|
||||||
|
funding-carry cross-sectional e basis/cash-and-carry. Il **funding cross-sectional (FC01) è già
|
||||||
|
SCARTATO** (diario 2026-06-22: DILUTES, sign-flip su un nome). L'angolo non testato è il
|
||||||
|
**cash-and-carry delta-neutral (CC01)**. Branch `research/gamma-scalp-options`,
|
||||||
|
script `scripts/research/cash_carry_hl.py`.
|
||||||
|
|
||||||
|
## Meccanismo (diverso da FC01)
|
||||||
|
|
||||||
|
FC01 pickava cross-section (short alto-funding / long basso-funding) → scommessa relativa, fragile.
|
||||||
|
CC01 **non picka**: harvesta il premio di funding AGGREGATO restando delta-neutral sullo *stesso*
|
||||||
|
asset. Long spot + short perp (stessa size): le gambe lineari nel prezzo si cancellano → ritorno
|
||||||
|
≈ **+funding** (lo short incassa il funding quando f>0), zero esposizione direzionale. Dati: funding
|
||||||
|
orario reale HL dal 2023-05 (`hlfund_*_1h.parquet`), gli stessi 19 major di XS01.
|
||||||
|
|
||||||
|
## Risultato grezzo — e perché NON va creduto
|
||||||
|
|
||||||
|
| config | Sharpe | CAGR | maxDD | per-anno |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| BTC/ETH CC-static | **+12.9** | +13% | 0.8% | 2023:+10 2024:+23 2025:+8 2026:+1% |
|
||||||
|
| BTC/ETH CC-gated | +13.9 | +14% | 0.3% | tutti positivi |
|
||||||
|
| 19-major CC-gated | +11.6 | +16% | 0.4% | tutti positivi |
|
||||||
|
|
||||||
|
**Uno Sharpe di 13 con DD 0.3% è un ALLARME, non un edge.** È la firma di un modello che cattura
|
||||||
|
solo un cashflow liscio (il funding) e azzera la volatilità reale. Il marginal scorer dà **ADDS /
|
||||||
|
robust_oos / has_insample_edge=True / multicut_persistent** su OGNI config — ma questo **espone un
|
||||||
|
punto cieco dello scorer**: si fida della vol riportata dal candidato e non ha un gate "Sharpe
|
||||||
|
implausibile → rischio nascosto". Un Sharpe di 13 dovrebbe squalificare-e-indagare, non passare.
|
||||||
|
|
||||||
|
## Il rischio è NASCOSTO, non assente
|
||||||
|
|
||||||
|
- **Mark-to-market della base** (`premium` col → `r = funding − Δpremium`): sgonfia lo Sharpe solo
|
||||||
|
13→11. La colonna premium di HL è già lisciata/clampata → a risoluzione daily il basis-vol è
|
||||||
|
minimo. **Quindi il basis-from-data NON è il rischio vero.**
|
||||||
|
- **I rischi che giustificherebbero uno Sharpe realistico (~1-3) sono ASSENTI dal dataset:**
|
||||||
|
1. **2022 mancante.** Lo storico funding parte 2023-05 → niente deleveraging LUNA/3AC/FTX, il
|
||||||
|
regime di funding profondamente negativo + basis blow-out che farebbe il vero drawdown.
|
||||||
|
2. **Procyclicità.** Funding aggregato BTC/ETH: +23% nel toro 2024 → **+1.7% nel bear 2026**
|
||||||
|
(e 19-major CC-static 2026 = **−1%**). Solo 10% di giorni a funding negativo *in-sample* — ma
|
||||||
|
in un vero bear quella frazione esplode. Il carry **non è all-weather**: è un risk-on premium.
|
||||||
|
3. **Liquidazione dello short** in uno squeeze e **slippage** su spot+perp: non modellati.
|
||||||
|
- **Sharpe reale di un crypto basis-trade ≈ 1-3 con code brusche** (Mar-2020, Mag-2021, FTX), non 13.
|
||||||
|
|
||||||
|
## Eseguibilità a $600 — muro indipendente
|
||||||
|
|
||||||
|
Serve spot **+** perp per gamba: BTC/ETH = 4 posizioni, 19-major = 38. Su Deribit (dove operiamo) lo
|
||||||
|
storico funding è **bloccato** (404) e non tradiamo spot HL. **STAT-MODE**, come XS01/VRP01 ma peggio
|
||||||
|
(doppia gamba per asset). Non deployabile a questo capitale.
|
||||||
|
|
||||||
|
## Verdetto
|
||||||
|
|
||||||
|
**CC01 = premio di funding REALE (~+8-14%/anno aggregato, positivo ogni anno in-sample) e
|
||||||
|
genuinamente ortogonale a TP01 (corr ~0.05, NON direzionale).** È la "fonte di ritorno diversa" più
|
||||||
|
concreta trovata finora. MA:
|
||||||
|
- lo **Sharpe headline è fiction** (rischi di coda strutturalmente fuori dal dataset);
|
||||||
|
- è **procyclico** (si comprime/inverte nel bear — proprio quando servirebbe);
|
||||||
|
- **non eseguibile** a $600 / sul nostro venue.
|
||||||
|
|
||||||
|
→ **LEAD da rivedere a scala** (capitale ~20k+ e un venue con funding eseguibile), **non uno sleeve**.
|
||||||
|
Nessun impatto sul book live (branch separato).
|
||||||
|
|
||||||
|
## Sottoprodotto metodologico (raccomandazione)
|
||||||
|
|
||||||
|
CC01 ha passato ogni gate del marginal scorer pur essendo un'illusione di rischio. **Prossima
|
||||||
|
indurita dello scorer:** un gate di *plausibilità dello Sharpe* — uno standalone Sharpe ≫ 4 deve
|
||||||
|
declassare a "SUSPECT/INVESTIGATE" invece di alimentare ADDS, perché segnala vol sottostimata
|
||||||
|
(mark-to-cashflow, dati che escludono il regime di stress, leva nascosta). Documentato qui, non
|
||||||
|
implementato in questa passata per non toccare lo scorer condiviso su `main`.
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
# 2026-06-26 — "Short su fondamentali/notizie NEG ma prezzo SU": screener forward, edge non provato
|
||||||
|
|
||||||
|
**Goal utente (chiarito):** se i dati finanziari/notizie di un'azienda sono negativi ma la
|
||||||
|
quotazione è positiva (sale), andare SHORT — scommessa che il prezzo scenda a riallinearsi ai
|
||||||
|
fondamentali. Branch `research/equity-meanrev-ib`, script `scripts/research/eq_fundnews_short.py`.
|
||||||
|
|
||||||
|
## Gate dati (lezione v2.0.0) — NON backtestabile
|
||||||
|
|
||||||
|
I fondamentali e le notizie scaricabili dalla rete (Yahoo) sono **snapshot CORRENTI**, non
|
||||||
|
point-in-time storici. Applicarli a prezzi passati = **look-ahead** (restatement + survivorship):
|
||||||
|
esattamente la classe di errore che ha prodotto la libreria fasulla v2.0.0. Un backtest onesto
|
||||||
|
richiede un DB point-in-time (Compustat PIT, news storiche con timestamp) — **assente**. Quindi,
|
||||||
|
come per la vol term-structure: **niente backtest**, l'unica via onesta è uno **screener forward**.
|
||||||
|
|
||||||
|
## Cosa è scaricabile (feasibility, fatto)
|
||||||
|
|
||||||
|
- **Fondamentali strutturati** via Yahoo quoteSummary (flusso cookie+**crumb**, tokenless):
|
||||||
|
`recommendationMean` (1=buy..5=sell), `revenueGrowth`, `earningsHistory` surprise%,
|
||||||
|
`recommendationTrend` (skew buy/sell). ✅
|
||||||
|
- **Notizie**: Yahoo news search (headline + publisher), sentiment lessicale crudo. ✅ (proxy debole)
|
||||||
|
- **Momentum**: chart API (return 1m/3m). ✅
|
||||||
|
|
||||||
|
## Screener costruito + eseguito dal vivo
|
||||||
|
|
||||||
|
`fund_neg` ∈ [0,1] (media di: recMean→sell, surprise negative, ricavi in calo, analisti a sell) +
|
||||||
|
`news_neg` lessicale + momentum. **SHORT candidate = (fond/news neg) AND prezzo in salita** (la
|
||||||
|
divergenza). Idempotente, logga forward su `data/raw/fundnews_short_screen.parquet`.
|
||||||
|
|
||||||
|
**Run di oggi (2026-06-26): NESSUN candidato.** Quasi tutto l'universo ha momentum 1m **negativo**
|
||||||
|
(mercato in flessione ampia, coerente col bear) → la gamba "prezzo che sale" non scatta. I peggiori
|
||||||
|
per fondamentali (TSLA 0.48, BA 0.39, NKE 0.38) stanno comunque *scendendo*. Output sensato.
|
||||||
|
|
||||||
|
## L'intuizione analitica chiave (il valore vero di questa analisi)
|
||||||
|
|
||||||
|
La premessa ha una **tensione interna** che la rende la versione *rischiosa* dell'anomalia:
|
||||||
|
- **Shortare un prezzo che SALE combatte il momentum** — una delle anomalie più robuste e persistenti
|
||||||
|
(i winner continuano a vincere su 3-12 mesi). Si scommette contro di essa.
|
||||||
|
- **Il PEAD** (post-earnings drift) dice che dopo cattive notizie il prezzo continua a **scendere**;
|
||||||
|
ma qui il prezzo *sale malgrado* le cattive notizie → spesso significa che il mercato sta
|
||||||
|
**prezzando informazione** che i fondamentali *trailing* non contengono (turnaround, M&A, squeeze).
|
||||||
|
- Quindi: la versione *pulita* dell'edge "short su fondamentali deboli" funziona meglio quando il
|
||||||
|
prezzo **conferma** (fondamentali deboli + prezzo che SCENDE = momentum e fondamentali allineati),
|
||||||
|
**non** quando diverge. La richiesta "shorta il titolo che sale su brutte notizie" è il caso
|
||||||
|
contrarian, più difficile e storicamente più punito (squeeze, perdita illimitata).
|
||||||
|
|
||||||
|
## Eseguibilità (muro)
|
||||||
|
|
||||||
|
Short = **borrow** (locate + fee; hard-to-borrow caro/assente), **perdita illimitata**, **squeeze**,
|
||||||
|
**PDT $25k** per i day-trade, IB instabile qui, $600, universo single-stock (non i nostri ETF). NON
|
||||||
|
deployabile.
|
||||||
|
|
||||||
|
## Verdetto
|
||||||
|
|
||||||
|
**Non un edge schierabile, né dimostrabile ora.** Deliverable onesto = lo **screener forward**
|
||||||
|
(funzionante, da dati di rete) + il log che accumula i candidati per una validazione futura, con
|
||||||
|
la chiara avvertenza che l'edge è **non provato** e che la *direzione contrarian* della scommessa
|
||||||
|
(short sulla forza) è la parte fragile. Strumento utile (fond+news+momentum da rete in un colpo),
|
||||||
|
tesi da maneggiare con scetticismo. Nessun impatto sul book live (branch separato).
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
# 2026-06-26 — Scalping azioni IB "quando sottoquotate" + check dati dalla rete
|
||||||
|
|
||||||
|
**Goal utente:** su IB, comprare azioni quando "sottoquotate" (oversold/sotto fair-value), con
|
||||||
|
verifica incrociata dei dati dalla rete. Branch `research/equity-meanrev-ib`,
|
||||||
|
script `scripts/research/eq_meanrev_ib.py`. Due pezzi.
|
||||||
|
|
||||||
|
## 1) CHECK DATI DALLA RETE — il pezzo richiesto (e perfettamente in-metodo)
|
||||||
|
|
||||||
|
Confronto i dati certificati IB (`data/raw/eq_*_1d.parquet`, ADJUSTED_LAST) con una **sorgente di
|
||||||
|
rete indipendente** (Yahoo Finance chart API, tokenless). È la lezione fondante del progetto: non
|
||||||
|
fidarti di un feed solo (il disastro v2.0.0 era un feed contaminato).
|
||||||
|
|
||||||
|
**Risultato (180g, BTC… no: 6 ETF):** dopo l'allineamento corretto **tutti CONCORDE**, deviazione
|
||||||
|
sui rendimenti **≤1.2bps**, ultimo close identico (0.0bps). Il feed IB è validato.
|
||||||
|
|
||||||
|
**La lezione (errore che ho fatto e corretto):** un primo confronto naïf (nostro close *adjusted*
|
||||||
|
vs `close` *grezzo* di Yahoo) ha **falso-allarmato 4/6 ticker** a 30-52bps (SPY 30, TLT 40, HYG 52).
|
||||||
|
Le divergenze erano **tutte su singoli giorni = stacco dividendo**: confrontavo dividend-adjusted vs
|
||||||
|
non-adjusted. Usando l'`adjclose` di Yahoo (apples-to-apples) → ~0bps. **Regola: ogni divergenza va
|
||||||
|
SPIEGATA prima di gridare "feed sporco" — e prima di tradarci sopra.** Lo strumento resta come
|
||||||
|
validatore di feed riutilizzabile / template del pre-trade price-check live.
|
||||||
|
|
||||||
|
## 2) "SCALPING quando sottoquotata" — non testabile/eseguibile; testato lo swing MR
|
||||||
|
|
||||||
|
Lo **scalping intraday non è valutabile**: (a) non abbiamo dati intraday (solo `eq_*_1d`), (b) non
|
||||||
|
è eseguibile — **PDT rule**: il day-trading di azioni US sotto **$25.000** è limitato a 3
|
||||||
|
day-trade/5gg → lo scalping è *regolatoriamente bloccato* al capitale del progetto (l'analogo equity
|
||||||
|
del muro STAT-MODE a $600 sul crypto), (c) IB Gateway è instabile qui (timeout ordini diagnosticato).
|
||||||
|
|
||||||
|
Versione onesta e testabile = **swing mean-reversion** "compra quando sottoquotata": Connors RSI2<10
|
||||||
|
+ filtro trend MA200, exit a MA5. Causale (segnale ≤ close[i], entry a close[i]), netto fee, hold-out 2015+:
|
||||||
|
|
||||||
|
| ETF | FULL Sh | DD | CAGR | expo | HOLD Sh | **B&H HOLD Sh** |
|
||||||
|
|---|---|---|---|---|---|---|
|
||||||
|
| SPY | +0.75 | 15% | +5% | 13% | +0.70 | **+0.81** |
|
||||||
|
| QQQ | +0.50 | 16% | +4% | 14% | +0.56 | **+0.92** |
|
||||||
|
| IWM | +0.32 | 22% | +2% | 13% | +0.15 | +0.53 |
|
||||||
|
| DIA | +0.38 | 13% | +2% | 14% | +0.55 | +0.74 |
|
||||||
|
| EEM | +0.41 | 20% | +3% | 13% | +0.36 | +0.46 |
|
||||||
|
|
||||||
|
Fee sweep SPY: Sh 0.82 (0bps) → 0.75 (3) → 0.70 (5) → 0.58 (10bps RT).
|
||||||
|
|
||||||
|
**Lettura onesta:** la mean-reversion "buy the dip" sugli indici equity ha un edge **reale ma
|
||||||
|
modesto** (Sharpe ~0.5-0.75, investito solo ~13% dei giorni) **che NON batte il buy&hold
|
||||||
|
risk-adjusted** (B&H hold-out 0.81 su SPY vs 0.70 della MR), con CAGR piccolo (2-5%) e sensibile ai
|
||||||
|
costi. È capital-efficient in teoria (cash 87% del tempo) ma il valore aggiunto vs "tieni l'indice"
|
||||||
|
è negativo o nullo, e la frequenza *scalping* che potrebbe aggiungere valore è bloccata dalla PDT.
|
||||||
|
|
||||||
|
## Verdetto
|
||||||
|
|
||||||
|
- **Check dati dalla rete: FATTO e utile** — feed IB validato (≤1.2bps vs Yahoo); strumento
|
||||||
|
riutilizzabile. Unico vero keeper della sessione equity.
|
||||||
|
- **Scalping "sottoquotate": NON deployabile** — non testabile (no intraday), non eseguibile (PDT
|
||||||
|
$25k, IB instabile). Lo swing MR daily testabile **non batte il buy&hold** → niente edge schierabile.
|
||||||
|
|
||||||
|
Conferma il pattern del progetto: l'idea promettente sopravvive solo finché non incontra
|
||||||
|
eseguibilità + benchmark onesto. Nessun impatto sul book live crypto (branch separato).
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
# 2026-06-26 — "Scalping BTC/ETH con copertura in opzioni" = gamma scalping → SCARTATO
|
||||||
|
|
||||||
|
**Domanda (goal utente):** analizzare lo scalping su BTC/ETH con copertura in opzioni come
|
||||||
|
possibile nuovo sleeve. **Esito: negativo, strutturale, su tutte le frequenze. Non è uno sleeve,
|
||||||
|
non è nemmeno un hedge.** Branch `research/gamma-scalp-options`, script
|
||||||
|
`scripts/research/options_gamma_scalp.py`.
|
||||||
|
|
||||||
|
## Cos'è davvero "scalping con copertura in opzioni"
|
||||||
|
|
||||||
|
L'interpretazione rigorosa è il **gamma scalping**: compri un'opzione (la *copertura* = long
|
||||||
|
gamma), delta-hedgi il sottostante a cadenza fissa (lo *scalp*), e il P&L netto è
|
||||||
|
≈ dollar-gamma × (vol realizzata² − vol implicita²). È lo **specchio esatto del VRP01** (short-vol):
|
||||||
|
VRP01 incassa IV−RV (positivo in media), il gamma scalping incassa **RV−IV** (negativo in media).
|
||||||
|
|
||||||
|
Modello (mirror della struttura VRP per comparabilità): long straddle ATM, tenor 7g, IV = DVOL
|
||||||
|
Deribit (la stessa fonte del VRP), delta-hedge sui prezzi certificati, fee opzioni cap 12.5% del
|
||||||
|
premio + fee perp 0.05%/lato sull'hedge turnover, return-on-notional vol-targeted 20%.
|
||||||
|
|
||||||
|
## La diagnostica strutturale (il cuore)
|
||||||
|
|
||||||
|
| asset | IV (DVOL) | RV 1d | IV−RV 1d | RV 1h | IV−RV 1h |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| BTC | 60.9% | 56.0% | **+4.9pp** | 64.5% | −3.6pp |
|
||||||
|
| ETH | 74.9% | 76.0% | −1.0pp | 81.0% | −6.1pp |
|
||||||
|
|
||||||
|
- A **rehedge giornaliero** l'IV ≈ o > la RV → il long gamma **paga il VRP** (sei sul lato sbagliato
|
||||||
|
del premio). Perde gross, prima di ogni fee.
|
||||||
|
- A **rehedge orario** la RV *supera* l'IV (BTC +3.6pp, ETH +6.1pp gross) — sembrerebbe un edge…
|
||||||
|
**ma è una trappola doppia:** (a) la RV_1h è gonfiata da microstruttura (bid-ask bounce), quindi
|
||||||
|
il "gross edge" è in parte fittizio; (b) il rehedge orario paga **24× la fee di hedge**, che
|
||||||
|
spazza via qualunque edge intraday reale.
|
||||||
|
|
||||||
|
## I numeri (ogni variante, ogni anno, ogni frequenza: PERDE)
|
||||||
|
|
||||||
|
| variante | rehedge | Sharpe | CAGR | per-anno |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| NAKED | 1d | **−3.99** | −56% | 2021..2026 tutti −25..−68% |
|
||||||
|
| CHEAP-GATED (IVr<0.30) | 1d | −3.05 | −47% | tutti negativi |
|
||||||
|
| RICH-SKIP (IVr>0.90) | 1d | −3.92 | −55% | tutti negativi |
|
||||||
|
| NAKED | 1h | **−6.06** | −71% | tutti −38..−81% (peggio: le fee) |
|
||||||
|
| CHEAP-GATED (IVr<0.30) | 1h | −4.96 | −64% | tutti negativi |
|
||||||
|
|
||||||
|
Il gate "compra vol solo quando è a sconto" (lo specchio del gate vincente del VRP, *vendi vol solo
|
||||||
|
quando è cara*) **migliora ma non salva**: −3.05 invece di −3.99. Il segno resta negativo perché
|
||||||
|
l'IV-rank basso non garantisce RV > IV su 7 giorni.
|
||||||
|
|
||||||
|
## Scoring marginale vs TP01
|
||||||
|
|
||||||
|
Tutte le varianti: **DILUTES**, `is_hedge=False`, `has_insample_edge=False` (IS Sharpe −3..−4.5),
|
||||||
|
blend-25 uplift hold −1.2/−1.5. Non aiuta nemmeno come hedge: perde sia quando TP01 è su
|
||||||
|
(uplift −1.2..−1.6) sia quando TP01 è giù (uplift −2.5..−3.2). Corr a TP01 ≈ 0 ma il drift negativo
|
||||||
|
domina la matematica di diversificazione.
|
||||||
|
|
||||||
|
## Eseguibilità a ~$600 (muro indipendente)
|
||||||
|
|
||||||
|
- **BTC**: contratto 1 BTC, min 0.1 BTC → notional minimo **$5.968** ≫ $600 → **NON eseguibile**.
|
||||||
|
- **ETH**: min 0.1 ETH → **$157** → marginalmente OK, ma un solo straddle = ~25% del conto in premio.
|
||||||
|
|
||||||
|
Anche se l'edge esistesse, BTC è fuori e ETH è troppo grosso per diversificare.
|
||||||
|
|
||||||
|
## Conclusione
|
||||||
|
|
||||||
|
Lo "scalping con copertura in opzioni" è **schiacciato tra due muri**: rehedge lento → paghi il
|
||||||
|
premio (RV < IV); rehedge veloce → paghi le fee (24×/day). **Nessuna frequenza vince.** Conferma
|
||||||
|
due lezioni di prim'ordine del progetto, ora quantificate sul long-vol:
|
||||||
|
1. **Le fee uccidono lo scalping** (il rehedge orario, vera frequenza di scalping, è la variante
|
||||||
|
*peggiore*: −6 Sharpe).
|
||||||
|
2. **Vol-da-modello è fragile in entrambe le direzioni.** Regola gemella del VRP: *niente long-vol
|
||||||
|
scalp da modello in deploy*.
|
||||||
|
|
||||||
|
**Il VRP01 (lato short, gated, rischio-definito) resta l'unico edge opzioni del progetto** —
|
||||||
|
e funziona proprio perché sta sul lato *giusto* dello stesso premio che il gamma scalp paga.
|
||||||
|
|
||||||
|
SCARTATO. Script preservato come riferimento. Nessun impatto sul book live (branch separato).
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
# 2026-06-26 — TP01 × DVOL vol-targeting: NON migliora (il taglio di DD è solo de-levering)
|
||||||
|
|
||||||
|
**Goal utente:** "continua" ad analizzare strategie. Dopo i tre angoli di diversificazione tutti
|
||||||
|
STAT-MODE (gamma scalp scartato, funding cross-sectional già morto, cash-and-carry lead non
|
||||||
|
deployabile), ho puntato sull'angolo a **più alto valore perché ESEGUIBILE**: migliorare il
|
||||||
|
risk-sizing del book **live** TP01 (BTC/ETH perp Deribit, già armato). Branch
|
||||||
|
`research/gamma-scalp-options`, script `scripts/research/tp01_dvol_overlay.py`.
|
||||||
|
|
||||||
|
## Ipotesi
|
||||||
|
|
||||||
|
TP01 vol-targeta sulla vol **realizzata** 30g (backward-looking). Il **DVOL** (vol implicita 30g
|
||||||
|
Deribit, forward-looking, che spesso anticipa i salti di vol) come denominatore → de-risking più
|
||||||
|
tempestivo prima dei crash → DD più basso / hold-out migliore senza affondare il FULL.
|
||||||
|
|
||||||
|
Onestà: DVOL parte 2021-03 → confronto TUTTE le varianti sulla **finestra comune 2021-04 → 2026**
|
||||||
|
(1891g, perdo il toro 2019-2020 pre-DVOL). Causale, fee 0.10% RT, config canonica TP01.
|
||||||
|
|
||||||
|
## Risultati (finestra comune, hold-out 2025+)
|
||||||
|
|
||||||
|
| variante (denominatore vol) | FULL Sh | FULL DD | CAGR | HOLD Sh |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| **realized** (baseline) | **+0.75** | 12.3% | +8% | +0.30 |
|
||||||
|
| dvol (implicita) | +0.70 | 9.3% | +6% | +0.33 |
|
||||||
|
| blend 50/50 | +0.72 | 10.4% | +7% | +0.32 |
|
||||||
|
| max(realiz, dvol) | +0.70 | 9.2% | +6% | +0.36 |
|
||||||
|
| derisk (gate DVOL>p90 ×0.5) | +0.75 | 12.3% | +8% | +0.30 |
|
||||||
|
|
||||||
|
Le varianti DVOL **abbassano il DD** (12.3% → ~9.2%) ma **anche** Sharpe FULL (−0.04/−0.05) e CAGR
|
||||||
|
(8% → 6%). Lo Sharpe è scale-invariant → sospetto: il taglio di DD è solo *posizioni più piccole*
|
||||||
|
(l'IV > RV per il VRP → denominatore più grande → leva minore), non vero timing.
|
||||||
|
|
||||||
|
## Il controllo decisivo
|
||||||
|
|
||||||
|
Confronto le varianti DVOL col **realized a target_vol RIDOTTO** (stesso de-levering, senza DVOL):
|
||||||
|
|
||||||
|
| | FULL Sh | DD | CAGR | HOLD Sh |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| **max-DVOL** | +0.70 | 9.2% | +6% | +0.36 |
|
||||||
|
| **realized @ vol-tgt 15%** | **+0.75** | 9.4% | +6% | +0.30 |
|
||||||
|
| **realized @ vol-tgt 13%** | +0.75 | **8.1%** | +5% | +0.30 |
|
||||||
|
|
||||||
|
**Conclusivo:** il realized a 15% eguaglia il DD del max-DVOL (9.4% ≈ 9.2%) a Sharpe **più alto**
|
||||||
|
(0.75 > 0.70) e stesso CAGR; a 13% fa DD ancora più basso (8.1%), sempre a 0.75. **Il taglio di DD
|
||||||
|
del DVOL è interamente "leva minore", replicabile MEGLIO con un semplice target_vol più basso.**
|
||||||
|
|
||||||
|
## Verdetto
|
||||||
|
|
||||||
|
**DVOL vol-targeting NON migliora TP01.** Risk-adjusted è marginalmente *peggiore* (FULL 0.70 vs
|
||||||
|
0.75 a parità di DD). L'unico residuo a favore — hold-out +0.06 (max 0.36 vs 0.30) — è **single-window**
|
||||||
|
su 5 anni scarsi di storia DVOL: sotto la soglia di **persistenza multi-cut** del progetto (la lezione
|
||||||
|
che ha ucciso 13/14 falsi positivi nello sweep alt). Il gate **DVOL-spike de-risk è RIDONDANTE col
|
||||||
|
trend**: quando il DVOL esplode (crash) TP01 è già flat (momentum negativo → posizione 0) → il gate
|
||||||
|
non tocca nulla (Δ 0.00 su tutto). Niente da deployare.
|
||||||
|
|
||||||
|
## Lezioni
|
||||||
|
|
||||||
|
1. **Per meno DD sul book live, la leva giusta è `target_vol`, non un overlay DVOL.** Abbassare TP01
|
||||||
|
da vol-tgt 20% → 15% taglia il DD 12.3% → ~9.4% allo **stesso Sharpe** (0.75). Dial pulito e noto,
|
||||||
|
se mai si volesse un profilo più difensivo (oggi 20% è la scelta canonica — invariata).
|
||||||
|
2. **La vol implicita non batte la realizzata come denominatore di sizing per un trend long-flat**:
|
||||||
|
il segnale di trend gestisce già il de-risking direzionale; il denominatore fissa solo la
|
||||||
|
magnitudine, e la realizzata lo fa marginalmente meglio per unità di rischio.
|
||||||
|
3. Conferma indiretta del soffitto: anche un raffinamento "ovvio" e *eseguibile* su TP01 non produce
|
||||||
|
alpha; al massimo sposta il punto sulla stessa frontiera rischio/rendimento.
|
||||||
|
|
||||||
|
SCARTATO come miglioria. Nessun impatto sul book live (branch separato, config canonica invariata).
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
# 2026-06-26 — Calendar-vol / term-structure DVOL: il DATO STORICO NON ESISTE (data-first gate)
|
||||||
|
|
||||||
|
**Goal utente:** "continua" — angolo scelto: scaricare e certificare la term-structure DVOL per
|
||||||
|
testare un calendar-vol (front IV vs back IV). **Esito: bloccato a monte dal gate "il dato prima
|
||||||
|
della strategia" (lezione v2.0.0).** Branch `research/gamma-scalp-options`.
|
||||||
|
Script: `scripts/research/probe_vol_termstructure.py` (scan) + `log_vol_termstructure.py` (forward).
|
||||||
|
|
||||||
|
## Scan di fattibilità (prima di costruire qualunque backtest)
|
||||||
|
|
||||||
|
Cosa l'API pubblica Deribit espone davvero per la vol per-scadenza:
|
||||||
|
|
||||||
|
| dato | disponibile? |
|
||||||
|
|---|---|
|
||||||
|
| Snapshot CORRENTE della term-structure ATM (mark_iv per scadenza) | **SÌ** (book_summary_by_currency, tokenless) |
|
||||||
|
| DVOL storico | solo **30g** fisso — nessun indice 7g/60g/90g pubblico |
|
||||||
|
| Trade-history IV per strumento | solo per strumenti **VIVI** (gli scaduti spariscono) |
|
||||||
|
| **Serie storica continua front-vs-back IV** | **NO** — il front-month rotola/espira → irricostruibile |
|
||||||
|
|
||||||
|
**Snapshot oggi (2026-06-26), per riferimento:**
|
||||||
|
- BTC spot $59.9k: 7g 45.6% · 30g 43.2% · 60g 42.7% · 90g 42.9% · 180g 44.5% — **contango** lieve.
|
||||||
|
- ETH spot $1.58k: 7g 57.6% · 30g 56.4% · 90g 57.5% · 180g 59.2% — contango (+1.6pp slope).
|
||||||
|
- (I valori sono interpolati a tenor fissi: il front a 1-giorno grezzo, 38%/54%, è rumore escluso.)
|
||||||
|
|
||||||
|
## Verdetto
|
||||||
|
|
||||||
|
**Un calendar-vol NON è backtestabile ora su dati certificati.** La storia per-scadenza non è
|
||||||
|
pubblica su Deribit (la nostra fonte di verità), e — coerentemente con la metodologia — **nessun
|
||||||
|
edge va creduto senza backtest OOS su dati certificati**. Costruire un calendar-vol su uno snapshot
|
||||||
|
singolo o su una storia ricostruita-a-pezzi sarebbe esattamente il tipo di scorciatoia che ha
|
||||||
|
prodotto la libreria fasulla v2.0.0. Quindi: **stop, niente backtest.**
|
||||||
|
|
||||||
|
## L'unica via legittima: costruire il dato in avanti
|
||||||
|
|
||||||
|
`scripts/research/log_vol_termstructure.py` — logger forward idempotente: ogni run prende lo snapshot
|
||||||
|
ATM, lo interpola ai tenor fissi {7,30,60,90,180}g e appende una riga/asset a
|
||||||
|
`data/raw/vol_term_<asset>.parquet`. Seminate le prime righe BTC/ETH oggi. Test offline
|
||||||
|
`tests/test_vol_termstructure.py` (interpolazione pura).
|
||||||
|
|
||||||
|
**Non auto-cablato in cron** (è ricerca forward, e non tocco il cron live senza ok). Per accumulare:
|
||||||
|
aggiungere una riga giornaliera al crontab. Dopo **~6-12 mesi** → certificare (monotonia, spike,
|
||||||
|
cross-venue) e SOLO ALLORA testare front-vs-back. Prima, nulla.
|
||||||
|
|
||||||
|
## Lezione
|
||||||
|
|
||||||
|
Il data-first gate ha funzionato: ha fermato un backtest su un dato che non esiste, invece di
|
||||||
|
produrre un numero non falsificabile. La term-structure è in **contango** oggi (regime calmo) —
|
||||||
|
osservazione da forward-monitor, non un edge. Nessun impatto sul book live (branch separato).
|
||||||
@@ -0,0 +1,118 @@
|
|||||||
|
# 2026-06-29 — DVOL come segnale DIREZIONALE/REGIME su BTC/ETH: l'unico edge è un HEDGE, non alpha
|
||||||
|
|
||||||
|
**Filone A — "DVOL-direzionale".** Tesi: usare la vol IMPLICITA Deribit (DVOL, `data/raw/dvol_*.parquet`,
|
||||||
|
2021-03→oggi) come **segnale direzionale o di regime** sul perp BTC/ETH (long-flat o L/S sul LIVELLO di
|
||||||
|
mercato), non come denominatore del vol-target. Script `scripts/research/dvol_directional.py`, test
|
||||||
|
`tests/test_dvol_directional.py`. Branch `research/equity-meanrev-ib` (separato, nessun impatto live).
|
||||||
|
|
||||||
|
## Cosa è diverso dal lavoro DVOL precedente
|
||||||
|
|
||||||
|
- `tp01_dvol_overlay.py` (2026-06-26): DVOL come **denominatore** del vol-target → solo de-levering, SCARTATO.
|
||||||
|
- VOL03/04/10/11 (sweep alt 100-agent): DVOL che **gata/scala un TSMOM** → eredita lo Sharpe di trend di
|
||||||
|
TP01 (il marginal scorer li boccia NEUTRAL/REDUNDANT).
|
||||||
|
- `agent_14_dvol_spread` (onda ortho): IV **relativa BTC-vs-ETH**, market-NEUTRAL 2-leg (l'unico LEAD vivo).
|
||||||
|
|
||||||
|
Qui invece: DVOL/IV-RV come segnale **direzionale STANDALONE sul livello di mercato**, per vedere se porta
|
||||||
|
alpha direzionale **ortogonale** a TP01 (non un overlay sul trend). Tutto causale (decisione ≤ `close[i]`,
|
||||||
|
tenuta in `i+1` dallo shift di `eval_weights`), fee 0.10% RT, vol-target 20%, leva cap 2x, harness onesto
|
||||||
|
condiviso `altlib`. Allineamento DVOL: `al.dvol` (merge_asof backward) → DVOL close del giorno *t* (≈
|
||||||
|
contemporaneo a `close[i]`), noto a decisione; verificato leak-free (`causality_ok` max_tail_diff 0.0).
|
||||||
|
|
||||||
|
DVOL parte 2021-03 → pre-DVOL il segnale è flat. Valuto sia **FULL** (col flat pre-2021, deflaziona lo
|
||||||
|
Sharpe) sia **ERA-only** (da 2021-10, equo per la tesi).
|
||||||
|
|
||||||
|
## 1) Probe direzionale (corr segnale[i] vs ritorno[i+1], pooled BTC+ETH, era DVOL)
|
||||||
|
|
||||||
|
| segnale | corr | long bps | flat bps | **edge bps** | frac_long |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| VRP-Z+ (long VRP ricco, IV-RV alto) | +0.010 | +7.8 | −0.9 | **+8.6** | 0.52 |
|
||||||
|
| VRP-Z− (flip) | −0.017 | −0.9 | +7.8 | −8.6 | 0.48 |
|
||||||
|
| **DVOL-LV fear (rank>0.5 → long)** | **+0.024** | +20.4 | +0.9 | **+19.5** | 0.14 |
|
||||||
|
| DVOL-LV calm (rank<0.5 → long) | −0.013 | +0.8 | +21.2 | −20.4 | 0.86 |
|
||||||
|
| DVOL-MOM (DVOL in calo → long) | −0.041 | −10.0 | +22.9 | **−32.9** | 0.59 |
|
||||||
|
| VRP>0 (quasi buy&hold) | +0.003 | +5.3 | −0.7 | +5.9 | 0.72 |
|
||||||
|
|
||||||
|
Lettura: l'unico contenuto direzionale reale è **"buy-the-fear"** (long quando il DVOL è alto nel suo
|
||||||
|
percentile espandente: edge +19.5 bps il giorno dopo). Il VRP-ricco→long è coerente ma debolissimo (+8.6).
|
||||||
|
Il "DVOL in calo → long" è **negativo** (−33 bps): comprare quando la paura scende è perdente (regola
|
||||||
|
falsificata). Nota: il percentile espandente è dominato dai picchi 2021-22 → "fear" scatta solo nel 14%
|
||||||
|
delle barre (gli spike veri), non metà del tempo.
|
||||||
|
|
||||||
|
## 2) Robustezza assoluta (study_weights 1d, fee sweep 0.00-0.20% RT) — ERA-only il giudizio equo
|
||||||
|
|
||||||
|
| segnale | abs | minFull Sh | minHold Sh | feeOK | **ERA Sh** | ERA DD | ERA CAGR |
|
||||||
|
|---|---|---|---|---|---|---|---|
|
||||||
|
| **DVOL-fear q0.4 LF** | WEAK | +0.39 | +0.14 | sì | **+0.59** | **8%** | +5% |
|
||||||
|
| VRP-Z60 LF | FAIL | +0.42 | −0.39 | sì | +0.46 | 23% | +7% |
|
||||||
|
| DVOL-fear q0.5 LF | FAIL | +0.31 | −0.17 | sì | +0.40 | 10% | +3% |
|
||||||
|
| VRP-Z90 LF | FAIL | +0.32 | −0.26 | sì | +0.32 | 29% | +4% |
|
||||||
|
| VRP-Z90 L/S | FAIL | +0.25 | +0.32 | sì | +0.31 | 28% | +3% |
|
||||||
|
| DVOL-calm q0.5 LF | FAIL | +0.00 | −1.05 | no | +0.09 | 37% | −0% |
|
||||||
|
| DVOL-MOM k10/k20 LF | FAIL | −0.6/−0.7 | <−1 | no | −0.6/−0.7 | ~40% | ~−10% |
|
||||||
|
| DVOL-MOM k10 L/S | FAIL | −1.16 | −1.29 | no | −1.23 | 72% | −23% |
|
||||||
|
|
||||||
|
Nessun segnale supera lo Sharpe assoluto in **valore** (tutti < 0.6, soffitto direzionale BTC/ETH ~1.3
|
||||||
|
confermato). Unico con profilo decente: **DVOL-fear q0.4 long-flat** (ERA Sh +0.59, DD **8%**) — il DD
|
||||||
|
bassissimo perché è long solo nei picchi di paura (poche barre, mean-reversion). Le famiglie momentum e
|
||||||
|
"buy-the-calm" sono nettamente negative e non sopravvivono nemmeno alle fee.
|
||||||
|
|
||||||
|
## 3) Marginal vs TP01 (il gate vero) — DVOL-fear q0.4 long-flat
|
||||||
|
|
||||||
|
| | corr→TP01 | in-sample Sh | uplift_full w25 | uplift_hold w25 | multi-cut persistente | is_hedge | verdetto |
|
||||||
|
|---|---|---|---|---|---|---|---|
|
||||||
|
| **ERA-only** (2021-10+) | 0.37 | 0.54 (has_edge) | +0.06 | +0.17 | sì | **No** | **ADDS** (earns_slot=True) |
|
||||||
|
| **FULL** (gate ufficiale) | 0.28 | 0.64 (has_edge) | +0.03 | +0.17 | sì | **Sì** | **HEDGE** (earns_slot=**False**) |
|
||||||
|
|
||||||
|
Il candidato ha tutto ciò che serve a un nuovo sleeve **tranne una cosa**: il gate canonico full-history
|
||||||
|
lo classifica **HEDGE**, non alpha. `hedge_yearly_corr(TP01-Sh, uplift) = −0.76`, `uplift TP01-up −0.003`
|
||||||
|
/ `uplift TP01-down +0.194` → **paga SOLO quando TP01 è debole**. Ha perfettamente senso: il DVOL esplode
|
||||||
|
durante i crash, proprio quando il trend di TP01 è flat/in-drawdown; comprare la paura cattura il rimbalzo
|
||||||
|
e smorza il DD del portafoglio, ma **non è un premio permanente**. Il blend 0.75·TP01 + 0.25·cand alza
|
||||||
|
l'hold-out 0.30→**0.47** (w50 → 0.62) e taglia il DD a ~11%/8% — un effetto **drawdown-dampener** reale,
|
||||||
|
ma classificato (giustamente) come hedge.
|
||||||
|
|
||||||
|
Perché ERA dice ADDS e FULL dice HEDGE: il rivelatore di hedge richiede ≥3 anni; sulla finestra ERA
|
||||||
|
(2021-10+) la `corr(TP01-Sh annuale, uplift)` è meno netta e non scatta. **Il gate full-history è quello
|
||||||
|
giusto** (più dati per il test di hedge) → mi attengo a quello: **HEDGE, non alpha.**
|
||||||
|
|
||||||
|
Gli altri tre candidati (VRP-Z60/90, DVOL-fear q0.5): **NEUTRAL o HEDGE**, mai ADDS. I VRP-Z hanno beta a
|
||||||
|
TP01 alto (0.88-0.90) → sono trend-correlati travestiti (resid Sharpe ~0), uplift hold-out negativo.
|
||||||
|
|
||||||
|
## 4) Causalità, alignment, eseguibilità, sign-falsification
|
||||||
|
|
||||||
|
- **Causale**: `causality_ok` ok=True, max_tail_diff **0.0** su tutti i candidati (rank espandente +
|
||||||
|
z-score ricalcolati su prefisso = identici → nessun future-peeking). Test dedicato `test_expanding_rank_is_causal`.
|
||||||
|
- **Alignment DVOL**: laggando il segnale di +1 giorno (extra-conservativo, usa solo DVOL di ieri) l'ERA
|
||||||
|
Sharpe del leader scende +0.59 → **+0.45**. L'edge sopravvive ma è **sensibile all'allineamento**
|
||||||
|
(parte del vantaggio è nel reagire allo spike DVOL del giorno stesso) → cautela in esecuzione.
|
||||||
|
- **Eseguibile a $600**: `eval_weights_smallcap` (min_order $5, cap $300/asset): haircut Sharpe **≈ 0.00**
|
||||||
|
su BTC ed ETH (segnale long-flat a basso turnover, ~210-270 trade su tutta la storia) → lo Sharpe netto
|
||||||
|
onesto a $600 = quello modellato. È l'unico aspetto pienamente promosso.
|
||||||
|
- **Sign-falsification**: tesi buy-the-fear ERA Sh +0.40 vs flip buy-the-calm +0.09; VRP-Z+ +0.32 vs
|
||||||
|
VRP-Z− (flip) −0.14. Il segno della tesi è quello giusto (l'edge è reale, non rumore simmetrico).
|
||||||
|
|
||||||
|
## Verdetto onesto: **LEAD (hedge / drawdown-dampener), NON sleeve.** SCARTATO come alpha direzionale.
|
||||||
|
|
||||||
|
- Nessun segnale DVOL-direzionale ha Sharpe assoluto sopra ~0.6 → **conferma il soffitto BTC/ETH
|
||||||
|
direzionale ~1.3** (la via per superarlo resta il cross-sectional XS01, non un nuovo segnale a 2 asset).
|
||||||
|
- L'unico con edge in-sample reale + eseguibile + leak-free è **DVOL-fear "buy-the-fear" long-flat**, ma il
|
||||||
|
gate canonico lo bolla **HEDGE** (`is_hedge=True`, paga solo quando TP01 è in difficoltà). Per la regola
|
||||||
|
del progetto un hedge **non si arma come slot di alpha** → **earns_slot=False**.
|
||||||
|
- È comunque un **LEAD utile in forward-monitor** come **smorzatore di drawdown** del portafoglio: il blend
|
||||||
|
porta l'hold-out 0.30→0.47/0.62 e abbassa il DD. Se in futuro si vorrà esplicitamente un tail/DD-hedge
|
||||||
|
*eseguibile* (a differenza del tail-hedge in opzioni, non eseguibile a $600), questo è il candidato più
|
||||||
|
pulito visto finora — ma da prezzare **come hedge**, non come ritorno atteso permanente.
|
||||||
|
|
||||||
|
## Caveat
|
||||||
|
|
||||||
|
1. **Storia DVOL <5 anni** (2021-03→oggi, ~4.7 anni; era valutata 2021-10+) → multiple-testing e
|
||||||
|
finestra corta. Il multi-cut 2026 è un assurdo +1.944 (manciata di giorni, picco DVOL recente):
|
||||||
|
l'uplift hold-out è trascinato dal regime 2025-26 ad alta-paura, non da un edge stazionario.
|
||||||
|
2. **È un hedge, non alpha**: il valore è condizionato ai drawdown di TP01 (2022, ed eventuali futuri).
|
||||||
|
In un toro lungo a bassa vol il segnale resta **flat l'86% del tempo** e non contribuisce nulla.
|
||||||
|
3. **Sensibile all'allineamento** DVOL (haircut −0.14 Sharpe col lag +1g): l'esecuzione reale dovrebbe
|
||||||
|
usare il DVOL già stampato a decisione, non assumere il close contemporaneo.
|
||||||
|
4. Long-flat → cattura il rimbalzo post-paura ma **non protegge** durante la discesa (non è uno short):
|
||||||
|
è "buy-the-dip gated by fear", con tutti i rischi del comprare coltelli che cadono se il regime peggiora.
|
||||||
|
|
||||||
|
Nessun impatto sul book live (branch separato, nessuno sleeve registrato, config canonica invariata).
|
||||||
@@ -0,0 +1,145 @@
|
|||||||
|
# 2026-06-29 — Filone B: INTRADAY REGIME BTC/ETH — ERM (efficiency-ratio) è un LEAD reale, forward-monitor
|
||||||
|
|
||||||
|
**Tesi.** Cercare un meccanismo **sub-daily** sui dati certificati 1h→12h BTC/ETH che sia ortogonale
|
||||||
|
**sia** a TP01 (TSMOM trend daily, long-flat) **sia** a SKH01 (regime BuzVola/BuzVolume + Donchian a
|
||||||
|
230m). SKH01 prova che il sub-daily PUÒ funzionare ed essere quasi-ortogonale: qui un MECCANISMO DIVERSO,
|
||||||
|
basato sulla **qualità del moto intraday** (efficiency-ratio / vol-expansion / thrust) come **regime** che
|
||||||
|
condiziona una posizione direzionale tenuta ~1 giorno. Script `scripts/research/intraday_regime.py`, test
|
||||||
|
`tests/test_intraday_regime.py`. Branch `research/equity-meanrev-ib` (separato, nessun impatto live).
|
||||||
|
|
||||||
|
Killer ricorrente del progetto sotto le 12h = **muro-fee 0.10% RT + overfitting**. Ricetta SKH01:
|
||||||
|
decisione sub-daily ma **hold ~1 giorno** → pochi trade → la fee non uccide. Ogni meccanismo qui è
|
||||||
|
costruito a basso turnover e giudicato col **fee-sweep alla sua frequenza reale**.
|
||||||
|
|
||||||
|
## Meccanismi provati (tutti come posizione CONTINUA decisa ≤ `close[i]`, causali)
|
||||||
|
|
||||||
|
| | meccanismo |
|
||||||
|
|---|---|
|
||||||
|
| **ERM** | **Efficiency-Ratio regime momentum** (Kaufman): ER = \|moto netto su L barre\| / \|percorso\|. Prendi la direzione del moto netto **solo quando ER ≥ soglia** (regime intraday "pulito"/trendy), altrimenti flat |
|
||||||
|
| VEM | Vol-Expansion Momentum: direzione = segno del moto, attiva solo quando vol-corta > vol-lunga |
|
||||||
|
| VBR | Volatility/thrust breakout (Larry-Williams ROLLING, no calendario): segui i moti > k·ATR |
|
||||||
|
| TOD | Time-of-day seasonality — **CONTROLLO calendario**, incluso APPOSTA per `day_boundary_robust` |
|
||||||
|
|
||||||
|
## Selezione + fee-sweep a frequenza reale (vincitori per famiglia, min-asset)
|
||||||
|
|
||||||
|
```
|
||||||
|
ERM: 8h L=2.0 thr=0.35 L/S minFull +0.88 minHold +0.99 f@.20 +0.55 feeOK=True turn/y 125
|
||||||
|
VEM: 12h Lmom=3 Ls=2 Ll=10 minFull +0.72 minHold -0.29 f@.20 +0.51 feeOK=True (hold<0 → out)
|
||||||
|
VBR: 12h k=1.0 atr=14 L/S minFull +0.33 minHold +1.20 f@.20 +0.25 feeOK=True
|
||||||
|
TOD: 1h minFull -3.99 minHold -4.49 feeOK=False (controllo → FAIL atteso)
|
||||||
|
```
|
||||||
|
|
||||||
|
Solo **ERM** e **VBR** sopravvivono al gate fee+OOS. VEM ha hold-out negativo. TOD esplode (vedi sotto).
|
||||||
|
|
||||||
|
## Il candidato: ERM 8h L=2.0 thr=0.35 (L/S) — `earns_slot=True`
|
||||||
|
|
||||||
|
```
|
||||||
|
abs=PASS marginal=ADDS EARNS_SLOT=True
|
||||||
|
standalone: cand FULL 0.919 / HOLD 1.105 (TP01 ref FULL 1.297 / HOLD 0.303)
|
||||||
|
corr->TP01 full 0.146 hold 0.057 beta 0.197 resid Sharpe 0.738 alpha/yr 0.121
|
||||||
|
robust_oos=True (clean-year +0.103, drop-best-month +0.283)
|
||||||
|
multi-cut persistence: 2020 .166 / 2021 .167 / 2022 .298 / 2023 .337 / 2024 .418 / 2025 .497 / 2026 2.861 persistent=True
|
||||||
|
has_insample_edge=True (standalone PRE-holdout Sharpe 0.874, > null-pctl 0.317)
|
||||||
|
is_hedge=False (yearly corr(TP01-Sh, uplift) -0.762; paga sia TP01-up 0.139 sia TP01-down 0.384)
|
||||||
|
blend w25: FULL 1.481 (+0.184) HOLD 0.80 (+0.497) DD 11.0%
|
||||||
|
corr con SKH01: full 0.278 hold 0.291
|
||||||
|
day_boundary=INVARIANT (spread 0.0) haircut $600 ≈ 0.00 su BTC/ETH
|
||||||
|
```
|
||||||
|
|
||||||
|
È il **primo sub-daily da SKH01** a passare TUTTI i gate del marginal scorer indurito: edge in-sample
|
||||||
|
reale (non diversification-math), persistenza multi-cut, robust_oos, NON hedge, scorrelato a TP01 (0.15).
|
||||||
|
|
||||||
|
### ERM aggiunge OLTRE SKH01? (gate #5 — il book esistente ne ha già uno sub-daily)
|
||||||
|
|
||||||
|
| blend | FULL Sh | FULL DD | HOLD Sh | HOLD DD |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| TP01 | +1.30 | 14.3% | +0.30 | 7.5% |
|
||||||
|
| TP01+SKH 75/25 | +1.78 | 9.4% | +1.17 | 6.2% |
|
||||||
|
| **TP01+SKH+ERM 60/25/15** | **+1.88** | 8.9% | **+1.46** | 5.3% |
|
||||||
|
| TP01+SKH+ERM 55/20/25 | +1.84 | 8.8% | +1.48 | 5.1% |
|
||||||
|
|
||||||
|
Sì: corr con SKH01 solo 0.28 → ERM **aggiunge oltre SKH** (FULL +0.10, HOLD +0.29 a peso 15%, DD ancora
|
||||||
|
giù). Non è SKH01 travestito.
|
||||||
|
|
||||||
|
## Il controllo TOD (calendario) — fa esattamente ciò che doveva
|
||||||
|
|
||||||
|
`TOD` (direzione per ora-del-giorno, media espandente causale) è incluso come **trappola**: è il tipo di
|
||||||
|
effetto che uccise `open_drive` (artefatto di etichettatura UTC). Esito: **FAIL** (FULL −3.99, 31.811
|
||||||
|
trade, fee-killed), marginal=DILUTES. `day_boundary_robust=INVARIANT` → l'effetto è **robustamente
|
||||||
|
negativo** a ogni offset (non un artefatto di confine giorno: è proprio che la time-of-day-direzionale non
|
||||||
|
ha edge e sanguina fee). Il controllo conferma che l'harness non si fa ingannare e che il segno
|
||||||
|
dei segnali di prezzo (ERM/VBR) è reale, non rumore di calendario.
|
||||||
|
|
||||||
|
## Causalità / eseguibilità
|
||||||
|
|
||||||
|
- **Leak-free**: `causality_ok=True`, max_tail_diff **0.0** su tutti i candidati (ER, rank espandente,
|
||||||
|
medie su prefisso = identiche → nessun future-peeking). Test dedicato in `test_intraday_regime.py`.
|
||||||
|
- **day_boundary_robust=INVARIANT** (spread 0.0) per ERM/VBR/TOD: segnali di prezzo, non di calendario.
|
||||||
|
- **Eseguibile a $600**: `eval_weights_smallcap` haircut **≈ 0.00** su BTC ed ETH. **MA** ERM a 8h fa
|
||||||
|
~3.158 trade BTC / ~2.823 ETH su tutta la storia (turnover 125/anno): haircut nullo nel modello, ma
|
||||||
|
l'esecuzione reale sub-daily sul book è operativamente più pesante di un segnale 1d (slippage/spread
|
||||||
|
intraday non interamente catturati dalla fee proporzionale).
|
||||||
|
|
||||||
|
## Caveat (perché LEAD, non sleeve)
|
||||||
|
|
||||||
|
1. **Plateau hold-out a UNA SOLA RIGA.** Il FULL è robusto su tutta la griglia L∈[2.0,3.0] (+0.6..+1.0),
|
||||||
|
ma l'**hold-out è positivo SOLO a L=2.0** (a L=2.5/3.0 crolla a −0.5..−0.8). Il plateau sul full è
|
||||||
|
ampio, quello che conta — l'hold-out — è single-row. Da rinforzare prima di credere alla stazionarietà.
|
||||||
|
2. **Standalone FULL 0.92 < soffitto ~1.3.** Coerente col soffitto direzionale BTC/ETH: il valore di ERM
|
||||||
|
è **marginale/diversificante** (corr 0.15 a TP01, 0.28 a SKH01), non assoluto. Non rompe il soffitto.
|
||||||
|
3. **Multiple-testing non deflazionato.** 102 celle testate (60 ERM + 16 VEM + 24 VBR + 2 TOD) senza
|
||||||
|
deflated-Sharpe (a differenza del filone C). Il multi-cut 2026 = +2.861 è una manciata di giorni che
|
||||||
|
gonfia. Storia sub-daily certificata utile ~quanto SKH01 → finestra non lunghissima.
|
||||||
|
4. **Esecuzione 8h** = complessità operativa reale (vedi sopra), oltre il modello a haircut nullo.
|
||||||
|
|
||||||
|
## Analisi di robustezza / de-bias (`intraday_regime_analysis.py`) — il lead NON regge
|
||||||
|
|
||||||
|
I caveat #1 (plateau hold-out single-row) e #3 (multiple-testing) erano i sospetti giusti. Tre test di
|
||||||
|
de-bias li trasformano da sospetto in **bocciatura** dello slot:
|
||||||
|
|
||||||
|
| test | esito |
|
||||||
|
|---|---|
|
||||||
|
| **A) Deflated-Sharpe** (Bailey & Lopez de Prado) su 122 trial cercati | **FAIL.** DSR 0.000 (tutti) / **0.163 (escludendo i trap TOD)** / 0.241 (solo-ERM) — tutti ≪ 0.95. Lo Sharpe winner (0.92) è sotto lo Sharpe-max-atteso-null (1.16–2.51): il search ha trovato celle a 1.6 full / 1.7 in-sample, il winner 0.92 **non è eccezionale**. |
|
||||||
|
| **B) Selezione IN-SAMPLE-only** (scelgo la cella ERM col solo Sharpe < 2025) | **earns_slot=False.** La cella migliore pre-hold-out è un'**ALTRA** (8h L=2.0 thr=0.4 **long-flat**), con corr→TP01 **0.53** (è trend-beta travestito) → marginal=**NEUTRAL**. Il winner max-hold **non si seleziona senza guardare l'hold-out** → il suo `earns_slot=True` era **selezione-sull'hold-out**. |
|
||||||
|
| **C) Ensemble del plateau** (media 20 celle L×thr, niente cherry-pick) | **earns_slot=False.** marginal=ADDS, in-sample Sh 1.01, corr→TP01 0.18 — ma **`robust_oos=False`** (clean-year + jackknife): l'uplift hold-out è trascinato dal **2026 (+2.09 multicut)**, manciata di giorni. |
|
||||||
|
|
||||||
|
**Dove vive l'(eventuale) edge** (per-anno, blend 3-way 60/25/15 vs 2-way 75/25): uplift FULL solo **+0.10**,
|
||||||
|
**negativo nel 2021 (−0.23) e 2022 (−0.15)**, positivo altrove; l'uplift HOLD **+0.30 è concentrato nel
|
||||||
|
2026 (+0.46)**. corr(ERM,SKH) 0.28 full (fino a 0.42 in alcuni anni) → **parziale sovrapposizione con SKH**,
|
||||||
|
non ortogonalità piena.
|
||||||
|
|
||||||
|
**Lettura.** Il segnale efficiency-ratio non è rumore puro (l'ensemble ha in-sample Sh ~1.0, positivo nella
|
||||||
|
maggior parte degli anni), ma come **slot** fallisce ogni de-bias: il `earns_slot=True` della scoperta era
|
||||||
|
prodotto da **(1) selezione della cella sull'hold-out** + **(2) coda 2026** + **(3) multiple-testing non
|
||||||
|
corretto**. È lo stesso falso-positivo che l'alt-sweep 100-agent imparò a uccidere — qui ucciso dai gate.
|
||||||
|
|
||||||
|
## Caveat originari (ora risolti dall'analisi sopra)
|
||||||
|
|
||||||
|
1. ~~Plateau hold-out single-row~~ → **confermato fatale**: l'edge hold-out a L=2.0 è cell-selection.
|
||||||
|
2. ~~Multiple-testing non deflazionato~~ → **deflazionato: DSR FAIL** anche senza i trap.
|
||||||
|
3. Esecuzione 8h: irrilevante ormai (lo slot non c'è).
|
||||||
|
|
||||||
|
## Verdetto onesto: **NON è uno slot. Falso positivo da selezione-hold-out + coda 2026.** SCARTATO come sleeve.
|
||||||
|
|
||||||
|
Lo "earns_slot=True" della scoperta **non sopravvive** alla de-selezione: deflated-Sharpe FAIL (anche
|
||||||
|
escludendo i controlli), selezione in-sample-only → NEUTRAL su un'altra cella (trend-beta corr 0.53),
|
||||||
|
ensemble del plateau → robust_oos FAIL. **Conferma ennesima del soffitto direzionale BTC/ETH ~1.3**: un
|
||||||
|
segnale a 2 asset non lo supera; la via resta il cross-sectional (XS01). Resta al più una **curiosità in
|
||||||
|
forward-monitor** (l'efficiency-ratio ha un debole edge in-sample reale), ma da non armare come alpha.
|
||||||
|
Gli altri tre meccanismi: VBR=NOISE, VEM hold-out<0, TOD=controllo FAIL come atteso.
|
||||||
|
|
||||||
|
**Lezione harness (CODIFICATA).** Lo script di scoperta selezionava il vincitore per `min_hold` massimo
|
||||||
|
sulla griglia = **selezione-sull'hold-out**, il punto cieco che ha generato il falso PASS. Il marginal
|
||||||
|
scorer da solo non basta se la *cella* è scelta guardando l'hold-out: serve **(a)** scegliere la cella
|
||||||
|
in-sample-only (o walk-forward) **prima** di valutare il marginal, e **(b)** deflazionare per il numero di
|
||||||
|
celle/famiglie testate. Stesso buco segnalato per CC01 ("Sharpe implausibile") e per l'alt-sweep
|
||||||
|
(hold-out-fitting): qui in forma "selection-on-holdout". Ora è **codice** in `altlib` (LESSON 4): tre
|
||||||
|
funzioni nuove — `deflated_sharpe()` (Bailey & Lopez de Prado), `select_cell_insample()` (scelta cella
|
||||||
|
col solo Sharpe pre-HOLDOUT), e il gate combinato **`study_family_honest()`** (`earns_slot_honest =
|
||||||
|
earns_slot[cella in-sample] AND deflated-Sharpe≥0.95`). Verificato: su ERM il gate ritorna
|
||||||
|
`earns_slot_honest=False` (cella in-sample = trend-beta NEUTRAL, DSR 0.74). Analisi completa in
|
||||||
|
`scripts/research/intraday_regime_analysis.py`; test in `tests/test_harness_realism.py`.
|
||||||
|
**Regola nuova: una strategia direzionale grid-searched si giudica con `study_family_honest`, non
|
||||||
|
chiamando `study_marginal` sulla cella a max hold-out.**
|
||||||
|
|
||||||
|
Nessun impatto sul book live (branch separato, config canonica invariata).
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
# 2026-06-29 — Filone D: MACRO regime-gate sul book crypto — RIDONDANTE col trend, SCARTATO
|
||||||
|
|
||||||
|
**Tesi.** Usare segnali macro/cross-market — equity (SPY/QQQ/IWM), credito (HYG/LQD), oro (GLD/SLV),
|
||||||
|
tassi (TLT/IEF) — come **gate risk-on/risk-off** sul book BTC/ETH, per migliorare il *timing* del
|
||||||
|
drawdown di TP01: regime risk-off (credito che cede, equity sotto trend, fuga sui bond) → riduci/azzera
|
||||||
|
l'esposizione crypto; risk-on → lascia agire TP01. **È eseguibile** (gata solo BTC/ETH perp, non aggiunge
|
||||||
|
gambe). Script `scripts/research/macro_regime_gate.py`, test `tests/test_macro_regime_gate.py`. Branch
|
||||||
|
`research/equity-meanrev-ib` (separato, nessun impatto live). Dati: `data/raw/eq_*_1d.parquet` (ETF daily,
|
||||||
|
allineati causale `merge_asof backward` sul calendario SPY).
|
||||||
|
|
||||||
|
**NON è un lead-lag direzionale** (già morto: diari 2026-06-22/-23). L'angolo nuovo = un overlay
|
||||||
|
binario/continuo di **de-risk** sul book esistente.
|
||||||
|
|
||||||
|
## Il rischio noto in partenza (CLAUDE.md)
|
||||||
|
|
||||||
|
La lezione DVOL-spike (2026-06-26): un gate di de-risk rischia di essere **ridondante col trend** — TP01
|
||||||
|
è già long-flat e va a 0 nei crash (Δ 0.00). Questo script DOVEVA dimostrare che il gate aggiunge **oltre**
|
||||||
|
quel che TP01 fa da solo. **Non ci riesce.**
|
||||||
|
|
||||||
|
## Gate provati (tutti causali: SMA/ratio/z-score rolling, merge_asof backward)
|
||||||
|
|
||||||
|
`SPY>MA{50,100,150,200,250}`, `HYG>MA`, ratio di credito `HYG/LQD`, `HYG/IEF`, combo a maggioranza
|
||||||
|
(SPY+HYG+HYG/LQD, binario e continuo), flight-to-quality (`TLTup&SPYdn`, `GLDup&SPYdn`), regime di vol
|
||||||
|
equity `SPYvol_z1` (proxy "VIX-spike" senza VIX). g_off ∈ {0.0, 0.5}.
|
||||||
|
|
||||||
|
## Esiti
|
||||||
|
|
||||||
|
I gate di trend equity alzano lo Sharpe FULL della combo (SPY>MA150/200/250 → FULL ~1.22-1.25 vs TP01-solo
|
||||||
|
1.30) ma **non l'hold-out** (HOLD ~0.17-0.19) → è **de-levering**, non timing: tagliano DD spegnendo il
|
||||||
|
book in mercati equity laterali, non anticipando i crash crypto. Il miglior profilo DD è `SPYvol_z1`.
|
||||||
|
|
||||||
|
### Deep-dive `SPYvol_z1` — il controllo decisivo (ridondanza col trend)
|
||||||
|
|
||||||
|
| | exposure TP01 risk-off | exposure risk-on | giorni risk-off | **giorni in cui il gate LAVORA** | corr(1-gate, 1-expo) |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| BTC | 0.023 | 0.093 | 18% | **3%** | 0.278 |
|
||||||
|
| ETH | 0.013 | 0.068 | 16% | **2%** | 0.296 |
|
||||||
|
|
||||||
|
"Il gate lavora" = giorno risk-off **E** posizione TP01 non già flat. Accade nel **2-3% dei giorni**: nel
|
||||||
|
resto, quando il gate vorrebbe de-riskare, TP01 è **già flat da solo**. Il gate spegne un motore già spento.
|
||||||
|
|
||||||
|
### Marginal scorer vs TP01 (gate come candidato-sleeve)
|
||||||
|
|
||||||
|
```
|
||||||
|
abs=FAIL marginal=REDUNDANT EARNS_SLOT=False
|
||||||
|
corr->TP01 full 0.989 hold 0.984 beta 0.978 resid Sharpe 0.739
|
||||||
|
multi-cut persistent=True has_insample_edge=True (standalone 1.634) is_hedge=False
|
||||||
|
blend w25: full 1.323 (+0.026) hold 0.257 (-0.046) blend w50: full 1.348 (+0.051) hold 0.21 (-0.093)
|
||||||
|
```
|
||||||
|
|
||||||
|
corr→TP01 **0.989**, beta 0.98: lo stream gated **È** TP01. L'uplift hold-out è **negativo** (de-levering
|
||||||
|
che toglie ritorno fuori dai crash). overlay-delta (gated−solo) come stream a sé: `verdict=NEUTRAL`.
|
||||||
|
|
||||||
|
## Causalità / eseguibilità (gli unici aspetti promossi)
|
||||||
|
|
||||||
|
- **Leak-free**: `causality_ok=True` (max_tail_diff 0.0); STRICT align (1 barra equity extra di lag) →
|
||||||
|
FULL invariato; `day_boundary_robust=INVARIANT` (spread 0.0). Allineamento macro→crypto backward-only.
|
||||||
|
- **Eseguibile a $600**: haircut `eval_weights_smallcap` ≈ **0.00** su BTC ed ETH. Fee-survivente
|
||||||
|
(0.00→0.30% RT: 1.42→1.33). Tecnicamente impeccabile — semplicemente **non aggiunge alpha**.
|
||||||
|
|
||||||
|
## Verdetto: **SCARTATO (ridondante col trend).** earns_slot=False.
|
||||||
|
|
||||||
|
Conferma esatta della lezione in CLAUDE.md: un overlay di de-risk su un book che è **già** long-flat e
|
||||||
|
già a 0 nei crash non ha quasi nulla da fare (lavora il 2-3% dei giorni, corr→TP01 0.99). Il taglio di DD
|
||||||
|
che mostra è **de-levering**, replicabile meglio con un `target_vol` più basso (stessa lezione del
|
||||||
|
TP01×DVOL overlay del 2026-06-26). Il macro-regime **non anticipa** i drawdown crypto meglio del prezzo
|
||||||
|
crypto stesso. Nessuno sleeve registrato; nessun impatto sul book live.
|
||||||
|
|
||||||
|
**Sottoprodotto utile:** il gate `redundancy_diag` (exposure risk-off vs risk-on + "quota giorni in cui il
|
||||||
|
gate lavora") è il test pulito da riusare ogni volta che si propone un overlay di de-risk — se "il gate
|
||||||
|
lavora" è basso e corr→TP01 ~1, è ridondante, a prescindere dallo Sharpe FULL che mostra.
|
||||||
@@ -0,0 +1,106 @@
|
|||||||
|
# 2026-06-29 — Ricerca strategie a 5 thread paralleli: 0 nuovi sleeve, 1 LEAD che rompe 2 muri su 3
|
||||||
|
|
||||||
|
**Mandato.** "Cerca altre strategie" (+ "senza correlazioni, a segnale" + "a 1 gamba in/out a segnale").
|
||||||
|
Cinque ricerche parallele su aree genuinamente inesplorate, tutte sull'harness onesto condiviso
|
||||||
|
(`altlib` + `xsec_v2_nonmom`) con TUTTI i gate: causalità (prefix-check), netto fee 0.10% RT + sweep,
|
||||||
|
OOS hold-out 2025+, **deflated-Sharpe** (multiple-testing), **gate anti-selection-on-holdout**
|
||||||
|
(`study_family_honest`: cella scelta IN-SAMPLE-only), marginal vs TP01/XS01, corr vs book, haircut $600.
|
||||||
|
Branch `main`, **nessun impatto live** (solo file nuovi, nessuno sleeve registrato).
|
||||||
|
|
||||||
|
Premessa onesta (base-rate): il soffitto direzionale BTC/ETH ~1.3 è già confermato e lo sweep di 104
|
||||||
|
ipotesi (2026-06-20) non produsse nulla di nuovo che reggesse. L'attesa era "quasi tutto SCARTATO".
|
||||||
|
|
||||||
|
## Esiti per thread
|
||||||
|
|
||||||
|
| # | Thread | File | Verdetto |
|
||||||
|
|---|--------|------|----------|
|
||||||
|
| 1 | **XSEC low-risk cousins** (MAX/lottery, idio-vol, Amihud) | `xsec_v3_lowrisk.py` | 1 LEAD (IVOL), 0 sleeve |
|
||||||
|
| 2 | **XSEC momentum-structure** (risk-adj/accel/frog-in-pan/vol-managed vs XS01) | `xsec_v3_momstruct.py` | tutto REDUNDANT/SCARTATO |
|
||||||
|
| 3 | **Meta-allocazione** (allocazione dinamica tra i 4 sleeve) | `meta_allocation.py` | pesi fissi vincono |
|
||||||
|
| 4 | **Segnali ortogonali ETH/BTC** (relative-value dollar-neutral) | `orthogonal_signals.py` | 2 LEAD (STATARB, DVOLSPREAD) |
|
||||||
|
| 5 | **1-gamba a segnale** (MACD/RSI/Supertrend/Donchian/BBands/EMA) | `signal_inout_1leg.py` | 0/12 earns_slot |
|
||||||
|
|
||||||
|
**Netto: 0 nuovi sleeve.** Il soffitto regge. Test 143/143.
|
||||||
|
|
||||||
|
### Thread 1 — Low-risk cross-sectional (51 alt HL)
|
||||||
|
Tre fattori mai provati (il filone C aveva fatto total-vol e BAB, non questi). **IVOL** (idiosyncratic-vol
|
||||||
|
basso, 19-major B30 H5 k8): FULL 1.06 / HOLD **1.22** / corr ~0 a XS01 e TP01 / positivo ogni anno /
|
||||||
|
uplift portafoglio HOLD +0.42/+0.50 — l'unico LEAD di valore. **MAX** e **AMIHUD-liquido** sono lo stesso
|
||||||
|
tema "evita speculativo/illiquido/volatile" in altre vesti (corr fra loro 0.33-0.59). **AMIHUD
|
||||||
|
long-illiquido SCARTATO** (premio illiquidità invertito in crypto: vincono i major liquidi). Bocciatura
|
||||||
|
del claim forte: **deflated-Sharpe 0.30-0.37 ≪ 0.95** (96 trial), storia ~2.5 anni, book 10-16 gambe →
|
||||||
|
**STAT-MODE**. Nota di rigore: il naive best-HOLD atterrava su celle in-sample-negative (holdout-fitting) →
|
||||||
|
l'agente ha auto-aggiunto il gate has_insample_edge. → **forward-monitor IVOL**.
|
||||||
|
|
||||||
|
### Thread 2 — Momentum-structure vs XS01
|
||||||
|
4 varianti (risk-adjusted, acceleration, frog-in-pan, vol-managed). **Nessuna batte né diversifica XS01**
|
||||||
|
(standalone 1.42). Sostituire XS01 con una variante **distrugge l'hold-out** del portafoglio (−0.58…−1.38)
|
||||||
|
— prova diretta che l'edge di XS01 sta nella sua struttura SPECIFICA (blend z-score [30,90] + gate
|
||||||
|
dispersione), non in varianti generiche. Deflated-Sharpe max 0.49. Tutte REDUNDANT/SCARTATO.
|
||||||
|
|
||||||
|
### Thread 3 — Meta-allocazione dinamica
|
||||||
|
Vol-parity / momentum-of-sleeves / dispersion-regime / drawdown-control vs pesi fissi, con costo di
|
||||||
|
ribilancio realistico. **Nessuno batte i pesi fissi OOS.** Vol-parity = trappola da manuale (+0.09…+0.44
|
||||||
|
sui tagli in-sample 2022-24, **−0.11 sull'hold-out 2025** → intercettato dal multi-cut). Drawdown-control
|
||||||
|
RIDONDANTE (TP01 va già flat nei crash, il gate non si attiva mai). I 4 sleeve sono già quasi-scorrelati
|
||||||
|
(corr ~0.12 max) → i pesi fissi sono già vicini al risk-parity ottimo statico. **Mantenere i pesi fissi.**
|
||||||
|
|
||||||
|
### Thread 4 — Segnali ortogonali ETH/BTC (il risultato più notevole)
|
||||||
|
Relative-value dollar-neutral sul ratio log(ETH/BTC): 6 segnali, evaluator a 2 gambe (fee × 2), cella
|
||||||
|
scelta in-sample-only.
|
||||||
|
|
||||||
|
| segnale | FULL/HOLD | corr→book | β-mkt | marginal | DSR (grid/same-sign) | exec $600 | verdetto |
|
||||||
|
|---|---|---|---|---|---|---|---|
|
||||||
|
| **STATARB-RESID** (residual relative-mom ETH−β·BTC, W45 **sgn+1**) | 0.84/0.56 | **0.027** | 0.013 | **ADDS** | 0.056 / 0.929 | haircut ~0 | **LEAD** |
|
||||||
|
| DVOLSPREAD (IV relativa, W60) | 0.74/0.77 | 0.017 | 0.012 | ADDS | 0.082 / 0.907 | haircut ~0 | LEAD |
|
||||||
|
| RATIO-MOM/REV/ACCEL | 0.25-0.68 / ≤0 | ~0 | ~0 | NEUTRAL | <0.23 | ok | NEUTRAL (diversification-math) |
|
||||||
|
| VOLSPREAD | −0.24/−1.47 | ~0 | 0.013 | DILUTES | — | — | SCARTATO |
|
||||||
|
|
||||||
|
**STATARB-RESID rompe 2 dei 3 muri storici:** è **ortogonale per costruzione** (corr→book 0.027, beta di
|
||||||
|
mercato 0.013 — meglio di SKH ~0.09) **ED eseguibile a $600** (book a 2 gambe BTC+ETH perp Deribit,
|
||||||
|
haircut ≈ 0, fee-survive fino a 0.30%/gamba → **NON STAT-MODE**, a differenza di XS01 e delle opzioni). Il
|
||||||
|
muro che **resta** è l'**edge**: Sharpe 0.84 / DSR 0.929 same-sign (ottimistico) ma comunque <0.95.
|
||||||
|
Verificato indipendentemente dal coordinatore: residuo causale (β OLS rolling backward, decisione a
|
||||||
|
close[i], return in i+1), fee a 2 gambe corretta. **⚠ Correzione di etichetta:** la cella vincente è
|
||||||
|
**sgn=+1**, NON sgn=−1 → NON è mean-reversion ma **momentum relativo sul residuo** (long lo spread quando
|
||||||
|
ETH è ricco vs il suo fit su BTC: le dislocazioni ETH-vs-BTC *continuano* a 1d; la MR pura sgn=−1 perde
|
||||||
|
−1.4 in-sample). L'ortogonalità (β~0) viene dalla struttura dollar-neutral, non dal verso. → **LEAD
|
||||||
|
forward-monitor** (monitorabile a costo reale ~0), NON deploy. **CABLATO:** `scripts/live/paper_statarb.py`
|
||||||
|
(config CONGELATA W=45/sgn=+1, doppio libro MODELED/REAL-$600, riusa il segnale esatto di
|
||||||
|
`orthogonal_signals.py`), aggiunto al cron giornaliero accanto a `paper_prevday`; test `tests/test_paper_statarb.py`.
|
||||||
|
**DVOLSPREAD** ri-valida l'ex-lead `dvol_spread`: ADDS ma storia DVOL corta (2021+) → resta forward-monitor
|
||||||
|
come già noto. Secondario crypto-vs-macro = "TSMOM travestito" (corr→book 0.17-0.20), non ortogonale.
|
||||||
|
|
||||||
|
### Thread 5 — 1-gamba a segnale (eseguibile)
|
||||||
|
12 famiglie (MACD/RSI/Supertrend/Donchian/BBands/EMA, ±ADX) su 1d/12h/8h. **0/12 earns_slot_honest.**
|
||||||
|
**Eseguibilità validata** (haircut $600 = 0 ovunque; RSI-MR ~2.5 trade/anno) — ma è l'unica cosa che
|
||||||
|
regge. I trend-follower sono **TP01 travestito** (corr 0.44-0.79, full ~1.2-1.3 = il soffitto) e le celle
|
||||||
|
sub-daily scelte in-sample **collassano OOS** (dimostrazione da manuale del gate selection-on-holdout). La
|
||||||
|
mean-reversion è morta (BBands-MR has_insample_edge=False). I "low-corr interessanti" (RSI-MR, MACD-LS,
|
||||||
|
Donchian-LS) sono **HEDGE non alpha** (`is_hedge=True`, pagano solo quando TP01 è debole), e con
|
||||||
|
deflated-Sharpe <0.95 (RSI-MR 0.861; Donchian-LS passa DSR ma is_hedge). **A $600 un 1-gamba a segnale è
|
||||||
|
eseguibile ma non aggiunge nulla a TP01.**
|
||||||
|
|
||||||
|
## Sintesi / cosa ho imparato
|
||||||
|
|
||||||
|
1. **0 nuovi sleeve, soffitto ~1.3 riconfermato** dal lato direzionale e dal lato struttura-momentum. La
|
||||||
|
ricerca è onesta: ogni candidato è stato ucciso dal gate giusto (deflated-Sharpe, is_hedge,
|
||||||
|
selection-on-holdout, sostituzione-XS01, multi-cut), non da un giudizio a occhio.
|
||||||
|
2. **Il LEAD di valore è STATARB-RESID** (ETH/BTC residual mean-reversion). È il primo stream visto che è
|
||||||
|
**insieme ortogonale (β~0) ED eseguibile a 2 gambe** — cadono i due muri che bloccano XS01 (STAT-MODE)
|
||||||
|
e le opzioni. Manca solo l'edge sopra-soglia. È il candidato n.1 per il **forward-monitor**, e l'unico
|
||||||
|
che — se la finestra forward confermasse l'edge — sarebbe *deployabile* a $600 (non statistico).
|
||||||
|
3. **Forward-monitor (STAT-MODE / sub-soglia):** IVOL (idio-vol XS, 19-major), DVOLSPREAD (storia corta),
|
||||||
|
STATARB-RESID (eseguibile — il più promettente). Nessuno armato come sleeve.
|
||||||
|
4. **I gate nuovi funzionano:** `study_family_honest` (selection-on-holdout) ha intercettato i collassi
|
||||||
|
OOS dei trend 1-gamba e dei low-risk XS; il deflated-Sharpe ha tenuto sotto la soglia ogni Sharpe ~1
|
||||||
|
su storia corta. La lezione del filone B (de-bias prima di credere) è ora applicata di default.
|
||||||
|
|
||||||
|
## Caveat
|
||||||
|
- Universi/finestre: HL ~2.5 anni, DVOL dal 2021 → multiple-testing reale; tutti i LEAD sono sotto la
|
||||||
|
soglia deflazionata. Niente di questo va creduto come alpha finché una finestra forward non lo conferma.
|
||||||
|
- Nessuno sleeve registrato, config canonica invariata (TP01+XS01+VRP01+SKH01 a pesi fissi). Book live
|
||||||
|
intatto. Tutto il lavoro è statistico/forward, su `main` come ricerca.
|
||||||
|
|
||||||
|
Script: `scripts/research/{xsec_v3_lowrisk,xsec_v3_momstruct,meta_allocation,orthogonal_signals,signal_inout_1leg}.py`.
|
||||||
|
Test: i rispettivi `tests/test_*.py` (143/143 verdi).
|
||||||
@@ -0,0 +1,65 @@
|
|||||||
|
# 2026-06-29 — Filone C: cross-sectional NON-momentum su Hyperliquid — DEBOLE / forward-monitor
|
||||||
|
|
||||||
|
**Tesi.** XS01 (sleeve attivo) è momentum cross-sectional sui 19 major HL. Lezione del progetto
|
||||||
|
(2026-06-19/20): **espandere il numero di asset NON aiuta il momentum** (gli small-cap diluiscono/
|
||||||
|
invertono il segnale). Quindi qui NON si ri-prova l'espansione-universo: si cerca un **meccanismo
|
||||||
|
DIVERSO dal momentum** che, market-neutral e scorrelato, possa diversificare il portafoglio. Script
|
||||||
|
`scripts/research/xsec_v2_nonmom.py`, test `tests/test_xsec_v2.py`. Branch `research/equity-meanrev-ib`.
|
||||||
|
|
||||||
|
## Meccanismi provati (tutti L/S dollar-neutral, vol-target ~20%, ribilancio periodico, CAUSALI)
|
||||||
|
|
||||||
|
| | meccanismo |
|
||||||
|
|---|---|
|
||||||
|
| REV | short-term reversal grezzo (long loser / short winner di breve) |
|
||||||
|
| IREV | reversal **idiosincratico** (sul residuo dopo aver tolto il mercato, beta-adjusted) |
|
||||||
|
| LOWVOL | factor **low-vol** (long bassa vol realizzata / short alta vol) |
|
||||||
|
| IMOM | momentum **idiosincratico** (sul residuo, ≠ raw mom) — *riferimento* |
|
||||||
|
| BAB | betting-against-beta (long basso beta / short alto beta) |
|
||||||
|
| MOM | momentum grezzo — *riferimento* |
|
||||||
|
|
||||||
|
Universi: **19 major** e **51 all** (i parquet certificati). Gate canonico di selezione: FULL>0.5,
|
||||||
|
HOLD>0, |corr→XS01|<0.6 (escluse le famiglie momentum MOM/IMOM, che sono riferimento, non candidati).
|
||||||
|
|
||||||
|
## Esiti — un solo candidato non-momentum supera il gate standalone
|
||||||
|
|
||||||
|
```
|
||||||
|
[OK] LOWVOL 19-major B30 H10 k5 FULL +1.07 HOLD +1.07 DD 19% corrXS +0.16 corrTP -0.28
|
||||||
|
[--] BAB 19-major B60 H10 k8 FULL +0.47 HOLD +1.15 DD 28% corrXS +0.20 corrTP -0.27
|
||||||
|
[--] REV/IREV (19 e 51) FULL ~0 o NEGATIVO (reversal cross-sectional non paga)
|
||||||
|
[--] LOWVOL 51-all FULL +0.42 (il long-tail diluisce, come per il momentum)
|
||||||
|
```
|
||||||
|
|
||||||
|
- **REV / IREV negativi** (FULL −0.10..−0.70): il reversal cross-sectional grezzo o idiosincratico **non
|
||||||
|
è un edge** su questo universo/finestra — coerente con la morte storica del mean-reversion del progetto.
|
||||||
|
- **BAB** ha un buon hold-out ma FULL solo +0.47 (sotto soglia) e DD 28%.
|
||||||
|
- **LOWVOL 19-major** (betting-against-vol) è l'unico idoneo: FULL **1.07** / HOLD **1.07** / DD 19%,
|
||||||
|
causale (max_tail_diff 0), corr→XS01 +0.16 (scorrelato), corr→TP01 −0.28.
|
||||||
|
- Espandere a **51 asset peggiora** anche il low-vol (FULL 1.07→0.42): riconferma che i margini
|
||||||
|
cross-sectional sono nella **struttura del segnale**, non nel numero di asset.
|
||||||
|
|
||||||
|
### Uplift portafoglio (4 → 5 sleeve, LOWVOL come 5° sleeve)
|
||||||
|
|
||||||
|
```
|
||||||
|
BASE (TP01+XS01+VRP01+SKH01) FULL 2.12 DD 8% | HOLD 2.25 DD 3%
|
||||||
|
+LOWVOL @10% FULL 2.17 (+0.05) | HOLD 2.57 (+0.32)
|
||||||
|
+LOWVOL @15% FULL 2.19 (+0.06) | HOLD 2.62 (+0.37)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Il muro (perché NON è uno sleeve)
|
||||||
|
|
||||||
|
1. **Deflated Sharpe 0.130 ≪ 0.95** (N=216 trial globali; soglia Sharpe-max-null annualizz. 1.79). Con il
|
||||||
|
numero di celle/famiglie/universi testati, lo Sharpe 1.07 **non è significativo** dopo la correzione
|
||||||
|
per multiple-testing. Per-anno: 2024 +0.23 / 2025 +0.50 / **2026 −0.09** (il 2026 è già negativo).
|
||||||
|
2. **Storia ~2.5 anni** (HL nativo 2024-2026): finestra troppo corta per un fattore cross-sectional.
|
||||||
|
3. **Non eseguibile a $600**: book L/S a molte gambe (10+ per lato) → **STAT-MODE**, mai deploy. Stesso
|
||||||
|
vincolo strutturale di XS01 (serve ~20k di capitale).
|
||||||
|
|
||||||
|
## Verdetto: **DEBOLE / forward-monitor (STAT-MODE).** Nessuno sleeve registrato.
|
||||||
|
|
||||||
|
Il **low-vol cross-sectional** (betting-against-vol sui 19 major) è l'unico meccanismo non-momentum con un
|
||||||
|
profilo decente e scorrelato sia a XS01 sia a TP01, e migliorerebbe l'hold-out del portafoglio (+0.32/+0.37).
|
||||||
|
**MA** non supera il deflated-Sharpe (multiple-testing), ha storia cortissima ed è non-eseguibile a questo
|
||||||
|
capitale. → lavoro **puramente statistico**, da tenere in forward-monitor come *secondo* segnale
|
||||||
|
cross-sectional a fianco di XS01, da rivalutare solo a scala (capitale ~20k+) e con più storia HL.
|
||||||
|
|
||||||
|
Reversal cross-sectional (REV/IREV) **confermato non-edge** su HL. Nessun impatto sul book live.
|
||||||
@@ -0,0 +1,91 @@
|
|||||||
|
# 2026-07-01 — Breadth / market-internals del mercato ALT come segnale su BTC/ETH — SCARTATO
|
||||||
|
|
||||||
|
**Tesi.** Gli "internals" del mercato crypto — la partecipazione degli alt — come segnale
|
||||||
|
direzionale o gate di de-risk su BTC/ETH perp (2 gambe, eseguibile a ~$600): % di alt sopra la
|
||||||
|
propria SMA(N), advance/decline, % di alt che battono BTC (risk-appetite relativo), breadth-thrust.
|
||||||
|
Script `scripts/research/r0701_breadth_internals.py` (non committato per policy del filone; harness
|
||||||
|
`altlib`). Dati: i 51 parquet certificati `data/raw/hl_*_1d.parquet` → panel di **49 alt**
|
||||||
|
(esclusi hl_btc/hl_eth dalla breadth; hl_btc solo come riferimento per la famiglia RS), barre a
|
||||||
|
volume 0 mascherate (lezione backfill 2026-06-20; il fetch le aveva già ripulite: vol0=0 su tutti
|
||||||
|
i file, gate comunque attivo).
|
||||||
|
|
||||||
|
**Limite strutturale dichiarato in partenza:** l'universo HL parte dal 2024-01 → dopo il warmup
|
||||||
|
(max 120g) la finestra comune è **2024-05-05 → 2026-07-01 (~2.2 anni)** e l'in-sample pre-HOLDOUT
|
||||||
|
è **~8 mesi del toro 2024**. Qualunque esito poteva essere al massimo un lead.
|
||||||
|
|
||||||
|
## Famiglie e griglia (108 celle, tutte contate nel deflated Sharpe)
|
||||||
|
|
||||||
|
4 famiglie × N∈{20,50,100} × soglia∈{0.3,0.5,0.7} × forma∈{LS, long-flat, gate-su-TP01}:
|
||||||
|
|
||||||
|
- **FAM-MA**: % di alt validi con close > SMA(N) (breadth classica).
|
||||||
|
- **FAM-AD**: frazione di advancers (ret 1g>0), SMA(N).
|
||||||
|
- **FAM-RS**: % di alt che battono BTC sul ritorno a N giorni (≈ market-neutral, l'angolo più ortogonale).
|
||||||
|
- **FAM-TH**: breadth-thrust = Δ a N giorni della breadth MA20 (thrust/collapse), score 0.5+Δ.
|
||||||
|
|
||||||
|
Tutte causali (rolling/shift soltanto), MIN_VALID=20 asset per data (osservato: 42-49). LS/LF
|
||||||
|
vol-target 20% cap 2x (sizing TP01-style); GATE = posizione TP01 × gate binario. Fee 0.10% RT +
|
||||||
|
sweep 0-0.30%. Procedura onesta = mirror di `study_family_honest` sulla finestra comune (il
|
||||||
|
padding pre-2024 avrebbe contaminato il ranking full-history: le celle GATE con gate=1 pre-storia
|
||||||
|
erediterebbero lo Sharpe 2019-2024 di TP01): **cella scelta col SOLO Sharpe in-sample**, DSR su
|
||||||
|
tutti i trial, `marginal_vs_tp01` di altlib sulla cella scelta.
|
||||||
|
|
||||||
|
## ⚠️ Bug trovato e corretto: allineamento merge_asof su indice non-ns
|
||||||
|
|
||||||
|
La prima versione di `_align` usava `b.index.view("int64")//10**6` per i timestamp della breadth:
|
||||||
|
su un DatetimeIndex tz-aware **a risoluzione non-ns** (pandas 2.x) la scala esce sbagliata →
|
||||||
|
`merge_asof backward` matchava OGNI barra BTC/ETH all'**ultimo** valore della breadth = **il futuro
|
||||||
|
broadcast su tutta la storia**. Sintomo: decine di celle con lo stesso identico Sharpe (il segnale
|
||||||
|
era una costante). **`causality_ok` NON lo vede** — la serie breadth è un input esterno *fisso*,
|
||||||
|
quindi il target sul prefisso troncato coincide col target full per costruzione. Fix: epoca
|
||||||
|
esplicita `(idx - Timestamp(1970, tz=UTC)) // Timedelta(1ms)` (come `resample_tf`). **Lezione
|
||||||
|
harness:** ogni allineamento di un panel esterno via merge_asof va fatto con epoch-ms esplicita, e
|
||||||
|
il sintomo "molte celle con Sharpe identico" è un red-flag di allineamento rotto (gemella
|
||||||
|
dell'osservazione merge_asof del 2026-06-20).
|
||||||
|
|
||||||
|
## Esito (procedura onesta, finestra comune 2024-05+)
|
||||||
|
|
||||||
|
104/108 celle valutabili (4 degeneri flat), 47 con FULL>0. **Cella scelta in-sample** (IS 2.11,
|
||||||
|
la selezione non tocca mai l'hold-out): **TH N=100 thr=0.7 long-flat** — long solo dopo un
|
||||||
|
breadth-thrust (+0.2 di breadth MA20 in 100g), attiva il 32% dei giorni.
|
||||||
|
|
||||||
|
| metrica | valore |
|
||||||
|
|---|---|
|
||||||
|
| standalone finestra comune | IS **+2.11** → FULL **+0.99**, HOLD **+0.41** |
|
||||||
|
| assoluto (per-asset, trimmed) | **PASS** — minFull +0.68, minHold +0.38, fee-survive 0.30%RT, DD 7-11% |
|
||||||
|
| marginale vs TP01 | **ADDS** — corr full **0.401**/hold 0.358, resid Sharpe 0.87, multicut {2025:+0.076, 2026:+0.366} persistente, is_hedge=False |
|
||||||
|
| **robust_oos** | **False** — jackknife drop-best-month **−0.068** (l'uplift hold-out sta in piedi su UN mese) |
|
||||||
|
| **deflated Sharpe** | **0.433** su 104 trial (null-max atteso 1.10) — lontanissimo dal PASS ≥0.95 |
|
||||||
|
| earns_slot / earns_slot_honest | **False / False** |
|
||||||
|
| causality_ok | True (post-fix) |
|
||||||
|
| smallcap $600 | haircut ≈ **0.00** (BTC −0.01, ETH +0.00; 137-152 trade) — eseguibile |
|
||||||
|
|
||||||
|
**Ridondanza col trend (il rischio n.1, lezione macro-gate):** qui NON è la modalità di morte.
|
||||||
|
corr(pos, TP01pos) 0.15-0.30 e il segnale "lavora" (off mentre TP01 non è flat) nel **24-32% dei
|
||||||
|
giorni** (il macro-gate lavorava nel 2-3%). Le forme direzionali LS/LF sono genuinamente diverse
|
||||||
|
da TP01 (corr→TP01 0.1-0.4). La forma **gate-su-TP01** invece sì: best gate = NEUTRAL a corr
|
||||||
|
0.803, e i gate a soglia bassa = REDUNDANT corr 1.0 (gate mai off → TP01 identico). **La breadth
|
||||||
|
come gate di de-risk non aggiunge nulla; come segnale direzionale è diversa dal trend ma l'edge
|
||||||
|
non è dimostrabile.**
|
||||||
|
|
||||||
|
**Il gemello in hindsight (trasparenza, NON selezionabile).** TH N=100 thr=0.7 **LS** fa FULL 1.13
|
||||||
|
/ HOLD 1.06, corr→TP01 **−0.26**, marginal ADDS con robust_oos=True e jackknife +0.46. MA il suo
|
||||||
|
in-sample (1.30) è sotto quello della cella lf (2.11): sceglierlo = **selezione-sull'hold-out**
|
||||||
|
(esattamente il falso positivo ERM del 2026-06-29). E comunque **DSR 0.518 < 0.95**: anche la
|
||||||
|
lettura più caritatevole muore sulla deflazione multiple-testing.
|
||||||
|
|
||||||
|
## Verdetto: SCARTATO (niente sleeve, niente forward-monitor cablato)
|
||||||
|
|
||||||
|
1. La cella scelta onestamente è ADDS ma **robust_oos=False** (uplift a un mese) e **DSR 0.433**
|
||||||
|
su 104 trial: su ~8 mesi di in-sample (toro 2024) un IS di 2.1 è indistinguibile dal massimo
|
||||||
|
atteso per caso (1.10) e non regge.
|
||||||
|
2. Il candidato migliore col senno di poi (TH-LS) sarebbe selezione-sull'hold-out e fallisce
|
||||||
|
comunque il DSR (0.518) — il gate `study_family_honest` fa esattamente il suo lavoro.
|
||||||
|
3. Il limite è la **storia**: 2.2 anni totali, 8 mesi di in-sample. Non c'è modo onesto di
|
||||||
|
dimostrare l'edge oggi.
|
||||||
|
|
||||||
|
**Cosa resta.** (a) La famiglia **breadth-thrust (TH)** è l'unico angolo con celle OOS-positive e
|
||||||
|
bassa/negativa corr a TP01 — **rivisitabile quando il panel HL avrà ≥1-2 anni di storia nativa in
|
||||||
|
più** (in-sample multi-regime, DSR ricalcolabile); nessun cablaggio forward oggi, il costo
|
||||||
|
dell'attesa è zero. (b) Il breadth-**gate** su TP01 va in bacino con macro-gate e DVOL-gate: terza
|
||||||
|
conferma che TP01 non ha bisogno di de-risk esterno (long-flat, già flat nei crash). (c) Il fix
|
||||||
|
`_align` (epoch esplicita) è la lezione riusabile per ogni futuro panel esterno.
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
# 2026-07-01 — Book live: verifica gate SKH01 + emersione errori silenziosi
|
||||||
|
|
||||||
|
## Contesto
|
||||||
|
Il BOOK DERIBIT armato (TP01 0.75 + SKH01 0.25 nettati) è **flat da quando è stato armato
|
||||||
|
(2026-06-23)**: 193 run orari, tutte HOLD, zero ordini reali. Domanda: il flat è legittimo o il
|
||||||
|
gate di SKH01 è muto per un bug?
|
||||||
|
|
||||||
|
## Verifica del gate SKH01 — SANO
|
||||||
|
- **Logica viva:** `skyhook_entries` produce 335 entry (BTC, 222 long/113 short) e 341 (ETH,
|
||||||
|
226/115) su tutta la storia. Non è degenere.
|
||||||
|
- **Shorta davvero i crash:** ha aperto SHORT sulla gamba di crollo di fine maggio/inizio giugno —
|
||||||
|
BTC 05-28→06-04 ($73k→$64k), ETH 06-02→06-06 ($1865→$1555).
|
||||||
|
- **Flat da 06-23 = legittimo:** ultimo entry 06-06, `max_bars=16 × 230m ≈ 2,5g` → chiuso ~06-08/09,
|
||||||
|
**prima** dell'arming (06-23). Dal grind post-crash nessun setup breakout+regime valido → flat
|
||||||
|
corretto per design ("NON trend-follower"). Contesto prezzo al 01-07: BTC −53% dal picco, ETH
|
||||||
|
−67,5%, momentum negativo su 1/3/6/12 mesi → anche TP01 (long-flat TSMOM) è a 0x.
|
||||||
|
- **Entrambi i feed valutano senza crash:** certificato e live `fresh_5m` → `skh_error=None`.
|
||||||
|
|
||||||
|
## Bug scoperto e corretto — pattern "eccezione ingoiata → stato safe silenzioso"
|
||||||
|
`src/live/` aveva più `try/except` che, in errore, producono uno stato safe (flat/fallback) **senza
|
||||||
|
farlo emergere**. Rischio: quando l'errore è transitorio ma reale, l'esecutore opera su dati sbagliati
|
||||||
|
credendoli legittimi.
|
||||||
|
|
||||||
|
### (1) `skh_error` — CORRETTO
|
||||||
|
`book_report` scriveva `skh_error` in un dict locale **mai incluso nel return** → `r.get("skh_error")`
|
||||||
|
sempre `None`; e `book_execute` non lo leggeva comunque. Un feed SKH rotto avrebbe forzato SKH→flat in
|
||||||
|
silenzio (entry mancato, nessun alert). Fix: `skh_error` esposto nel return + `book_execute` emette
|
||||||
|
log `⚠️ SKH FEED ERRORE` + alert Telegram. (commit 31369b3)
|
||||||
|
|
||||||
|
### (2) Gate fail-safe posizione (Opzione A) — CORRETTO
|
||||||
|
`src/live/shadow.py::_positions`: se la read della posizione reale Deribit lancia, assume flat (0.0)
|
||||||
|
con una `note`, MAI propagata (`pos_src`) a `book_report`/`book_execute`. Severità mitigata a valle
|
||||||
|
da `rebalance_signed` che **rilegge la posizione fresca** (no doppia-posizione), ma resta il caso
|
||||||
|
"target≈0 + posizione aperta + read fallita → close saltato quel run" (transitorio, backstoppato dal
|
||||||
|
disaster-SL −30%). **Scelta A = gate fail-safe:** `_positions` ritorna un `pos_error` esplicito →
|
||||||
|
propagato `shadow_report → book_report → book_execute`; se presente (ONLINE ma posizione IGNOTA)
|
||||||
|
l'esecutore **NON opera a cieco** (return + alert), come già fa per `online`.
|
||||||
|
|
||||||
|
### (3) Diagnostica equity (Opzione B) — CORRETTO
|
||||||
|
`src/live/shadow.py::_equity`: se `account_summary('USDC')` e tutte le per-asset falliscono,
|
||||||
|
`real_eq=None` e `shadow_report` ripiega su `paper_cap` (~$2000 dallo state paper) mentre il conto
|
||||||
|
reale è ~$598 → il book dimensionerebbe su $2000 invece di $598 (**sovradimensiona ~33%**). Il danno
|
||||||
|
è limitato dall'**hard-cap $300/asset** in `book_net_target`. **Scelta B = SOLO DIAGNOSTICA** (niente
|
||||||
|
gate/halt, l'hard-cap già protegge il downside): `shadow_report` calcola `eq_fallback` (ONLINE +
|
||||||
|
equity reale non leggibile + no override), propagato `→ book_report → book_execute`, che stampa
|
||||||
|
`⚠️ EQUITY FALLBACK` + alert Telegram **ma prosegue** (a differenza del gate posizione, che blocca).
|
||||||
|
|
||||||
|
## Test
|
||||||
|
Suite completa **156/156** (era 148; +4 gate A + 4 diagnostica B). Dry-run reale di `book_execute`
|
||||||
|
invariato (nessuna riga d'errore, nessun ordine, conto $598.06 al target). Path live: `pos_error=None`,
|
||||||
|
`skh_error=None`, `eq_fallback=None`.
|
||||||
|
|
||||||
|
## Sintesi finale — i 3 pattern "errore silenzioso" del path live sono ora tutti tracciati
|
||||||
|
| # | Punto | Comportamento | Emersione |
|
||||||
|
|---|-------|---------------|-----------|
|
||||||
|
| 1 | `book_report` feed SKH | SKH → flat | log `⚠️ SKH FEED ERRORE` + alert |
|
||||||
|
| 2 | `_positions` read fallita | posizione → flat | **HALT** (non esegue) + alert (gate A) |
|
||||||
|
| 3 | `_equity` non leggibile | sizing → paper_cap | log `⚠️ EQUITY FALLBACK` + alert (diagnostica B) |
|
||||||
@@ -0,0 +1,114 @@
|
|||||||
|
# 2026-07-01 — Funding rate come segnale TIME-SERIES direzionale su BTC/ETH (R0701): SCARTATO
|
||||||
|
|
||||||
|
## Contesto
|
||||||
|
|
||||||
|
Filone: il **funding orario Hyperliquid come proxy di POSIZIONAMENTO/sentiment** con valenza
|
||||||
|
direzionale a orizzonte giornaliero su BTC/ETH — NON carry. Angolo diverso dal prior art già
|
||||||
|
chiuso: **FC01** (carry cross-sectional delta-neutral 19 alt → LEAD fragile SCARTATO,
|
||||||
|
`2026-06-22-funding-carry-hl.md`) e **funding price-clock** intraday (drift attorno agli stamp →
|
||||||
|
FAIL, onda intraday). Qui l'ipotesi è: funding estremo = affollamento long → fade; funding in
|
||||||
|
espansione = domanda persistente → follow; funding affollato = de-risk del trend (gate).
|
||||||
|
Attrattiva a priori: 2 gambe BTC/ETH perp = **eseguibile al capitale reale ~$600** (non STAT-MODE
|
||||||
|
come XS01/opzioni) — se avesse retto sarebbe stato deployabile.
|
||||||
|
|
||||||
|
Script: `scripts/research/r0701_funding_ts.py`.
|
||||||
|
|
||||||
|
## Dati e causalità (data-first)
|
||||||
|
|
||||||
|
- `data/raw/hlfund_{btc,eth}_1h.parquet`: **2023-05-12 → 2026-06-22, 1138/1138 giorni validi,
|
||||||
|
0 gap** dopo il 2023-06 (primi ~27 giorni a cadenza 8h — la somma giornaliera degli stamp li
|
||||||
|
gestisce indifferentemente). Funding medio **+14.4%/anno BTC, +14.6% ETH**; std del funding
|
||||||
|
giornaliero ~5.5 bps.
|
||||||
|
- **Join causale** (il punto delicato): le barre 1d di `altlib.get` sono **open-labeled**
|
||||||
|
(datetime = 00:00 UTC del giorno D; il close della barra D è noto alle 00:00 di D+1). Il
|
||||||
|
feature-day D aggrega i SOLI stamp in **[D 00:00, D+24h)** — l'ultimo alle 23:00 — quindi tutto
|
||||||
|
è noto PRIMA della decisione al close della barra D; `eval_weights` shifta la posizione al
|
||||||
|
giorno D+1. Prefix-consistency check esplicito: **max diff 0.0** (nessun leak).
|
||||||
|
- **Valutazione su finestra TRONCATA** alla copertura funding, non sul frame prezzi 2018+: fuori
|
||||||
|
copertura il target sarebbe zero per costruzione e i giorni-zero (a) **gonfiano il T del
|
||||||
|
deflated-Sharpe** (anti-conservativo) e (b) diluiscono `cand_insample_sharpe` (il gate
|
||||||
|
`has_insample_edge` scatterebbe a vuoto). La logica di `study_family_honest` è replicata
|
||||||
|
ESATTAMENTE sui frame troncati coi primitivi altlib (selezione IN-SAMPLE-ONLY → gates
|
||||||
|
study_marginal → DSR sull'intera griglia). Cross-check `study_marginal` non-troncato in coda:
|
||||||
|
stessi verdetti (abs WEAK / marginal NEUTRAL / earns_slot False).
|
||||||
|
- ⚠️ **STORIA CORTA**: ~3.1 anni totali → in-sample pre-HOLDOUT ~1.6a (meno warmup z), hold-out
|
||||||
|
2025+ ~1.5a. Dichiarato: nessun numero qui ha il peso statistico di TP01 (7 anni).
|
||||||
|
|
||||||
|
## Metodo
|
||||||
|
|
||||||
|
Famiglia a griglia modesta, 1d, 50/50 BTC+ETH, vol-target 20% cap 2x (convenzione TP01), fee
|
||||||
|
0.10% RT + sweep 0.00-0.30%:
|
||||||
|
|
||||||
|
- **FADE**: z-score(funding daily, lb) ≥ thr → short; ≤ −thr → long (fade dell'affollamento).
|
||||||
|
- **FOLLOW**: z ≥ thr → long; ≤ −thr → short (sentiment momentum).
|
||||||
|
- **GATE**: trend long-flat TP01-like (sgn mom 30d+90d) ma FLAT quando z ≥ thr (de-risk crowding).
|
||||||
|
- **DIVERGE**: momentum prezzo 20d seguito se funding NON affollato (z ≤ −thr), fatto se z ≥ thr.
|
||||||
|
|
||||||
|
Griglia: 4 forme × lb {7,14,30,60}g × thr {0.5,1.0,1.5} = **48 celle**. Selezione cella
|
||||||
|
**in-sample-only** (mai sul hold-out), deflated-Sharpe su tutte le 48, gates marginali
|
||||||
|
(`marginal_vs_tp01`), boundary-shift della finestra di aggregazione funding (−0/3/6/9/12h),
|
||||||
|
`eval_weights_smallcap` a $600.
|
||||||
|
|
||||||
|
## Risultati
|
||||||
|
|
||||||
|
Best in-sample per forma: **fade 0.34, follow 0.81, gate 1.76, diverge −0.34** — il segnale
|
||||||
|
puro-funding è debole ovunque; solo la forma che CONTIENE il trend ha Sharpe.
|
||||||
|
|
||||||
|
**Cella scelta (in-sample): GATE lb=60 thr=1.5** — IS 1.76, FULL 1.16, HOLD 0.29.
|
||||||
|
|
||||||
|
| Gate | Esito |
|
||||||
|
|---|---|
|
||||||
|
| Deflated-Sharpe (48 celle) | **0.215** (null-max atteso 1.59) → **FAIL** (soglia 0.95) |
|
||||||
|
| Assoluto (frame troncati) | **WEAK** (minFull +0.97, ma minHold **+0.04** BTC); fee-survive fino a 0.30% RT |
|
||||||
|
| Marginale vs TP01 | **NEUTRAL**: corr **0.879** (hold 0.92), beta 0.77; uplift w25 hold **+0.001**; robust_oos=False (jackknife −0.074); multicut 2026 **−0.423** |
|
||||||
|
| earns_slot / earns_slot_honest | **False / False** |
|
||||||
|
| Realism | prefix-diff 0.0 (causale); boundary-shift sign-stable (uplift spread 0.047); smallcap $600 haircut ~0.00 (eseguibile, irrilevante senza edge) |
|
||||||
|
|
||||||
|
**Controllo decisivo (lezione TP01-DVOL-overlay)** — lo stesso trend long-flat SENZA gate funding:
|
||||||
|
|
||||||
|
```
|
||||||
|
trend NUDO : IS 1.65 FULL 1.14 HOLD 0.37
|
||||||
|
trend+GATE : IS 1.76 FULL 1.16 HOLD 0.29 corr(gated,nudo)=0.928
|
||||||
|
delta del gate funding: FULL +0.013, HOLD −0.080
|
||||||
|
```
|
||||||
|
|
||||||
|
→ **tutto lo Sharpe della "vincitrice" è il trend**; il contributo del funding è ~zero in-sample
|
||||||
|
e **negativo sul hold-out**. Il gate è TP01 travestito.
|
||||||
|
|
||||||
|
**Miglior cella puro-funding** (la vera tesi del filone): FOLLOW lb=60 thr=0.5 — IS 0.81 ma
|
||||||
|
**FULL −0.28, HOLD −1.69**, marginale **DILUTES** (uplift w25 hold −0.778). L'in-sample 0.81 era
|
||||||
|
"long-il-toro-2023/24" travestito: z-alto di funding = rally già in corso; nel 2025-26 la stessa
|
||||||
|
regola è sistematicamente dalla parte sbagliata. FADE (shortare il crowding) perde sul toro e non
|
||||||
|
recupera abbastanza nel chop; DIVERGE negativa ovunque. NB: esistono celle gate con HOLD migliore
|
||||||
|
(es. gate 7/1.5 HOLD 0.96) — sceglierle sarebbe **selection-on-holdout**, il gate del 2026-06-29
|
||||||
|
esiste esattamente per questo.
|
||||||
|
|
||||||
|
## Perché fallisce (meccanismo)
|
||||||
|
|
||||||
|
1. Su asset MAJOR il funding è **quasi sempre positivo e segue il prezzo con lag**: lo z-score
|
||||||
|
alto coincide col momentum già espresso → FOLLOW è trend-beta ritardato (muore quando il regime
|
||||||
|
gira), FADE è shortare il toro. Non c'è l'anti-persistenza ("crowding → reversal") che la tesi
|
||||||
|
richiede — a 1d, su BTC/ETH, le liquidazioni-da-crowding sono già nel prezzo prima che lo
|
||||||
|
z-score giornaliero diventi estremo.
|
||||||
|
2. L'unico uso "funzionante" (gate di de-risk sul trend) è **ridondante**: TP01-like è già flat
|
||||||
|
quando serve. Stesso verdetto di macro-regime-gate (corr 0.989) e DVOL-overlay: la famiglia
|
||||||
|
"overlay prudenziale su TSMOM" è esaurita — eredita lo Sharpe del trend e non aggiunge nulla.
|
||||||
|
|
||||||
|
## Verdetto
|
||||||
|
|
||||||
|
**SCARTATO.** `earns_slot=False`, `earns_slot_honest=False` (DSR 0.215). Il funding time-series
|
||||||
|
non ha informazione direzionale propria su BTC/ETH a 1d; l'unica cella con Sharpe è trend
|
||||||
|
travestito con contributo funding OOS negativo. Niente forward-monitor: non c'è una componente
|
||||||
|
funding da monitorare. Con FC01 (carry cross-sectional) e il price-clock intraday, il filone
|
||||||
|
"funding come segnale" su dati certi è ora **chiuso su tre lati**.
|
||||||
|
|
||||||
|
## Lascito
|
||||||
|
|
||||||
|
- `scripts/research/r0701_funding_ts.py` riusabile: (a) loader funding→daily **causale** per barre
|
||||||
|
open-labeled (finestra [D, D+24h), gestione cadenza mista 8h/1h, flag validità copertura);
|
||||||
|
(b) pattern "**truncation-honest**" per dataset a copertura parziale — replica di
|
||||||
|
`study_family_honest` su finestra troncata per non gonfiare il T del DSR né diluire
|
||||||
|
`has_insample_edge` con anni di zeri (riusabile per ogni serie corta tipo DVOL/HL).
|
||||||
|
- I parquet `hlfund_*` restano certificati. Se mai si tornasse sul funding: gli estremi VERI
|
||||||
|
(squeeze) vivono sugli alt, ma è di nuovo cross-sectional → STAT-MODE a $600, soglia di prova
|
||||||
|
alta (e FC01 ha già mostrato la fragilità d'universo).
|
||||||
@@ -0,0 +1,174 @@
|
|||||||
|
# 2026-07-01 — Pesi statici ri-ottimizzati + guardia-DD sul portafoglio a 4 sleeve
|
||||||
|
|
||||||
|
## Mandato
|
||||||
|
Migliorare il portafoglio ATTIVO (TP01 41.25 / XS01 18.75 / VRP01 15 / SKH01 25) SENZA nuove
|
||||||
|
strategie: (A) ri-ottimizzazione onesta dei pesi statici, (B) guardia-drawdown a livello
|
||||||
|
portafoglio (replica del soft-guard vincente del tail-hedge lab 2026-06-23), (C) combinazione.
|
||||||
|
NON meta-allocazione dinamica (già scartata, thread 3 del 2026-06-29).
|
||||||
|
Script: `scripts/research/r0701_portfolio_opt.py`. Solo ricerca: nessun file di src/ o live toccato,
|
||||||
|
i pesi sono PROPOSTI, non applicati.
|
||||||
|
|
||||||
|
## Baseline riprodotta
|
||||||
|
`run_portfolio.py` oggi: **FULL Sh 2.12 / HOLD 2.21 / DD full 7.8% / CAGR 23.3%** (vs 2.13/2.30
|
||||||
|
del diario Skyhook: i dati sono avanzati di una settimana, coerente). Matrice sleeve outer-join
|
||||||
|
2019-03-14 → 2026-07-01 (TP01/SKH01 dal 2019, VRP01 dal 2021-05, XS01 dal 2024-01), combine
|
||||||
|
identico a `portfolio.combined_daily` (pesi rinormalizzati per-riga sugli sleeve attivi).
|
||||||
|
|
||||||
|
## (A) Pesi statici — metodo
|
||||||
|
- Ottimizzazione SOLO in-sample (pre-cut), valutazione OOS (post-cut), multi-cut
|
||||||
|
{2024-01, 2024-07, 2025-01}. Sleeve con <120 giorni in-sample al cut (XS01 al 2024-01)
|
||||||
|
PINNED al peso corrente (l'ottimizzatore non ha dati per giudicarli).
|
||||||
|
- Criteri: MAXSH (max-Sharpe del combo simulato), RP (inverse-vol), ERC, MINVAR-R (min-var con
|
||||||
|
vincolo ritorno ≥ pesi correnti). Null: EW (25×4) e CURRENT. Vincoli 5%≤w≤60%, Σ=1.
|
||||||
|
- **Cap STRUTTURALI dichiarati** (prudenza, non statistica): **VRP01 ≤ 15%** (sleeve MODELLATO su
|
||||||
|
DVOL ATM, stress-f non catturato — "niente short-vol da modello in deploy"), **XS01 ≤ 25%**
|
||||||
|
(STAT-MODE, storia ~2.5 anni). Varianti sotto cap: MAXSH-STR (ottimizzato) e EW-STR
|
||||||
|
(EW proiettato sui cap, parameter-free → TP 30 / XS 25 / VRP 15 / SKH 30).
|
||||||
|
|
||||||
|
### Risultati (pesi ottimizzati pre-2025, valutati FULL e HOLD-OUT 2025-26)
|
||||||
|
| criterio | pesi TP/XS/VRP/SKH | FULL Sh | FULL DD | FULL CAGR | HOLD Sh | HOLD DD | HOLD CAGR | multi-cut ΔSh OOS | anni vinti |
|
||||||
|
|---|---|---|---|---|---|---|---|---|---|
|
||||||
|
| CURRENT | 41.2/18.8/15/25 | 2.12 | 7.8% | +23.3% | 2.21 | 3.5% | +16.0% | — | — |
|
||||||
|
| MAXSH | 27.6/17.5/**39.5**/15.4 | 2.17 | 6.3% | +21.8% | 2.27 | 2.8% | +12.7% | +0.24/+0.08/+0.06 | **1/8** |
|
||||||
|
| RP-invvol | 26.7/15.5/**41.6**/16.3 | 2.17 | 6.4% | +21.8% | 2.25 | 2.8% | +12.4% | +0.28/+0.07/+0.04 | — |
|
||||||
|
| ERC | 26.6/16.2/**41.6**/15.7 | 2.17 | 6.3% | +21.7% | 2.25 | 2.8% | +12.4% | +0.29/+0.07/+0.05 | — |
|
||||||
|
| MINVAR-R | 26.7/23.3/**29.6**/20.4 | 2.18 | 6.4% | +23.3% | 2.37 | 2.6% | +16.1% | +0.20/+0.10/+0.16 | 4/8 |
|
||||||
|
| MAXSH-STR | 38.6/25/15/21.4 | 2.14 | 7.5% | +23.4% | 2.28 | 3.3% | +16.8% | **−0.00**/+0.03/+0.07 | 3/8 |
|
||||||
|
| EW | 25/25/25/25 | 2.14 | 7.0% | +24.5% | 2.39 | 2.8% | +18.1% | +0.16/+0.17/+0.18 | 6/8 |
|
||||||
|
| **EW-STR** | **30/25/15/30** | 2.10 | 8.5% | +25.2% | **2.35** | 3.2% | **+19.7%** | **+0.06/+0.13/+0.14** | **7/8** |
|
||||||
|
|
||||||
|
### Lettura onesta
|
||||||
|
1. **Gli OTTIMIZZATORI non aggiungono nulla — anzi overfittano.** Tutti (MAXSH/RP/ERC/MINVAR-R)
|
||||||
|
convergono sulla stessa mossa: scaricare TP01 e caricare **VRP01 al 30-42%** perché ha la vol
|
||||||
|
più bassa (7.7%/anno). Ma quella è la vol del MODELLO (premio BS su DVOL, coda di stress non
|
||||||
|
catturata): è esattamente il punto cieco tipo-CC01 ("Sharpe/vol implausibile → rischio
|
||||||
|
nascosto"). E per-anno MAXSH vince **1/8 anni** vs CURRENT — l'uplift multi-cut è smoothing di
|
||||||
|
vol modellata, non alpha di allocazione. **Dentro i cap** l'ottimizzatore (MAXSH-STR) converge
|
||||||
|
quasi sui pesi correnti (38.6/25/15/21.4) e NON è persistente (−0.00 al cut 2024-01) →
|
||||||
|
**i pesi correnti sono già ~ottimi per ciò che il backtest può giudicare lecitamente**.
|
||||||
|
2. **L'unico segnale robusto è la DE-CONCENTRAZIONE parameter-free**: EW-STR (EW sotto i cap,
|
||||||
|
nessun parametro fittato) vince **7/8 anni** (unica perdita 2021 −3.1pp), tutti i cut OOS
|
||||||
|
(ΔSh +0.06/+0.13/+0.14), HOLD Sh 2.21→2.35, HOLD CAGR +16.0→+19.7%. Classico "1/N batte
|
||||||
|
l'ottimizzazione" (DeMiguel). La sostanza: CURRENT dà il 41% al peggior Sharpe FULL del book
|
||||||
|
(TP01 1.30) e EW-STR sposta ~11pp da TP01 verso SKH01 (+5pp) e XS01 (+6.25pp).
|
||||||
|
3. **MA non è un free lunch risk-adjusted**: FULL Sh 2.12→**2.10** e FULL DD 7.8→**8.5%**
|
||||||
|
(più SKH01, che ha DD standalone 18%, pesa di più nei primi anni a 2 sleeve). L'uplift è un
|
||||||
|
TILT di ritorno verso gli sleeve research-grade con la storia più corta/caveat più pesanti
|
||||||
|
(SKH01 = research win, book 230m da verificare a deploy; XS01 = STAT-MODE non eseguibile a 2k).
|
||||||
|
E TP01 resta l'unico sleeve *deployed* live: il suo 41% nel report riflette una scelta di
|
||||||
|
prudenza/eseguibilità, non solo statistica.
|
||||||
|
|
||||||
|
### VERDETTO (A)
|
||||||
|
- **Ottimizzazione formale: NON MIGLIORA** (viola i cap strutturali o converge ai pesi correnti).
|
||||||
|
**Per il book reale i pesi correnti reggono.**
|
||||||
|
- **Candidato PROPOSTO (non applicato): EW-STR = TP01 30 / XS01 25 / VRP01 15 / SKH01 30** —
|
||||||
|
uplift OOS persistente e per-anno (7/8), dentro i cap, al costo di FULL DD +0.7pp e FULL Sh
|
||||||
|
−0.02. È una decisione di risk-appetite (più ritorno atteso spostando peso su sleeve
|
||||||
|
research-grade), non un miglioramento dominante. Se si vuole adottare, farlo consapevoli che
|
||||||
|
aumenta la dipendenza da SKH01/XS01, e NON tocca il book Deribit eseguibile (TP75/SKH25).
|
||||||
|
|
||||||
|
### Caveat metodologici (A)
|
||||||
|
- Le 3 finestre multi-cut sono ANNIDATE (tutte contengono il 2025-26): non 3 conferme
|
||||||
|
indipendenti. Il test disgiunto vero è il per-anno (7/8 per EW-STR è il dato forte).
|
||||||
|
- EW-STR è stato costruito DOPO aver visto EW vincere (proiezione del null sui cap dichiarati):
|
||||||
|
costruzione principled e parameter-free, ma va detto — non era nella griglia iniziale.
|
||||||
|
- I pesi CURRENT stessi furono fissati (2026-06-23) conoscendo l'hold-out → il confronto
|
||||||
|
"in-sample-opt vs CURRENT su hold-out" è semmai sbilanciato A FAVORE di CURRENT; EW-STR vince
|
||||||
|
comunque.
|
||||||
|
|
||||||
|
## (B) Guardia-drawdown a livello portafoglio — metodo
|
||||||
|
Soft-guard causale sul combo 4-sleeve (pesi CURRENT): esposizione del giorno D decisa dal DD
|
||||||
|
dell'equity fino a **D−1**; trigger/re-entry sul **NAV ombra** non-guardato (lezione stops_lab:
|
||||||
|
sull'equity congelata a expo=0 il DD non rientra mai); isteresi re-risk a 0.4·X come nel
|
||||||
|
tail-hedge lab. Griglia X∈{3,4,5,6}%, derisk∈{0,0.5}. Selezione cella IN-SAMPLE (max Calmar
|
||||||
|
pre-2025), verifica hold-out + multi-cut, **null de-levering** (expo costante c che pareggia il
|
||||||
|
MaxDD in-sample della guardia: Sharpe di c·r è invariante → la guardia vale solo se batte quello).
|
||||||
|
|
||||||
|
### Risultati
|
||||||
|
- Cella scelta in-sample: **X=5% / derisk=0.5** (IS Calmar 3.64 vs 3.24 baseline; IS DD 7.8→6.6%,
|
||||||
|
IS CAGR 25.3→23.9%, IS Sh 2.13→2.12). In-sample batte il null de-levering c=0.84 a pari DD
|
||||||
|
(CAGR 23.9% vs 21.0%) — il timing esiste in-sample.
|
||||||
|
- **MA OOS è INERTE**: a ogni cut la cella scelta non scatta MAI (ΔSh +0.00, ΔDD 0.0pp, ΔCAGR
|
||||||
|
0.0pp su tutti e 3 i cut) perché il DD OOS del 4-sleeve resta 3.5-4.8% < trigger 5%.
|
||||||
|
**La diversificazione a 4 sleeve fa già il lavoro della guardia** (il 2022 del book è +11.6%
|
||||||
|
con DD 3.6%: non c'è il grind da proteggere che aveva il combo TP01+GTAA del tail-hedge lab,
|
||||||
|
DD 8.4% / 2022 −4.4%).
|
||||||
|
- Trigger più stretti che scattano davvero COSTANO: X=3%/d=0.5 → HOLD Sh 2.10 (< 2.21), CAGR
|
||||||
|
13.7% (< 16.0%); X=3-4%/d=0 whipsaw pieno (HOLD Sh 1.83-2.09; a X=4/d=0 il DD guardato IS
|
||||||
|
sale addirittura a 8.8% > 7.8% baseline — accumulo di perdite su cicli off/on, lo stesso
|
||||||
|
fenomeno visto in stops_lab con l'uscita totale).
|
||||||
|
|
||||||
|
### VERDETTO (B)
|
||||||
|
**NON MIGLIORA.** La guardia-DD che vinceva sul combo TP01+GTAA (DD 8.4%, 2022 −4.4%) qui non ha
|
||||||
|
bersaglio: il 4-sleeve ha già DD ~3.5-4.8% OOS. Coerente col thread meta-allocazione 2026-06-29
|
||||||
|
(drawdown-control ridondante). Nota operativa: la cella X=5%/d=0.5 è *innocua* (non fa nulla
|
||||||
|
finché il DD non supera il 5%) e in-sample mostrava timing genuino sopra il null de-levering —
|
||||||
|
può valere come **circuit-breaker di emergenza sul live** (risk management, non alpha), ma non è
|
||||||
|
un miglioramento statistico e non la si adotta come tale.
|
||||||
|
|
||||||
|
## (C) Combinazione
|
||||||
|
(B) è inerte → niente da combinare. Per completezza: EW-STR + guard X=5%/d=0.5 → FULL Sh 2.08,
|
||||||
|
DD 6.7%, CAGR 23.7% | HOLD invariato 2.35/3.2%/19.7% (la guardia lima il DD 2021-2023 del tilt
|
||||||
|
a costo di −0.02 Sh FULL). Nessuna adozione proposta.
|
||||||
|
|
||||||
|
## Sintesi
|
||||||
|
| config | FULL Sh | FULL DD | FULL CAGR | HOLD Sh | HOLD DD | HOLD CAGR |
|
||||||
|
|---|---|---|---|---|---|---|
|
||||||
|
| **CURRENT (attivo)** | 2.12 | 7.8% | +23.3% | 2.21 | 3.5% | +16.0% |
|
||||||
|
| EW-STR (proposta A, non applicata) | 2.10 | 8.5% | +25.2% | 2.35 | 3.2% | +19.7% |
|
||||||
|
| CURRENT + guard 5%/0.5 (B) | 2.11 | 6.6% | +22.3% | 2.21 | 3.5% | +16.0% |
|
||||||
|
| EW-STR + guard (C) | 2.08 | 6.7% | +23.7% | 2.35 | 3.2% | +19.7% |
|
||||||
|
|
||||||
|
- **(A) NON MIGLIORA in senso forte** — i pesi correnti reggono; l'unico candidato onesto è il
|
||||||
|
tilt de-concentrante EW-STR (30/25/15/30), un trade-off di risk-appetite da decidere, non un
|
||||||
|
upgrade dominante. Gli ottimizzatori in-sample o violano i cap strutturali (VRP01 40%) o
|
||||||
|
riconvergono sui pesi correnti.
|
||||||
|
- **(B) NON MIGLIORA** — guardia inerte OOS sul 4-sleeve; utile al più come circuit-breaker.
|
||||||
|
- Nessuna modifica a `src/portfolio/sleeves.py` o al live. Test 160/160 verdi.
|
||||||
|
|
||||||
|
Script: `scripts/research/r0701_portfolio_opt.py` (~4s, vettoriale).
|
||||||
|
|
||||||
|
## Verifica avversariale (agente scettico)
|
||||||
|
|
||||||
|
Script: `scripts/research/r0701_portfolio_skeptic.py`. **VERDETTO: NON APPLICARE — CURRENT resta.**
|
||||||
|
I numeri dell'agente riproducono ESATTAMENTE (via `StrategyPortfolio.combined_daily`, path di
|
||||||
|
produzione: CURRENT 2.12/2.21, EW-STR 2.10/2.35, multi-cut +0.06/+0.13/+0.14, |diff|=0). Il claim
|
||||||
|
muore altrove: l'uplift è **selezione-sull'hold-out di 2° ordine**, non alpha di allocazione.
|
||||||
|
|
||||||
|
1. **L'uplift OOS vive TUTTO nel 2025-26 — la finestra che ha selezionato i beneficiari.**
|
||||||
|
Finestre OOS **DISGIUNTE** (i 3 cut del diario sono annidati): ΔSh EW-STR vs CURRENT =
|
||||||
|
**−0.12** (2024H1) / +0.06 (2024H2) / **+0.14** (2025+). L'unica finestra OOS non toccata
|
||||||
|
dalla selezione hold-out è negativa. Sharpe standalone IS→HOLD per sleeve: TP01 1.49→**0.30**,
|
||||||
|
SKH01 1.42→**1.64**, XS01 1.22→**1.51**: EW-STR compra esattamente i due sleeve ammessi/affinati
|
||||||
|
(2026-06-23 / 2026-06-19) PERCHÉ forti sull'hold-out e vende quello che lì collassa. Meccanico.
|
||||||
|
2. **Pre-2025 (finestra non contaminata) EW-STR PERDE risk-adjusted**: ΔSh aggregato **−0.05**,
|
||||||
|
Sharpe per-anno vinti **2/6** (2021 −0.29, 2020 −0.10, 2023/2024 negativi).
|
||||||
|
3. **"7/8 anni vinti" è un artefatto di metrica**: è RITORNO composto (un tilt a più vol/ritorno
|
||||||
|
li vince quasi per costruzione), non risk-adjusted. Su **Sharpe per-anno: 3/8**. E due dei 7
|
||||||
|
"vinti" (2023, 2024) hanno margine **+0.03pp** = tie. Bilancio materiale sul ritorno:
|
||||||
|
5 vinti / 1 perso (2021 −3.1pp) / 2 pari.
|
||||||
|
4. **Plateau: liscio ma il gradiente è solo "meno TP01"**; a TP fisso, alzare SKH 25→30 è
|
||||||
|
piatto/negativo (min multi-cut a TP35: +0.07→+0.02). Scomposizione: il tilt **solo-SKH**
|
||||||
|
(+5pp, TP 36.25) da solo NON è persistente (multi-cut **−0.00**/+0.05/+0.04); il tilt
|
||||||
|
**solo-XS** (TP35/XS25/VRP15/SKH25) è l'unico positivo su tutte le finestre disgiunte
|
||||||
|
(+0.05/+0.02/+0.11) — ma pre-2025 fa ΔSh −0.00 (edge ≈ zero fuori dal 2025-26) e carica lo
|
||||||
|
sleeve MENO eseguibile (STAT-MODE).
|
||||||
|
5. **Realismo**: con l'outer-join rinormalizzato EW-STR tiene SKH01 al **50% effettivo nel
|
||||||
|
2019-20 e 40% nel 2021-23** (book research 230m a metà portafoglio: da lì il FULL DD 8.5%).
|
||||||
|
Punto onesto A FAVORE: un haircut d'esecuzione a drag su SKH01(-20/30%) e SKH+XS non ribalta
|
||||||
|
il ranking hold-out (ΔSh resta +0.08..+0.13), ma i livelli assoluti crollano (HOLD Sh CURRENT
|
||||||
|
2.21→1.64 al −30% su entrambi) e il beneficio resta di CARTA: il book Deribit eseguibile
|
||||||
|
(TP75/SKH25) non è toccato dalla decisione.
|
||||||
|
6. **Forking paths quantificato**: ≥15 config valutate sull'hold-out (7 vettori pesi + 8 celle
|
||||||
|
guardia), EW-STR costruito dopo aver visto EW vincere. Su **500 tilt CASUALI cap-respecting**:
|
||||||
|
51% batte CURRENT sull'hold-out (mediana ΔSh +0.00), solo 11% sul FULL, 30% su tutti e 3 i cut.
|
||||||
|
EW-STR è al **94° percentile** dell'uplift hold-out fra i tilt casuali ≈ il **massimo atteso di
|
||||||
|
~15 tentativi** (k/(k+1)=93.8%): l'uplift osservato è indistinguibile dal "best of 15 tilt
|
||||||
|
casuali scelto sull'hold-out".
|
||||||
|
|
||||||
|
**Conclusione**: il tilt non è disonesto nei conti ma non è evidenza — è la stessa lezione del gate
|
||||||
|
SELECTION-ON-HOLDOUT applicata al livello dei PESI (2° ordine: gli sleeve stessi sono stati
|
||||||
|
selezionati su quell'hold-out). Unica direzione sopravvissuta: XS01 18.75→25 (solo-XS, positivo su
|
||||||
|
tutte le finestre disgiunte), MA edge ≈0 fuori dal 2025-26, sleeve STAT-MODE non eseguibile a $600,
|
||||||
|
e l'hold-out-strength di XS01 è a sua volta concentrata dal gate di dispersione nel regime 2025-26
|
||||||
|
→ da rivalutare SOLO con più storia forward, non ora. **CURRENT (41.25/18.75/15/25) resta.**
|
||||||
@@ -0,0 +1,132 @@
|
|||||||
|
# 2026-07-01 — Ondata multi-agente a 6 filoni: 0 nuovi sleeve, pesi CURRENT confermati, 1 gate nuovo
|
||||||
|
|
||||||
|
**Goal utente:** "cerca con diversi agenti altre strategie di trading. Prova di tutto e arriva a
|
||||||
|
migliorare il portfolio presente. Lo scopo è sempre 50 euro days."
|
||||||
|
|
||||||
|
**Esito in una riga:** 6 filoni nuovi (scelti dopo scan dei ~65 diari per non ripetere strade morte)
|
||||||
|
+ 1 verifica avversariale → nessun candidato supera i gate onesti; il portafoglio a 4 sleeve
|
||||||
|
(41.25/18.75/15/25) **sopravvive a un attacco serio**, che è l'esito corretto per un book onesto.
|
||||||
|
Miglioramento concreto dell'ondata = metodologico: **gate `weights_tilt_null`** codificato (sotto).
|
||||||
|
|
||||||
|
## I 6 filoni (tutti su harness onesto: study_family_honest, marginal scorer, DSR≥0.95, smallcap $600)
|
||||||
|
|
||||||
|
| # | filone | verdetto | perché muore |
|
||||||
|
|---|---|---|---|
|
||||||
|
| 1 | **Funding time-series** BTC/ETH (posizionamento, non carry) — `r0701_funding_ts.py` | SCARTATO | FOLLOW = trend-beta ritardato (HOLD −1.69), FADE = shortare il toro; la cella gate è TP01 travestito (controllo senza funding = stessi numeri, corr 0.93, ΔHOLD −0.08); DSR 0.215. **Filone funding chiuso su 3 lati** (FC01 carry, price-clock, TS-signal). |
|
||||||
|
| 2 | **Breadth/internals alt** (51 HL) → BTC/ETH — `r0701_breadth_internals.py` | SCARTATO (rivisitabile) | Unico non-ridondante col trend (corr→TP01 0.40, lavora dove TP01 è attivo), assoluto PASS, marginal ADDS — ma jackknife −0.068 (uplift su UN mese) e DSR 0.433/104 celle. Con ~8 mesi di IS il 2024-toro non basta. **Rivisitare tra 1-2 anni di storia HL nativa.** |
|
||||||
|
| 3 | **Residual momentum XS** (β-hedged vs BTC, 19 major) — `r0701_xs_residmom.py` | REDUNDANT | Cross-section la residualizzazione è quasi un no-op (lo z-score di XS01 già rimuove il mercato): corr→XS01 0.54, HOLD −0.24, corr(IS,HOLD) tra le celle **−0.37** (anti-predittivo = rumore). L'edge residuo-momentum vive nella coppia ETH/BTC (STATARB-RESID, resta in `paper_statarb`), non generalizza. |
|
||||||
|
| 4 | **Pesi + guardia-DD** — `r0701_portfolio_opt.py` | vedi sotto | Unico candidato dell'ondata (EW-STR) → refutato dallo scettico. Guardia-DD X5%/d0.5: in-sample batte perfino il null de-levering, ma **OOS non scatta mai** (DD book 3.5-4.8% < trigger): la diversificazione fa già il lavoro. Utilizzabile solo come circuit-breaker di emergenza (risk mgmt, non alpha). |
|
||||||
|
| 5 | **Affinamento VRP01** (sizing IV−RV, DVOL-mom, gate TP01) — `r0701_vrp_refine.py` | NON MIGLIORA | L'alpha è già tutto nel gate binario IV-rank; il gate TP01 è la trappola IS perfetta (schiva il 2022, ma taglia le settimane migliori dell'hold-out: multi-cut 0/5). **3° fallimento del filone "affinare VRP dentro il modello" → esaurito** finché cerbero-bite non cattura un crash reale (f di stress). |
|
||||||
|
| 6 | **Stagionalità cross-sectional** HL — `r0701_xs_seasonal.py` | SCARTATO (allo step statistico) | Nessuna persistenza split-half sopra il null permutato max-statistic (p 0.16-0.23); l'unica struttura è il canale-beta dell'effetto weekday di mercato (famiglia trackF, già morta). Turnover ~2×gross/die = fee-death comunque. |
|
||||||
|
|
||||||
|
## EW-STR: il candidato refutato (caso di scuola di selezione-sull'hold-out di 2° ORDINE)
|
||||||
|
|
||||||
|
Il filone 4 proponeva **EW-STR** (TP01 30 / XS01 25 / VRP01 15 / SKH01 30 = equal-weight proiettato
|
||||||
|
sui cap strutturali): HOLD Sh 2.21→2.35, multi-cut +0.06/+0.13/+0.14, "7/8 anni vinti" — dichiarando
|
||||||
|
onestamente i caveat. La verifica avversariale (`r0701_portfolio_skeptic.py`, addendum nel diario
|
||||||
|
pesi) lo uccide:
|
||||||
|
|
||||||
|
1. **Selezione di 2° ordine**: SKH01 fu ammesso (2026-06-23) *perché* alzava l'hold-out 2025-26;
|
||||||
|
XS01 fu affinato conoscendo l'hold-out. EW-STR vende lo sleeve che collassa OOS (TP01 IS 1.49→
|
||||||
|
HOLD 0.30) e compra i due selezionati su quell'OOS. Pre-2025: **ΔSh −0.05** (perde risk-adjusted).
|
||||||
|
2. **Su finestre OOS disgiunte**: −0.12 (2024H1) / +0.06 (2024H2) / +0.14 (2025+) — tutto l'uplift
|
||||||
|
vive nella finestra che ha selezionato gli sleeve. "7/8 anni" era sul ritorno composto; su
|
||||||
|
Sharpe è 3/8.
|
||||||
|
3. **Firma best-of-k**: su 500 tilt casuali cap-respecting, EW-STR siede al 94-100° percentile ≈
|
||||||
|
k/(k+1) con k≈15 config viste sull'hold-out → uplift indistinguibile dal *best-of-15 scelto
|
||||||
|
sull'hold-out*.
|
||||||
|
4. **Realismo**: in pesi effettivi (outer-join rinormalizzato) EW-STR = SKH01 al 40-50% del book
|
||||||
|
2019-23 (sleeve research a book 230m). Il book Deribit eseguibile (TP+SKH) non cambierebbe comunque.
|
||||||
|
|
||||||
|
Residuo onesto: il sub-tilt XS01 18.75→25 è positivo su tutte le finestre disgiunte ma edge≈0
|
||||||
|
pre-2025 e STAT-MODE → rivalutare solo con storia forward.
|
||||||
|
|
||||||
|
## GATE NUOVO codificato: `weights_tilt_null` (src/portfolio/portfolio.py)
|
||||||
|
|
||||||
|
La lezione è ora codice, come per marginal-scorer e study_family_honest:
|
||||||
|
- **`combine_outer(daily_cols, weights, lo, hi)`** — la combinazione outer-join/rinormalizzata di
|
||||||
|
`combined_daily` estratta come funzione su pesi arbitrari (riusabile per studi di tilt).
|
||||||
|
- **`weights_tilt_null(daily_cols, w_current, w_proposed, caps, floor, n, seed, k_seen)`** —
|
||||||
|
null di tilt casuali uniformi sul simplesso dentro floor/caps: riporta `delta_hold/full/insample`,
|
||||||
|
`frac_random_beat_hold`, `pctl_hold`, `bestofk_pctl=k/(k+1)` e `gate_pass`.
|
||||||
|
**Regola: un cambio-pesi si applica solo se (1) delta_insample ≥ 0 e (2) pctl_hold < firma
|
||||||
|
best-of-k** (necessario, non sufficiente: restano finestre disgiunte + realismo).
|
||||||
|
Sul caso reale EW-STR: delta_hold +0.139, delta_insample **−0.054**, pctl **100°** vs best-of-15
|
||||||
|
93.75° → `gate_pass=False`. Test: `tests/test_weights_tilt_null.py` (5 test, sintetici,
|
||||||
|
deterministici; incluso lo sleeve "forte-solo-nell'hold-out" che DEVE fallire il gate).
|
||||||
|
|
||||||
|
## Lezione tecnica riusabile (dal filone 2)
|
||||||
|
|
||||||
|
`DatetimeIndex.view("int64")` su indici **tz-aware a risoluzione non-ns** (pandas 2.x) produce
|
||||||
|
timestamp in scala sbagliata → un `merge_asof` può broadcastare l'ultimo valore su tutta la storia
|
||||||
|
= **look-ahead che `causality_ok` non vede** (input fisso). Sintomo: decine di celle con Sharpe
|
||||||
|
identico. Fix: epoca esplicita in ms. Verificato: `altlib.py` non è affetto (grep pulito); dettagli
|
||||||
|
nel diario breadth.
|
||||||
|
|
||||||
|
## Onestà sul goal €50/giorno
|
||||||
|
|
||||||
|
Invariata (vedi CLAUDE.md): a capitale reale ~$600 il book onesto fa ~+€1.5/giorno atteso; la via
|
||||||
|
resta capitale + tempo + target-vol, non un tilt di pesi né leva. Questa ondata conferma che il
|
||||||
|
book attuale è vicino al massimo estraibile dai dati certificati disponibili oggi; le opzioni
|
||||||
|
reali di crescita restano (a) storia forward che promuova i lead (STATARB-RESID, breadth tra 1-2
|
||||||
|
anni), (b) capitale, (c) nuove fonti di dato (f di stress reale per VRP).
|
||||||
|
|
||||||
|
**File dell'ondata:** `scripts/research/r0701_{funding_ts,breadth_internals,xs_residmom,portfolio_opt,portfolio_skeptic,vrp_refine,xs_seasonal}.py`; diari `2026-07-01-{funding-ts-signal,alt-breadth-internals,xs-residual-momentum,portfolio-weights-ddguard,vrp-refinement,xs-seasonality}.md`; gate in `src/portfolio/portfolio.py` + `tests/test_weights_tilt_null.py`.
|
||||||
|
|
||||||
|
## ADDENDUM (stessa sera) — GTAA01 promosso a 5° SLEEVE: il miglioramento c'era, ma era in casa
|
||||||
|
|
||||||
|
Il secondo passaggio sull'archivio (non sui dati!) ha trovato il candidato che l'ondata di *ricerca*
|
||||||
|
non poteva trovare: **EQ-GTAA01** (`src/portfolio/gtaa.py` — trend difensivo equity 6-ETF, vt12%,
|
||||||
|
~30 anni di storia, netto fee IB) era stato validato il 2026-06-22 come *"primo miglioramento
|
||||||
|
STRUTTURALE del rischio-aggiustato trovato in tutta la ricerca post-reset"*, messo in paper
|
||||||
|
cross-venue (`paper_combo`, nel cron dal 2026-06-23) e **mai valutato come 5° sleeve del
|
||||||
|
portafoglio attivo** (il giorno dopo arrivò SKH01 e il filone si fermò).
|
||||||
|
|
||||||
|
### Valutazione onesta (`r0701_gtaa_5th_sleeve.py`) — perché GTAA passa dove EW-STR è morto
|
||||||
|
|
||||||
|
| gate | EW-STR (refutato) | +GTAA01 (passa) |
|
||||||
|
|---|---|---|
|
||||||
|
| uplift IN-SAMPLE (pre-2025) | **−0.05** | **+0.09..+0.13** (2.134→2.23-2.26) |
|
||||||
|
| finestre OOS disgiunte | −0.12 / +0.06 / +0.14 | **+0.05 / +0.19 / +0.25** (tutte >0) |
|
||||||
|
| multi-cut (4 tagli) | solo annidate | **+0.21 / +0.21 / +0.22 / +0.25** |
|
||||||
|
| provenienza dell'edge | sleeve selezionati sull'hold-out crypto | validato su OOS equity 2015+, **indipendente** dall'hold-out crypto |
|
||||||
|
| corr al book | — | **+0.10** full, ~0.00 hold-out; is_hedge +0.30 (non-hedge) |
|
||||||
|
| plateau | gradiente generico anti-TP01 | **monotono su w 10-30%, ogni cella migliora IS/FULL/HOLD/DD** |
|
||||||
|
|
||||||
|
Convenzione di realismo cross-venue (nuova, cablata nello sleeve): nei giorni senza barra equity
|
||||||
|
(weekend/festivi US) il rendimento è **0.0** — capitale IB fermo, NON rinormalizzato sul crypto
|
||||||
|
(due conti reali non si travasano nel weekend). Numeri quasi identici alla versione outer-join
|
||||||
|
(differenze al 3° decimale) ma il modello è quello giusto. Attivazione nel book all'era crypto
|
||||||
|
(2019-03-14): senza troncatura l'outer-join farebbe partire il book nel 1996 con 23 anni di
|
||||||
|
solo-GTAA rinormalizzato al 100%.
|
||||||
|
|
||||||
|
### Decisione pesi
|
||||||
|
Cella IS-best = w=30% (bordo griglia), **ingresso @20%** per scelta strutturale dichiarata:
|
||||||
|
(a) cross-venue IB con paper operativo di soli 8 giorni — non diventa lo sleeve più grande del
|
||||||
|
book al day-one; (b) precedente: ogni sleeve nuovo è entrato ≤25% (SKH01 25%, VRP01 15%);
|
||||||
|
(c) costo CAGR (a 30%: 16.8% vs 18.8% a 20%) — e l'obiettivo €50/g vive di CAGR, non solo di
|
||||||
|
Sharpe. Tutte le celle 10-30% passano comunque ogni gate. Pesi nuovi: **TP01 33 / XS01 15 /
|
||||||
|
VRP01 12 / SKH01 20 / GTAA01 20** (i 4 preesistenti scalati ×0.80, rapporti conservati).
|
||||||
|
|
||||||
|
### Portafoglio 5-sleeve (run_portfolio, capitale 2k)
|
||||||
|
| | FULL Sh | FULL DD | FULL CAGR | HOLD Sh | HOLD DD | HOLD CAGR |
|
||||||
|
|---|---|---|---|---|---|---|
|
||||||
|
| 4-sleeve (baseline) | 2.12 | 7.8% | +23.3% | 2.21 | 3.5% | +16.0% |
|
||||||
|
| **5-sleeve (+GTAA01 20%)** | **2.24** | **6.2%** | +18.8% | **2.46** | **2.2%** | +14.6% |
|
||||||
|
|
||||||
|
Per-anno: tutti gli 8 anni positivi, 2022 +7.0% (era +11.6%: GTAA soffre il whipsaw 2022, unico
|
||||||
|
anno con dSh negativo −0.49 — dichiarato). Il trade-off è esplicito: −4.5pp di CAGR full per
|
||||||
|
+0.12/+0.25 di Sharpe e DD 7.8→6.2 / hold-out 3.5→2.2. A pesi research (XS/VRP/SKH modellati o
|
||||||
|
STAT-MODE) il CAGR era comunque di carta; lo Sharpe/DD del book è la metrica di verità.
|
||||||
|
|
||||||
|
### Cosa NON cambia
|
||||||
|
Il **book live Deribit** (`deribit_book_sleeves` TP01+SKH01 75/25, `book_execute`) è INTATTO —
|
||||||
|
GTAA è su IB, già tracciato forward da `paper_combo`. `paper_portfolio` da oggi traccia la
|
||||||
|
composizione a 5 (regime-break dichiarato qui). Test: `tests/test_gtaa_sleeve.py` (registry,
|
||||||
|
weekend-zero, attivazione, book live invariato) — suite 168/168.
|
||||||
|
|
||||||
|
### Lezione dell'addendum
|
||||||
|
Prima di una nuova ondata di *ricerca*, ri-leggere l'archivio dei **validati-ma-non-integrati**:
|
||||||
|
l'unico upgrade onesto del book in 3 ondate (104+5+6 filoni) era un edge già validato che
|
||||||
|
aspettava solo la valutazione da sleeve. La diversificazione strutturale (secondo mercato,
|
||||||
|
corr ~0.1) resta l'unica cosa che alza lo Sharpe del book senza nuovo alpha.
|
||||||
@@ -0,0 +1,98 @@
|
|||||||
|
# 2026-07-01 — Affinamento VRP01 (sizing IV−RV / filtro DVOL-momentum / gate TP01): NON MIGLIORA
|
||||||
|
|
||||||
|
**Script:** `scripts/research/r0701_vrp_refine.py` (solo ricerca: `src/` e `scripts/live/` non toccati).
|
||||||
|
**Esito: NON MIGLIORA — VRP01 baseline resta la config canonica.** La cella IS-best (gate TP01-skip)
|
||||||
|
è un falso positivo in-sample da manuale: IS Sharpe 2.07 ma multi-cut **0/5**, hold-out **−0.14**
|
||||||
|
(vs 0.59 del baseline), DSR 0.71. Nessuna modifica a `sleeves._vrp_combo_returns`.
|
||||||
|
|
||||||
|
## Cosa testava (celle NUOVE, verificate non ripetute nei diari)
|
||||||
|
|
||||||
|
Stessa pipeline di `options_vrp_v2.py` (pricing BS su DVOL reale, payoff sul path certificato,
|
||||||
|
fee 12.5% del premio, f=1.0, tenor 7d, spread −0.28/−0.10) — cambiati SOLO gate/sizing:
|
||||||
|
|
||||||
|
1. **Sizing sul gap IV−RV** (carry atteso): size lineare `clip(vrp/scale,0,1)` (scale 8/12 pt) o
|
||||||
|
percentile espandente causale del VRP; in aggiunta o in sostituzione del gate binario IV-rank.
|
||||||
|
NB: il gate composito "IV-rank>0.30 AND IV−RV>0" è **già il baseline** (`gate_vrp=True`).
|
||||||
|
2. **Filtro DVOL-momentum**: non vendere se `dvol[i]−dvol[i−k] > thr` (k∈{5,10}, thr∈{0, 5pt}).
|
||||||
|
(Diverso da `dvol_directional` 2026-06-29, dove il DVOL-mom era segnale direzionale sul perp.)
|
||||||
|
3. **Gate di regime da TP01**: skip o half-size quando TP01 è flat su entrambi gli asset (risk-off).
|
||||||
|
4. Croce completa: **105 celle**, tutte contate nel deflated-Sharpe.
|
||||||
|
|
||||||
|
NON ripetuto (già scartato): gestione attiva intra-trade (PT/SL/vol-stop/delta-exit,
|
||||||
|
`2026-06-20-vrp-active-management.md` → hold-to-expiry vince).
|
||||||
|
|
||||||
|
Metodo: selezione cella **in-sample (pre-2025)** con floor di attività IS ≥20%, hold-out 2025-26,
|
||||||
|
**multi-cut 5 tagli** (2023-01→2025-01, richiesti ≥4/5 uplift>0), `altlib.deflated_sharpe` su tutti
|
||||||
|
i 105 trial, effetto sul **portafoglio 4-sleeve** (TP01 41.25 / XS01 18.75 / VRP 15 / SKH01 25).
|
||||||
|
|
||||||
|
## Risultati (book 50/50 BTC+ETH, rendimenti settimanali)
|
||||||
|
|
||||||
|
Baseline riprodotto esattamente: **FULL Sh 1.09 / IS 1.26 / HOLD 0.59 / DD 12% / worst −7.4% / attivo 41%.**
|
||||||
|
|
||||||
|
| cella | IS Sh | FULL | HOLD | DD | worst | attivo |
|
||||||
|
|---|---|---|---|---|---|---|
|
||||||
|
| **BASELINE** bin+ivr30 | 1.26 | **1.09** | **0.59** | 12% | −7.4% | 41% |
|
||||||
|
| sizing lin 8pt (+ivr30) | 1.20 | 1.05 | 0.61 | 11% | −7.4% | 41% |
|
||||||
|
| sizing lin 12pt (+ivr30) | 1.12 | 0.98 | 0.54 | 11% | −7.4% | 41% |
|
||||||
|
| sizing rank (+ivr30) | 1.07 | 0.94 | 0.54 | 9% | −5.7% | 41% |
|
||||||
|
| sizing lin 8pt **al posto di** ivr | 0.89 | 0.58 | **−0.38** | 21% | −7.4% | 86% |
|
||||||
|
| sizing rank al posto di ivr | 1.03 | 0.69 | **−0.36** | 11% | −5.7% | 86% |
|
||||||
|
| mom k=5 thr=5pt | 1.24 | 1.02 | 0.37 | 9% | −6.5% | 34% |
|
||||||
|
| mom k=10 thr=5pt | 1.26 | 1.08 | 0.55 | 9% | −6.5% | 31% |
|
||||||
|
| mom k=5 thr=0 | 1.78 | 1.24 | −0.10 | 5% | −3.9% | 20% |
|
||||||
|
| mom k=10 thr=0 | 1.36 | 0.78 | **−0.47** | 7% | −3.9% | 18% |
|
||||||
|
| tp01-skip | **2.05** | 1.43 | **−0.14** | 7% | −4.7% | 27% |
|
||||||
|
| tp01-half | 1.72 | 1.34 | 0.27 | 7% | −4.7% | 41% |
|
||||||
|
| IS-best: lin8+tp01-skip | **2.07** | 1.43 | **−0.14** | 6% | −4.2% | 27% |
|
||||||
|
|
||||||
|
**Multi-cut della IS-best vs baseline: uplift negativo in 5/5 tagli** (−0.35 → −0.73, monotono
|
||||||
|
peggiorando verso il presente). **DSR** IS-best 0.709 (<0.95); baseline 0.472 dentro questa griglia
|
||||||
|
(contesto onesto: nemmeno il baseline è statisticamente distinguibile su 105 trial correlati — ma è
|
||||||
|
pre-committed, non selezionato qui). Celle che battono l'hold-out del baseline: **1/105** (lin8pt
|
||||||
|
tp-off, +0.02 — rumore; non selezionabile: sarebbe selection-on-holdout).
|
||||||
|
|
||||||
|
### Frequenza d'intervento dei gate (settimane-trade del baseline = 163)
|
||||||
|
|
||||||
|
- **TP01-skip: blocca il 32.5%** delle settimane tradabili (TP01 flat il 38% dei giorni della
|
||||||
|
finestra DVOL). NON è ridondante col baseline — lavora tanto — ma lavora **male** OOS.
|
||||||
|
- mom thr=5pt: blocca 24-32%; mom thr=0: blocca 60-64% (quasi metà del book).
|
||||||
|
|
||||||
|
### Portafoglio 4-sleeve (VRP @15%)
|
||||||
|
|
||||||
|
| VRP nello slot | FULL Sh | FULL DD | HOLD Sh | HOLD DD |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| **baseline** | **2.12** | 7.8% | **2.21** | 3.5% |
|
||||||
|
| IS-best (lin8+tp01-skip) | 2.11 | 7.8% | 2.12 | 3.5% |
|
||||||
|
|
||||||
|
Anche a livello portafoglio la variante **peggiora** l'hold-out (2.21→2.12) e non migliora nulla.
|
||||||
|
|
||||||
|
## Lettura (perché non migliora)
|
||||||
|
|
||||||
|
1. **L'alpha del VRP è già tutto nel gate IV-rank binario** ("vendi solo vol ricca"). Il sizing
|
||||||
|
proporzionale al gap IV−RV è ridondante *dato* il gate (Δ ≈ ±0.05, dentro il rumore); usato al
|
||||||
|
posto del gate, riporta dentro le settimane di vol povera e distrugge l'hold-out (−0.36/−0.38).
|
||||||
|
Il carry atteso (IV−RV) NON è un segnale di *intensità* utile oltre il suo segno+rank.
|
||||||
|
2. **Il gate TP01 è la trappola in-sample perfetta** (la lezione macro-gate al contrario): schiva il
|
||||||
|
2022 (−6%→0%) gonfiando l'IS a 2.05, ma nel 2025-26 TP01 è flat proprio nei regimi di vol ricca
|
||||||
|
in cui la vendita gated di put **guadagna** — il gate taglia le settimane migliori dell'hold-out
|
||||||
|
(0.59→−0.14). Short-vol gated e trend sono complementari, non condizionabili l'uno sull'altro.
|
||||||
|
3. **Il DVOL-momentum non aggiunge protezione**: il crash-skip IV-rank>0.90 + il long wing dello
|
||||||
|
spread coprono già il run-up di vol; thr=0 è troppo aggressivo (blocca ~60%), thr=5pt è neutro
|
||||||
|
(mai meglio del baseline su hold-out).
|
||||||
|
|
||||||
|
## Onestà / caveat (invariati)
|
||||||
|
|
||||||
|
Premio MODELLATO su DVOL ATM (no skew), book 1d, f di stress reale non catturato → tutto questo
|
||||||
|
resta dentro il modello; il verdetto massimo possibile era "sleeve modellato migliorato", e non è
|
||||||
|
stato raggiunto. Il DSR sulla griglia è un limite *superiore* (celle correlate + ~20 config storiche
|
||||||
|
di options_vrp_lab/_v2 non contate).
|
||||||
|
|
||||||
|
## Azione
|
||||||
|
|
||||||
|
**Nessuna.** VRP01 resta com'è (`bin + gate_vrp + ivr30 + crash-skip 0.90`, hold-to-expiry).
|
||||||
|
Terzo tentativo di affinamento fallito (dopo active-management e — per il portafoglio — DVOL
|
||||||
|
overlay): il filone "migliorare VRP01 dentro il modello" è da considerarsi **esaurito**; il prossimo
|
||||||
|
passo utile resta quello noto: f di stress reale quando cerbero-bite cattura un crash + skew reale
|
||||||
|
sul long wing.
|
||||||
|
|
||||||
|
Script: `scripts/research/r0701_vrp_refine.py` (`--skip-portfolio` per la sola griglia).
|
||||||
@@ -0,0 +1,74 @@
|
|||||||
|
# 2026-07-01 — Residual (idiosyncratic) momentum cross-sectional sui 19 major HL — SCARTATO/REDUNDANT
|
||||||
|
|
||||||
|
**Tesi.** STATARB-RESID (thread 4, 2026-06-29) ha mostrato che il momentum del residuo ETH−β·BTC
|
||||||
|
(β OLS rolling, **sgn=+1**: le dislocazioni continuano a 1d) passa quasi tutti i gate su 2 gambe,
|
||||||
|
fallendo solo il deflated-Sharpe (0.929<0.95). Ipotesi qui: portare lo **stesso meccanismo
|
||||||
|
cross-sectional** sui 19 major di XS01 — per ogni alt, residuo vs β·BTC (β OLS rolling B), momentum
|
||||||
|
del residuo (blend z-score [30,90] come XS01 o singolo L), long top-k / short bottom-k, vol-target
|
||||||
|
20% — sperando che la **breadth** (18 stream invece di 1) alzasse il DSR dove il 2-gambe falliva.
|
||||||
|
Script `scripts/research/r0701_xs_residmom.py` (riusa l'harness collaudato `xsec_v2_nonmom`:
|
||||||
|
load_matrix, xs_engine — uguaglianza verificata maxdiff 0 —, deflated_sharpe, StrategyPortfolio).
|
||||||
|
|
||||||
|
Distinzione dal già-testato: IREV (idio-**reversal**, sgn=−1) era FALLITO nel filone C; IMOM di
|
||||||
|
xsec_v2 usava il mercato equal-weight come fattore, B=60 fisso, senza blend ed era solo riferimento.
|
||||||
|
Qui fattore = **BTC** (come STATARB-RESID, BTC escluso dal cross-section), B in griglia, blend
|
||||||
|
z-score, probe con gate di dispersione p30 (parità strutturale con XS01), **selezione in-sample-only**.
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
- Universo: 19 major HL certificati (`data/raw/hl_*_1d.parquet`), 913 giorni [2024-01-01 → 2026-07-01],
|
||||||
|
barre vol=0 escluse. Fee 0.10% RT/gamba + sweep fino a 0.30%.
|
||||||
|
- Griglia (57 trial): β-window {60,90,120} × lookback {blend[30,90], 30, 90} × k {3,5} × H {5,10,20}
|
||||||
|
+ 3 probe gated (blend, k5, H10, gate dispersione p30). Cella scelta col solo Sharpe **pre-2025**;
|
||||||
|
hold-out 2025-01-01 bloccato. Causalità: prefix-check ok (max_tail_diff 0).
|
||||||
|
- Baseline (stessa finestra, sleeve attivi): XS01 FULL Sh **1.38** / HOLD **1.51** / DD 11%;
|
||||||
|
book 4-sleeve FULL 2.12 / HOLD 2.21.
|
||||||
|
|
||||||
|
## Esito — collasso OOS della cella in-sample e nessuna cella competitiva
|
||||||
|
|
||||||
|
Cella scelta in-sample: **B60 L30 k3 H20** (IS Sh 2.00):
|
||||||
|
|
||||||
|
```
|
||||||
|
FULL +0.67 | HOLD −0.24 | DD 35% | per-anno 2024 +54% / 2025 −15% / 2026 +5%
|
||||||
|
corr→XS01 +0.54 | corr→TP01 −0.09 | DSR 0.510 (57 trial) | fee-sweep ok (F+0.59 a 0.30%)
|
||||||
|
small-cap $600/min$5: haircut ≈ 0 (ma book multi-gamba → STAT-MODE comunque, come XS01)
|
||||||
|
```
|
||||||
|
|
||||||
|
Portafoglio (il bar del mandato):
|
||||||
|
|
||||||
|
```
|
||||||
|
BASE 4-sleeve FULL 2.12 DD 7.8% | HOLD 2.21 DD 3.5%
|
||||||
|
SOSTITUZIONE XS01 → cand FULL 2.01 (−0.10) | HOLD 1.18 (−1.03) ← distrugge l'hold-out
|
||||||
|
AGGIUNTA 5° sleeve @10/15% HOLD −0.31 / −0.53 ← diluisce
|
||||||
|
MARGINAL vs BOOK: corr +0.23, uplift@10% full −0.04 / hold −0.31, multi-cut 2025 −0.31 / 2026 −0.14
|
||||||
|
```
|
||||||
|
|
||||||
|
**Il verdetto non dipende dalla selezione** — aggregato delle 57 celle:
|
||||||
|
- FULL max **+0.94**, HOLD max **+0.82** (mediane +0.52/+0.33): *nessuna* cella si avvicina a XS01
|
||||||
|
(1.38/1.51), nemmeno cherry-pickando sull'hold-out.
|
||||||
|
- corr→XS01 in [+0.47, +0.71], mediana **+0.62**: è momentum XS01 travestito (la residualizzazione
|
||||||
|
vs β·BTC sposta poco: lo z-scoring cross-sectional di XS01 già rimuove implicitamente il mercato).
|
||||||
|
- Solo 4/57 celle passerebbero un gate "diversificatore" (|corrXS|<0.6, FULL>0.5, HOLD>0), tutte con
|
||||||
|
FULL ≤0.68 e IS incoerente.
|
||||||
|
- **corr(Sharpe in-sample, Sharpe hold-out) attraverso le celle = −0.37**: l'in-sample è
|
||||||
|
anti-predittivo dell'OOS su questa griglia — la firma del rumore, non di un edge con plateau.
|
||||||
|
|
||||||
|
## Perché la tesi è falsa (3 righe)
|
||||||
|
|
||||||
|
1. La breadth non ha alzato il DSR (0.51 ≪ 0.95) perché non c'è edge da deflazionare: il residuo
|
||||||
|
vs β·BTC sul cross-section degli alt NON eredita l'edge del 2-gambe ETH−β·BTC — quel lead vive
|
||||||
|
nella coppia specifica ETH/BTC (i due asset profondi/cointegrati), non nel long-tail degli alt.
|
||||||
|
2. Cross-sectional, la residualizzazione è quasi un no-op: demeaning z-score (XS01) ≈ togliere il
|
||||||
|
mercato → il candidato è una variante rumorosa di XS01 (corrXS mediana 0.62) con meno segnale.
|
||||||
|
3. In-sample = solo 2024 (~1 anno utile dopo il warmup): la selezione onesta atterra su una cella
|
||||||
|
2024-lucky che perde nel 2025-26 — l'ennesima conferma del gate selection-on-holdout.
|
||||||
|
|
||||||
|
## Verdetto: **SCARTATO/REDUNDANT.** Nessuno sleeve, nessun forward-monitor.
|
||||||
|
|
||||||
|
Coerente con il filone momentum-structure (2026-06-29): l'edge di XS01 sta nella sua struttura
|
||||||
|
specifica (blend + gate dispersione), e le sue varianti — incluso l'idio-momentum vs BTC — sono
|
||||||
|
REDUNDANT o peggio. Chiude anche il cerchio su STATARB-RESID: il meccanismo residuo-momentum resta
|
||||||
|
valido SOLO come coppia ETH/BTC (forward-monitor `paper_statarb`), non generalizza al cross-section.
|
||||||
|
Nessun impatto sul book live; config canonica invariata.
|
||||||
|
|
||||||
|
Script: `scripts/research/r0701_xs_residmom.py` (non committato, prefisso r0701_xs).
|
||||||
@@ -0,0 +1,69 @@
|
|||||||
|
# 2026-07-01 — Stagionalità CROSS-SECTIONAL sull'universo Hyperliquid → SCARTATO
|
||||||
|
|
||||||
|
## Ipotesi
|
||||||
|
|
||||||
|
Effetti calendario **relativi tra i 19 alt major HL** (weekday tilt, turn-of-month,
|
||||||
|
pattern weekend→lunedì nel cross-section), long/short market-neutral. L'angolo è diverso
|
||||||
|
dal prior art già morto (trackF seasonality BTC/ETH = buy&hold travestito;
|
||||||
|
crypto_weekend_signal/overnight = look-ahead; open_drive = artefatto calendario ucciso da
|
||||||
|
`day_boundary_robust`): essendo il segnale **demeaned cross-section**, il buy&hold
|
||||||
|
travestito è strutturalmente escluso… *in prima battuta* (vedi diagnostica beta sotto).
|
||||||
|
|
||||||
|
## Metodo (test statistico PRIMA della strategia)
|
||||||
|
|
||||||
|
Script `scripts/research/r0701_xs_seasonal.py`. Dati `data/raw/hl_*_1d.parquet`, 19 major
|
||||||
|
XS01 (lista `src/portfolio/sleeves.XS_UNIVERSE`), **912 giorni** (2024-01-02 → 2026-07-01,
|
||||||
|
~2.5 anni), 0 barre vol=0. Ritorno relativo x[t,a] = r[t,a] − media cross-section del
|
||||||
|
giorno. Per ogni bucket calendario: **tilt bucket-specifico** per asset = media di x nel
|
||||||
|
bucket − tilt incondizionato dell'asset (isola il calendario dal drift relativo generico).
|
||||||
|
**Persistenza split-half**: Spearman rank-corr del vettore tilt (19 asset) H1 vs H2, per
|
||||||
|
bucket. **Null**: 2000 permutazioni delle etichette entro ciascuna metà → distribuzione del
|
||||||
|
**max-statistic** (controlla il multiple-testing sui bucket e il confound "alpha persistente
|
||||||
|
dell'asset"). Soglia severa p<0.05 sul max. Regola del mandato: senza persistenza →
|
||||||
|
**nessun backtest**.
|
||||||
|
|
||||||
|
## Numeri
|
||||||
|
|
||||||
|
| Test | Statistica | Null 95° pctl | p | Esito |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| [A] Weekday (7 bucket) | max rank-corr **+0.511** (Wed); Mon +0.38, Sun +0.37, Fri +0.04 | +0.604 | **0.159** | FAIL |
|
||||||
|
| [B] Weekend vs feriali | +0.268 | +0.428 | **0.178** | FAIL |
|
||||||
|
| [C] Turn-of-month (±2gg) | +0.221 | +0.451 | **0.226** | FAIL |
|
||||||
|
| [D] IC weekend→lunedì | FULL −0.053 (t=−1.94); H1 −0.006 (t=−0.17) vs H2 −0.100 (t=−2.4) | — | non persiste | FAIL |
|
||||||
|
|
||||||
|
Con ~65 osservazioni per weekday per metà, lo std di una rank-corr su 19 asset è ~0.24 → il
|
||||||
|
max-su-7 sotto puro rumore arriva a ~0.60: il +0.51 reale è *dentro* il rumore.
|
||||||
|
|
||||||
|
## Diagnostica: perché tutte le rank-corr weekday sono positive?
|
||||||
|
|
||||||
|
Non è tilt idiosincratico, è il **canale-beta**: il mercato EW ha un pattern weekday di
|
||||||
|
*livello* che si ripete nelle due metà (Sun −42/−30 bps, Sat +26/+25, Mon +35/+32) e la
|
||||||
|
dispersione di beta (0.53→1.26) lo proietta nel cross-section — rank-corr(tilt, beta):
|
||||||
|
**Sun −0.642**, Sat +0.325, feriali ~0. Cioè la poca "persistenza" visibile è l'effetto
|
||||||
|
weekday di MERCATO (dominio trackF, già scartato come buy&hold travestito) che rientra
|
||||||
|
dalla finestra via beta. Un eventuale L/S "weekday tilt" sarebbe stato in gran parte un
|
||||||
|
book short-beta-la-domenica — non un edge calendario cross-sectional.
|
||||||
|
|
||||||
|
## Note sui gate non raggiunti
|
||||||
|
|
||||||
|
- **day_boundary_robust** (obbligatorio per ogni effetto calendario): NON eseguibile sui
|
||||||
|
19 alt — i dati HL locali sono **solo 1d**, il confine giorno non è ri-tagliabile. Anche
|
||||||
|
con persistenza, il verdetto massimo sarebbe stato LEAD-forward *condizionato* a barre
|
||||||
|
orarie HL, mai sleeve. Con lo SCARTATO allo step 1 il punto è moot, ma resta il vincolo
|
||||||
|
per chiunque riapra il filone.
|
||||||
|
- **Fee**: mai arrivati al backtest; nota strutturale: un weekday-tilt L/S ribilancia ogni
|
||||||
|
giorno (weekday di domani ≠ oggi) → turnover ~2×gross/die, morte-per-fee quasi certa a
|
||||||
|
0.10% RT anche con edge lordo.
|
||||||
|
- **DSR**: non calcolato (nessuna cella backtestata — il branch strategia esiste nello
|
||||||
|
script ma non si attiva senza persistenza).
|
||||||
|
|
||||||
|
## Verdetto
|
||||||
|
|
||||||
|
**SCARTATO** allo step statistico, senza backtest. Tre motivi: (1) nessuna persistenza
|
||||||
|
split-half sopra il null permutato (p 0.16–0.23 su tutti i test, IC weekend→lunedì non
|
||||||
|
persiste tra le metà); (2) la sola struttura visibile è il canale-beta di un pattern
|
||||||
|
weekday di mercato — la stessa famiglia già scartata in trackF, non un effetto
|
||||||
|
cross-sectional; (3) ~2.5 anni × effetto calendario × turnover giornaliero = rumore +
|
||||||
|
morte-per-fee anche nello scenario migliore.
|
||||||
|
|
||||||
|
File: `scripts/research/r0701_xs_seasonal.py` (deterministico, seed 20260701, ~2 min).
|
||||||
@@ -0,0 +1,132 @@
|
|||||||
|
# 2026-07-02 — Audit anchor timing-luck su XS01 e SKH01 (chiusura del pendente dell'ondata TIMING)
|
||||||
|
|
||||||
|
**Contesto.** L'ondata TIMING+CRT dello stesso giorno (`2026-07-02-timing-crt-wave.md`) ha stabilito
|
||||||
|
che l'hold-out di TP01 (0.31) è la **migliore delle 24 ancore daily possibili** (mediana 0.04,
|
||||||
|
P~0.86 di uno spike così per caso). Lo scettico ha flaggato l'audit come **pendente** sugli altri
|
||||||
|
due sleeve a ribilanciamento/griglia ancorata: **XS01** (fase del ciclo di ribilanciamento H=10
|
||||||
|
giorni) e **SKH01** (offset della griglia dual-TF 230m/690m, `origin='epoch'`). Questo diario
|
||||||
|
chiude entrambi. Due agenti indipendenti, metodologia identica allo scettico TP01
|
||||||
|
(`r0702_skeptic_offset.py`): ancore dichiarate **a priori**, parametri **identici** in ogni
|
||||||
|
fase/offset (zero tuning per-ancora), **sanity replica bit-exact** della sleeve canonica prima di
|
||||||
|
qualsiasi numero, block-bootstrap congiunto per P(spike).
|
||||||
|
|
||||||
|
**Script:** `scripts/research/r0702_anchor_xs01.py`, `scripts/research/r0702_anchor_skh01.py`.
|
||||||
|
Nessun file di produzione toccato dagli agenti (solo docstring/narrativa aggiornate a valle, qui).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Verdetto in una riga
|
||||||
|
|
||||||
|
**Il finding TP01 si replica su TUTTI e tre gli sleeve ancorati — su SKH01 più forte che su TP01 —
|
||||||
|
e i numeri headline del book (HOLD 2.46) sono in parte best-of-anchors.** Ciò che sopravvive
|
||||||
|
de-luckato: XS01 resta un diversificatore ammissibile (ensemble di fase FULL 1.25 / HOLD 1.31 /
|
||||||
|
DD 11%); SKH01 resta ADDS (uplift del blend positivo a **tutte** le 23 fasi, corr ~0.08) ma i suoi
|
||||||
|
numeri headline e — cruciale — **il gate DD<30% che l'ha selezionata** non reggono alla fase
|
||||||
|
mediana. Stima onesta de-luckata del book 5-sleeve: **HOLD ~1.9–2.1, FULL ~2.0–2.2** (vs 2.46/2.24
|
||||||
|
dichiarati).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## XS01 — fase del ciclo di ribilanciamento H=10 (10 fasi)
|
||||||
|
|
||||||
|
Sanity: replica di `_xsec_returns` con parametro `phase` → **max|Δ|=0.0 bit-exact** vs la canonica.
|
||||||
|
NB: la canonica sui dati di oggi fa FULL 1.367/HOLD 1.479/DD 10.8% (i dichiarati 1.50/1.71/11%
|
||||||
|
erano del 2026-06-19; deriva dati, confronto interno coerente).
|
||||||
|
|
||||||
|
| metrica | min | mediana | max | canonica (f0) | pctl f0 |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| Sh FULL | 0.41 | 1.21 | 1.64 | 1.37 | 85° |
|
||||||
|
| Sh HOLD | 0.15 | 1.17 | 1.71 | 1.48 | 65° |
|
||||||
|
| maxDD | 10.0% | 15.5% | 29.1% | 10.8% | **15°** |
|
||||||
|
|
||||||
|
- **Firma diversa da TP01: la fortuna NON è nell'hold-out** (65° pctl, non estremo) **ma nel
|
||||||
|
DD** (15° pctl: il "DD 11%" dichiarato è uno dei più bassi delle 10 fasi; la fase tipica fa
|
||||||
|
~15.5%, la peggiore 29%) e nel FULL (85°).
|
||||||
|
- **Bootstrap**: spike osservato +0.38 su hold-out; **P(una fase qualsiasi ≥ +0.38) = 0.91–0.94**
|
||||||
|
(block 10/20/40, B=4000) → la canonica è il massimo atteso di 10 stime correlate (corr mediana
|
||||||
|
fra fasi 0.71).
|
||||||
|
- **Ensemble 10 fasi** (lens di reporting onesta): **FULL 1.25 / HOLD 1.31 / DD 10.9%** — la
|
||||||
|
diversificazione di fase riporta il DD al livello canonico con Sharpe ≈ mediana.
|
||||||
|
- **Book 5-sleeve**: HOLD 2.44 (canonica) → 2.26 (fase mediana) → 1.75 (peggiore, marginalmente
|
||||||
|
PEGGIO del book senza XS01 = 1.77) → 2.35 (ensemble). **Eredità di fortuna ~+0.17 HOLD.**
|
||||||
|
FULL quasi insensibile (2.10–2.28).
|
||||||
|
- **Gate di ammissione a fase mediana**: FULL 1.08 / HOLD 1.10 / DD 20.7% — **i numeri dichiarati
|
||||||
|
non reggono** (Sharpe −0.3/−0.6, DD raddoppia). **La decisione però regge**: nessuna fase
|
||||||
|
negativa, 8/10 con FULL≥1.0, book migliore a ogni fase tranne la peggiore (dove è neutro) →
|
||||||
|
slot da diversificatore @15% difendibile; cambia la NARRATIVA (banda/ensemble, non 1.50/1.71/11%).
|
||||||
|
- **Caveat**: storia ~2.5 anni (CI95 Sh HOLD canonica **[−0.04, +2.72]** — nessuna stima puntuale
|
||||||
|
affidabile); dimensione **ora-del-giorno non testabile** (solo barre 1d HL: resta luck residua
|
||||||
|
10 fasi × 24 ore non certificabile); XS01 è STAT-MODE → impatto su reporting/gate, non sul book
|
||||||
|
live Deribit.
|
||||||
|
|
||||||
|
## SKH01-V2-DD — offset della griglia dual-TF 230m/690m (23 offset × 30m)
|
||||||
|
|
||||||
|
Sanity: offset 0 riproduce `_skyhook_returns()` **bit-exact** (max|Δ|=0.0 su 2666 giorni); maxDD
|
||||||
|
harness BTC 21.4%/ETH 27.4% = identici al diario di ammissione; riuso diretto di
|
||||||
|
`skyhook_entries`/`htf_features`/`merge_htf_to_ltf` con `resample(origin='epoch', offset=...)`,
|
||||||
|
confini 690 ⊂ 230 verificati a ogni offset.
|
||||||
|
|
||||||
|
| metrica (book 50/50) | min | mediana | max | off0 (canonico) | pctl off0 |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| Sh FULL | 0.78 | 1.05 | 1.48 | 1.46 | 93° |
|
||||||
|
| Sh HOLD | 0.44 | 0.93 | 1.64 | 1.64 | **98° (max)** |
|
||||||
|
| minFull (2 asset) | 0.35 | 0.67 | 1.01 | 0.99 | 93° |
|
||||||
|
| minHold | −0.10 | 0.39 | 1.25 | 1.25 | **98° (max)** |
|
||||||
|
| blend 0.75·TP01+0.25·SKH, HOLD | 0.49 | 0.72 | 1.16 | 1.16 | **98° (max)** |
|
||||||
|
|
||||||
|
- **È uno spike, non un plateau**: gli offset adiacenti ±30m crollano (book HOLD 1.64 → 0.88 a
|
||||||
|
off30). Firma identica all'ancora TP01, ma **più forte**: il canonico è al 93–98° pctl di OGNI
|
||||||
|
metrica; minHold +1.26 e blend "0.31→1.17" sono il **massimo dei 23**.
|
||||||
|
- **Gate DD<30% — il criterio per cui V2-DD fu selezionata — FALLISCE in 15/23 offset**
|
||||||
|
(mediana DD: BTC 23.5%, ETH **29.2%** — pass per 0.8pt; peggiori 35.9%/42.1%). Il margine ETH
|
||||||
|
"già sottile" (27.4%) è in realtà **sotto la mediana di fase**: la proprietà DD<30% è in larga
|
||||||
|
parte fortuna di fase.
|
||||||
|
- **Ciò che regge de-luckato**: **uplift del blend positivo a TUTTE le 23 fasi** (min +0.18,
|
||||||
|
mediana +0.42, canonico +0.86) e corr→TP01 in [0.05, 0.11] a ogni fase → il verdetto
|
||||||
|
ADDS/diversificatore sopravvive, ridimensionato. Alla fase peggiore invece non regge
|
||||||
|
(minHold −0.10, DD fail).
|
||||||
|
- **Bootstrap**: spike blend +0.44; **P(un offset qualsiasi ≥ +0.44) ≈ 0.70** (block 10/20/40);
|
||||||
|
P(uplift≤0) = 0.03–0.04 → l'uplift è reale, l'ampiezza è best-of-23.
|
||||||
|
- **Book 5-sleeve**: HOLD 2.44 (off0 = max dei 23) → mediana **1.96** → ensemble 2.12; FULL 2.24 →
|
||||||
|
mediana 2.01. **Eredità di fortuna ~+0.5 HOLD** — molto più dei ~+0.10 dell'ancora TP01.
|
||||||
|
- **Rilevanza LIVE (SKH = 25% del book Deribit reale)**: il cron è orario, i confini 230m no →
|
||||||
|
ritardo uniforme {0..50} min (media 25). Re-sim del path reale (fill al close 5m del prossimo
|
||||||
|
run orario, exit SOFTWARE come da `book.py`): book 50/50 **FULL 1.46→1.19, HOLD 1.64→1.15,
|
||||||
|
DD 18.1%→24.6%**. La maggior parte del gap è l'assunzione fill-al-livello del backtest, non il
|
||||||
|
ritardo orario in sé: nei crash le barre 230m **gappano attraverso lo SL software** (short
|
||||||
|
sl2% modellato −2% → realizzato **−11/−23%**: ETH 2021-05-19, 2021-01-04, COVID 2020-03-13).
|
||||||
|
Il disaster-SL on-book −30% copre solo la coda estrema della posizione netta.
|
||||||
|
- **Caveat**: equity daily-step (lens Sharpe, come il canonico); l'ensemble di offset NON è
|
||||||
|
eseguibile live (gira una sola griglia) → serve solo come stima de-luckata; sim hourly senza
|
||||||
|
slippage/parziali.
|
||||||
|
|
||||||
|
## Book 5-sleeve — stima de-luckata congiunta (approssimata)
|
||||||
|
|
||||||
|
Ogni audit varia UN solo sleeve (gli altri restano canonici), quindi gli effetti non si sommano
|
||||||
|
esattamente; ordine di grandezza dell'eredità di fortuna sull'HOLD 2.46: TP01-ancora ~+0.10,
|
||||||
|
XS01-fase ~+0.17, SKH01-offset ~+0.5. **Stima onesta: HOLD ~1.9–2.1, FULL ~2.0–2.2, DD ~6%
|
||||||
|
(invariato)** — il book resta largamente positivo e diversificato a ogni combinazione testata,
|
||||||
|
ma il 2.46 è un massimo di ~24×10×23 configurazioni di ancora, non la stima centrale.
|
||||||
|
|
||||||
|
## Regole codificate in narrativa (CLAUDE.md aggiornato)
|
||||||
|
|
||||||
|
1. **I numeri headline di OGNI sleeve ancorato si citano con la banda d'ancora** (o come ensemble
|
||||||
|
di fase): vale già per TP01, ora anche per XS01 e SKH01 e per l'HOLD del book.
|
||||||
|
2. **Un gate di selezione (es. DD<30%) va verificato sulla banda di fase, non sull'ancora
|
||||||
|
canonica** — SKH01-V2-DD fu selezionata per una proprietà che tiene in 8/23 fasi.
|
||||||
|
3. Il candidato gate `anchor_luck_band()` in altlib sale di priorità: tre sleeve su tre ancorati
|
||||||
|
mostrano la stessa firma, e il deflated-Sharpe non conta questo multiple-testing.
|
||||||
|
|
||||||
|
## Follow-up (non eseguiti, da valutare)
|
||||||
|
|
||||||
|
- **Rivalutare il peso 25% di SKH01 nel book live Deribit**: l'aspettativa onesta della gamba SKH
|
||||||
|
è ≈ fase-mediana + path orario (blend HOLD ~0.72, non 1.17) con gap-through-stop reale nei
|
||||||
|
crash. L'uplift resta positivo a ogni fase → non c'è motivo di rimuoverla, ma il sizing fu
|
||||||
|
deciso su numeri best-of-23.
|
||||||
|
- Cadenza cron a 230m (o trigger sui confini di barra) per chiudere il gap di path orario.
|
||||||
|
- `anchor_luck_band()` in `altlib.py` come gate standard per candidati ancorati.
|
||||||
|
- Audit ora-del-giorno di XS01 quando esisterà un feed HL intraday certificato.
|
||||||
|
|
||||||
|
**Stato:** XS01/SKH01/pesi/book live INVARIATI (nessun cambio operativo da questo audit — è un
|
||||||
|
audit di reporting e di gate, e ogni cambio pesi dovrà passare `weights_tilt_null` +
|
||||||
|
selection-on-holdout). Test suite 168 verdi. Script audit committati.
|
||||||
@@ -0,0 +1,168 @@
|
|||||||
|
# 2026-07-02 — Ondata "video claims": Elliott (3 filoni), Albimarini (2), capital scaling 2-5k
|
||||||
|
|
||||||
|
**Contesto.** Su richiesta: meccanizzare e testare le claim falsificabili di 4 video didattici
|
||||||
|
italiani (3 sulle onde di Elliott, 1 ricostruzione della "strategia Albimarini" — double diagonal
|
||||||
|
a credito su SPX), più l'audit dei muri di scala visto l'annuncio che il conto live verrà portato
|
||||||
|
a **2.000-5.000 $**. Sei agenti indipendenti, harness altlib, fee 0.10% RT, hold-out 2025-26 mai
|
||||||
|
usato per selezionare, banda d'ancora obbligatoria (regola dello stesso giorno). Nessun PASS →
|
||||||
|
nessuno scettico necessario. Nessun file di produzione toccato.
|
||||||
|
|
||||||
|
**Scripts:** `scripts/research/r0702_ell_{rangecycle,fibconfluence,channel}.py`,
|
||||||
|
`r0702_alb_{structure,claims}.py`, `r0702_capital_scaling.py`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Verdetto in una riga
|
||||||
|
|
||||||
|
**Elliott 3/3 SCARTATO** (range-cycle = rumore 0/24 Bonferroni; canale = Donchian travestito che
|
||||||
|
non batte il Donchian; Fibonacci = effetto posizione, non numeri magici). **Albimarini 2/2
|
||||||
|
SCARTATO** (la diagonale non domina nemmeno nel modello ed è fee-negativa su Deribit; il track
|
||||||
|
record dichiarato è consistente con zero skill al 20-45%, e va in rovina in ogni finestra storica
|
||||||
|
con una coda). **Capital scaling: l'unico vincolo vero a 2-5k è il cap $300/asset** — da alzare a
|
||||||
|
equity/2 al momento del deposito; tutto il resto si scioglie da solo o resta fuori comunque.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ELL-A — "range-cycle" (onda 1 compressa → onda 3 ampia): RUMORE
|
||||||
|
|
||||||
|
Claim di Frost&Prechter/Larry Williams meccanizzato senza conteggio soggettivo: 2 definizioni di
|
||||||
|
segmento (flip TSMOM, zigzag k·ATR causale), impulso iniziale (N∈{3,5,10} barre, range/ATR
|
||||||
|
pre-segmento) vs ampiezza del seguito (claim A) e troncatura dell'ultimo terzo (claim B).
|
||||||
|
BTC/ETH 1d+1w, Spearman con null permutato (2000), Bonferroni m=24.
|
||||||
|
|
||||||
|
- **0/24 celle significative** (miglior p raw: A 0.061, B 0.058; Bonferroni 1.00 ovunque, FULL e
|
||||||
|
pre-2025). 7-9/12 celle col segno "giusto" = moneta su celle correlate.
|
||||||
|
- **Nessuna cella weekly regge a tutte e 7 le ancore** (p 0.02-0.05 di singole ancore = il
|
||||||
|
timing-luck d'ancora che da oggi non crediamo più; alcune celle flippano segno tra ancore).
|
||||||
|
- **Artefatto previsto e smascherato**: normalizzando col range POST-impulso la correlazione
|
||||||
|
diventa negativa per pura meccanica del denominatore — chi "conferma" il claim così misura
|
||||||
|
l'artefatto.
|
||||||
|
- Coerente con le famiglie di compressione già fallite nello sweep 104 (BRK08 NR7, BRK10
|
||||||
|
BB-squeeze, CMB05, VOL12). Campione strutturalmente piccolo (mediana 78 segmenti daily, ~30
|
||||||
|
weekly). Strategizzazione correttamente non eseguita (statistica prima della strategia).
|
||||||
|
|
||||||
|
⚠️ **LEZIONE PANDAS (gemella di `view("int64")` del 2026-07-01):** `resample("7D",
|
||||||
|
origin=...)` in pandas 2.x **ignora silenziosamente `origin`** ("D" non è Tick-like, solo un
|
||||||
|
RuntimeWarning) → tutte le ancore weekly uscivano identiche e la banda d'ancora sarebbe stata una
|
||||||
|
banda finta di larghezza zero. Serve **`"168h"`**. Da ricordare per ogni futura banda d'ancora
|
||||||
|
settimanale.
|
||||||
|
|
||||||
|
## ELL-B — Confluenza di Fibonacci: EFFETTO POSIZIONE, non numeri magici
|
||||||
|
|
||||||
|
Zigzag causale non-repainting (livelli usabili solo dalla conferma del pivot, causality_ok
|
||||||
|
max_tail_diff=0.0), tocco fresh intrabar, reazione ATR-normalizzata a 5/20 barre, ~24k/14k tocchi
|
||||||
|
IS a 1h. **Tre null in scala di durezza**: (A) rapporti uniformi casuali, (B) ri-sorteggiati per
|
||||||
|
swing, **(C) location-matched** (Fib ± jitter 2-8%: "0.618 è speciale vs 0.58/0.66?").
|
||||||
|
|
||||||
|
- Vs null A/B i Fib sembrano buoni (pctl 0.82-1.00) — **vs null C crollano a 0.39-0.68 = puro
|
||||||
|
caso**. L'apparente vantaggio è interamente l'effetto di *posizione* (i rapporti Fib cadono in
|
||||||
|
zone mediamente decenti del range), non dei numeri di Fibonacci.
|
||||||
|
- **Confluenza** (2 griglie entro 0.25·ATR): FAIL 4/4 celle — non reagisce più delle confluenze
|
||||||
|
di rapporti casuali. Break-rate al tocco ~46-50% (moneta); su 1h i Fib veri vengono bucati più
|
||||||
|
spesso del placebo.
|
||||||
|
- In assoluto comunque nulla da tradare: +2.6/+5.6 bps a 5 barre (fee = 10 bps), negativo a 20
|
||||||
|
barre e su 1d. Strategizzazione correttamente saltata da gate a priori.
|
||||||
|
- **Pattern di test riusabile**: il null location-matched è IL test giusto per ogni claim su
|
||||||
|
"livelli speciali" (Fib, pivot, round numbers) — separa la qualità della posizione dal numero.
|
||||||
|
|
||||||
|
## ELL-C — Tecnica del canale (Ftaonline): DONCHIAN TRAVESTITO
|
||||||
|
|
||||||
|
Implementazione onesta completa (zigzag causale, vincolo onda-2>origine, canale 0→min-2 con
|
||||||
|
parallela dal max-1, entry al close della barra fuori, target 1.618×, stop=invalidazione,
|
||||||
|
speculare short, 27 celle TF×k×varianti).
|
||||||
|
|
||||||
|
- **family_honest boccia**: cella scelta in-sample (1h k4 long, IS 1.40) → hold-out **−0.87**;
|
||||||
|
DSR 0.685 < 0.95; earns_slot=False. Marginale vs TP01: uplift positivo solo 2020-21 =
|
||||||
|
beta-trend del toro (corr 0.35).
|
||||||
|
- **Il Donchian banale a pari geometria/frequenza eguaglia o batte il canale a ogni TF**
|
||||||
|
(corr 0.43-0.53): vincoli d'onda + 1.618 non aggiungono nulla. Il segnale-2 ("onda 5") è
|
||||||
|
quasi inerte (+0.00-0.07).
|
||||||
|
- **Target 1.618 = geometria, non magia**: toccato con la frequenza di distanze identiche
|
||||||
|
piazzate a caso (5/6 celle p>0.18). Claim discriminante "in canale = correttivo":
|
||||||
|
direzionalmente sensata, mai significativa (p 0.08-0.45); l'uscita dal canale è momentum da
|
||||||
|
breakout, già in casa.
|
||||||
|
- **Anchor-luck di nuovo**: la miglior cella 4h fa hold 1.54 all'ancora 00:00, la migliore delle
|
||||||
|
4 (banda [0.35, 1.54]) — quarta conferma della firma nello stesso giorno.
|
||||||
|
|
||||||
|
## ALB-A — Double diagonal "Albimarini" su BTC/ETH: NON DOMINA, niente LEAD
|
||||||
|
|
||||||
|
Portata su Deribit (che ha le scadenze giornaliere per la long T+1) col motore DVOL di VRP01
|
||||||
|
(riprodotto esatto: 1.09/0.59/11.8%), strike scalati in vol (2σ/5g ≈ il "9% su SPY"), gate
|
||||||
|
IV-rank canonico non riottimizzato, 2021-26 con LUNA/FTX/2022, banda skew f∈{0.6,0.8,1.0,1.3}.
|
||||||
|
|
||||||
|
- **Il claim strutturale del corso è falsificato**: gated, l'iron condor stessa-scadenza batte la
|
||||||
|
diagonale a ogni f (1.05 vs 0.95 a f=1.0), Δ negativo ogni anno. La long T+1 è **assicurazione
|
||||||
|
di coda quantificata** (+12/+33 bps nei 5% peggiori vs ~1 bps di costo medio), non dominanza.
|
||||||
|
- **Senza gate tutte le strutture perdono** a f≤1.0 → terza conferma indipendente: nel VRP
|
||||||
|
l'alpha è il filtro di regime, non la vendita di premio. VRP01 resta superiore su tutta la
|
||||||
|
banda f (CAGR 8.3% vs 1.4%).
|
||||||
|
- **Il meccanismo dell'illusione riprodotto in vitro**: celle z≥2.5 = 0 perdite su 142 trade,
|
||||||
|
Sharpe 5.9-∞ (il punto cieco CC01 in forma opzioni); la best in-sample (7.88) crolla a −0.51
|
||||||
|
in hold-out. Seconda occorrenza del pattern "0-perdite = Sharpe implausibile" in una settimana
|
||||||
|
→ **si rafforza il caso per il gate `implausible_sharpe` in altlib** (raccomandato dal filone
|
||||||
|
CC01, ora con 2 casi d'uso).
|
||||||
|
|
||||||
|
## ALB-B — Audit dei numeri dichiarati (28 trade, 82%, PF 5.16, "420% annuo"): ZERO SKILL
|
||||||
|
|
||||||
|
SPY 1d 1996-2026 (parquet già in repo dal filone GTAA) + BTC/ETH certificati; MC 200k; replay
|
||||||
|
claim-anchored calibrato per riprodurre esattamente il video.
|
||||||
|
|
||||||
|
- **L'82% è incoerente col "deep OTM" in entrambe le letture**: strike a 9% → win strutturale
|
||||||
|
99.5% (P(|move 4td|>9%) = 0.53%, fat-tail 88× la normale); 82% letterale → strike a 2.63% ≈
|
||||||
|
1.2σ, non deep. In entrambi i casi win-rate = delta venduto.
|
||||||
|
- **P(track record del video senza edge) = 20-45%**; il **78.6%** di tutte le finestre 6-mesi
|
||||||
|
1996-2026 lo avrebbe prodotto (lettura deep). Il PF ~5.1 esce per costruzione quando la coda
|
||||||
|
non è campionata.
|
||||||
|
- **Replay attraverso le code reali**: rovina nel 1998/2002/2020 col sizing 1→4 dichiarato;
|
||||||
|
perfino regalando +20% di premio, 1 contratto fisso fa CAGR +4.1% con maxDD −95%. La stessa
|
||||||
|
semestrale del video annualizza a +73-77%, non 420%. Su BTC/ETH a EV=0: +12%/DD−68% e
|
||||||
|
+0%/DD−88%.
|
||||||
|
- **La diagonale lascia passare il 12-40%** della perdita naked in un −10% overnight (dipende dal
|
||||||
|
vol-spike). Su Deribit la double diagonal è **fee-negativa a qualsiasi size** (fee 8 gambe =
|
||||||
|
194-221% del theta raccolto a questi strike): il capitale sposta solo il muro di margine.
|
||||||
|
- Che cosa distingue VRP01 (sopravvissuto allo stesso tipo di audit): defined-risk per
|
||||||
|
costruzione, gate IV-rank che ribalta l'hold-out, sizing fisso — l'opposto esatto su tutti e
|
||||||
|
tre gli assi.
|
||||||
|
|
||||||
|
## Capital scaling 600 → 2000/3500/5000 (r0702_capital_scaling.py)
|
||||||
|
|
||||||
|
| capitale | TP01 haircut Sh | book investibile % (cap $300) | K=2 exec-turn % | statarb haircut | spread ETH conc. | XS01 exec-turn % |
|
||||||
|
|---|---|---|---|---|---|---|
|
||||||
|
| 600 | +0.010 | 100.0% | 90.5 | −0.004 | 0 | 56.9 |
|
||||||
|
| 2000 | −0.002 | 85.9% | 95.7 | 0.000 | 3 | 87.4 |
|
||||||
|
| 3500 | −0.002 | 63.7% | 97.5 | 0.000 | 5 | 89.3 |
|
||||||
|
| 5000 | −0.002 | **48.9%** | 98.2 | 0.000 | 7 | 90.8 |
|
||||||
|
|
||||||
|
- **Il vincolo dominante è UNO: `max_notional_per_asset_usd`=300.** A 5k il book girerebbe a
|
||||||
|
metà del target (cap binding nel 39-46% delle barre). **Proposta config (da applicare AL
|
||||||
|
deposito): cap = equity/2** → $1000 a 2k, $1750 a 3.5k, $2500 a 5k. `min_order_usd`=5 va
|
||||||
|
LASCIATO (il fee drag risale solo al tetto noto ~0.4%/anno; l'isteresi artificiale costerebbe
|
||||||
|
più in lag — lezione ondata timing).
|
||||||
|
- Min-order/haircut TP01 ≈ 0 a ogni capitale (conferma indipendente del "−74% ordini" a 600 →
|
||||||
|
39-43% saltati a 5k, tutti micro). Statarb: haircut 0 da 2k (il muro era l'edge, non la scala).
|
||||||
|
- Tranching K=2: matematicamente regge a 5k (98.2% turnover-tranche), ma il blocco vero resta il
|
||||||
|
feed intraday fuori path certificato + beneficio solo di varianza → **non cablare**.
|
||||||
|
- Opzioni: il muro d'ingresso ETH cade a ~2.6k (3-7 spread concorrenti a 2-5k, fee solo 5-6% del
|
||||||
|
credito grazie al cap 12.5%; rettifica vs ALB-A: margine spread ETH oggi $66-76). BTC granulare
|
||||||
|
da ~$4.7k. **La regola "niente short-vol da modello" non decade col capitale.**
|
||||||
|
- XS01: soglia ~20k confermata (a 5k il 9%+ del turnover non esegue). CC01: il capitale non è
|
||||||
|
mai stato il muro (fuori per ragioni strutturali).
|
||||||
|
- **Aspettativa onesta**: col CAGR de-luckato del book live (10-15%, audit SKH01): **2k ≈
|
||||||
|
€0.55-0.82/giorno; 5k ≈ €1.37-2.05/giorno**. Il salto di capitale cambia cosa è eseguibile,
|
||||||
|
non l'ordine di grandezza del ritorno (€50/g ≈ 130k, invariato).
|
||||||
|
|
||||||
|
## Lezioni
|
||||||
|
|
||||||
|
1. **Il null giusto smonta il livello "speciale"**: location-matched (ELL-B) per i livelli,
|
||||||
|
Donchian-equivalente (ELL-C) per i pattern, EV=0-calibrato (ALB-B) per i track record. In
|
||||||
|
tutti e tre i casi il claim sopravviveva ai null ingenui e moriva su quello giusto.
|
||||||
|
2. **`resample("7D", origin=...)` ignora origin in pandas 2.x** → usare `"168h"` per le bande
|
||||||
|
d'ancora settimanali.
|
||||||
|
3. Secondo caso "0-perdite = Sharpe implausibile" (celle deep-OTM di ALB-A, dopo CC01) → il gate
|
||||||
|
`implausible_sharpe` in altlib sale in coda ai lavori insieme ad `anchor_luck_band`.
|
||||||
|
4. L'anchor-luck è comparso spontaneamente anche in questa ondata (celle weekly ELL-A, 4h ELL-C)
|
||||||
|
— la regola della banda d'ancora sta già pagando.
|
||||||
|
|
||||||
|
**Stato:** nessun nuovo sleeve, nessun forward-monitor aggiunto, book live INVARIATO. Un'azione
|
||||||
|
operativa pende sul FUTURO deposito: alzare `max_notional_per_asset_usd` a equity/2 (decisione
|
||||||
|
utente al momento del funding). Test suite verde. 6 script committati.
|
||||||
@@ -0,0 +1,186 @@
|
|||||||
|
# 2026-07-02 — Ondata timing + CRT (8 filoni multi-agente + scettico): 0 nuovi sleeve, 1 finding strutturale (anchor timing-luck di TP01)
|
||||||
|
|
||||||
|
**Obiettivo (goal utente):** "cerca su Deribit altre strategie profittevoli magari con timing
|
||||||
|
differenti oltre a quelle già valutate". Prima ondata interamente dedicata al TIMING: dopo che le
|
||||||
|
ondate precedenti hanno coperto segnali (104 famiglie alt-sweep), universi (HL cross-sectional),
|
||||||
|
opzioni (VRP/gamma) e pesi (EW-STR/weights_tilt_null), qui si attacca la dimensione rimasta: *quando*
|
||||||
|
si campiona, si decide e si esegue. Su richiesta utente, seconda tranche dedicata alla **CRT (Candle
|
||||||
|
Range Theory)**, il pattern sweep-and-reclaim a 3 candele di scuola ICT/Wyckoff.
|
||||||
|
|
||||||
|
Inventario preventivo per non rifare lavoro: SEA01-09 coprivano già hour-of-day, day-of-week,
|
||||||
|
weekend, turn-of-month, sessioni; l'onda intraday 2026-06-21 il sub-daily (con il lead prevday in
|
||||||
|
forward-monitor); `tp01_lowfreq` i TF 4h/12h/1d. Angoli NON coperti individuati e testati: clock a
|
||||||
|
eventi, calendario scadenze Deribit, ancora di ribilanciamento, clock più lenti del daily, velocità
|
||||||
|
del segnale regime-condizionata — più i 3 tagli CRT (base, multi-TF, contesto).
|
||||||
|
|
||||||
|
**Esito: 7 filoni FAIL + 1 finding strutturale confermato dallo scettico (timing-luck dell'ancora
|
||||||
|
di TP01). Nessun nuovo sleeve. Nessuna modifica al book live. Il soffitto ~1.3 direzionale
|
||||||
|
BTC/ETH resta intatto anche cambiando il clock.**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Filone 1 — Event-clock bars (tempo-informazione): FAIL
|
||||||
|
|
||||||
|
`scripts/research/r0702_eventclock.py`. Volume/vol/range bars da 5m certificato (soglie causali
|
||||||
|
EWMA-90g shift(1), barre medie 4h/12h/24h), 5 strategie (TSMOM multi-orizzonte, Donchian 10/30d,
|
||||||
|
EWMA-cross), 45 celle event + 15 controlli wall-clock = 60 trial.
|
||||||
|
|
||||||
|
- Null decisivo (stesso segnale, stessa frequenza, wall-clock): event batte wall su ENTRAMBE le
|
||||||
|
finestre solo in **4/45 coppie (9%)** — rumore. Pattern incoerenti (EWMA event vince IS 9/9 ma
|
||||||
|
perde HOLD 9/9; Donchian-30d l'esatto opposto = selection-on-holdout in agguato).
|
||||||
|
- Cella scelta in-sample (volume-bars 24h, DONCH-10d): IS 1.45 → **HOLD −0.46** (2025 −7.4%,
|
||||||
|
2026 −18.1%). Marginal NEUTRAL (corr 0.74 a TP01 = trend travestito), earns_slot_honest=False.
|
||||||
|
- Executability comunque assente: in alta attività le barre "24h" chiudono in 3.6-4.6h (p5) → il
|
||||||
|
cron orario le eseguirebbe in ritardo; i clock 4h richiedono monitoraggio sub-orario.
|
||||||
|
|
||||||
|
**Lezione: campionare a tempo-informazione non normalizza nulla di monetizzabile sul feed
|
||||||
|
certificato; il clock non è la dimensione dove vive l'edge.**
|
||||||
|
|
||||||
|
## Filone 2 — Calendario scadenze Deribit: FAIL (0/24 celle)
|
||||||
|
|
||||||
|
`scripts/research/r0702_expiry_calendar.py`. Griglia dichiarata a priori: 4 finestre × 3 tipi expiry
|
||||||
|
(weekly ven 08:00 UTC / monthly ultimo ven / quarterly) × 2 asset, Bonferroni |t|≥3.08; 3 null
|
||||||
|
(placebo weekday, anchor-shift ±2/4h, permutation 500 calendari).
|
||||||
|
|
||||||
|
- Nessuna cella passa Bonferroni (max |t| 2.69). Il post-expiry drift monthly (+0.61/+0.77%) ha il
|
||||||
|
segno della teoria ma: non batte il placebo giovedì, permutation pctl 84-95 (non estremo), si
|
||||||
|
INVERTE sul quarterly (dove l'OI massimo dovrebbe amplificarlo) ed è guidato dal 2019 → rumore.
|
||||||
|
- Unica cella robusta ai null: weekly [-24,0) negativa (gio→ven), ma è indistinguibile dal
|
||||||
|
day-of-week (famiglia SEA già morta) e netta fee fa Sharpe ~0.08 (52 eventi/anno × 0.10% RT).
|
||||||
|
- Best-in-sample tradabile: IS +0.90 → **HOLD −0.52**; DSR 0.230 su 24 trial.
|
||||||
|
- Nota tecnica: colpito ESATTAMENTE il pitfall pandas 2.x documentato (epoca in secondi da
|
||||||
|
`date_range` su tz-aware → matching vuoto); fix con epoca ms esplicita. La lezione 2026-07-01
|
||||||
|
ha pagato.
|
||||||
|
|
||||||
|
## Filone 3 — Anchor timing-luck di TP01 + tranching: FINDING (verificato dallo scettico)
|
||||||
|
|
||||||
|
`scripts/research/r0702_tp01_offset.py` + scettico indipendente `r0702_skeptic_offset.py`
|
||||||
|
(ricostruzione bit-exact con codice diverso, zero riuso; h=0 riproduce `tp01_baseline_daily`
|
||||||
|
esattamente; vol-target ricalcolata per ancora; nessun look-ahead — verificato con troncamenti).
|
||||||
|
|
||||||
|
**Claim 1 CONFERMATO: l'hold-out 2025-26 "Sharpe 0.31" di TP01 è in larga parte fortuna
|
||||||
|
dell'ancora 00:00 UTC.** La stessa strategia CANONICAL alle altre 23 ancore orarie: HOLD mediano
|
||||||
|
**0.04**, banda **[−0.13, +0.30]** — e il massimo è proprio h=0 (98° pctl; in-sample era al 10°:
|
||||||
|
sfortunato lì, fortunato qui). Spike, non plateau (h=23/h=1 fanno 0.13/0.04). Bootstrap dello
|
||||||
|
scettico: P(una qualsiasi ancora mostri uno spike ≥ così) = **0.86** — è il massimo atteso di 24
|
||||||
|
stime correlate, non un'anomalia; best-anchor per finestra annuale ruota a caso (16→23→21→12→5→0,
|
||||||
|
Spearman ≈ 0, nessuna seasonality d'ancora). Formulazione corretta (NON "il vero hold-out è 0.07",
|
||||||
|
che ha CI95 [−1.2,+1.4] su 547 giorni): **l'hold-out 2025-26 non risolve l'edge di RITORNO di TP01**
|
||||||
|
(ritorno totale mediano ancore ≈ 0%); ciò che regge A OGNI ancora è il claim DIFENSIVO
|
||||||
|
(DD 6.7-10.1% vs ~60% B&H). Che è da sempre il vero valore dichiarato di TP01.
|
||||||
|
|
||||||
|
**Claim 2 (tranching multi-ancora) RIDIMENSIONATO:** K=4 ≡ esattamente EW di 4 book ancorati
|
||||||
|
(diff 1.4e-17), turnover identico (~8.3/y), haircut $600 ≈ 0. MA il "miglioramento" IS 1.49→1.56 è
|
||||||
|
per ~90% *tornare alla media delle ancore* (h=0 era sfortunato in-sample): vs ancora tipica
|
||||||
|
+0.005 mediano, P(K4≤h0)=0.18 n.s.; il taglio DD strutturale è ~0.5pt (non 2.8: la mediana delle
|
||||||
|
singole è già 12.6%). Ciò che regge: la compressione della VARIANZA DELLA STIMA (HOLD
|
||||||
|
[−0.12,+0.30]→[−0.01,+0.13] a K=4) → **lens di reporting, non alpha**.
|
||||||
|
|
||||||
|
**Impatto a valle (quantificato dallo scettico):**
|
||||||
|
- Blend SKH: HOLD 1.16 (h=0) → 0.97 mediana ancore, ma l'UPLIFT a mediana è +0.93 > +0.86
|
||||||
|
dichiarato → **il verdetto ADDS di SKH01 era conservativo, regge**.
|
||||||
|
- Book 5-sleeve: HOLD 2.44 → 2.34 mediana (min 2.22), FULL 2.24→2.22 → eredita **~+0.10** di
|
||||||
|
fortuna d'ancora (non +0.25: il peso di TP01 diluisce). Nessuna decisione (GTAA/SKH/pesi) cambia.
|
||||||
|
- NON toccati: tutti i FULL (h=0 al 31° pctl = normale), plateau, deflated-Sharpe, fee-sweep,
|
||||||
|
causalità, validazione GTAA (equity OOS), gate weights_tilt_null (relativo).
|
||||||
|
|
||||||
|
**Raccomandazione operativa (sottoscritta dallo scettico): cambio di narrativa e di standard di
|
||||||
|
reporting, NESSUN cambio del book live oggi.** (1) I numeri hold-out di TP01 si citano d'ora in poi
|
||||||
|
come banda d'ancora (mediana ~0.04, [−0.13,+0.30]) con valore = taglio DD; (2) valutazione
|
||||||
|
anchor-agnostic (media 24 ancore) come lens di reporting per i futuri hold-out; (3) NO deploy
|
||||||
|
K=2/K=4 a $600: guadagno ≈ 0, e a $225/asset di quota TP01 i delta per-ancora (~$1-2) sono sotto il
|
||||||
|
min-order $5 → degenererebbe comunque in K=1; inoltre le ancore intraday richiederebbero un feed
|
||||||
|
fresco fuori dal path certificato (staleness ×4 finestre di guasto). **Rivalutare K=2 (0,12) a
|
||||||
|
capitale ≥ ~5-10k.** (4) ⚠️ Audit analogo RACCOMANDATO su XS01 (rebalance 10g ancorato = spazio di
|
||||||
|
luck 10g×24h, potenzialmente peggiore) e SKH01 (fase griglia 230m/690m) — TP01 è oggi l'unico
|
||||||
|
sleeve de-luckato.
|
||||||
|
|
||||||
|
## Filone 4 — Clock lenti + banded rebalancing: FAIL (negativo utile)
|
||||||
|
|
||||||
|
`scripts/research/r0702_slow_clock.py`. Fatto a monte che chiude il filone: il fee drag di TP01 a
|
||||||
|
1d è **~0.40%/anno ≈ 0.03 Sharpe** (8 turnover/y × 0.10% RT) — il tetto di QUALSIASI risparmio.
|
||||||
|
- Clock N∈{2,3,5,7}g: degrado monotono dell'ensemble di fase (HOLD 0.34→0.11 da N=2 a N=7); lo
|
||||||
|
spread TRA fasi esplode a N≥5 (HOLD −0.19…+0.37 a N=7) = timing luck pura, coerente col filone 3.
|
||||||
|
- Bande di isteresi {2.5,5,10,20}%: tagliano il 77-94% degli ORDINI ma quasi zero TURNOVER (gli
|
||||||
|
ordini di TP01 sono micro-aggiustamenti del vol-target). Cella best-IS (band 20%): hold-out
|
||||||
|
0.13 vs 0.30 baseline, e il "guadagno" IS è effetto-segnale (posizioni stantie fortunate), non
|
||||||
|
effetto-costo → fitting. Non-monotonia sulla griglia = firma di rumore.
|
||||||
|
- **Finding utile per il live: a $600 il vincolo min-order $5 È GIÀ la banda ottimale** (ordini
|
||||||
|
427→111/y a costo Sharpe ~0, banda implicita 1.67%): cattura ~100% del risparmio catturabile.
|
||||||
|
Nessun cambio al book, a nessun capitale testato (600/2k/10k).
|
||||||
|
|
||||||
|
## Filone 5 — Velocità del trend regime-condizionata: FAIL
|
||||||
|
|
||||||
|
`scripts/research/r0702_regime_speed.py`. Pesi tra gli orizzonti TSMOM 30/90/180g condizionati al
|
||||||
|
percentile espandente di vol (realized e DVOL), 16 celle, sanity = riproduzione esatta del canonico.
|
||||||
|
- Cella best-IS (alta-vol→lento, linear, rv): FULL +0.06 ma **HOLD BTC −0.31**, 50/50 +0.005 →
|
||||||
|
dominanza fallita; multi-cut a segno instabile (+0.18/−0.08/+0.00).
|
||||||
|
- Null decisivo (300 pesi statici Dirichlet): la cella sta al pctl 0.71-0.72, sotto il p90 —
|
||||||
|
un peso statico casuale la batte spesso. Meccanismo smascherato: corr(peso-30d, Sharpe) = +0.93 →
|
||||||
|
le celle "regime" vincono in-sample perché tengono il tilt-30d la maggior parte dei giorni =
|
||||||
|
**tilt statico travestito da regime**, la stessa trappola di EW-STR. E il tilt statico verso il
|
||||||
|
30d NON regge su BTC hold-out (−0.15). RV e DVOL indistinguibili come misura di regime (coerente
|
||||||
|
con l'esito overlay DVOL 2026-06-26). Pesi canonici 1/3-1/3-1/3 confermati.
|
||||||
|
|
||||||
|
## Filoni 6-8 — CRT "Candle Range Theory" (base / multi-TF / contesto): FAIL 3/3
|
||||||
|
|
||||||
|
Il pattern sweep-and-reclaim a 3 candele (C1 range forte; C2 rompe un estremo ma chiude dentro =
|
||||||
|
"manipolazione"; C3 ingresso contro il breakout, stop dietro lo sweep, target all'estremo opposto),
|
||||||
|
meccanizzato onestamente in tre tagli. Overlap dichiarato: MRV01-11 e MIC07 non coprivano questa
|
||||||
|
meccanica; ora è coperta.
|
||||||
|
|
||||||
|
**6. Base single-TF** (`r0702_crt_base.py`, 864 trial su 1h/4h/12h/1d, motore trade-level
|
||||||
|
conservativo SL-first cross-checkato con l'harness): **DSR 0.000** (il null best-of-grid atteso è
|
||||||
|
Sharpe 2.27, ottenuto 0.74); cella best-IS (4h long color-rule) IS 0.90 → HOLD 0.07 con 2026 a
|
||||||
|
WR 0%; anchor-shift +1/+2h flippa l'hold-out a −1.0 (artifact-risk); lo **short su sweep dell'alto
|
||||||
|
(la narrativa smart-money canonica) perde perfino in-sample (−0.59)**. Autopsia: l'expectancy IS
|
||||||
|
veniva dal time-exit in trend (beta del toro ETH 2021-23), non dal target strutturale. Dettaglio
|
||||||
|
informativo: CRT batte nettamente sia il fade incondizionato (IS −0.49) sia il breakout-confermato
|
||||||
|
(IS −0.31) → il close-back-inside FILTRA davvero tossicità, ma "meno tossico del fade morto" non è
|
||||||
|
un edge.
|
||||||
|
|
||||||
|
**7. Multi-timeframe** (`r0702_crt_mtf.py`, 4h→15m e 1h→5m, ~10k trade): expectancy netta negativa
|
||||||
|
OVUNQUE (FULL e HOLD, entrambi gli asset); il MTF alza il R:R medio da ~3 a ~10-20 ma il WR collassa
|
||||||
|
da ~36% a 9-16% → "migliora" solo perdendo meno. **Refutazione strutturale: il ritest è informazione
|
||||||
|
negativa** — pattern CON ritest −40 bps, SENZA +52 bps (non tradabile: condiziona sul futuro):
|
||||||
|
aspettare il ritest per entrare seleziona sistematicamente i pattern peggiori; i buoni scappano
|
||||||
|
subito e il metodo non li prende mai. A fee ZERO l'edge lordo è ~0 (non è morte per fee: non c'è).
|
||||||
|
Stop 0.1-0.35% ineseguibili col cron orario (26-75% dei segnali già invalidati all'esecuzione).
|
||||||
|
|
||||||
|
**8. Contesto** (`r0702_crt_context.py`, 22 trial: livelli prevday/Donchian/prevweek × equal-H/L ×
|
||||||
|
FVG × sessioni): baseline incondizionata morta (8/8 celle HOLD<0); FVG semmai peggiora; sessione
|
||||||
|
EU consistentemente negativa; unica cella IS-positiva (sweep in Asia su livello prevday) uccisa 4
|
||||||
|
volte (DSR 0.001, anchor-flip a −2/−4h con la firma di open_drive — la sessione "Asia" inizia dove
|
||||||
|
il livello prevday viene ricreato —, solo-ETH, morta a 0.20% fee). **Sottoprodotto prezioso: sugli
|
||||||
|
STESSI livelli prior-day, FOLLOW batte FADE ogni singolo anno 2019-2026** (follow IS/HOLD
|
||||||
|
+1.22/+1.25 vs fade −0.66/−1.46, corr −0.19/−0.27) → conferma indipendente e rafforzativa del lead
|
||||||
|
prevday-breakout in forward-monitor (paper_prevday).
|
||||||
|
|
||||||
|
**Verdetto CRT: concetto Wyckoff riverniciato che, spogliato della discrezionalità, non contiene
|
||||||
|
edge su BTC/ETH Deribit certificati. La direzione giusta sui livelli affollati resta il FOLLOW
|
||||||
|
(breakout), non il fade — coerente con SKH01 (breakout) vivo e mean-reversion morta.**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Lezioni codificabili
|
||||||
|
|
||||||
|
1. **Il timing-luck dell'ancora è una dimensione di multiple-testing NON coperta dai gate
|
||||||
|
esistenti** (deflated-Sharpe conta i trial, non le ancore implicite). Nuova regola di reporting:
|
||||||
|
ogni metrica hold-out di una strategia a ribilanciamento ancorato si cita con la banda d'ancora
|
||||||
|
(o la media anchor-agnostic). Candidato gate futuro: `anchor_luck_band()` in altlib. Audit
|
||||||
|
pendente: XS01 (10g), SKH01 (fase 230m/690m).
|
||||||
|
2. **La famiglia day_boundary_robust / anchor-shift continua a uccidere** (CRT base, CRT-Asia,
|
||||||
|
6/24 celle expiry): ogni effetto legato a etichettatura di barre VA spostato d'ancora prima di
|
||||||
|
crederci. Confermata la regola 2026-06-21.
|
||||||
|
3. **Il fee drag di TP01 (~0.4%/anno) non è un problema da risolvere** — chiude a priori il filone
|
||||||
|
"esecuzione più furba" a questo turnover; il min-order small-cap è già la banda ottimale.
|
||||||
|
4. Il pitfall pandas tz-aware/epoca (2026-07-01) è stato evitato/gestito 2 volte su 9 agenti grazie
|
||||||
|
alla documentazione in CLAUDE.md — il costo di documentare i bug paga.
|
||||||
|
|
||||||
|
## Stato finale
|
||||||
|
|
||||||
|
- 0 nuovi sleeve; portafoglio e book live INVARIATI (5-sleeve 33/15/12/20/20; book Deribit
|
||||||
|
TP01+SKH01 75/25, flat da armamento — il segnale resta risk-off).
|
||||||
|
- Narrativa TP01 aggiornata (CLAUDE.md + docstring): hold-out = banda d'ancora, valore = difesa DD.
|
||||||
|
- Script: `scripts/research/r0702_{eventclock,expiry_calendar,tp01_offset,slow_clock,regime_speed,
|
||||||
|
crt_base,crt_mtf,crt_context,skeptic_offset}.py`. Test suite: invariata, verde.
|
||||||
@@ -0,0 +1,111 @@
|
|||||||
|
# 2026-07-03 — Frontiera rischio/rendimento del book: quanto caldo correre a 2k-5k
|
||||||
|
|
||||||
|
**Contesto.** Dopo la diagnosi strategica ("€50/g è un problema di capitale e di frontiera, non di
|
||||||
|
alpha; hai costruito una macchina difensiva a DD 6% ma hai capitale piccolo e obiettivo di
|
||||||
|
crescita"), goal: **misurare** (non cercare segnali) la frontiera CAGR/DD/P-rovina in funzione del
|
||||||
|
target-vol, pesata per confidenza per-sleeve, a €2k e €5k — per decidere quanto caldo girare il book.
|
||||||
|
Workflow: 3 filoni (curva / onestà-della-coda / eseguibile+Kelly), refuter fat-tail su ciascuno,
|
||||||
|
scettico sintetizzatore. 7 agenti, 0 errori. Sanity bit-exact di entrambi i book prima di ogni numero.
|
||||||
|
|
||||||
|
**Scripts:** `scripts/research/r0703_frontier_{curve,tail,exec}.py`. Nessun file di produzione
|
||||||
|
toccato, nessun commit dagli agenti, `config/live.json` NON modificato (cap solo proposto).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Verdetto in una riga
|
||||||
|
|
||||||
|
**La tesi "corri più caldo" era in gran parte un MIRAGGIO DI REGIME.** Il "~6% attuale" non è un
|
||||||
|
target scelto: è la vol *realizzata* in regime risk-off (TP01 spesso flat 0.0x → il conto è flat
|
||||||
|
*by design*). A lambda=1 il book LIVE a 2 sleeve gira **già a ~11% vol / 9.4% DD**. Quindi "saltare
|
||||||
|
da 6% a 10%" NON è aggiungere leva — è solo assumere che il book non sia risk-off. **Il numero
|
||||||
|
onesto è: gira alla vol NATIVA (~10%, banda 8-11%), non levare.** Guadagno reale vs il 6% risk-off:
|
||||||
|
**+€0.2/g @2k, +€0.5/g @5k** — reale ma modesto, comprato con un DD plausibile di ~€500 su €2k. €50/g
|
||||||
|
resta ~130k, invariato.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## I numeri (frontiera fidata, non full-Sharpe)
|
||||||
|
|
||||||
|
Sanity (deriva nulla): 5-sleeve FULL Sh **2.238** / HOLD 2.452 / DD 6.17% / vol nativa 7.84%;
|
||||||
|
2-sleeve live FULL Sh **1.776** / HOLD 1.162 / DD 9.42% / vol nativa 10.96%.
|
||||||
|
|
||||||
|
**Scale-invarianza confermata da tutti e 3 i refuter:** il capitale NON cambia la matematica del
|
||||||
|
target-vol (le tabelle sono in %), cambia solo l'ESEGUIBILITÀ → **stesso % a 2k e 5k.**
|
||||||
|
|
||||||
|
### Book LIVE 2-sleeve (TP01+SKH01) — l'unico eseguibile <20k
|
||||||
|
- **Target-vol raccomandato: ~10%, banda [8%, 11%], lambda ≈ 0.9.** Sopra la vol nativa non si va.
|
||||||
|
- €/giorno al punto fidato (haircut): CAGR full-sample 12.9% → €0.71@2k / €1.77@5k; ma **HOLD-onesto**
|
||||||
|
(de-luck) CAGR ~4.5% → **€0.25@2k / €0.62@5k**. Il lato-reward headline è ~3× l'onesto (HOLD≪FULL).
|
||||||
|
- **Stima centrale onesta: €0.3-0.7/g @2k, €0.8-1.8/g @5k.**
|
||||||
|
|
||||||
|
### Book PIENO 5-sleeve — ASPIRAZIONALE, non gira <20k
|
||||||
|
Frontiera fidata regge ~12-15% sotto tail estremo, ~20% sotto tail mite — ma XS01 serve ~20k e VRP01
|
||||||
|
è modellato → rilevante solo per il tracking di `paper_combo`, non per una decisione di deploy a 2-5k.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## I quattro insegnamenti strutturali
|
||||||
|
|
||||||
|
### 1. La rovina-50% è la metrica SBAGLIATA (trappola esposta dal curve-refuter)
|
||||||
|
P(rovina-50%|5y) resta <1% fino a ~20-22% di target-vol su ogni book — i book sono troppo lisci/
|
||||||
|
diversificati per bruciare metà capitale entro la distribuzione campionaria. **La risposta letterale
|
||||||
|
"max CAGR a P(rovina)<1%" direbbe "gira al 22%" — ed è un suicidio**: lì P(DD>30%|5y) ≈ 20-25%. Il
|
||||||
|
vincolo che MORDE è **P(DD>30%), super-lineare** (raddoppia ~ogni 2.5 punti di vol). E la rovina-50%
|
||||||
|
non è nemmeno robusta ad alta vol (block-15 vs block-20 danno 7.1% vs 0.9% a tv30%) → altro motivo
|
||||||
|
per stare bassi.
|
||||||
|
|
||||||
|
### 2. Il muro fat-tail ONESTO è ~12%, più basso della carta (~15%)
|
||||||
|
Tre ragioni che il modello sottostima: **(a) gap-through-stop SKH già osservato reale** (sl2%
|
||||||
|
modellato → −11/−23% realizzato — la coda vera NON è nei rendimenti modellati; l'iniezione dei
|
||||||
|
finder usava lo *clean-stop* → ~2× troppo mite); **(b) il 2-sleeve è 4× più crash-sensibile del
|
||||||
|
5-sleeve** (+14.5pt vs +3.5pt di P(DD>30) all'iniezione, diversificazione sottile); **(c)
|
||||||
|
vol-targeting a lambda costante lagga nello spike** → sei più levato *entrando* nel crash.
|
||||||
|
**LIVE 2-sleeve: non superare ~12%; mai 15-20%** (triplica il DD-in-euro senza margine di coda).
|
||||||
|
|
||||||
|
### 3. Aggressività differenziata-per-confidenza (TP01 più caldo di VRP) — REFUTATA
|
||||||
|
La mia proposta era intuitiva ma **sbagliata, e i numeri lo dicono netto**: differenziare la vol per
|
||||||
|
confidenza PEGGIORA la frontiera (5s Sharpe 2.24→2.11, 2s 1.78→1.69) perché **taglia la
|
||||||
|
diversificazione** di VRP/XS (corr uniforme-vs-differenziato 0.98-0.99). **Regola corretta: la bassa
|
||||||
|
fiducia sull'EDGE si esprime DE-MEANando lo sleeve in aspettativa (= la frontiera haircut), NON
|
||||||
|
riducendone l'esposizione/vol.** La confidenza vive nell'haircut della media, non nella leva. Tutti
|
||||||
|
gli sleeve alla stessa leva.
|
||||||
|
|
||||||
|
### 4. La diversificazione LIMA la coda sinistra in-sample (sorpresa onesta)
|
||||||
|
Per il 5-sleeve ben diversificato il block-bootstrap dà P(DD>30) SOTTO il Gaussiano iso-vol (30%:
|
||||||
|
10.6% reale vs 21.1% gauss) — la coda in-sample è benigna. Il segnale fat-tail vive in due posti:
|
||||||
|
l'**iniezione di crash sintetico** (il campione non contiene il crash peggiore di ogni sleeve) e
|
||||||
|
il **book live sottile** (2 gambe, drift haircut) dove il bootstrap SUPERA il Gaussiano. Cioè: la
|
||||||
|
frontiera è affidabile finché il futuro somiglia al passato campionato, e fragile esattamente dove
|
||||||
|
le storie sono corte (VRP mai stressato reale, XS 2.5y, nessun 2018/pre-2018).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Azione concreta (proposta, NON applicata)
|
||||||
|
|
||||||
|
1. **Nessun cambio di leva sul codice.** Il book gira già ≈ al punto fidato: LASCIARE `target_vol=20%`
|
||||||
|
di TP01 (canonico, la vol nativa del book emerge a ~8-11%). Non c'è una leva da girare su.
|
||||||
|
2. **⚠️ L'UNICO cambio che conta: `config/live.json` `max_notional_per_asset_usd` da $300 a
|
||||||
|
equity/2** ($1000@2k / $1750@3.5k / $2500@5k). Senza, il cap $300 tappa la vol raggiungibile a
|
||||||
|
13%@2k / 8%@3.5k / **6%@5k** → **throttling paradossale: più capitale = book più freddo**, forzato
|
||||||
|
sotto il punto fidato. Da applicare AL deposito. (config NON toccato ora.)
|
||||||
|
3. `min_order_usd=5`: LASCIARE (banda d'isteresi gratuita). Tranching K=2: NON cablare. Vol
|
||||||
|
differenziata: NON implementare (Q3).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Brutalità sui limiti
|
||||||
|
|
||||||
|
- **Storie corte = il difetto strutturale.** TP01/SKH dal 2019 (no 2018), VRP dal 2021, XS **2.5
|
||||||
|
anni** (no 2022). Il block-bootstrap non può campionare un crash mai visto; l'iniezione sintetica
|
||||||
|
è l'unico proxy, e quella dei finder era ~2× troppo mite.
|
||||||
|
- **VRP01 è MODELLATO** (f-di-stress mai catturato su un crash reale) → l'haircut −50% è stima, non
|
||||||
|
misura; resta STAT-MODE anche a 5k (regola: niente short-vol da modello in deploy).
|
||||||
|
- **HOLD ≪ FULL sul book live** (1.78 vs 1.16) → il lato-reward headline è in gran parte artefatto
|
||||||
|
full-sample; citare i €/g su base HOLD-onesta.
|
||||||
|
- **€50/g NON è risolto e non lo sarà da questo.** Il warm-up compra ~€0.2/g@2k. La via resta
|
||||||
|
**capitale + tempo**; la regola "niente leva alta come base" è rispettata (la raccomandazione è
|
||||||
|
"gira alla vol nativa", non "corri caldo").
|
||||||
|
|
||||||
|
**Numero unico da portare a casa:** book LIVE a **~10% target-vol (lambda ≈ 0.9, banda 8-11%)**,
|
||||||
|
uguale a 2k e 5k, con **cap → equity/2** come unica azione config; muro invalicabile a **~12%**;
|
||||||
|
guadagno reale vs il 6% risk-off ~**+€0.2/g@2k / +€0.5/g@5k** — reale ma modesto.
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
# 2026-07-03 — Cap notional per-asset DINAMICO (= equity/2): operazionalizza la decisione frontier
|
||||||
|
|
||||||
|
**Contesto.** La frontiera del 2026-07-03 (`docs/diary/2026-07-03-book-frontier.md`) aveva identificato
|
||||||
|
**una sola** azione config con impatto reale: portare `max_notional_per_asset_usd` da $300 fisso a
|
||||||
|
**equity/2**, perché il cap fisso strozza il book man mano che si deposita (paradosso: più capitale =
|
||||||
|
book più freddo — a $5k il cap $300 fa girare il libro al ~49% del target). Il diario la lasciava
|
||||||
|
"da applicare AL deposito". Qui la **operazionalizzo in codice** rendendo il cap dinamico, così è
|
||||||
|
sempre corretta e non richiede un edit manuale al deposito.
|
||||||
|
|
||||||
|
## Cosa è cambiato
|
||||||
|
|
||||||
|
- **`src/live/book.py` — `_cap()`**: se in config c'è `max_notional_per_asset_frac` (opt-in), il cap
|
||||||
|
per-asset diventa **`equity × frac`** (0.5 → equity/2). Senza la chiave → comportamento vecchio
|
||||||
|
(cap fisso `max_notional_per_asset_usd`). Il call site in `book_report()` passa
|
||||||
|
`equity`, `real_equity`, `eq_fallback` a `_cap()`.
|
||||||
|
- **`config/live.json`**: aggiunto `max_notional_per_asset_frac: 0.5` (+ nota). `max_notional_per_asset_usd`
|
||||||
|
resta come **cap fisso di fallback**.
|
||||||
|
- **`tests/test_book_live.py`**: +4 test (scaling con equity fidata, fallback su eq_fallback/real=None/
|
||||||
|
equity 0, no-frac, integrazione online). Suite: **172 passed**.
|
||||||
|
|
||||||
|
## Il guardrail di sicurezza (il punto delicato)
|
||||||
|
|
||||||
|
Il cap dinamico si usa **SOLO con equity reale fidata** (letta dal conto). Se l'equity reale non è
|
||||||
|
leggibile — `eq_fallback` attivo, `real_equity=None`, offline, o equity ≤ 0 — si **torna al cap fisso
|
||||||
|
$300**. Motivo: in fallback `equity` è il paper-cap ($2000 ipotetico); calcolare `equity/2 = $1000` su
|
||||||
|
un conto di importo reale **ignoto** sizerebbe troppo. Preserva esattamente la protezione downside che
|
||||||
|
il test `test_book_execute_eq_fallback_warns_but_proceeds` verificava (l'hard-cap $/asset protegge
|
||||||
|
quando E è ignota). Regola: **equity/2 solo quando ci fidiamo di E; altrimenti $300 fisso.**
|
||||||
|
|
||||||
|
## Verifica
|
||||||
|
|
||||||
|
- **Live dry-run reale** (nessun `--execute`, nessun ordine): `cap/asset **$299**` = $598.06/2 →
|
||||||
|
**INERTE** oggi (≡ vecchio $300). Book flat, HOLD.
|
||||||
|
- Offline / `equity_override`: cap resta **$300 fisso** (nessuna equity reale da fidarsi) → il test
|
||||||
|
di parità pre-esistente regge invariato.
|
||||||
|
- A $5.000 di equity il cap diventerebbe automaticamente **$2.500** (equity/2), rimuovendo il
|
||||||
|
throttling che la frontiera aveva quantificato.
|
||||||
|
|
||||||
|
## Impatto e limiti
|
||||||
|
|
||||||
|
- **Già attivo**: il cron orario (`cron_book.sh`) esegue dal working tree → il prossimo run legge già
|
||||||
|
`frac=0.5`. Nessun deploy separato. **Inerte a $600**, si "accende" da sé quando l'equity cresce.
|
||||||
|
- **NON avvicina €50/g**: la frontiera lo aveva già detto — è una miglioria marginale (+€0.2/g @2k,
|
||||||
|
+€0.5/g @5k), il cui unico scopo è non lasciare capitale futuro strozzato. €50/g resta un problema
|
||||||
|
di **capitale + tempo** (~130k @ CAGR onesto), non di questo cap.
|
||||||
|
- Nessun cambio di **leva** (TP01 `target_vol=20%` invariato, la vol nativa ~10% emerge da sola —
|
||||||
|
coerente col verdetto frontier "gira alla vol nativa, non levare").
|
||||||
@@ -0,0 +1,156 @@
|
|||||||
|
# 2026-07-03 — STATO COMPLETO DEL PROGETTO (snapshot)
|
||||||
|
|
||||||
|
Foto d'insieme dopo le ondate di ricerca del 1-3 luglio 2026 (timing/CRT, anchor-audit,
|
||||||
|
video-claims Elliott/Albimarini, capital-scaling, migliora-e-proteggi VRP01). Serve come punto di
|
||||||
|
riferimento unico: *dove siamo, cosa gira, cosa è provato, cosa resta aperto.*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. In una frase
|
||||||
|
|
||||||
|
Progetto post-reset v2.0.0: su dati Deribit mainnet certificati (solo BTC/ETH) abbiamo costruito un
|
||||||
|
**portafoglio di 5 strategie diversificate** (research Sharpe ~2.2, DD ~6%), di cui **2 sono
|
||||||
|
eseguite live su Deribit** in un book nettato in software. Il conto reale è **~$598, flat** perché
|
||||||
|
il segnale trend è risk-off. Il valore delle strategie è **difensivo** (taglio del drawdown), non
|
||||||
|
generazione di ritorno: il target €50/giorno resta lontano (serve ~130k di capitale). L'onestà
|
||||||
|
metodologica è il vero asset accumulato: ~10 gate anti-illusione codificati, decine di edge
|
||||||
|
falsificati.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2. Il book LIVE (soldi reali)
|
||||||
|
|
||||||
|
- **Conto:** Deribit mainnet, USDC linear, **equity reale $598.06** (NON i €2000 nominali del paper).
|
||||||
|
- **Cosa gira:** `deribit_book_sleeves` = **TP01 (0.75) + SKH01 (0.25)** nettati in software su un
|
||||||
|
solo conto; UN ordine con segno per asset (BTC, ETH). `config/live.json`
|
||||||
|
**`execution_enabled=true`** → esecuzione ARMATA e reale.
|
||||||
|
- **Cadenza:** cron ORARIO `scripts/cron_book.sh` → `scripts/live/book_execute.py` (SKH01 decide su
|
||||||
|
griglia 230m; exit software, latenza fino a fine barra).
|
||||||
|
- **Guardrail:** cap **$300 notional/asset**, min order $5, **disaster-SL on-book −30%** sulla
|
||||||
|
posizione netta, alert Telegram su esecuzione/errori, gate fail-safe su posizione/equity non
|
||||||
|
leggibili (non opera a cieco).
|
||||||
|
- **Stato corrente (ultimo cron 2026-07-03 07:00Z):** BTC e ETH **flat, HOLD a target** — il target
|
||||||
|
TSMOM è risk-off (trend 0.0x) e SKH01 è flat (nessun breakout) → **zero ordini reali mai eseguiti**
|
||||||
|
da quando è armato (2026-06-23): il conto è flat *by design*, non per un errore.
|
||||||
|
- **NON nel book live:** XS01, VRP01, GTAA01 (research/paper/STAT-MODE).
|
||||||
|
|
||||||
|
## 3. Il portafoglio RESEARCH (5 sleeve) — `src/portfolio/sleeves.active_sleeves`
|
||||||
|
|
||||||
|
| Sleeve | Peso | Meccanismo | Dati | Stato |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| **TP01** | 33% | TSMOM difensivo trend BTC/ETH 1d, long-flat, vol-target 20% | 2019→ | **Deploy pieno** (nel book live) |
|
||||||
|
| **SKH01** | 20% | Dual-TF regime+breakout BTC/ETH, L/S, exit %-asimmetrici | 2019→ | Research → nel book live |
|
||||||
|
| **GTAA01** | 20% | Trend difensivo equity 6-ETF (IB), ~30 anni storia | 1996→ | Paper (paper_combo) |
|
||||||
|
| **VRP01** | 12% | Options short-vol (put credit spread + gate IV-rank) | 2021→ | LEAD modellato (STAT-MODE) |
|
||||||
|
| **XS01** | 15% | Cross-sectional momentum 19 alt Hyperliquid | 2024→ | STAT-MODE (serve ~20k) |
|
||||||
|
|
||||||
|
- **Combinato (research, ancore canoniche):** FULL Sharpe **2.24**, HOLD-OUT **2.46**, DD full **6.2%**.
|
||||||
|
- **⚠️ Stima DE-LUCKATA onesta** (dopo gli anchor-audit, vedi §5): **HOLD ~1.9-2.1, FULL ~2.0-2.2,
|
||||||
|
DD ~6%**. Il 2.46 è un massimo di configurazioni d'ancora, non la stima centrale.
|
||||||
|
- Sleeve a date d'inizio diverse → outer-join con pesi rinormalizzati (`combine_outer`).
|
||||||
|
- Report: `scripts/portfolio/run_portfolio.py`. Il book live (TP01+SKH01 75/25) è un sottoinsieme.
|
||||||
|
|
||||||
|
## 4. Paper trader / forward-monitor attivi (nessun soldo reale)
|
||||||
|
|
||||||
|
- **paper_trend** — TP01 1d, capitale nominale 2000, forward-only.
|
||||||
|
- **paper_combo** — book 5-sleeve completo (incl. GTAA/VRP/XS) dal 2026-06-22.
|
||||||
|
- **paper_statarb** — STATARB-RESID (ETH−β·BTC residual momentum, W=45/sgn=+1 congelati), doppio
|
||||||
|
libro MODELED/REAL-$600. LEAD eseguibile a $600 sotto soglia solo sull'edge (DSR 0.929).
|
||||||
|
- **paper_prevday** — FOLLOW prior-day levels (3 trade registrati); confermato indipendentemente da
|
||||||
|
più ondate (FOLLOW > FADE ogni anno 2019-26).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Finding strutturale del blocco 1-3 luglio: ANCHOR TIMING-LUCK (audit COMPLETO 4/4)
|
||||||
|
|
||||||
|
Le strategie a ribilanciamento/griglia ancorata hanno un'ancora "canonica" che è spesso il
|
||||||
|
**migliore** di molte configurazioni equivalenti (giorno/ora/offset) — un multiple-testing che il
|
||||||
|
deflated-Sharpe NON conta. Audit eseguito su tutti e 4 gli sleeve ancorati:
|
||||||
|
|
||||||
|
| Sleeve | Spazio d'ancora | Firma | Conseguenza |
|
||||||
|
|---|---|---|---|
|
||||||
|
| **TP01** | 24 ore (barra daily) | canonica = migliore (P=0.86) | hold-out 0.31 non risolve l'edge di ritorno; regge solo il taglio DD |
|
||||||
|
| **XS01** | 10 fasi (ciclo 10g) | canonica al 15° pctl di DD | numeri headline conservativi sul DD, non sull'hold-out |
|
||||||
|
| **SKH01** | 23 offset (griglia 230/690m) | canonica = 93-98° pctl (peggiore firma) | gate DD<30% fallisce in 15/23 offset; ~+0.5 HOLD di fortuna sul book |
|
||||||
|
| **VRP01** | 7 giorni (ciclo settimanale) | **canonica = PEGGIORE** (7° pctl) | **numeri CONSERVATIVI**, non gonfiati — unico sleeve senza luck |
|
||||||
|
|
||||||
|
**Regola codificata:** i numeri hold-out di strategie ancorate si citano **con banda d'ancora**.
|
||||||
|
Candidato gate futuro: `anchor_luck_band()` in altlib. Diari: `2026-07-02-timing-crt-wave.md`,
|
||||||
|
`2026-07-02-anchor-audit-xs01-skh01.md`, `2026-07-03-vrp-improve-dd.md`.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. Cosa è PROVATO e MORTO (per non ri-testarlo)
|
||||||
|
|
||||||
|
- **Soffitto BTC/ETH-direzionale ~1.3** confermato da ogni ondata; superato solo dal cross-sectional
|
||||||
|
(XS01) e dalla diversificazione multi-sleeve.
|
||||||
|
- **Sweep 104 famiglie** (2026-06-20): 1 sola sopravvissuta, comunque non deployabile.
|
||||||
|
- **Opzioni long-vol** (gamma scalping): specchio del VRP, perde ogni anno/variante/frequenza.
|
||||||
|
- **Cash-and-carry (CC01):** premio reale ma Sharpe artefatto (manca il 2022, procyclico) → STAT-MODE.
|
||||||
|
- **Timing/clock alternativi** (event-clock, expiry calendar, clock lenti, regime-speed): 0 edge.
|
||||||
|
- **CRT "Candle Range Theory"** (3/3 FAIL): DSR 0.000, expectancy negativa anche a fee zero, il
|
||||||
|
ritest è informazione negativa; sui livelli prior-day FOLLOW > FADE.
|
||||||
|
- **Elliott (3/3 FAIL):** range-cycle = rumore; Fibonacci = effetto posizione non numeri magici;
|
||||||
|
canale = Donchian travestito.
|
||||||
|
- **Albimarini double-diagonal (2/2 FAIL):** non domina il condor, fee-negativa su Deribit, track
|
||||||
|
record consistente con zero skill (P=20-45%), rovina nei replay con code reali.
|
||||||
|
- **VRP01 miglioramenti (0/7 filoni):** struttura, overlay-DD, gate nuovi (4° fallimento), sizing,
|
||||||
|
gate SPX (confound di modello) — **VRP01 non migliorabile; la protezione DD si compra con la size.**
|
||||||
|
|
||||||
|
## 7. Regole/gate anti-illusione codificati (l'asset metodologico)
|
||||||
|
|
||||||
|
- **Certificazione dati** obbligatoria (solo Deribit mainnet, BTC/ETH; alt esclusi).
|
||||||
|
- **`marginal_vs_tp01` / `study_marginal`** (earns_slot) — Sharpe MARGINALE, non assoluto.
|
||||||
|
- **`study_family_honest` / `select_cell_insample` / `deflated_sharpe≥0.95`** — anti selection-on-holdout.
|
||||||
|
- **`day_boundary_robust`** — effetti calendario che si invertono spostando il confine = artefatto.
|
||||||
|
- **`eval_weights_smallcap`** — Sharpe haircut reale a capitale piccolo (sub-min-order = finzione).
|
||||||
|
- **`weights_tilt_null`** — ogni cambio pesi vs null dei tilt casuali cap-respecting.
|
||||||
|
- **Banda d'ancora** (nuova, luglio) — per ogni costrutto ancorato.
|
||||||
|
- **Candidati in coda:** `anchor_luck_band` (multiple-testing d'ancora); `implausible_sharpe`
|
||||||
|
(0-perdite / Sharpe implausibile — 3 occorrenze: CC01, ALB-A, griglia struttura VRP).
|
||||||
|
- **Lezioni pandas:** mai `DatetimeIndex.view("int64")` su tz-aware; `resample("7D", origin=)`
|
||||||
|
ignora origin (usare `"168h"`); un gate che si correla con un errore di modello è indistinguibile
|
||||||
|
da alpha finché non correggi il modello.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8. Onestà sui numeri e sul target
|
||||||
|
|
||||||
|
- **€50/giorno da €1.000-2.000 NON è raggiungibile** in 1-2 anni: serve ~130k di capitale o un DD da
|
||||||
|
rovina. La leva non è la scorciatoia (5x raddoppia il DD). La via è target-vol + capitale + tempo.
|
||||||
|
- Aspettativa onesta col CAGR de-luckato del book (10-15%): **~€0.6-0.8/giorno a 2k, ~€1.4-2/giorno
|
||||||
|
a 5k**. Il salto di capitale cambia *cosa è eseguibile*, non l'ordine di grandezza del ritorno.
|
||||||
|
- Il valore reale di TP01/del book è il **taglio del drawdown ~6× vs buy&hold**, non l'alpha.
|
||||||
|
|
||||||
|
## 9. Capitale in arrivo 2-5k — cosa cambia (audit r0702_capital_scaling)
|
||||||
|
|
||||||
|
- **Unico vincolo binding: il cap `max_notional_per_asset_usd=300`.** A 5k il book live girerebbe al
|
||||||
|
~49% del target. **Azione pendente sul deposito: alzare il cap a equity/2** ($1000/$1750/$2500 a
|
||||||
|
2k/3.5k/5k). `min_order_usd=5` da lasciare.
|
||||||
|
- Tranching K=2: matematicamente regge a 5k ma serve feed intraday fuori path certificato → non cablare.
|
||||||
|
- Opzioni ETH eseguibili da ~2.6k (spread), ma **la regola "niente short-vol da modello in deploy"
|
||||||
|
non decade col capitale**. XS01 resta fuori fino a ~20k. CC01 fuori per struttura.
|
||||||
|
- ⚠️ Disambiguazione unità: il "12%" come peso book (~0.014 Kelly) ≠ "12%" come margine/equity
|
||||||
|
(~0.27 Kelly) — **fattore 19x**.
|
||||||
|
|
||||||
|
## 10. Aperto / prossimi passi
|
||||||
|
|
||||||
|
1. **Al deposito 2-5k:** alzare il cap $/asset (proposta pronta, `config/live.json` non ancora toccato).
|
||||||
|
2. **Forward-monitor da maturare:** paper_statarb (edge sotto soglia DSR), paper_prevday (FOLLOW),
|
||||||
|
paper_combo (book completo). Se la finestra forward conferma STATARB-RESID → deployabile a 2 gambe.
|
||||||
|
3. **Gate da codificare:** `anchor_luck_band`, `implausible_sharpe`.
|
||||||
|
4. **Rivisite temporizzate:** term-structure DVOL (logger dal 2026-06-26, rivalutare a 6-12 mesi);
|
||||||
|
breadth/internals HL (1-2 anni di storia nativa); tranching a ≥5-10k; VRP stress-f su un crash reale.
|
||||||
|
5. **Ricerca strategie nuove:** il soffitto direzionale ~1.3 è saturo; i margini restano in meccanismi
|
||||||
|
ORTOGONALI (cross-sectional, relative-value, options gated) e nella diversificazione, non in nuovi
|
||||||
|
segnali direzionali BTC/ETH.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 11. Stato tecnico
|
||||||
|
|
||||||
|
- **Versione:** 2.0.0 (semver in `VERSION`). **Test:** 168 verdi (28 file). **Diari:** 76.
|
||||||
|
- **Ultimi commit:** `26f8d27` (migliora+proteggi VRP01), `76120b5` (video-claims + capital-scaling),
|
||||||
|
`a74cc69` (anchor-audit XS01/SKH01), `e6657fc` (GTAA01 5° sleeve).
|
||||||
|
- **Working tree pulito, tutto pushato.** Book live sano e invariato da tutta la ricerca (research
|
||||||
|
isolata: nessun agente tocca src/config/live).
|
||||||
@@ -0,0 +1,167 @@
|
|||||||
|
# 2026-07-03 — Ondata "migliora e proteggi VRP01 dai DD" (7 filoni + verifica a 2 lenti + scettico incrociato)
|
||||||
|
|
||||||
|
**Contesto.** Dopo la chiusura del dossier Albimarini (3 backtest indipendenti convergenti: premio
|
||||||
|
piccolo e reale, code non campionate, numeri del corso spiegabili al 100% dalla struttura del
|
||||||
|
payoff), goal esplicito: **migliorare la strategia short-vol** — la famiglia Albimarini → il nostro
|
||||||
|
**VRP01**, l'unica forma sopravvissuta agli audit — **e proteggerla dai drawdown**, con
|
||||||
|
orchestrazione a decine di agenti. Workflow deterministico: 7 filoni di ricerca in parallelo, 2
|
||||||
|
refuter avversariali (lente selection-bias + lente de-levering) su ogni miglioramento proposto,
|
||||||
|
scettico incrociato finale sui sopravvissuti. **26 agenti, 0 errori.**
|
||||||
|
|
||||||
|
**Scripts:** `scripts/research/r0703_vrpimp_{structgrid,ddoverlay,sizing,newgates,anchor,spxgate,stresslab}.py`.
|
||||||
|
Nessun file di produzione toccato, nessun commit dagli agenti. Motore riusato: `r0702_alb_structure.py`
|
||||||
|
(DVOL, riproduce VRP01 bit-exact: baseline bridge max|diff|=0.00e+00 su 266 settimane).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Verdetto in una riga
|
||||||
|
|
||||||
|
**VRP01 non è migliorabile oltre lo status quo, e la protezione DD si compra SOLO con la size.**
|
||||||
|
Zero nuovi sleeve, zero overlay che reggono, zero gate nuovi, zero cambio di sizing. I due unici
|
||||||
|
"sopravvissuti" alla verifica **non propongono alcun cambiamento** (una conferma dello status quo +
|
||||||
|
una lente di misura). Il candidato più luccicante dell'ondata — un gate term-structure VIX su SPX
|
||||||
|
con ΔSharpe +0.90 e DSR 0.992 — è stato smontato dallo scettico come **confound di modello al
|
||||||
|
100%**. Deliverable reale = **audit anchor-luck di VRP01 CHIUSO** (ultimo sleeve ancorato): la fase
|
||||||
|
canonica è all'estremo **conservativo** della banda, quindi i numeri di ammissione reggono e da ora
|
||||||
|
si citano con banda.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## I 7 filoni
|
||||||
|
|
||||||
|
### 1. Griglia di struttura (288 celle) — NESSUNA batte VRP01
|
||||||
|
6 strutture (vertical put/call, condor, 3 diagonali) × distanza {1,1.5,2,2.5}σ × ali {0.5,1,2}σ ×
|
||||||
|
tenor {3,5,7,10}g, gate IV-rank canonico sempre attivo. La cella scelta col **solo in-sample**
|
||||||
|
(DIAG-PUT z=1.0 3g, ShIS 2.28) crolla in hold-out a **+0.19** vs 0.86 del bridge stesso-motore;
|
||||||
|
DSR 0.000/0.004 su 288 trial; multi-cut negativo a 3-4 cut su 4; banda d'ancora che non tiene
|
||||||
|
nemmeno il segno (ShH [−0.21,+0.64]). **Metà griglia (150/288) è il pattern "0-perdite = Sharpe
|
||||||
|
implausibile"** (celle z≥2 lunghe, 0 perdite su ~97 trade, ShH fasulli 4-6.5) — **terza occorrenza
|
||||||
|
dopo CC01 e ALB-A**. Quarta conferma indipendente: nel VRP l'alpha sta nel gate di regime + nella
|
||||||
|
zona ~δ-0.28 dove la coda è campionata, non nella geometria.
|
||||||
|
|
||||||
|
### 2. Overlay di protezione DD (14 celle) — 4/4 REFUTED (2 lenti ciascuno)
|
||||||
|
(a) exit intra-settimana su spike DVOL, (b) stop-loss MTM, (c) ala di coda comprata (broken-wing),
|
||||||
|
(d) cooldown post-perdita. **Nessuno batte il null del de-levering** a pari maxDD su tutta la banda
|
||||||
|
f; nessuno passa multi-cut (max 1/4) né DSR (0.70-0.88, tutti <0.95). Esempio decisivo: SL MTM 3x fa
|
||||||
|
DD 7.9%/worst −5.7%, ma VRP01 × 0.66 (semplice riduzione di size) fa lo **stesso DD a Sharpe
|
||||||
|
invariato e worst-week migliore (−4.9%)**. Meccanismo confermato: i trigger di spike scattano solo
|
||||||
|
2-3 volte in 5 anni **perché il gate IV-rank/crash-skip evita già gli ingressi vicino alle
|
||||||
|
esplosioni di vol** — la protezione crash vive nel gate d'ingresso, non serve un overlay a valle.
|
||||||
|
Coerente con TP01×DVOL (2026-06-26): "per meno DD la leva è la size, non un overlay".
|
||||||
|
|
||||||
|
### 3. Sizing anti-rovina — CONFERMA (12% ≈ quarter-Kelly), 1 candidato REFUTED
|
||||||
|
Il sizing non crea alpha (Sharpe del flusso invariante ~0.95 a ogni frazione). Frontiera onesta
|
||||||
|
CAGR-DD-P(rovina) mappata su 92 trade gated ETH 2021-26 (pooled banda-f + coda sintetica full-loss):
|
||||||
|
Kelly onesto q*=44% → il **12% del book = 0.27 Kelly, già in zona quarter-Kelly anti-rovina**
|
||||||
|
(P(rovina-50%|5y) 0.0-0.1%, P(DD>30%) 9-18%, CAGR med 13.5-17% a 2k/5k). Salire al 25% → P(DD>30%)
|
||||||
|
> 92%; Albimarini 1→4 → P(rovina) 53-55%. **Nessun cambio raccomandato.** Il candidato anti-streak
|
||||||
|
(N=2, size 12%→3% dopo 2 vittorie, l'opposto di Albimarini) era il più luccicante mai visto sullo
|
||||||
|
sleeve (FULL CAGR +19.4%/DD 6.3%/Sh 2.08, random-null 0.996, DSR 0.999) ma **auto-refutato come
|
||||||
|
artefatto di selezione**: plateau assente (solo N=2 vince, N=3/5 collassano), P(loss|streak) non
|
||||||
|
monotona, delever-null perde in 2/7 ancore — tutto l'effetto sono ~6 perdite su 15 trade a
|
||||||
|
streak==2 (binomtest p=0.033, CI contiene la base). Istruttivo: mostra come un DSR 0.999 possa
|
||||||
|
convivere con l'assenza di meccanismo.
|
||||||
|
|
||||||
|
### 4. Gate nuovi — 4° FALLIMENTO su 4 (barra alta)
|
||||||
|
(a) term-structure DVOL **non testabile oggi** (storia vol_term = 7 giorni, logger forward dal
|
||||||
|
2026-06-26 → rivalutare a 6-12 mesi); (b) vol-of-vol, (c) RV-acceleration, (d) combinazioni-AND. Il
|
||||||
|
candidato IS-best (vol-of-vol pctl>0.80) passa DSR 0.960 e il de-levering all'ancora di default ma
|
||||||
|
la **banda d'ancora lo smaschera** (mediana uplift FULL −0.07 su 7 ancore, uplift concentrato in UNA
|
||||||
|
finestra 2021-22 di 5 settimane, hold-out uplift 0.00). Bonus strutturale: i veti RV-acceleration
|
||||||
|
bloccano settimane **profittevoli** (+0.93/+1.25% vs +0.6% tenute) — dopo il gate IV-rank, la vol
|
||||||
|
che accelera è dove il premio venduto è più ricco. Conferma il verdetto 2026-07-01: l'alpha è tutto
|
||||||
|
nel binario IV-rank>0.30.
|
||||||
|
|
||||||
|
### 5. Audit anchor-luck VRP01 — CHIUSO: primo sleeve SENZA firma di luck
|
||||||
|
VRP01 è l'ultimo sleeve ancorato dopo TP01/XS01/SKH01. Ciclo settimanale → 7 ancore (giorno di
|
||||||
|
apertura). Replica bit-exact della sleeve (max|diff|=0.0). Le 7 fasi con parametri identici:
|
||||||
|
|
||||||
|
| metrica | canonica (fase-0) | mediana 7 fasi | banda | pctl canonica |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| Sh FULL | 1.09 | 1.32 | [1.09, 1.83] | **7° (peggiore)** |
|
||||||
|
| Sh HOLD | 0.59 | 0.59 | [−0.03, 1.11] | 50° (mediana) |
|
||||||
|
| maxDD | 11.8% | 7.2% | [5.7, 11.8%] | **93° (peggiore)** |
|
||||||
|
|
||||||
|
**Firma OPPOSTA a TP01/XS01/SKH01**: lo spike bootstrap è NEGATIVO (g0 HOLD −0.06, FULL −0.21,
|
||||||
|
P(g0≤0) 0.54/0.74) → niente da de-luckare. La fase canonica ha beccato le settimane crash 2022
|
||||||
|
**peggio** di ogni altra (unico anno-fase negativo, −5.8%). **I numeri di ammissione FULL 1.10 /
|
||||||
|
HOLD 0.60 / DD 12% sono quindi CONSERVATIVI, non gonfiati** — il timore di "protezione fittizia" è
|
||||||
|
refutato: il DD 12% è il caso peggiore della banda, non quello fortunato. Impatto della fase sul
|
||||||
|
book 5-sleeve ≤ 0.04 Sh (banda ShFULL 2.23-2.27, ShHOLD 2.35-2.48, DD 6.2-6.3%). **Con questo
|
||||||
|
l'audit anchor-luck è completo su tutti gli sleeve ancorati (4/4).**
|
||||||
|
|
||||||
|
### 6. Gate di regime sulla diagonale SPX (l'esperimento mancante) — REFUTED, con confound istruttivo
|
||||||
|
L'esperimento che mancava ai 3 backtest Albimarini: il gate di regime sulla diagonale SPX (VIX +
|
||||||
|
VXV da FRED, motore BS sintetico con skew log-lineare). **Domanda secca: il gate IV-rank ribalta gli
|
||||||
|
anni di coda su SPX come su crypto? NO.** Il gate VIX-rank canonico *abbassa* lo Sharpe (1.36→1.19),
|
||||||
|
non ribalta nessun anno di coda, peggiora il 2018, muore sul de-levering (ΔSh −0.17). Meccanismo:
|
||||||
|
su SPX il VRP è già positivo l'**84% dei giorni** (vs ~58% delle settimane crypto) → il filtro di
|
||||||
|
rank non ha lavoro discriminante; su equity IV-rank alto = crisi, non vol ricca.
|
||||||
|
Il candidato **term-structure VIX/VXV<1 (contango)** sembrava reale — Sh 1.18→2.08, DD 3.5→1.3%,
|
||||||
|
ΔSh **+0.90** a pari DD, multicut 3/3, flippa il 2020, DSR 0.992, plateau su c∈[0.93,1.05], jackknife
|
||||||
|
robusto — **e passa la lente selection-bias pulito**. Ma la lente de-levering lo affonda:
|
||||||
|
**l'intero uplift è un confound di modello, quantificato al 100%.** La variabile del gate (VIX/VXV>1)
|
||||||
|
coincide 1:1 con la variabile dell'errore di pricing (tenor 6g prezzato a VIX-30g). Il refuter ha
|
||||||
|
riprezzato con σ(6g)=VIX·(VIX/VXV)^α term-structure-consistent (α=1.42 = estrapolazione log-lineare
|
||||||
|
zero-parametri della pendenza osservata 30g→93g) → l'edge sparisce. **Lezione: un gate che si
|
||||||
|
correla con un errore di modello è indistinguibile da alpha finché non correggi il modello** — vale
|
||||||
|
per ogni futuro test su strutture prezzate BS-flat.
|
||||||
|
|
||||||
|
### 7. Stress lab di coda — fisica dello strumento, nessun cambio
|
||||||
|
La protezione di coda del VRP01 viene per ~metà dall'**ala far-OTM** (nel replay COVID taglia ~90%
|
||||||
|
della perdita naked) e ~metà dal **gate canonico** (sulle 10 peggiori finestre 14g taglia la perdita
|
||||||
|
cumulata del 44-71% saltando i re-entry a IV-rank>0.90). L'ala T+1 "Albimarini" è assicurazione solo
|
||||||
|
contro i gap **medi** (−15/−20%, dove atterra ATM con un giorno di time value: +150bps) e **NON**
|
||||||
|
contro i gap profondi (k(−30%)=0.98 → il de-levering la batte), con valore interamente dipendente
|
||||||
|
dal vol-spike (banda f/mult da −324 a +263bps). Worst-case onesto a sizing 12%: piccolo in
|
||||||
|
convenzione book (−€12/sett a 2k, −€31 a 5k alla cella −30%) ma **è il margine intero** se il 12%
|
||||||
|
fosse deployato fisicamente come margine (−€164..−227).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Scettico incrociato — verdetto e disambiguazione critica
|
||||||
|
|
||||||
|
I 2 sopravvissuti (sizing-conferma, anchor-ensemble) usano leve diverse (posizione sulla frontiera
|
||||||
|
vs varianza della stima), ma lo scettico ha trovato **tre sovrapposizioni che i refuter singoli non
|
||||||
|
potevano vedere**:
|
||||||
|
|
||||||
|
1. **Stessa dipendenza dal modello f** — entrambi flippano segno allo stesso punto (f=0.6-0.8 →
|
||||||
|
negativo). Due sopravvissuti = **un solo grado di libertà di rischio-modello** (il caveat "premio
|
||||||
|
MODELLATO su DVOL ATM" resta il collo di bottiglia dell'intera famiglia).
|
||||||
|
2. **⚠️ CONFLITTO DI UNITÀ sul "12%"** (il punto più pericoloso per la narrativa): il **12% di PESO
|
||||||
|
del book** (convenzione pnl/Ks di `sleeves.py`) = ~**0.6% margine/equity ≈ 0.014 Kelly**, mentre
|
||||||
|
il "FISSO 12%" del filone sizing = **12% margine/equity ≈ 0.27 Kelly** — **fattore 19x**. Entrambe
|
||||||
|
corrette internamente, ma non vanno confuse: worst-week −12.2% del conto (convenzione margine) vs
|
||||||
|
−0.64% (convenzione peso book).
|
||||||
|
3. **L'ensemble-7-fasi è ridondante con il tranching TP01** (matematica di diversificazione: corr fra
|
||||||
|
fasi ρ=0.355, boost teorico ×1.50 vs osservato ×1.53, residuo alpha ≈ 0) → **non promuovere a LEAD
|
||||||
|
autonomo**; la coda strutturale è invariata (worst = 7 tranche a full-loss simultaneo), il DD 4.7%
|
||||||
|
è campionario, non un cap.
|
||||||
|
|
||||||
|
**Effetto congiunto sul book 5-sleeve: ZERO** (entrambi propongono nessun cambio; controfattuale
|
||||||
|
|ΔSh| ≤ 0.04). Il book live Deribit (TP01+SKH01) non contiene VRP01 → impatto operativo nullo.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Cosa entra nella narrativa (una sola voce, status = misura research)
|
||||||
|
|
||||||
|
- **Audit anchor-luck VRP01 CHIUSO** → i numeri di ammissione reggono e si citano con banda
|
||||||
|
(ShFULL [1.09,1.83], ShHOLD [−0.03,1.11], DD [5.7,11.8%]); l'edge OOS resta f-dipendente.
|
||||||
|
Con questo l'audit anchor è completo su 4/4 sleeve ancorati.
|
||||||
|
- **Sizing (conferma, con disambiguazione unità obbligatoria):** 12% deploy ≈ 0.27 Kelly onesto,
|
||||||
|
anti-rovina; NON confondere col 12% di peso book (0.014 Kelly, 19x).
|
||||||
|
- **VRP01 canonico resta lo sleeve giusto, INVARIATO** — non migliorabile per struttura, gate,
|
||||||
|
overlay o sizing; la protezione DD si compra con la size.
|
||||||
|
|
||||||
|
## Regole/candidati rafforzati
|
||||||
|
|
||||||
|
- **`implausible_sharpe` gate in altlib**: 3ª occorrenza del pattern "0-perdite = Sharpe
|
||||||
|
implausibile" (griglia struttura, dopo CC01 e ALB-A) → priorità alzata.
|
||||||
|
- **Nuova regola metodologica**: un gate che si correla con un errore di modello (term-structure vs
|
||||||
|
BS-flat) è indistinguibile da alpha finché non si corregge il modello — riprezzare
|
||||||
|
term-structure-consistent prima di credere a qualsiasi gate vol su strutture BS-flat.
|
||||||
|
- **Conferma (4ª): l'alpha del VRP è il gate IV-rank binario**, non struttura/sizing/overlay/gate
|
||||||
|
aggiuntivi.
|
||||||
|
|
||||||
|
**Stato:** book live INVARIATO, nessun nuovo sleeve, nessun forward-monitor. Test suite verde. 7
|
||||||
|
script committati.
|
||||||
@@ -0,0 +1,109 @@
|
|||||||
|
# 2026-07-07 — Video-claim "CRT top-down multi-TF, 74% win rate": SCARTATO (il 74% è un knob, non un edge)
|
||||||
|
|
||||||
|
**Richiesta utente:** analizzare e testare una strategia da video, metodo ICT/SMC top-down
|
||||||
|
multi-timeframe con claim **74% win rate**:
|
||||||
|
1. **H1** — setup CRT: candela di displacement forte, poi candela che prende liquidità (spike oltre
|
||||||
|
il range di C1) ma richiude dentro → falso breakout → fade/reversal.
|
||||||
|
2. **M15** — struttura: swing (U a 3 candele) + imbalance che diventa inverse-imbalance (FVG mitigato).
|
||||||
|
3. **M5** — conferma: displacement direzionale + zona di protezione (order block / imbalance).
|
||||||
|
4. **M1** — entry: attende la correzione, entra con SL dietro la zona di protezione.
|
||||||
|
Uscita: **TP1 a fine zona CRT (RR ~1.5–2), chiude 70–80% lì → resto a break-even → runner 20–30%**
|
||||||
|
verso la "liquidità successiva" (previous daily high/low). Due esempi mostrati (gold, nasdaq), entrambi
|
||||||
|
vincenti. Metà finale del video = vendita academy → lead magnet.
|
||||||
|
|
||||||
|
La valutazione critica dell'utente ("occhio Milito") aveva già isolato le red flag giuste (74% non
|
||||||
|
dimostrato, cherry-picking di 2 esempi, concetti discrezionali non falsificabili, RR basso + WR alto =
|
||||||
|
fragile, funnel commerciale). Questo diario **meccanizza e falsifica** la parte testabile.
|
||||||
|
|
||||||
|
## Inventario preventivo (non rifare lavoro)
|
||||||
|
|
||||||
|
Il setup H1 CRT è **già stato meccanizzato e scartato 3 volte** nell'onda 2026-07-02:
|
||||||
|
- `r0702_crt_base` (864 trial, 1h/4h/12h/1d): **DSR 0.000**; short "smart-money" negativo perfino IS.
|
||||||
|
- `r0702_crt_mtf` (4h→15m, 1h→5m, ~10k trade): **expectancy netta negativa OVUNQUE**; refutazione
|
||||||
|
strutturale = **"il ritest è informazione negativa"** (pattern CON ritest −40bps, SENZA +52bps).
|
||||||
|
- `r0702_crt_context` (FVG/sessioni/livelli): FVG semmai peggiora; **FADE < FOLLOW ogni anno 2019-26**.
|
||||||
|
|
||||||
|
**Angolo NUOVO non coperto** = la **gestione d'uscita (parziale+BE+runner)** e il **claim 74% WR**.
|
||||||
|
È lì che ho concentrato il test: `scripts/research/r0707_crt_topdown.py` (non tocca src/config/live;
|
||||||
|
nessun file scritto). Riusa l'harness certificato (dati/atr/sharpe/DSR di `altlib`).
|
||||||
|
|
||||||
|
## Disegno
|
||||||
|
|
||||||
|
- Detection CRT C1-C2 su **H1** (causale, nota alla chiusura di C2). Direzione = fade dello sweep.
|
||||||
|
- Entry sul TF basso (**5m/15m**, proxy di M5/M1 — ⚠️ **M1 non è nel feed certificato**): ritest della
|
||||||
|
zona violata + close-back attraverso il livello ("displacement di conferma"), **SL = estremo dello
|
||||||
|
swing basso = zona di protezione**.
|
||||||
|
- Tre schemi d'uscita sugli **stessi ingressi**: `fix1.5` (full, TP 1.5R), `fix2.0` (full, TP 2.0R),
|
||||||
|
`managed` (75% a 1.5R → resto 25% a BE, runner target = prev-daily high/low o estremo opposto C1).
|
||||||
|
- Gate progetto: hold-out 2025-01-01, griglia (k, s, d, tf, scheme) con **selezione cella solo
|
||||||
|
in-sample** + **DSR su tutti i trial**, **fee sweep** 0/0.10/0.20% RT, executability $600.
|
||||||
|
- Metrica invariante = **expectancy in R netto fee** (non il win-rate).
|
||||||
|
|
||||||
|
## Esito — il 74% è un artefatto della distanza del target, non un edge
|
||||||
|
|
||||||
|
**1) Win-rate reale (fade, tutti gli schemi, pooled BTC+ETH):**
|
||||||
|
|
||||||
|
| schema | WR mediana | expectancy R (netto 10bps) |
|
||||||
|
|---|---|---|
|
||||||
|
| fix1.5 | **35.8%** | −2.38 |
|
||||||
|
| fix2.0 | 31.3% | −2.34 |
|
||||||
|
| managed | **35.8%** | −2.17 |
|
||||||
|
|
||||||
|
Il WR a RR 1.5 è **~35%**, cioè **SOTTO** il null gambler's-ruin di un random walk senza edge
|
||||||
|
(P(+1.5R prima di −1R) = 1/(1+1.5) = **40%**). Il setup tocca 1.5R **meno spesso di una moneta** →
|
||||||
|
conferma indipendente che *il ritest è informazione negativa*. Lo schema `managed` **non gonfia** il
|
||||||
|
WR sopra `fix1.5` (per costruzione: "vinci" solo se raggiungi il parziale a 1.5R, che è la stessa
|
||||||
|
condizione di `fix1.5`). **In nessuna cella si avvicina al 74%.**
|
||||||
|
|
||||||
|
**2) Il win-rate È un knob — sweep del target parziale `rr1` (managed, 5m, cella tipica):**
|
||||||
|
|
||||||
|
| rr1 | WR reale | null 1/(1+rr1) | expR (fee 10bps) | expR (fee 0) |
|
||||||
|
|------|----------|----------------|------------------|--------------|
|
||||||
|
| 0.50 | 51.4% | 66.7% | **−2.54** | +0.11 |
|
||||||
|
| 0.75 | 46.9% | 57.1% | −2.51 | +0.14 |
|
||||||
|
| 1.00 | 43.2% | 50.0% | −2.47 | +0.17 |
|
||||||
|
| 1.50 | 36.3% | 40.0% | −2.45 | +0.19 |
|
||||||
|
| 2.00 | 31.8% | 33.3% | −2.42 | +0.23 |
|
||||||
|
|
||||||
|
Avvicinando il target il WR sale (esattamente come previsto dalla formula gambler's-ruin): **un "74%"
|
||||||
|
si fabbrica scegliendo un parziale vicino** (~0.35R), NON perché il metodo indovina la direzione. Ma
|
||||||
|
l'**expectancy R è costante e negativa a ogni rr1**: il WR alto non porta soldi. NB anche a WR massimo
|
||||||
|
il setup resta *sotto* il null teorico ad ogni rr1 → è pure peggio di un random walk nel raggiungere
|
||||||
|
target vicini.
|
||||||
|
|
||||||
|
**3) Gate statistici (cella scelta in-sample = 15m, k1.5, s0.1, d0.15, fix2.0):**
|
||||||
|
- **DSR = 0.000** su 48 trial (null max-Sharpe atteso 4.35). FAIL.
|
||||||
|
- **Fee sweep:** a **0 bps** expR = −0.10 e Sharpe book −0.63 → **non è morte-per-fee: l'edge lordo
|
||||||
|
non esiste** (il residuo lordo marginalmente positivo su 5m è la beta di trend dei time-exit, la
|
||||||
|
stessa autopsia del CRT base). A 10bps expR −1.26; a 20bps −2.43. Stop stretti (0.13–0.24%) →
|
||||||
|
la fee 0.10% pesa 0.75–2.6 R per trade → qualunque micro-edge lordo è polverizzato.
|
||||||
|
- **Hold-out 2025-26:** WR 32%, expR −1.56 (peggio dell'IS). Nessuna reggenza fuori campione.
|
||||||
|
|
||||||
|
**4) Executability $600:** SL sul TF basso = 0.13% (5m) / 0.24% (15m). Lo schema parziale+BE+runner
|
||||||
|
richiede **3–4 ordini per trade**, alcuni **sotto il min-order $5** a nozionale $1200 → non eseguibile
|
||||||
|
pulito al capitale reale.
|
||||||
|
|
||||||
|
## Verdetto
|
||||||
|
|
||||||
|
**SCARTATO.** Il claim "74% win rate" è **coerente con ZERO edge**: è la scelta di un parziale vicino
|
||||||
|
(gambler's ruin), non capacità direzionale. Smontato lo schema d'uscita, resta il setup H1 CRT che
|
||||||
|
questo progetto ha già triplo-refutato (DSR 0.000, ritest = informazione negativa, fade < follow).
|
||||||
|
Sul feed certificato BTC/ETH il metodo ha **win-rate reale ~30–37% e expectancy R negativa a ogni
|
||||||
|
schema, fee, finestra e asset**; lordo di fee non c'è edge; a $600 non è nemmeno eseguibile pulito.
|
||||||
|
|
||||||
|
La parte *utile* del video è il framework di lettura (CRT + imbalance + parziali), non il numero — come
|
||||||
|
aveva già concluso la valutazione dell'utente. Da trattare come lettura del mercato, non come sistema.
|
||||||
|
|
||||||
|
## Lezione codificabile (candidata)
|
||||||
|
|
||||||
|
**Il win-rate di uno schema parziale+BE non è un parametro di merito: è ~P(tocca il primo target prima
|
||||||
|
dello stop) = 1/(1+rr1) per un processo senza drift.** Ogni claim "WR X%" da schema SMC va convertito
|
||||||
|
in **expectancy R netto fee** prima di crederci; il WR alto si compra con un target vicino a costo di
|
||||||
|
un'expectancy identica (o peggiore). Prossimo giro di gate: un helper `winrate_is_a_knob()` che, dato
|
||||||
|
un book a schema parziale, riporta expectancy-R vs WR al variare del target (rende esplicito l'artefatto).
|
||||||
|
|
||||||
|
## File
|
||||||
|
|
||||||
|
- `scripts/research/r0707_crt_topdown.py` — il test (griglia + 74%-check + knob-sweep + DSR + fee + exec).
|
||||||
|
- Prior: `r0702_crt_{base,mtf,context}.py`, diario `2026-07-02-timing-crt-wave.md`.
|
||||||
|
- Nessuna modifica a src/, config/, scripts/live/, tests/. Book live e pesi INVARIATI.
|
||||||
@@ -0,0 +1,108 @@
|
|||||||
|
# 2026-07-09 — Incident infra: "BOOK LIVE conto offline" = cert Traefik di default (non un problema del conto)
|
||||||
|
|
||||||
|
**Tipo:** incident operativo (infra VPS), non ricerca. Nessun edge, nessun cambio a strategie/pesi/config
|
||||||
|
di trading. Documentato qui perché ha **bloccato la lettura del conto del book live** e ha prodotto
|
||||||
|
l'alert Telegram `⚠️ BOOK LIVE — conto offline`.
|
||||||
|
|
||||||
|
## Sintomo
|
||||||
|
|
||||||
|
Alert dal `cron_book` orario (`scripts/live/book_execute.py --execute`):
|
||||||
|
|
||||||
|
```
|
||||||
|
⚠️ BOOK LIVE — conto offline
|
||||||
|
nota: salto l'esecuzione, non opero a cieco
|
||||||
|
```
|
||||||
|
|
||||||
|
Nel log (`logs/cron_book.log`) le run recenti mostravano `conto non leggibile (offline) -> stop, non
|
||||||
|
eseguo a cieco`. 10 run offline su 382 totali → **regressione recente**, non uno stato storico.
|
||||||
|
|
||||||
|
## Diagnosi (catena completa)
|
||||||
|
|
||||||
|
Il book legge il conto Deribit mainnet in sola lettura via **Cerbero MCP** (`DeribitRead`,
|
||||||
|
`src/live/deribit.py` → `https://cerbero-mcp.tielogic.xyz`). `book_report` marca `online=False` quando
|
||||||
|
`DeribitRead.mark_price(BTC)` lancia. Riproduzione diretta:
|
||||||
|
|
||||||
|
```
|
||||||
|
mark_price BTC: FAIL -> SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] self-signed certificate
|
||||||
|
```
|
||||||
|
|
||||||
|
Il proxy presentava il **cert self-signed di default di Traefik** (`CN = TRAEFIK DEFAULT CERT`,
|
||||||
|
`notBefore Jul 9 19:55 2026`) al posto del vero Let's Encrypt. `curl -k` → HTTP 401 (backend
|
||||||
|
`cerbero-mcp` healthy, routing OK): **solo la presentazione del cert TLS era rotta**. `requests`
|
||||||
|
verifica il cert → fallisce → `online=False` → il book salta l'esecuzione (comportamento di sicurezza
|
||||||
|
**corretto**: non opera a cieco).
|
||||||
|
|
||||||
|
**Causa a monte** (log di avvio Traefik, 11:37:16Z, container `traefik-traefik-1`):
|
||||||
|
|
||||||
|
```
|
||||||
|
ERR The ACME resolve is skipped from the resolvers list
|
||||||
|
error="unable to get ACME account: permissions 660 for /acme.json are too open, please use 600"
|
||||||
|
resolver=mytlschallenge
|
||||||
|
→ (a cascata) Router uses a nonexistent certificate resolver certificateResolver=mytlschallenge
|
||||||
|
routerName=cerbero-mcp@docker [+ ~14 altri router: git, vault, portfolio, budget, cerbero-bite, ...]
|
||||||
|
```
|
||||||
|
|
||||||
|
Sequenza:
|
||||||
|
1. Immagine `traefik:latest` + **Watchtower** (`com.centurylinklabs.watchtower.enable=true`) →
|
||||||
|
auto-upgrade a **Traefik 3.7.7** con restart alle 11:37 di oggi.
|
||||||
|
2. Traefik 3.x **rifiuta** `acme.json` con permessi più larghi di `600`; il file era `660`
|
||||||
|
(`-rw-rw---- root:adriano`) → **resolver `mytlschallenge` scartato**.
|
||||||
|
3. Tutti i ~15 router che lo referenziano → "nonexistent certificate resolver" → Traefik serve il
|
||||||
|
**cert di default self-signed** a ogni host HTTPS del VPS (non solo cerbero-mcp).
|
||||||
|
4. I cert veri erano **già dentro `acme.json`** (14 domini, incl. `cerbero-mcp.tielogic.xyz`) → nessuna
|
||||||
|
ri-emissione necessaria, **zero rischio rate-limit** Let's Encrypt.
|
||||||
|
|
||||||
|
## Impatto
|
||||||
|
|
||||||
|
- **VPS-wide:** ogni servizio HTTPS dietro Traefik serviva un cert invalido (warning browser, fallimento
|
||||||
|
di ogni client che verifica il TLS). Non solo il trading.
|
||||||
|
- **Trading:** **nessun trade perso.** Target del book **flat** (TP01/SKH01 risk-off) + conto reale
|
||||||
|
~$598 (non finanziato al livello nominale): anche online il book avrebbe fatto HOLD. Il doppio gate
|
||||||
|
di sicurezza ha lavorato come previsto.
|
||||||
|
|
||||||
|
## Fix
|
||||||
|
|
||||||
|
**Immediato** (eseguito dall'utente):
|
||||||
|
```bash
|
||||||
|
sudo chmod 600 /opt/docker/traefik/acme.json
|
||||||
|
docker restart traefik-traefik-1
|
||||||
|
```
|
||||||
|
Il resolver ricarica i cert già presenti in `acme.json` e li ripresenta subito.
|
||||||
|
|
||||||
|
**Durevole** (pin dell'immagine, `/opt/docker/traefik/docker-compose.yml`):
|
||||||
|
```yaml
|
||||||
|
- image: "traefik" # = traefik:latest → Watchtower salta ai major (causa dell'incident)
|
||||||
|
+ image: "traefik:3.7" # Watchtower resta su 3.7.x: patch sì, salto a 3.8+ breaking no
|
||||||
|
```
|
||||||
|
Applicato con `docker compose up -d` (container ricreato su `traefik:3.7`, 20:05:05Z).
|
||||||
|
|
||||||
|
## Verifica (end-to-end, post-fix)
|
||||||
|
|
||||||
|
| Check | Risultato |
|
||||||
|
|---|---|
|
||||||
|
| `acme.json` perms | `600` |
|
||||||
|
| Cert `cerbero-mcp.tielogic.xyz` | issuer **Let's Encrypt** (fino 2026-09-27) |
|
||||||
|
| Traefik log | nessun `ACME resolve is skipped` / `too open` |
|
||||||
|
| Container image | `traefik:3.7` (running) |
|
||||||
|
| `DeribitRead.mark_price` | BTC 63.193 / ETH 1.746 |
|
||||||
|
| `book_report.online` | **True** · `eq_basis=mainnet USDC` · `real_equity=$598.06` · `pos_error=None` |
|
||||||
|
|
||||||
|
## Lezioni
|
||||||
|
|
||||||
|
- **`traefik:latest` + Watchtower = auto-upgrade non deterministico.** Un bump di major (qui il giro
|
||||||
|
di vite sui permessi di `acme.json`) diventa un'interruzione TLS di tutto il VPS senza intervento
|
||||||
|
umano. Pinnare la minor (`3.7`) rende i restart prevedibili pur ricevendo le patch.
|
||||||
|
- **Traefik 3.x pretende `acme.json` a `600`** (non solo warning: **scarta il resolver**). Se il file
|
||||||
|
è group/other-readable, tutti i router cadono sul cert di default.
|
||||||
|
- **Il gate `online` del book ha fatto il suo lavoro:** un problema *infra di lettura* non ha prodotto
|
||||||
|
ordini a cieco. L'alert "conto offline" va letto prima come possibile problema di **connettività/cert
|
||||||
|
al Cerbero MCP**, non del conto Deribit.
|
||||||
|
- **Runbook rapido** per "BOOK LIVE conto offline":
|
||||||
|
1. `python -c "from src.live.deribit import DeribitRead; DeribitRead().mark_price('BTC-PERPETUAL')"`
|
||||||
|
→ se `SSLError`/`CERTIFICATE_VERIFY_FAILED` è il cert del proxy, non il conto.
|
||||||
|
2. `openssl s_client -connect cerbero-mcp.tielogic.xyz:443 -servername cerbero-mcp.tielogic.xyz | openssl x509 -noout -issuer`
|
||||||
|
→ se `TRAEFIK DEFAULT CERT`, Traefik non serve il cert reale.
|
||||||
|
3. `docker logs traefik-traefik-1 | grep -iE "ACME resolve is skipped|too open|nonexistent"`
|
||||||
|
→ conferma resolver scartato; controlla `stat -c %a /opt/docker/traefik/acme.json` (deve essere `600`).
|
||||||
|
|
||||||
|
Nessun file di trading toccato; `config/live.json`, sleeve e pesi **invariati**.
|
||||||
@@ -0,0 +1,126 @@
|
|||||||
|
# 2026-07-15 — Incident ops: feed BTC/ETH del book congelato 7 giorni (`copy2`→`copystat` EPERM)
|
||||||
|
|
||||||
|
**Tipo:** incident operativo (pipeline dati), non ricerca. Nessun edge, nessun cambio a
|
||||||
|
strategie/pesi/config di trading. Documentato qui perché ha **congelato il segnale del book live**
|
||||||
|
per una settimana: il book ha ri-girato ogni ora ma su una barra vecchia (`ultima barra 2026-07-08`),
|
||||||
|
senza ri-valutare TP01. Trovato durante un check di `stato`, non da un alert (il fallimento era
|
||||||
|
silenzioso — vedi Lezioni).
|
||||||
|
|
||||||
|
## Sintomo
|
||||||
|
|
||||||
|
Nel log del `cron_book` orario, ogni run dal 2026-07-08 in poi mostrava:
|
||||||
|
|
||||||
|
```
|
||||||
|
ultima barra : 2026-07-08 # <-- oggi e' 2026-07-15
|
||||||
|
...
|
||||||
|
ETH TP +0.000 · SKH +1(LONG@1868.9) -> net $+75 | pos $+77 -> HOLD (a target)
|
||||||
|
=> Nessuna azione: conto gia' al target netto del book.
|
||||||
|
```
|
||||||
|
|
||||||
|
Conto **online** e sano ($600.5), esecuzione armata, cron regolari — ma il segnale TP01 (1d) fermo
|
||||||
|
al 8 luglio. SKH01 meno colpito: prende il 5m fresco **in memoria** via `livefeed.fresh_5m`, non da
|
||||||
|
disco. Il congelamento riguardava il **feed certificato su disco** (`data/raw/{btc,eth}_*.parquet`),
|
||||||
|
mtime fermo a **Jul 8 00:32**.
|
||||||
|
|
||||||
|
## Diagnosi (catena completa)
|
||||||
|
|
||||||
|
Il `cron_daily` (00:30) ricostruisce il feed Deribit con `rebuild_history.py --asset BTC ETH`. Nel
|
||||||
|
`logs/cron_daily.log`, **ogni notte dal 9 luglio**:
|
||||||
|
|
||||||
|
```
|
||||||
|
REBUILD STORICO da DERIBIT MAINNET — FULL (scrive data/raw, backup)
|
||||||
|
Traceback (most recent call last):
|
||||||
|
File "scripts/analysis/rebuild_history.py", line 189, in build
|
||||||
|
shutil.copy2(path, BACKUP / f"{asset.lower()}_{tf}.parquet.prebuild.bak")
|
||||||
|
PermissionError: [Errno 1] Operation not permitted
|
||||||
|
```
|
||||||
|
|
||||||
|
Il resto del daily (Hyperliquid, DVOL, ETF, paper trader) proseguiva regolare — solo il **primo**
|
||||||
|
step, il rebuild BTC/ETH, moriva. Sequenza dentro `build()`:
|
||||||
|
|
||||||
|
```python
|
||||||
|
if path.exists():
|
||||||
|
shutil.copy2(path, BACKUP / f"...prebuild.bak") # <-- crash QUI
|
||||||
|
tmp = path.with_suffix(".parquet.tmp")
|
||||||
|
d.to_parquet(tmp, index=False) # <-- mai raggiunto
|
||||||
|
tmp.replace(path) # <-- il feed non viene mai scritto
|
||||||
|
```
|
||||||
|
|
||||||
|
**Causa radice:** `shutil.copy2` = `copyfile` **+ `copystat`**. `copystat` fa `os.utime`/`chmod`/
|
||||||
|
`chflags` sulla destinazione con valori espliciti → richiede la **proprietà** del file (o `CAP_FOWNER`),
|
||||||
|
**non basta il group-write**. I file erano `root:adriano 660`; il cron gira come **adriano** (uid 1001,
|
||||||
|
membro del gruppo `adriano`). adriano può *scrivere* nel `.bak` (group-write) ma non `utime`-arlo →
|
||||||
|
`EPERM`.
|
||||||
|
|
||||||
|
Firma diagnostica coerente: `btc_5m.parquet.prebuild.bak` aveva mtime **odierno** mentre gli altri
|
||||||
|
`.bak` erano fermi al 7 luglio. Ovvero il `copyfile` interno riusciva (scriveva contenuto + mtime),
|
||||||
|
poi `copystat` lanciava → l'eccezione abortiva il loop **prima** di scrivere `data/raw/btc_5m.parquet`.
|
||||||
|
|
||||||
|
Perché ha iniziato il 9 luglio e non prima: l'ownership `root:*` dei file di `data/raw` è residuo di
|
||||||
|
run/manutenzione eseguiti come root (l'incidente Traefik del 9 luglio è nella stessa finestra). Finché
|
||||||
|
il processo era root, `copystat` sui file root riusciva; passato a run come adriano, EPERM. La causa
|
||||||
|
prossima non è *chi* ha creato i file, ma che **un backup difensivo poteva abortire il feed live**.
|
||||||
|
|
||||||
|
## Impatto
|
||||||
|
|
||||||
|
- **7 giorni (2026-07-08 → 07-15)** di feed Deribit BTC/ETH fermo → TP01 (1d) del book non ha
|
||||||
|
ri-valutato. Il book ha tenuto un ETH long SKH01 (@1868.9) impostato il 8 luglio.
|
||||||
|
- **Nessuna perdita né ordine errato:** il segnale ricalcolato sul feed fresco **coincide** con quello
|
||||||
|
tenuto (BTC flat, ETH long $75, già a target → 0 ordini di divergenza). Rischio evitato per fortuna
|
||||||
|
di regime, non per design — il book è comunque stato **cieco** a una settimana di segnale TP01.
|
||||||
|
- Paper trader e dashboard **non impattati**: usano feed diversi (HL/DVOL/ETF, aggiornati regolarmente).
|
||||||
|
|
||||||
|
## Fix
|
||||||
|
|
||||||
|
`scripts/analysis/rebuild_history.py` — backup reso **best-effort e non fatale**:
|
||||||
|
|
||||||
|
```python
|
||||||
|
if path.exists():
|
||||||
|
# copyfile (solo contenuto, NO copystat) dentro try/except: un .bak difensivo
|
||||||
|
# non deve MAI poter bloccare la scrittura del feed live.
|
||||||
|
try:
|
||||||
|
shutil.copyfile(path, BACKUP / f"{asset.lower()}_{tf}.parquet.prebuild.bak")
|
||||||
|
except OSError as e:
|
||||||
|
print(f" WARN backup {path.name} saltato (non fatale): {e}")
|
||||||
|
```
|
||||||
|
|
||||||
|
Due cambi: (1) `copy2` → `copyfile` — un `.bak` non ha bisogno dei metadati originali, e `copystat`
|
||||||
|
era l'unica fonte dell'EPERM; (2) `try/except OSError` con warning — anche un futuro errore di backup
|
||||||
|
(disco pieno, permessi) non blocca più il feed.
|
||||||
|
|
||||||
|
**Verifica end-to-end:**
|
||||||
|
- rebuild rigirato a mano → `scritto {btc,eth}_{5m,15m,1h}.parquet`, feed fresco a **2026-07-15**,
|
||||||
|
audit cross-venue **BTC 1.9 bps / ETH 2.0 bps** (pulito).
|
||||||
|
- i file di `data/raw` ora sono **`adriano:adriano`** (`tmp.replace` li rigenera con l'owner del
|
||||||
|
processo) → l'ownership si auto-sana, il problema non si ripresenta anche con `copy2`.
|
||||||
|
- `book_execute.py` in dry-run legge **`ultima barra 2026-07-15`** e ricalcola → BTC flat / ETH long
|
||||||
|
$75 → HOLD. Pipeline sbloccata.
|
||||||
|
|
||||||
|
## Lezioni
|
||||||
|
|
||||||
|
1. **Un backup difensivo non deve mai poter uccidere l'operazione che protegge.** Il `.bak` è una
|
||||||
|
rete di sicurezza; il suo fallimento (metadati, permessi, disco) va isolato in `try/except`, mai
|
||||||
|
propagato allo scrittore del feed live.
|
||||||
|
2. **`shutil.copy2` è insidioso in ambienti multi-utente:** `copystat` richiede *ownership*, non
|
||||||
|
group-write. In una dir a proprietà mista (`root:adriano`) un cron non-root ci sbatte. Per un
|
||||||
|
backup, `copyfile` è la scelta giusta (i metadati del `.bak` non servono).
|
||||||
|
3. **Fallimento silenzioso = il peggiore.** Il conto era online, i cron giravano, gli alert tacevano:
|
||||||
|
solo la barra vecchia nel log tradiva il congelamento. Il gate `online` del book protegge dai
|
||||||
|
problemi di *conto*, non da un feed *stale*. **Follow-up raccomandato:** alert se
|
||||||
|
`ultima_barra < today − 2g` in `book_execute` (staleness-gate esplicito).
|
||||||
|
4. **La sicurezza del book ha retto a metà:** non ha operato a cieco su un conto irraggiungibile, ma
|
||||||
|
*ha* operato (HOLD) su un segnale stantio. La coincidenza segnale-vecchio == segnale-nuovo è
|
||||||
|
fortuna di regime; un mercato in movimento avrebbe lasciato il book fuori posizione.
|
||||||
|
|
||||||
|
## Runbook (feed BTC/ETH stantio)
|
||||||
|
|
||||||
|
1. **Rilevare:** `stat -c '%y %n' data/raw/btc_1h.parquet` → se mtime > 1-2g fa, il feed è fermo.
|
||||||
|
Conferma incrociata: `ultima barra` nel `logs/cron_book.log`.
|
||||||
|
2. **Diagnosi:** `grep -A3 "REBUILD STORICO" logs/cron_daily.log | tail` → cercare Traceback nello
|
||||||
|
step rebuild.
|
||||||
|
3. **Sbloccare:** `uv run python scripts/analysis/rebuild_history.py --asset BTC ETH` → deve stampare
|
||||||
|
`scritto ..._5m/15m/1h.parquet` e l'audit cross-venue (atteso < ~10 bps mediana).
|
||||||
|
4. **Verificare il book:** `uv run python scripts/live/book_execute.py` (senza `--execute`) → `ultima
|
||||||
|
barra` deve essere la data odierna.
|
||||||
|
|
||||||
|
Nessun file di trading (strategie/pesi/config) toccato. Solo `rebuild_history.py`.
|
||||||
@@ -0,0 +1,111 @@
|
|||||||
|
# 2026-07-17 — Ondata WEEKEND (ven→lun, timing multipli, 4 agenti): 0 edge, 1 fatto strutturale sul book
|
||||||
|
|
||||||
|
**Goal:** "cerca strategie che con diversi timing lavorino solo tra venerdì e lunedì, usa diversi
|
||||||
|
agenti." Quattro filoni in parallelo su BTC/ETH 1h/15m certificati, harness `altlib` condiviso,
|
||||||
|
metodologia onesta piena (selezione in-sample-only pre-2025, banda di timing mai la best-cell,
|
||||||
|
deflated-Sharpe sull'intera famiglia, `day_boundary_robust`, fee nette 0.10% RT + sweep,
|
||||||
|
`causality_ok`, realismo small-cap $600). Prior vincolante: day-of-week già morto (SEA 2026-07-02),
|
||||||
|
anchor timing-luck su 3/3 sleeve ancorati, CRT triplo-refutato.
|
||||||
|
|
||||||
|
**Esito: SCARTATO 4/4. Nessun LEAD, nessun forward-monitor, book/pesi INVARIATI.**
|
||||||
|
Il fatto nuovo utile è *difensivo*: il weekend è leggermente sovra-denso per TP01 (38% del gross
|
||||||
|
nel 31% del tempo) → togliere esposizione weekend al book è attivamente dannoso.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Filone 1 — WK-DRIFT: drift puro ven→lun (`r0717_wk_drift.py`)
|
||||||
|
|
||||||
|
Griglia 6 H_in (ven) × 6 H_out (lun) × long/short × BTC/ETH = **144 trial**.
|
||||||
|
|
||||||
|
- Cella scelta in-sample (LONG ETH ven08→lun16): IS +1.07 → FULL +0.84 → **HOLD −0.14**
|
||||||
|
(ret hold-out −23%), maxDD 69%. Banda long: FULL med +0.57, HOLD med **−0.21**.
|
||||||
|
- **DSR 0.001/144** (max atteso sotto il null: 1.97 ≫ 0.84 osservato).
|
||||||
|
- **Null weekday: il venerdì NON è speciale** — mediana IS della famiglia long per ancora:
|
||||||
|
Fri +0.74 = 71° percentile, sotto Mon (+0.78) e Sun (+0.78). Qualsiasi finestra ~3g long fa lo
|
||||||
|
stesso = beta di buy&hold a esposizione ridotta (B&H daily Sh FULL: BTC 0.79 / ETH 0.86 ≈ il max
|
||||||
|
della griglia).
|
||||||
|
- A fee ZERO l'hold-out resta negativo (−0.03) → non è morte-per-fee, l'edge OOS non esiste.
|
||||||
|
- `day_boundary_robust`: ARTIFACT-RISK (uplift flippa spostando il confine UTC, spread 0.43).
|
||||||
|
|
||||||
|
**SCARTATO** — il "weekend drift" è B&H diluito nel tempo (vive del toro 2019-21, −58% nel 2022,
|
||||||
|
−33% nel 2025).
|
||||||
|
|
||||||
|
## Filone 2 — WK-COND: weekend condizionato da gate causali (`r0717_wk_cond.py`)
|
||||||
|
|
||||||
|
5 gate causali noti all'ingresso del venerdì × 9 timing × direzioni = **99 combo** (198 stream):
|
||||||
|
(a) TSMOM concorde, (b) FOLLOW/FADE del venerdì, (c) follow/fade della settimana, (d) regime vol
|
||||||
|
RV30 (percentile espandente causale), (e) breakout dei livelli del giovedì.
|
||||||
|
|
||||||
|
- **5/5 gate: earns_slot=False, DSR ≤0.30, `day_boundary_robust` = ARTIFACT-RISK 5/5** (la stessa
|
||||||
|
firma che uccise `open_drive`: l'etichetta "weekend" non è dove vive alcun segnale).
|
||||||
|
- (a) TSMOM-gate = **TP01-in-weekend per costruzione** (β 0.67, uplift hold −0.015, jackknife
|
||||||
|
−0.18): re-timing del trend, non alpha. Lo short weekend perde perfino col trend a favore
|
||||||
|
(mediana IS −0.15).
|
||||||
|
- (b) FOLLOW>FADE regge in-sample ma **si inverte in hold-out** → rumore; il lead prevday-FOLLOW
|
||||||
|
non si trasferisce alla finestra weekend. Unico is_hedge=True dell'ondata, ma con HOLD −0.92.
|
||||||
|
- (d) l'unica variante con HOLD positivo (HIGH70 +0.19) è **non selezionabile in-sample**
|
||||||
|
(IS +0.22): crederle sarebbe selection-on-holdout da manuale.
|
||||||
|
- A fee zero l'hold-out resta negativo per 4/5 gate → non è morte-per-fee.
|
||||||
|
|
||||||
|
**SCARTATO** — e con questo (99 trial qui + SEA + expiry-calendar 2026-07-02) **la famiglia
|
||||||
|
calendario su BTC/ETH è satura**: riaprirla solo con un meccanismo nuovo non-calendario.
|
||||||
|
|
||||||
|
## Filone 3 — WK-INTRA: intraday dentro la finestra (`r0717_wk_intra.py`)
|
||||||
|
|
||||||
|
**132 celle** su 1h+15m, tre sotto-filoni: (A) Donchian weekend-only follow/fade,
|
||||||
|
(B) gap dom 22:00 vs close ven 21:00 (meccanizzazione onesta del claim "CME gap"),
|
||||||
|
(C) livelli H/L/C del venerdì come magnete.
|
||||||
|
|
||||||
|
- Quadro: celle IS **lorde** positive = 64/132 ≈ 50% = **moneta simmetrica** (rumore prima ancora
|
||||||
|
delle fee); IS nette >0: 18/132. DSR famiglia 0.068 → 0.001 per filone.
|
||||||
|
- (A) la cella IS (Donchian 48h follow) è trend-2022 su ETH travestito (2022 +96%; BTC per-anno
|
||||||
|
negativo nel toro); su BTC muore di fee E il lordo è sotto soglia.
|
||||||
|
- (B) **il claim "CME gap" è morto**: nessuna config ha IS netto >0; la best (revert 2%) fa IS
|
||||||
|
−0.09 *lordo +0.03* → l'edge non esiste nemmeno lordo; il suo HOLD +0.5 è la firma esatta del
|
||||||
|
selection-on-holdout. Nessuna centratura reale sulle 22:00 (shift-test).
|
||||||
|
- (C) il "magnete del venerdì" non esiste in nessuna direzione (L-fade: IS lordo +0.12 →
|
||||||
|
HOLD −0.97/−0.77; DSR 0.001). FOLLOW>FADE riconfermato (le celle fade sono le peggiori ovunque).
|
||||||
|
- Eseguibilità $600 NON è il vincolo (0% ordini sotto min-order, haircut 0.00): manca l'edge.
|
||||||
|
|
||||||
|
**SCARTATO 3/3.**
|
||||||
|
|
||||||
|
## Filone 4 — WK-OVERLAY: esposizione weekend di TP01 sul book (`r0717_wk_overlay.py`)
|
||||||
|
|
||||||
|
Il lato eseguibile: conviene uscire/dimezzare/aumentare TP01 nel weekend? Griglia timing + null
|
||||||
|
de-levering (lezione DVOL 2026-06-26) + bootstrap settimanale appaiato + placebo rotazioni + smallcap.
|
||||||
|
|
||||||
|
- **Fatto strutturale (attribuzione gross):** la finestra ven20→lun00 è il 30.9% del tempo e porta
|
||||||
|
il **38% del gross di TP01** (+44.2pp su +117.8pp, positivo ogni anno) — il weekend non è tempo
|
||||||
|
morto per uno slow-trend crypto 24/7, è sovra-denso.
|
||||||
|
- **WK-FLAT: REFUTED, attivamente dannoso** — ΔSh FULL −0.46 (banda 6/6 negativa),
|
||||||
|
**P(danno)=1.000** al bootstrap; a fee zero resta −0.41; il de-levering k=0.88 compra lo stesso
|
||||||
|
DD a Sharpe pieno (1.29 vs 0.83). Placebo: il weekend è tra i giorni *peggiori* da flattare (5/7).
|
||||||
|
- **WK-HALF: REFUTED** — solo de-levering pagato con fee (k=0.755 a pari DD: +0.20 Sh in più).
|
||||||
|
- **WK-BOOST ×1.5: neutro** — coerente col controllo simmetrico ma non significativo (P=0.12) e a
|
||||||
|
pari DD la leva uniforme rende di più sul CAGR → nessuna azione.
|
||||||
|
- **WK-ONLY**: Sh 1.04 da solo, ma k=0.54 uniforme lo domina → diagnostica, non strategia.
|
||||||
|
- Small-cap $600: haircut ≈0 su tutte — l'overlay si eseguirebbe fedelmente; non conviene e basta.
|
||||||
|
|
||||||
|
**REFUTED/nessuna azione — book e pesi INVARIATI.**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Lezioni codificabili
|
||||||
|
|
||||||
|
1. **Famiglia calendario BTC/ETH = SATURA.** SEA (day-of-week) + expiry-calendar + event-clock
|
||||||
|
(2026-07-02) + 144+99+132 trial weekend (oggi) convergono: su BTC/ETH non vive alcun edge di
|
||||||
|
calendario/finestra-oraria. Prossimi claim di questa famiglia partono da prior ~0: esigere il
|
||||||
|
pacchetto completo (null weekday-ancora + day_boundary + DSR famiglia) prima ancora di guardare
|
||||||
|
l'hold-out.
|
||||||
|
2. **"~50% di celle lorde positive" = rumore simmetrico**: diagnostica rapida di famiglia morta
|
||||||
|
prima ancora del netting fee (WK-INTRA).
|
||||||
|
3. **Il gate condizionato non salva una finestra morta**: un gate causale su una finestra senza
|
||||||
|
edge o replica il trend (TP01 travestito) o seleziona rumore che flippa OOS (5/5 in WK-COND).
|
||||||
|
4. **Non de-esporre il weekend del book**: il 38%-in-31%-del-tempo di TP01 è la ragione
|
||||||
|
quantificata per cui il libro resta 24/7. Qualsiasi futura proposta "risk-off weekend" parte
|
||||||
|
REFUTED salvo nuovo evidence (null de-levering obbligatorio).
|
||||||
|
5. Riconferme indipendenti: FOLLOW>FADE (3ª volta); "CME gap" e "magnete del venerdì" =
|
||||||
|
folklore che non sopravvive alla meccanizzazione onesta.
|
||||||
|
|
||||||
|
**Script:** `scripts/research/r0717_wk_{drift,cond,intra,overlay}.py` (standalone, `uv run python`,
|
||||||
|
nessun file esistente toccato). **Nessun cambiamento a strategie, config, pesi o esecuzione live.**
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
# 2026-07-24 — Dossier 0DTE: economia LIVE delle daily options Deribit (BTC/ETH)
|
||||||
|
|
||||||
|
**Goal.** Quantificare stanotte, da quote pubbliche LIVE Deribit, l'economia del premio a
|
||||||
|
scadenza DAILY (0-1DTE) — il dossier 0DTE parcheggiato. VRP01 resta deploy-bloccato dalla regola
|
||||||
|
"niente short-vol da modello"; le daily (365 expiry/anno) accumulerebbero una serie di premi
|
||||||
|
REALI 7x più in fretta delle weekly. Domanda: il tenor daily è quotato/eseguibile/conveniente,
|
||||||
|
o muore di fee (lezione Albimarini)?
|
||||||
|
|
||||||
|
**Misura (3 snapshot ~22:35 UTC, ven 24 lug):** catena 0DTE (settle 25JUL 08:00, DTE 9.4h),
|
||||||
|
daily "fresca" (26JUL, DTE 33.4h), weekly (31JUL, DTE 153h). Fee verificate: taker=maker
|
||||||
|
0.0003 base/contratto, **cap 12.5% del premio**, daily ESENTI da delivery fee. Min size:
|
||||||
|
BTC 0.1 contratto, ETH 1.0. Spot 64.1k / 1859.
|
||||||
|
|
||||||
|
## Numeri chiave (put credit spread -0.28d/-0.10d, prezzi al tocco, fee taker 2 gambe)
|
||||||
|
|
||||||
|
| tenor | credito lordo | cross-spread (vs mid) | fee (% credito) | NETTO (% width) | %width/giorno |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| BTC 9.4h | $38.5 | 25% | 25.0% | 5.8% | — |
|
||||||
|
| BTC 33h | $96.2 (0.1 lot: $9.6) | 12% | 20.8% | 7.6% | 5.5%/g |
|
||||||
|
| BTC weekly | $224.6 | 16% | 17.1% | 9.3% | 1.5%/g |
|
||||||
|
| ETH 9.4h | $1.12 | 29% | 29.2% | 3.2% | — |
|
||||||
|
| ETH 33h | $3.53 | 14% | 23.0% | 10.9% | 7.8%/g |
|
||||||
|
| ETH weekly | $13.39 | 8% | **8.3%** | 12.3% | 1.9%/g |
|
||||||
|
|
||||||
|
- **Il cap 12.5% è quasi sempre BINDING a tenor daily** (premi < 0.0024 base) → fee ≈ 10-12.5%
|
||||||
|
del premio PER GAMBA, sempre. A weekly la fissa 0.0003 = 3-5% del premio. Il drag fee del
|
||||||
|
daily è **2-3x** quello weekly per unità di premio: la legge di scala Albimarini vista live
|
||||||
|
(premio ~ √T, fee ~ costante).
|
||||||
|
- **Haircut totale mid→netto**: daily 33h ≈ 30-35% del credito mid; 0DTE 9.4h ≈ 45-50%;
|
||||||
|
weekly ETH ≈ 16%. Richezza di pareggio a tenor daily ≈ **IV/RV ~1.4x**; a weekly ~1.1x.
|
||||||
|
- **IV vs RV stanotte**: ATM daily mark_iv BTC **12.8%** / ETH **21.5%** ann. contro RV20
|
||||||
|
29.6% / 39.8% → **IV_daily/RV20 = 0.43x / 0.54x: il premio daily era SOTTO la realized**
|
||||||
|
(VRP negativo al front). Weekly: 33.9% / 44.9% = 1.13-1.14x RV (il VRP vive lì, coerente
|
||||||
|
con VRP01). DVOL-30d 37.0 / 50.2. Caveat onesto: 1 snapshot, finestra weekend (ven→dom) =
|
||||||
|
IV bassa in parte razionale; NON generalizzabile — esattamente il perché della cattura.
|
||||||
|
- **EV check ETH 33h**: credito netto $2.72 < fair-value mid ~$4.1 e < E[payout] alla STESSA
|
||||||
|
IV implicita (~$4.9) → EV negativo *anche al pricing del mercato*, prima di ogni view di vol.
|
||||||
|
- **Quote sulle ali**: sì, 2-sided su tutto il ladder anche a 9h; depth MM ETH 400-1150
|
||||||
|
contratti al tocco, BTC più sottile (0.4-49). MA la griglia strike daily è GROSSA (step
|
||||||
|
1.3% ETH): i delta -0.28/-0.10 non esistono, si salta da -0.36 a -0.12; smile ripidissimo
|
||||||
|
(vendi bid_iv 13-20, compri ask_iv 22-38); le ali <5d hanno spread mediano 200% del mid =
|
||||||
|
di fatto non prezzate. Tick 0.0001 base = 3-10% del premio daily: anche la granularità quota.
|
||||||
|
|
||||||
|
## Margine = la realtà che uccide la taglia
|
||||||
|
|
||||||
|
Default Deribit = **standard margin SENZA netting fra gambe** (verificato docs): lo spread
|
||||||
|
"defined-risk" è margginato come naked short + long pagata intera. Il netting (margine ≈ width)
|
||||||
|
richiede Portfolio Margin, **min equity ~0.5 BTC ≈ $32k**. Quindi:
|
||||||
|
- ETH 1-lot PCS daily: margine SM ~$276, credito netto $2.72, max loss ~$22 → *meccanicamente*
|
||||||
|
eseguibile a $600 (1-2 lot), rendimento su margine ~1%/g SE zero perdite (e l'EV è negativo).
|
||||||
|
- BTC 0.1-lot: margine SM ~$963 → FUORI a $600, dentro a $2.6k.
|
||||||
|
- La soglia "$2.6k ETH" vale per strutture long/covered; per credit spread le soglie oneste
|
||||||
|
sono: $600 = ETH 1-lot (SM), $2.6k = entrambi sottili, **$32k = defined-risk vero (PM)**.
|
||||||
|
|
||||||
|
## Pipeline di cattura — FATTA (non in cron)
|
||||||
|
|
||||||
|
`scripts/research/r0724_daily_opt_snapshot.py`: pubblico/read-only, appende 1 riga JSON per
|
||||||
|
strumento (+1 meta con spot e DVOL) a `data/options_daily/snapshots.jsonl`; scadenze ≤50h,
|
||||||
|
moneyness 75-125%, ~160 righe/run, ~40 MB/anno a 2 run/g. Cadenza raccomandata quando la si
|
||||||
|
cabla: **08:05 UTC** (daily appena listata, ~24h DTE = premio vendibile) + **07:55 UTC**
|
||||||
|
(pre-settle = chiude il ciclo payoff). Primo snapshot già nel file. Esisteva solo
|
||||||
|
`options_real_quote_check.py` (weekly, one-shot, dipende da EXT path) e `fetch_dvol.py` (IV
|
||||||
|
30d, non quote): nessuna cattura daily preesistente.
|
||||||
|
|
||||||
|
## Verdetto: **CAPTURE-AND-WAIT con prior negativo sul daily**
|
||||||
|
|
||||||
|
Il tenor daily NON è morto-di-quotazione (mercato 2-sided, depth reale) ma stanotte era
|
||||||
|
**morto-di-economia**: haircut fee+spread 2-3x il weekly E IV<RV al front → servono entrambe
|
||||||
|
le gambe della condizione (IV/RV>~1.4x al daily) che oggi non c'è. Nessun deploy, nessun
|
||||||
|
cambio a book/pesi. Regola di decisione futura: dopo **≥90 giorni di cattura 2x/g**, calcolare
|
||||||
|
mediana(credito_netto/fair_mid) e mediana(IV_daily/RV_forward); il dossier si riapre SOLO se
|
||||||
|
il VRP daily mediano netto-haircut > 0 (e poi passa i gate standard). Il f di stress reale
|
||||||
|
arriva gratis se un crash cade nella finestra di cattura — lo stesso prerequisito che sblocca
|
||||||
|
VRP01. Fino ad allora: le daily servono da **strumento di misura**, non da strategia.
|
||||||
|
|
||||||
|
Script: `scripts/research/r0724_daily_opt_snapshot.py`. Dati: `data/options_daily/snapshots.jsonl`.
|
||||||
@@ -0,0 +1,293 @@
|
|||||||
|
# 2026-07-24 — Goal "50 EUR/giorno in qualche mese": analisi onesta e roadmap
|
||||||
|
|
||||||
|
**Contesto.** Goal dichiarato: rendita aggiuntiva che arrivi a **50 EUR/giorno entro qualche
|
||||||
|
mese**, senza precludere alcuna modalità. Branch `goal/50eur-day`. Questo diario è la sintesi
|
||||||
|
di: matematica del target sui ritorni reali del book, Monte Carlo prop-firm, 3 ricerche web
|
||||||
|
parallele (prop firm 2026, yield/basis a piccola scala, monetizzazione del track record),
|
||||||
|
e audit delle migliorie interne possibili.
|
||||||
|
|
||||||
|
**Verdetto in una riga:** 50 EUR/g = **EUR 18.250/anno**; ai CAGR onesti del book (10-20%)
|
||||||
|
servono **EUR 73k-183k di capitale**. Da $600 in "qualche mese" per via di trading sul
|
||||||
|
capitale proprio **non esiste** — l'unica famiglia di vie compatibile con "mesi" è
|
||||||
|
**moltiplicare il nozionale gestito** (conto funded / capitale di terzi), ognuna con
|
||||||
|
probabilità e rischi quantificati sotto.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## A) Il muro del capitale (script `r0724_goal50_math.py`, parte A)
|
||||||
|
|
||||||
|
| CAGR netto | capitale per 50 EUR/g |
|
||||||
|
|---|---|
|
||||||
|
| 8% | ~EUR 228k |
|
||||||
|
| 10% | ~EUR 182k |
|
||||||
|
| 15% | ~EUR 122k |
|
||||||
|
| 20% | ~EUR 91k |
|
||||||
|
| 25% | ~EUR 73k |
|
||||||
|
|
||||||
|
Tempo da $600 (CAGR 15%, compounding + depositi mensili): **0/mese → 38.7 anni; 500/mese →
|
||||||
|
9.6 anni; 1.000/mese → 6.3 anni; 2.000/mese → 3.8 anni; 5.000/mese → 1.8 anni.**
|
||||||
|
|
||||||
|
## B) La leva non è la scorciatoia (parte B)
|
||||||
|
|
||||||
|
Book Deribit live (TP01 .75 + SKH01 .25, modellato): Sharpe 1.77, **vol nativa ~11%**,
|
||||||
|
CAGR 20.5%, maxDD 9.4%. Il target su capitale piccolo implica: $600 → 3.315%/anno
|
||||||
|
(leva ~160x); $5k → 398%/anno (~19x, vol ~212%); $20k → 99%/anno (~4.8x, vol ~53%).
|
||||||
|
Tutte fuori dalla zona di sopravvivenza (Kelly documentato: il book gira a ~0.01-0.27 Kelly).
|
||||||
|
La frontiera 2026-07-03 ha già stabilito che il book gira alla sua vol nativa — alzare
|
||||||
|
`target_vol` scala DD in proporzione, non crea rendimento.
|
||||||
|
|
||||||
|
## C) Prop-firm / conto funded — l'unica via "da mesi" quantificabile (parte C)
|
||||||
|
|
||||||
|
Monte Carlo (block bootstrap 20g dei ritorni giornalieri reali del book, 20k path,
|
||||||
|
regole tipiche: target 8-10%, maxDD 10% statico/trailing, daily loss 4-5%):
|
||||||
|
|
||||||
|
| scenario | leva eval | P(pass entro 1a) | mediana giorni |
|
||||||
|
|---|---|---|---|
|
||||||
|
| book modellato | 1.0x | 81-86% | 111-132 g |
|
||||||
|
| book modellato | 1.5x | 78-85% | **72-89 g** |
|
||||||
|
| book modellato | 2.0x | 72-81% | 46-62 g |
|
||||||
|
| de-luck ×0.6 | 1.0x | 63-72% | 113-137 g |
|
||||||
|
| de-luck ×0.6 | 1.5x | 62-71% | **70-87 g** |
|
||||||
|
| de-luck ×0.6 | 2.0x | 56-65% | 43-58 g |
|
||||||
|
|
||||||
|
Fase funded ($100k nozionale, split 80%, 1 anno): **modellato** P(conto vivo) 88.9%,
|
||||||
|
payout p10/p50/p90 = EUR 8.9/42.3/93.4 al giorno; **de-luck ×0.6** P(vivo) 67.7%,
|
||||||
|
p10/p50/p90 = EUR 1.3/**31.1**/77.9 al giorno. A $200k nozionale i payout raddoppiano
|
||||||
|
(mediana de-luck ~EUR 62/g) — il target dei 50 EUR/g sta tra $150k e $200k funded.
|
||||||
|
|
||||||
|
**Caveat onesti:** (1) daily-loss simulato su barre daily → i wick intraday rendono le
|
||||||
|
P(pass) OTTIMISTE; (2) le regole reali (consistency, min trading days, divieto bot/API,
|
||||||
|
weekend) possono uccidere lo stile low-frequency → vedi ricerca firm 2026 sotto;
|
||||||
|
(3) payout = reddito VOLATILE, non "rendita" (p10 de-luck ≈ EUR 1/g).
|
||||||
|
|
||||||
|
## D) Vault / copy-trading (parte D)
|
||||||
|
|
||||||
|
A perf-share 10% sopra HWM servono **$1-2M di TVL altrui** per 50 EUR/g → richiede anni
|
||||||
|
di track record pubblico, non mesi. Vincolo legale per residente italiano (gestione di
|
||||||
|
capitale altrui = art. 166 TUF) approfondito nella ricerca dedicata sotto.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Migliorie interne implementate/decise oggi
|
||||||
|
|
||||||
|
1. **Gate di deploy PRE-REGISTRATO per STATARB-RESID** (`r0724_statarb_deploy_gate.py`).
|
||||||
|
Forward a oggi: 25 barre, +4.42%, Sharpe fwd +5.84 (caldissimo → regredirà), DD 1.4%,
|
||||||
|
haircut 0.01pp. Regola fissata OGGI (day 25) per evitare selection-on-forward:
|
||||||
|
**decisione il 2026-09-27 (90g)**; Sh≥0.5 → candidato deploy (pesi {10,15,20}% via
|
||||||
|
`weights_tilt_null`, maxDD combinato <15%); 0≤Sh<0.5 → UNA proroga di 90g; Sh<0 → ritiro.
|
||||||
|
Guardie: haircut <0.5pp, config congelata (W=45, sgn=+1), DD fwd <10%.
|
||||||
|
2. **Audit infra:** i messaggi "open/completed orders request timed out" nel cron daily sono
|
||||||
|
warning benigni di `ib_async` al connect col Gateway IB (conto paper DU) — cosmetici,
|
||||||
|
nessuna azione. Book live 743/743 giri completati; errori cerbero-mcp solo storici.
|
||||||
|
3. **Conferme di sistema (non ri-litigate):** soffitto direzionale ~1.3 (10+ ondate);
|
||||||
|
book già quasi-risk-parity; alzare vol = de-levering inverso (frontiera 2026-07-03);
|
||||||
|
il vincolo binding è il CAPITALE, non la ricerca. Il cap dinamico equity/2 è già
|
||||||
|
pronto ad assorbire depositi.
|
||||||
|
|
||||||
|
## Ricerche web (3 agenti paralleli) — RISULTATI
|
||||||
|
|
||||||
|
### R1 — Yield / basis / carry a $600-20k (luglio 2026): NIENTE di rilevante ora
|
||||||
|
|
||||||
|
- **Il carry è al fondo del ciclo, CC01 confermato live**: funding BTC annualizzato
|
||||||
|
+70% (gen 2026, euforia) → **−3.4%** (mag) → **+4.2%** (metà lug); spot 22-24 lug ≈ 0.
|
||||||
|
**ETH funding NEGATIVO** (flip 3-4 giu). CME basis −2.35% dic 2025 (peggior
|
||||||
|
backwardation post-FTX). Carry netto BTC oggi: **0-2%/anno < Aave**, con più tail risk.
|
||||||
|
- **Menu onesto**: Aave v3 USDC **4-5%** = pavimento income reale; sUSDe 4-7% in
|
||||||
|
compressione (= il premio CC01 tokenizzato, riserva 1.18% del TVL, TVL fuggito
|
||||||
|
$14B→$5.9B, DeFi-only per EEA); **HLP ~15-25%** ma è inventory di market-making
|
||||||
|
travestito da yield (tail plausibile −20/−50%, cooldown sui prelievi; nel crash
|
||||||
|
ott 2025 fece +10% in un weekend — profitta nei cascade, sanguina nei trend).
|
||||||
|
- **Tier di capitale**: $600 → ~€0.07/g; $5k → ~€0.6-0.8/g; $20k → **€2.5-4/g**
|
||||||
|
(aggressivo HLP-heavy ~€5-6 con la sua coda). Nessuno step-change tra 5k e 20k;
|
||||||
|
quelli veri sono ~$20k (basis multi-leg eseguibile QUANDO il funding torna) e $100k+
|
||||||
|
(fee tier). 50 EUR/g a 5-8% onesto = **€250-350k** — peggio del muro trading.
|
||||||
|
- **Regola operativa cablabile**: CC01 resta LEAD **regime-triggered** — riaprire il
|
||||||
|
dossier solo con **funding medio 1-mese > 10-15% annualizzato sostenuto** (la serie
|
||||||
|
funding HL ce l'abbiamo già). Gli spike stile gen-2026 (70% ann., spariti in
|
||||||
|
settimane) NON sono income raccoglibile.
|
||||||
|
- **MiCA day-one 2026-07-01 — mappa venue per residenti IT**: **Binance OUT** (no
|
||||||
|
licenza, restrizioni dal 1/7); Bybit globale bloccato EEA, bybit.eu senza perp;
|
||||||
|
**Deribit OK** (Coinbase ha licenza MiCA Luxembourg) ma perp-EU-retail in zona grigia
|
||||||
|
MiFID-II da monitorare; **Hyperliquid ancora accessibile** senza KYC ma è il
|
||||||
|
test-case del perimetro EU → rischio geoblock futuro reale. In pratica: i nostri
|
||||||
|
due venue sono esattamente ciò che resta.
|
||||||
|
- ⚠️ **FISCO ITALIA 2026**: capital gain crypto **33% dal 1/1/2026** (~~L.199/2025~~ →
|
||||||
|
**L. 207/2024 art. 1 c.23-29**, corretto il 2026-08-07: la L.199/2025 fa altro, vedi CLAUDE.md),
|
||||||
|
esenzione €2.000 ABOLITA (dal 2025), IVAFE 0.2%, DAC8 auto-reporting, crypto nell'ISEE.
|
||||||
|
→ ogni numero di questo diario è LORDO: **50 EUR/g netti ≈ 75 EUR/g lordi**, il
|
||||||
|
muro di capitale sale di ~1.5x (~EUR 180k a CAGR 15%). Da verificare col
|
||||||
|
commercialista il trattamento di yield/staking.
|
||||||
|
|
||||||
|
_(FX: i rendimenti sono USD-denominati; ~2pp del 4.5% stable è solo il differenziale
|
||||||
|
tassi USD-EUR — hedged in EUR il "4.5%" reale è ~2.5%.)_
|
||||||
|
|
||||||
|
### R2 — Prop firm crypto 2026: via CREDIBILE ma payoff modesto — €8-15/g a $100k, cap $200k
|
||||||
|
|
||||||
|
- **Vincolo vero = geometria del drawdown**: le eval crypto-native danno **DD max 3-6%
|
||||||
|
statico** (non 10%) contro il maxDD storico 9.4% del book → si gira a 0.5-1.0x vol.
|
||||||
|
FTMO Swing è l'unica con DD 10% ma è crypto-via-CFD (swap ~10-25%/anno).
|
||||||
|
- **Ranking per QUESTO stile** (verificato su fonti primarie, non affiliate-SEO):
|
||||||
|
1. **HyroTrader** 1-step $100k ($579): unica con **API reale** (sub-account Bybit) da
|
||||||
|
funded, funding = mercato (stessa economia del book Deribit), no time limit, weekend
|
||||||
|
ok, consistency 40% solo in eval, fee rimborsata al pass, payout ~12h. Cap $200k.
|
||||||
|
2. **Breakout/Kraken Prop** ($800): miglior reputazione (Trustpilot 4.8, Kraken-backed),
|
||||||
|
regole pulite, MA **carry nascosto 0.033%/giorno ≈ 12%/anno sul nozionale** = ostile
|
||||||
|
ai multi-week hold; niente API supportata (a cadenza 1d l'esecuzione manuale è ~5
|
||||||
|
min/g, non-blocker). Evitare 2-step (DD trailing = veleno per un trend book) e Turbo (DD 3%).
|
||||||
|
3. **FTMO Swing** (~€540): controparte più solvibile del settore ($450M+ pagati),
|
||||||
|
DD 10%, EA propri su MT5; ma crypto non è il suo core.
|
||||||
|
- **Crypto Fund Trader: EVITARE** (Trustpilot soppresso per manipolazione, pattern di
|
||||||
|
payout negati, SL obbligatorio che rompe la meccanica TSMOM).
|
||||||
|
- **Monte Carlo aggiornato alle regole VERE** (parte C di `r0724_goal50_math.py`, bootstrap
|
||||||
|
dei ritorni reali del book): de-luck ×0.6 a leva 1.0-1.5x → **P(pass) 55-68%, mediana
|
||||||
|
68-137 giorni**; funded $100k HYRO de-luck → P(vivo 1a) 69%, payout mediano €31/g SE
|
||||||
|
vivo. La MC dell'agente (Sharpe 0.5-1.0, code t(4)) converge: P(pass) 40-72%.
|
||||||
|
⚠️ **SUPERATO da C-bis (MC intraday, sera stessa)**: questi numeri sono close-only e
|
||||||
|
OTTIMISTI — coi wick intraday P(pass) de-luck ~44% a 1.0x, funded a 1.0x P(vivo) crolla
|
||||||
|
a 20.5% (leva ottima funded = 0.75x). Vedi sezione C-bis sotto.
|
||||||
|
- **Attriti fuori dal MC** (che tagliano l'atteso): carry/swap, recycling dei bust
|
||||||
|
(~40-55%/anno di P(bust) al limite 6%), consistency in eval, **controparte non regolata**
|
||||||
|
(il settore ha perso il 13% delle firm nel solo 2024, $50M+ di payout stranded; profitti
|
||||||
|
non ritirati = credito chirografario) → **atteso blended onesto: €250-450/MESE a $100k
|
||||||
|
funded; €15-30/g al cap $200k nei buoni scenari.** Consob/ESMA stanno tirando il
|
||||||
|
modello verso MiFID II → rischio regolatorio EU 2026-27.
|
||||||
|
- **Disciplina se si apre il fronte**: entry sensata = $25k ($249) o $50k ($379) come
|
||||||
|
test economico che può autofinanziare il tentativo $100k; prelievi SETTIMANALI
|
||||||
|
(mai lasciare credito alla firm); è un side-bet EV+ ~10-50x il rendimento della stessa
|
||||||
|
strategia sui nostri $600 — **non** la soluzione del capitale.
|
||||||
|
|
||||||
|
### R3 — Monetizzazione track record / vault / legale IT: NIENTE in mesi, stack lento legale in 18-36 mesi
|
||||||
|
|
||||||
|
- **Aritmetica sovrana**: ogni canale profit-share paga ~10-15% dei profitti generati sul
|
||||||
|
capitale altrui → a CAGR onesto 15-20%, 50 EUR/g richiede **€600k-1.2M di capitale
|
||||||
|
follower**. Nessun meccanismo sposta quel capitale su un track record di mesi con $600
|
||||||
|
di skin-in-the-game.
|
||||||
|
- **Hyperliquid vault: MORTO a $600** — creazione ora costa **$10k** + leader deve tenere
|
||||||
|
≥5% del vault; TVL mediano dei vault utente ≈ $0 (solo ~$35M su 2.400 vault non-HLP);
|
||||||
|
la discovery è ordinata per APR → un 15-20% difensivo è carta da parati.
|
||||||
|
- **Copy trading post-MiCA (1/7/2026)**: Binance/Bybit/Bitget CHIUSI per residenti EEA.
|
||||||
|
Restano: **OKX EU** (Malta MiCA+MiFID II, lead trader legale con KYC, 8-13% profit
|
||||||
|
share) e **eToro Popular Investor** (Champion: $400-800/mese FISSI = €13-26/g, ma
|
||||||
|
servono $50k di copier AUM + $5k equity propri + 6 mesi risk-score ≤7 → 12-24 mesi).
|
||||||
|
- **Darwinex Zero = miglior fit strutturale**: l'engine normalizza tutti alla stessa vol
|
||||||
|
→ **l'allocazione si vince con lo SHARPE, non col CAGR flashy** — l'unico canale dove
|
||||||
|
la virtù del book è la metrica classificata. FCA-regolato, 15% perf fee sopra HWM,
|
||||||
|
~$35-50/mese di costo. Primi fee piccoli a 3-6 mesi, >€10/g a 18-36 mesi con
|
||||||
|
qualche centinaio di k€ di allocazione cumulata. Caveat: crypto solo via MT5 CFD →
|
||||||
|
conto parallelo, non monetizza direttamente il book Deribit.
|
||||||
|
- **Collective2**: mediana ≈ $0 lifetime, C2 trattiene ~50%, il retail compra emozioni
|
||||||
|
non Sharpe difensivi → non vale il listing fee.
|
||||||
|
- ⚠️ **LEGALE (pattern regolatorio, non parere)**: gestione remunerata di conti di
|
||||||
|
amici/famiglia = **art. 166 TUF, 1-8 anni** (+ D.Lgs. 129/2024 art. 30 per i
|
||||||
|
crypto-asset, 6m-4a) — è l'unico canale "veloce" ed è esattamente quello penale;
|
||||||
|
la denuncia arriva con le perdite. Safe harbor = lead trader su venue licenziata
|
||||||
|
(la licenza è della piattaforma). Newsletter GENERICA con disclaimer = lecita;
|
||||||
|
personalizzazione/auto-esecuzione/soldi in mano = attività riservata.
|
||||||
|
- **Stack realistico a 24 mesi** (Darwinex + eToro/OKX): top-decile **€15-45/g**,
|
||||||
|
mediana €5-15/g. In "qualche mese": ~€0. Il vincolo non è la strategia, è il
|
||||||
|
**trust-capital** — e si accumula sullo stesso orologio del capitale.
|
||||||
|
|
||||||
|
### C-bis — MC INTRADAY wick-aware (addendum serale): chiuso il caveat n.1 — i wick
|
||||||
|
### tagliano 6-37pp di P(pass) e RIBALTANO la config consigliata
|
||||||
|
|
||||||
|
Script `scripts/research/r0724_goal50_intraday_mc.py`. Il MC di parte C applicava le
|
||||||
|
regole alle CHIUSURE daily; le regole vere scattano sull'equity intraday. Qui l'equity
|
||||||
|
del book è ricostruita MTM a 1h sul feed certificato: TP01 = pesi daily (fee di
|
||||||
|
ribilanciamento incluse), SKH01 = trade 230m con exit AL LIVELLO SL/TP nell'ora del
|
||||||
|
trigger (SL prioritario, stessa convenzione di `backtest_signals`), wick per-barra
|
||||||
|
firmati col segno del peso.
|
||||||
|
|
||||||
|
**Validazione della ricostruzione** (obbligatoria prima di credere ai numeri):
|
||||||
|
leg TP01 corr daily 0.9997 e log-total +0.833 vs sleeve×0.75 +0.827 (esatto); leg SKH
|
||||||
|
log-total +0.548 vs sleeve×0.25 +0.513 (Δ≈0.5%/anno, bordi orari); book Sharpe MTM 1.62
|
||||||
|
vs 1.77 dello sleeve — il delta è l'ATTRIBUZIONE: lo sleeve SKH è equity-a-scalino
|
||||||
|
per-trade (P&L intero sulla barra d'ingresso), mentre un conto prop è marcato MTM →
|
||||||
|
la lens MTM è quella giusta per questo uso. ⚠️ Bug catturato dalla sanity al primo run:
|
||||||
|
`reindex` con indice tz-naive contro tz-aware → NaN→0 SILENZIOSI, TP01 sparito dal recon
|
||||||
|
(corr 0.43) — ennesima conferma della famiglia di lezioni pandas-tz del progetto.
|
||||||
|
|
||||||
|
**Geometria dei wick del book**: gap (min intraday − chiusura) p50 −0.17pp, p10 −1.03pp,
|
||||||
|
p1 −2.7pp, worst −6pp; 2.6% dei giorni con wick oltre −2pp. Piccolo in mediana, ma le
|
||||||
|
regole prop sono sensibili proprio alla coda.
|
||||||
|
|
||||||
|
**Eval (de-luck ×0.6, P(pass) close→intraday):** a leva 1.0x HYRO 58.8%→**44.7%**,
|
||||||
|
BREAKOUT 57.1%→**26.6%**, FTMO Swing 65.7%→**59.9%**. Tre conseguenze:
|
||||||
|
1. **La leva 1.5x consigliata dal MC close-only è REFUTATA**: intraday fa PEGGIO di 1.0x
|
||||||
|
(HYRO 36.0% vs 44.7%) — i wick amplificati bruciano il daily-loss prima che il drift
|
||||||
|
paghi. Config onesta: **eval a leva 1.0x**, mediana pass ~99g (HYRO) / ~125g (FTMO).
|
||||||
|
2. **Breakout Classic declassata**: il daily-loss 3% coi wick del book è una tagliola
|
||||||
|
(P(pass) 26.6%) — fuori dalla shortlist.
|
||||||
|
3. **FTMO Swing riabilitata dal lato regole**: il DD 10% assorbe i wick (haircut solo
|
||||||
|
−5.8pp) → miglior P(pass); resta il caveat swap CFD ~10-25%/anno NON nel MC, che
|
||||||
|
colpisce esattamente i multi-week hold del book.
|
||||||
|
|
||||||
|
**Fase funded — sweep di leva (novità decisiva): la leva ottima è 0.75x, non 1x.**
|
||||||
|
A 1.0x col max-loss 6% HYRO l'account de-luck sopravvive 1 anno solo il **20.5%** delle
|
||||||
|
volte (il close-only diceva 69% — era il numero più gonfiato di tutta la parte C).
|
||||||
|
A **0.75x**: HYRO P(vivo) 58.1%, E[payout] $5.8k/anno (~€14.5/g ATTESO, mediana €20.6/g
|
||||||
|
se vivo); FTMO 0.75x P(vivo) 82.2%, E[payout] $7.4k lordo swap. Equivalente operativo:
|
||||||
|
girare il funded a target_vol ~15% invece del 20% canonico.
|
||||||
|
|
||||||
|
**EV del biglietto aggiornato (eval 1.0x, funded 0.75x, de-luck):** P(pass) ~44%,
|
||||||
|
**P(perdere la fee) ~56%** (peggio del 35-45% stimato close-only), EV a 1 anno
|
||||||
|
+$491/$1.048/$2.197 per i conti 25/50/100k → il fronte prop resta EV-positivo ma più
|
||||||
|
sottile; il costo atteso per arrivare funded è ~$570-1.325 a seconda della taglia.
|
||||||
|
|
||||||
|
Limiti dichiarati: wick a risoluzione 1h (i 5m sarebbero più severi → le P(pass) restano
|
||||||
|
un TETTO); leva applicata linearmente al giorno; bust funded = payout 0 (i prelievi
|
||||||
|
settimanali reali migliorano l'atteso). Test suite invariata (172 pass).
|
||||||
|
|
||||||
|
## Roadmap — sintesi e decision tree
|
||||||
|
|
||||||
|
### Verdetto finale (nessuna modalità esclusa, tutte quantificate)
|
||||||
|
|
||||||
|
**50 EUR/giorno entro "qualche mese": NON esiste via legale che ci arrivi.** I massimi
|
||||||
|
onesti per canale nell'orizzonte di mesi: prop funded ~€8-15/g (a $100k, P~55-68%,
|
||||||
|
3-6 mesi); yield ~€0-4/g (vincolato dal capitale, e il carry è al fondo del ciclo);
|
||||||
|
monetizzazione del track record ~€0 (i canali pagano in anni). L'unico canale "veloce"
|
||||||
|
è gestire a compenso i soldi di terzi senza autorizzazione = **reato** (art. 166 TUF,
|
||||||
|
1-8 anni) → chiuso. Il fisco 2026 (33%) alza ogni muro di un ulteriore ~1.5x.
|
||||||
|
|
||||||
|
**50 EUR/g resta raggiungibile solo come STACK su 18-36 mesi**, con esecuzione buona e
|
||||||
|
un po' di fortuna: prop al cap $200k (€15-30/g) + Darwinex/eToro (€5-20/g) + capitale
|
||||||
|
proprio cresciuto con depositi (a €20k il book fa ~€5-8/g). Top-decile ≈ €30-60/g a
|
||||||
|
24 mesi; mediana ≈ €10-25/g. Senza depositi sostanziosi, il target scivola oltre.
|
||||||
|
|
||||||
|
### Cosa è stato cablato oggi (branch `goal/50eur-day`)
|
||||||
|
|
||||||
|
| # | Cosa | File |
|
||||||
|
|---|---|---|
|
||||||
|
| 1 | Matematica del target + MC prop con regole vere | `scripts/research/r0724_goal50_math.py` |
|
||||||
|
| 2 | Gate deploy PRE-REGISTRATO statarb (decisione 27/09) | `scripts/research/r0724_statarb_deploy_gate.py` |
|
||||||
|
| 3 | Trigger regime CC01 (funding 30g, WARN 10%/ALERT 15%) | `scripts/live/cc01_regime_watch.py` |
|
||||||
|
| 4 | Fix test latente paper-advance (pre-esistente su main) | `tests/test_trend_portfolio.py` |
|
||||||
|
| 5 | Questo diario | `docs/diary/2026-07-24-goal-50eur-roadmap.md` |
|
||||||
|
| 6 | MC prop INTRADAY wick-aware (recon MTM 1h del book) | `scripts/research/r0724_goal50_intraday_mc.py` |
|
||||||
|
|
||||||
|
### Decisioni che spettano all'operatore (non automatizzabili)
|
||||||
|
|
||||||
|
1. **Fronte prop** (l'unico che cambia la scala in mesi): sì/no. Se sì (numeri C-bis,
|
||||||
|
MC intraday): HyroTrader $25-50k come test (€230-350), poi $100k; **eval a leva 1.0x
|
||||||
|
(NON 1.5x — refutata dai wick), funded a 0.75x** (≈ target_vol 15%); prelievi
|
||||||
|
settimanali; budget mentale = perdere l'intera fee con **P~56%** de-luck; atteso
|
||||||
|
funded ~€14.5/g a $100k. Alternativa con P(pass) migliore: FTMO Swing (DD 10%
|
||||||
|
assorbe i wick) MA swap CFD 10-25%/anno sui multi-week hold. Breakout Classic NO
|
||||||
|
(daily-loss 3% + wick = P(pass) 27%). Il book si esegue a mano (5 min/g)
|
||||||
|
dal segnale di `paper_portfolio` finché non c'è l'API funded.
|
||||||
|
2. **Track record pubblico** (canale 18-36 mesi): aprire Darwinex Zero (~€40-50/mese,
|
||||||
|
l'unico venue dove lo Sharpe difensivo compete sul merito) e/o candidarsi lead trader
|
||||||
|
OKX EU / eToro PI. Costo basso, payoff lento ma legale e cumulativo.
|
||||||
|
3. **Depositi**: il moltiplicatore più affidabile resta il capitale proprio — il sistema
|
||||||
|
è già pronto (cap dinamico equity/2, aspettativa onesta ~€0.6-0.8/g a 2k,
|
||||||
|
~€1.4-2/g a 5k, ~€5-8/g a 20k lordi).
|
||||||
|
4. **Alla merge in main**: aggiungere `cc01_regime_watch.py` a `cron_daily.sh` (riga
|
||||||
|
read-only) così il trigger CC01 lavora da solo.
|
||||||
|
|
||||||
|
### Cosa NON fare (confermato da questa ondata)
|
||||||
|
|
||||||
|
- Niente leva per "accelerare" (parte B: rovina quasi certa a ogni tier di capitale).
|
||||||
|
- Niente gestione remunerata di conti altrui, nemmeno family&friends (penale).
|
||||||
|
- Niente yield-chasing sopra il pavimento Aave 4-5% (HLP = trading risk travestito).
|
||||||
|
- Niente vault HL a questo capitale ($10k di creazione + 5% skin + discovery per APR).
|
||||||
|
- Il book live Deribit resta INVARIATO (pesi, config, esecuzione) — questa ondata non
|
||||||
|
ha toccato nulla del path live.
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
# 2026-07-24 — Ondata ON-CHAIN / SENTIMENT: la famiglia era vergine, il verdetto è 0/6 slot
|
||||||
|
|
||||||
|
**Goal**: "trova altre strategie, sfruttiamo anche internet". Prima parte (questa): la
|
||||||
|
famiglia on-chain/sentiment — l'unica grande famiglia di INFORMAZIONE (non di prezzo)
|
||||||
|
mai testata dal progetto — meccanizzata onestamente su dati gratuiti scaricati stasera.
|
||||||
|
Script `scripts/research/r0724_onchain_wave.py`. In parallelo girano 3 agenti di ricerca
|
||||||
|
web (letteratura accademica, segnali on-chain/fonti dati, pratica non convenzionale) —
|
||||||
|
sintesi in un diario/addendum separato quando completano.
|
||||||
|
|
||||||
|
## Setup
|
||||||
|
|
||||||
|
- **Segnali**: CoinMetrics Community (CSV daily dal genesis, gratuito, tokenless:
|
||||||
|
AdrActCnt, TxTfrCnt, CapMVRVCur, SplyExNtv, HashRate) + Fear&Greed alternative.me
|
||||||
|
(2018-02→oggi) + supply stablecoin totale DefiLlama (2017-11→oggi). Staging in
|
||||||
|
`data/external/coinmetrics/` (gitignored — NON certificato, mai usato come prezzo).
|
||||||
|
- **Ritorni**: SOLO feed Deribit certificato (lezione v2.0.0). Harness: `altlib`,
|
||||||
|
`study_family_honest` (selezione cella IN-SAMPLE, deflated-Sharpe sull'intera griglia,
|
||||||
|
marginal scorer indurito vs TP01). 32 celle totali su 6 famiglie, tutte contate.
|
||||||
|
- **Causalità**: doppio lag — segnale by-day shiftato di 1 giorno (la riga CM del giorno
|
||||||
|
d si completa a EOD d + processing) + lo shift di 1 barra di `eval_weights` ⇒ lag
|
||||||
|
attività→posizione = 2 giorni. tz-aware su entrambi i lati del reindex (la trappola
|
||||||
|
naive/aware ha già colpito stasera nel MC intraday).
|
||||||
|
|
||||||
|
## Verdetti (0/6 earns_slot_honest)
|
||||||
|
|
||||||
|
| Famiglia | Cella IS | DSR | Marginale | Perché muore |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| **STABLE**-supply-growth | L=30 LF thr=10% | **0.998** | **ADDS** | robust_oos=False (uplift concentrato, 2026 domina) |
|
||||||
|
| **NET**-growth (Liu-Tsyvinski) | TxTfrCnt L=30 LF | 0.916 | ADDS | DSR<0.95 E jackknife −0.12 |
|
||||||
|
| **MVRV**-valuation | long-salvo-top p90 | 0.968 | DILUTES | hold-out −0.08, blend peggiora sempre |
|
||||||
|
| **EXS**-exchange-supply | L=90 LF | 0.903 | NEUTRAL | hold-out **−0.58**: il claim "outflow=bullish" è DECADUTO |
|
||||||
|
| **HASH**-ribbons (BTC-only) | 30/60 hold120 | 0.984 | **HEDGE** | paga solo quando TP01 è debole (corr −0.67) |
|
||||||
|
| **FNG**-fear-greed | regime media7>50 | 0.955 | NEUTRAL | corr→TP01 **0.82**: è trend travestito |
|
||||||
|
|
||||||
|
## Il finding strutturale
|
||||||
|
|
||||||
|
**L'on-chain tradabile è in larga parte PREZZO TRAVESTITO**: corr→TP01 0.50-0.82 su
|
||||||
|
tutte le famiglie. L'attività di rete, il sentiment e la supply su exchange *seguono*
|
||||||
|
il prezzo; quando ne estrai un segnale direzionale daily ottieni un trend-follower
|
||||||
|
peggiore di TP01 con un vocabolario diverso. È la stessa firma delle onde macro-gate
|
||||||
|
(corr 0.989) e funding: la barra per un nuovo sleeve non è "informazione nuova" ma
|
||||||
|
"informazione nuova NON già incorporata nel prezzo che TP01 segue".
|
||||||
|
|
||||||
|
## Il lead (debole): STABLE-supply-growth
|
||||||
|
|
||||||
|
L'unico sopra la linea su quasi tutti i gate: la crescita 30g della supply stablecoin
|
||||||
|
totale (soglia 10% annualizzato) come gate risk-on. Standalone FULL 1.25/HOLD 0.42,
|
||||||
|
DSR 0.998, ADDS persistente multi-cut, non-hedge, blend w25 hold +0.12. Muore SOLO su
|
||||||
|
robust_oos (drop-best-month −0.06; l'uplift 2026 = 1.32 domina la persistenza).
|
||||||
|
|
||||||
|
⚠️ **Caveat VINTAGE che declassa il lead a WATCH**: la storia DefiLlama è RICOSTRUITA
|
||||||
|
retroattivamente (chain e coin aggiunte nel tempo) — il "totale supply" visto oggi per
|
||||||
|
il 2019-2021 NON era osservabile allora. Un backtest su serie vintage-contaminate può
|
||||||
|
inventare edge. Idem (più mite) per le metriche exchange-flow CM (labeling dei wallet
|
||||||
|
rivisto ex-post). **Regola nuova da questa ondata: ogni segnale da aggregatori esterni
|
||||||
|
va classificato per rischio-vintage prima del backtest; un PASS su serie ricostruita
|
||||||
|
vale al massimo WATCH.**
|
||||||
|
|
||||||
|
Decisione: **WATCH, niente paper-monitor** (corr 0.61-0.67 a TP01 = il beneficio
|
||||||
|
marginale reale è piccolo; il vintage-risk non è sanabile retroattivamente). Criterio
|
||||||
|
di rivisita: se una fonte point-in-time della supply stablecoin (snapshot propri da
|
||||||
|
oggi, o fonte con vintage garantito) accumula ≥12 mesi, ritestare il gate thr=10%.
|
||||||
|
|
||||||
|
## Note dati (per il futuro)
|
||||||
|
|
||||||
|
- CM community: fermo al **2026-05-24** (~2 mesi di lag) → inutilizzabile live senza
|
||||||
|
fonte fresca; per backtest ok.
|
||||||
|
- ETH HashRate muore al Merge (2022-09) → hash-famiglia solo BTC.
|
||||||
|
- F&G è DERIVATO da vol+momentum di prezzo → la ridondanza col trend era attesa e
|
||||||
|
lo scorer l'ha confermata.
|
||||||
|
|
||||||
|
Book/pesi INVARIATI. Test suite invariata (172 pass).
|
||||||
@@ -0,0 +1,132 @@
|
|||||||
|
# 2026-07-24 — SKH01 sul PATH LIVE: peso del book Deribit a 2 sleeve + valore della cadenza 230m
|
||||||
|
|
||||||
|
**Chiude il follow-up aperto dall'audit anchor 2026-07-02** (`2026-07-02-anchor-audit-xs01-skh01.md`:
|
||||||
|
"cadenza 230m, peso live da rivedere"). Il book live Deribit è TP01 0.75 + SKH01 0.25
|
||||||
|
(`sleeves.deribit_book_sleeves`); l'audit aveva mostrato che il path live reale (cron ORARIO
|
||||||
|
`0 * * * *` + exit software, non on-book al livello) degrada SKH01 (50/50: FULL 1.46→1.19,
|
||||||
|
HOLD 1.64→1.15, DD 18→25%) e che l'offset 0 della griglia 230m/690m è best-of-23. Domanda:
|
||||||
|
**dato il path live vero, qual è il peso SKH ottimale, e quanto vale allineare il cron a 230m?**
|
||||||
|
|
||||||
|
**Script:** `scripts/research/r0724_skh_live_weight.py` — riusa la macchineria di
|
||||||
|
`r0702_anchor_skh01.py` (import diretto di `run_asset`/`sim_equity`/`get5m`/`sanity`, non
|
||||||
|
riscritta). Nessun file di produzione toccato (config/sleeves/live/cron INVARIATI).
|
||||||
|
|
||||||
|
## Verdetto in una riga
|
||||||
|
|
||||||
|
**INVARIATO su entrambi i fronti**: il peso SKH ottimale sul path live, scelto onestamente
|
||||||
|
(mediana de-luckata sui 23 offset, IN-SAMPLE, mai su hold-out), è **0.25 = il peso corrente**
|
||||||
|
(plateau 0.20–0.30); e **allineare il cron ai confini 230m non vale nulla** (Δmediana di banda
|
||||||
|
~+0.01/+0.02 Sharpe): il degrado live è quasi tutto **fill-al-livello vs exit software**,
|
||||||
|
che nessuna cadenza recupera.
|
||||||
|
|
||||||
|
## Setup (onestà dichiarata a priori)
|
||||||
|
|
||||||
|
- **Serie SKH live-path**: tutti i **23 offset** a priori della griglia (ogni 30m su [0,690)) ×
|
||||||
|
3 modi di `sim_equity`: `canonical` (fill al livello sl/tp = backtest), `barclose` (fill al
|
||||||
|
close della barra 230m = ciò che otterrebbe un cron allineato ai confini), `hourly` (fill al
|
||||||
|
close 5m del prossimo multiplo orario = **path del cron reale**). Sanity replica bit-exact
|
||||||
|
del canonico prima di ogni numero.
|
||||||
|
- **Sweep peso**: book = (1−w)·TP01 + w·SKH_live, w ∈ {0, .10, .15, .20, .25, .30, .40, .50}
|
||||||
|
(**8 valori = multiple-testing leggero, dichiarato**; nel gate k_seen=8). TP01 =
|
||||||
|
`al.tp01_baseline_daily()` canonico (come nell'audit).
|
||||||
|
- **Regola di selezione dichiarata PRIMA di vedere i numeri**: w* = argmax della **mediana
|
||||||
|
sui 23 offset dello Sharpe IN-SAMPLE** (pre-2025), lente `hourly`; a parità (<0.03) vince
|
||||||
|
il w più vicino al corrente 0.25. **L'hold-out serve solo a verificare, mai a scegliere.**
|
||||||
|
- **Gate**: `weights_tilt_null` (src/portfolio/portfolio.py) adattato al book a 2 sleeve
|
||||||
|
(null = 500 tilt casuali floor 0.05 / cap SKH 0.50 attorno al 75/25, sui daily del path
|
||||||
|
live hourly).
|
||||||
|
|
||||||
|
## Sanity — riconciliazione con l'audit r0702
|
||||||
|
|
||||||
|
Off0 == `_skyhook_returns()` **bit-exact** (max|Δ|=0.0 su 2688 giorni; l'audit ne aveva 2666 —
|
||||||
|
22 giorni di feed in più, deriva-dati attesa). DD harness BTC 21.4% / ETH 27.4% e n. trade
|
||||||
|
identici al diario di ammissione. Book 50/50 off0:
|
||||||
|
|
||||||
|
| modo | ShFULL | ShIS | ShHOLD | maxDD | audit r0702 |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| canonical | 1.447 | 1.418 | 1.578 | 18.1% | 1.46 / — / 1.64 / 18.1% |
|
||||||
|
| barclose | 1.100 | 1.080 | 1.228 | 23.0% | (non riportato) |
|
||||||
|
| hourly | 1.179 | 1.201 | 1.103 | 24.6% | 1.19 / — / 1.15 / 24.6% |
|
||||||
|
|
||||||
|
TP01 baseline: FULL 1.290 / IS 1.488 / HOLD 0.297 / DD 14.3% (audit ~1.30/~0.31). Blend 75/25
|
||||||
|
canonical off0 HOLD 1.125 (audit ~1.16). **Riconcilia** (Δ ≈ deriva-dati).
|
||||||
|
|
||||||
|
## Sweep peso — lente HOURLY (path live, quella della decisione)
|
||||||
|
|
||||||
|
| w | off0 FULL/IS/HOLD/DD | mediana banda FULL/IS/HOLD/DD | HOLD min..max | DD min..max |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 0.00 | 1.29 / 1.49 / 0.30 / 14.3% | 1.29 / 1.49 / 0.30 / 14.3% | — | — |
|
||||||
|
| 0.10 | 1.48 / 1.67 / 0.54 / 11.8% | 1.42 / 1.63 / 0.43 / 11.9% | 0.33..0.56 | 11.3..13.1% |
|
||||||
|
| 0.15 | 1.56 / 1.74 / 0.66 / 11.6% | 1.47 / 1.68 / 0.50 / 11.6% | 0.35..0.70 | 10.7..12.6% |
|
||||||
|
| 0.20 | 1.61 / 1.79 / 0.77 / 11.3% | 1.51 / 1.71 / 0.56 / 11.3% | 0.36..0.82 | 10.1..12.7% |
|
||||||
|
| **0.25** | **1.65 / 1.82 / 0.86 / 11.1%** | **1.53 / 1.72 / 0.62 / 11.2%** | 0.36..0.94 | 9.6..13.6% |
|
||||||
|
| 0.30 | 1.67 / 1.82 / 0.94 / 11.0% | 1.53 / 1.71 / 0.67 / 11.0% | 0.37..1.05 | 9.4..14.6% |
|
||||||
|
| 0.40 | 1.65 / 1.78 / 1.04 / 11.9% | 1.48 / 1.65 / 0.73 / 11.9% | 0.35..1.20 | 10.4..17.3% |
|
||||||
|
| 0.50 | 1.58 / 1.69 / 1.09 / 12.9% | 1.39 / 1.53 / 0.76 / 13.4% | 0.33..1.30 | 11.2..19.9% |
|
||||||
|
|
||||||
|
(La tabella `canonical` di riferimento è nell'output dello script: stessa forma, picco a
|
||||||
|
0.30–0.40 su off0 — l'off0 canonico resta la lente gonfiata già nota.)
|
||||||
|
|
||||||
|
- **Mediana-IS (hourly) per w**: 0.00:1.488 · 0.10:1.627 · 0.15:1.678 · 0.20:1.710 ·
|
||||||
|
**0.25:1.721** · 0.30:1.712 · 0.40:1.645 · 0.50:1.534 → argmax = **0.25**, plateau
|
||||||
|
{0.20, 0.25, 0.30} dentro la tolleranza 0.03 → **w\* = 0.25 = corrente**.
|
||||||
|
- Anche sul path live onesto la gamba SKH **paga**: a w=0.25 la mediana di banda migliora
|
||||||
|
TP01-solo su tutto (FULL 1.29→1.53, IS 1.49→1.72, HOLD 0.30→0.62, DD 14.3%→11.2%) —
|
||||||
|
la diversificazione sopravvive al path orario. Il sizing 25%, deciso a suo tempo su numeri
|
||||||
|
best-of-23, **risulta a posteriori difendibile anche de-luckato sul path vero**.
|
||||||
|
- **Tentazione rifiutata per regola**: su off0 l'HOLD cresce monotono fino a w=0.50 (1.09).
|
||||||
|
Sceglierlo sarebbe selezione-sull'hold-out + fortuna d'ancora (off0 = 98° pctl HOLD
|
||||||
|
nell'audit). La banda IS dice 0.25 e il DD di banda peggiora oltre 0.30.
|
||||||
|
|
||||||
|
## Gate `weights_tilt_null`
|
||||||
|
|
||||||
|
w\* == corrente → **nessun cambio proposto: INVARIATO** (gate non necessario). Eseguito
|
||||||
|
comunque, a titolo informativo, sul miglior w ≠ corrente (0.30):
|
||||||
|
|
||||||
|
- **off0 (griglia live)**: delta_insample +0.007, delta_hold +0.076, pctl_hold 53.6 (<88.9
|
||||||
|
best-of-8) → gate_pass **True ma marginale** (frac_random_beat_hold 0.562: più di metà dei
|
||||||
|
tilt casuali batte il 75/25 sull'hold-out — il claim "SKH aiuta l'hold-out" è generico,
|
||||||
|
non specifico di 0.30).
|
||||||
|
- **off30 (offset IS-mediano)**: delta_insample **−0.009** → gate_pass **False**. Il pass di
|
||||||
|
off0 è (di nuovo) figlio dell'ancora fortunata: il tick +0.01 IS a 0.30 non è robusto
|
||||||
|
alla banda. → 0.30 NON supera la barra onesta; **75/25 resta**.
|
||||||
|
|
||||||
|
## Cadenza 230m — barclose vs hourly (a w=0.25)
|
||||||
|
|
||||||
|
- off0: ΔShFULL **−0.040**, ΔShHOLD +0.068, ΔDD −0.9pt. Banda 23 offset: ΔShFULL med
|
||||||
|
**+0.010** [−0.042,+0.105], ΔShHOLD med **+0.020** [−0.109,+0.162], ΔDD med −0.3pt.
|
||||||
|
- SKH standalone 50/50: barclose−hourly ΔShFULL off0 −0.080 (med +0.015), ΔShHOLD off0
|
||||||
|
+0.125 (med +0.041), ΔDD off0 −1.5pt (med −1.3pt).
|
||||||
|
- **Sorpresa onesta**: a off0 il barclose è perfino PEGGIO dell'hourly su FULL — il ritardo
|
||||||
|
0–50 min del cron orario è **rumore, non un costo sistematico**. Il vero gap è il
|
||||||
|
**fill-al-livello** (canonical−barclose: ΔShFULL off0 +0.347, ΔShHOLD +0.350, ΔDD −4.9pt),
|
||||||
|
cioè l'assunzione del backtest che l'exit avvenga esattamente a sl/tp — e quello **nessun
|
||||||
|
cron lo recupera** (l'exit software in una barra che gappa prende il gap comunque; già
|
||||||
|
misurato dall'audit: sl2% → −11/−23% realizzato nei crash).
|
||||||
|
- Fattibilità (SOLO stima, non cablata): 230=23×10 → i confini 230m cadono sempre su multipli
|
||||||
|
di 10 min dall'epoch, quindi un cron `*/10` che esegue solo quando `now % 230min == 0`
|
||||||
|
colpirebbe ogni confine con ritardo ~0. **Ma non vale la pena**: guadagno mediano ~+0.01/+0.02
|
||||||
|
Sharpe, dentro il rumore, contro 6× invocazioni cron e complessità sul path live certificato.
|
||||||
|
|
||||||
|
## Caveat
|
||||||
|
|
||||||
|
- Exit software nei crash = gap reale (la sim `hourly` è già la stima pessimistica giusta);
|
||||||
|
niente slippage/parziali modellati; equity daily-step (lens Sharpe) come canonico e audit.
|
||||||
|
- 8 valori di w provati e dichiarati (k_seen=8 nel gate); selezione mai sull'hold-out.
|
||||||
|
- La banda 23-offset è la lente de-luckata; live gira UNA sola griglia (off 0).
|
||||||
|
- Deriva-dati vs audit (22 giorni di feed in più): riconciliazione "circa", riportata sopra.
|
||||||
|
- A $600 la granularità del peso non vincola (gamba SKH a w=0.10 ≈ $60/trade ≫ min-order $5).
|
||||||
|
|
||||||
|
## Raccomandazione finale (decisione utente per ogni cambio config)
|
||||||
|
|
||||||
|
1. **Peso SKH del book live Deribit: INVARIATO a 0.25.** È l'ottimo di banda sul path live
|
||||||
|
(plateau 0.20–0.30); nessun w alternativo passa il gate in modo robusto.
|
||||||
|
2. **Cadenza cron: INVARIATA (oraria).** L'allineamento 230m vale ~+0.01/+0.02 Sharpe mediano
|
||||||
|
(rumore); il degrado live è strutturale (fill-al-livello), non di cadenza. Non cablare il
|
||||||
|
cron `*/10`.
|
||||||
|
3. L'aspettativa onesta della gamba SKH live resta quella dell'audit: blend ~fase-mediana +
|
||||||
|
path orario (HOLD di banda ~0.62 a w=0.25, non 1.17), con gap-through-stop nei crash.
|
||||||
|
Il **follow-up dell'audit 2026-07-02 è CHIUSO** (entrambi i punti, esito nullo).
|
||||||
|
|
||||||
|
**Stato:** config/live.json, sleeves.py, scripts/live, cron **INVARIATI** — questo è ricerca;
|
||||||
|
ogni eventuale cambio resta una decisione esplicita dell'utente. Script committabile dopo review.
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
# 2026-07-24 — Snapshot stato paper book (chiusura sessione goal/50eur-day)
|
||||||
|
|
||||||
|
Fotografia dello stato dei libri paper al 2026-07-24 00:00 UTC, presa alla chiusura della
|
||||||
|
sessione (merge di `goal/50eur-day` in main a `05d069f`, branch cancellato, cron cablati:
|
||||||
|
cc01_regime_watch + stable_snapshot in cron_daily, opzioni 0DTE 2x/g 07:55+08:05 UTC).
|
||||||
|
Serve da riferimento per le decisioni pre-registrate (gate STATARB 2026-09-27 in primis).
|
||||||
|
|
||||||
|
## Book attivo 5-sleeve (`paper_portfolio`, €2000 nominali dal 2026-06-19)
|
||||||
|
|
||||||
|
- **Equity €2018,80 → +0,94% in 35g** (≈+10% ann.), **maxDD 0,3%**, picco €2018,89 (22/07).
|
||||||
|
- Posizioni: **risk-off quasi totale sul crypto** — TP01 0.0x/0.0x, XS01 flat (gate
|
||||||
|
dispersione chiuso), VRP01 nessuno spread (gate IV-rank chiuso), SKH01 flat.
|
||||||
|
Unica gamba investita: **GTAA01** (IB, 23/07) SPY 15,5 / HYG 16,7 / IWM 8,2 / QQQ 6,2 /
|
||||||
|
TLT 5,7 / GLD 2,1 / cash 45,8%.
|
||||||
|
- Lettura onesta: il rendimento del mese viene dalla gamba equity difensiva + i pochi
|
||||||
|
giorni crypto di fine giugno; i gate tengono il book fuori dal crypto da settimane —
|
||||||
|
comportamento atteso (il valore è il taglio del DD, non il ritorno). Coerente col book
|
||||||
|
live Deribit, anch'esso flat.
|
||||||
|
|
||||||
|
## Forward monitor
|
||||||
|
|
||||||
|
| Libro | Equity | Da inizio | maxDD | Posizione |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| Combo TP01+GTAA (dal 22/06) | €1991,20 | −0,44% | 0,6% | segue gli sleeve sopra |
|
||||||
|
| **STATARB-RESID** (dal 29/06) | €2088 mod. / €626 reale-$600 | **+4,4%** | 1,4% | long residuo 0.22x |
|
||||||
|
| Prevday-breakout (dal 21/06) | €1904 mod. / €572 reale | −4,8% | 6,4% | short BTC −0,47 / ETH −0,37 |
|
||||||
|
|
||||||
|
- **STATARB è il monitor messo meglio** (+4,4% in ~4 settimane, modellato E reale-$600
|
||||||
|
quasi identici, DD 1,4%): se la finestra forward regge, il gate pre-registrato
|
||||||
|
`r0724_statarb_deploy_gate.py` (2026-09-27) ha una chance concreta di promozione a
|
||||||
|
sleeve eseguibile (2 gambe BTC/ETH perp).
|
||||||
|
- Prevday −4,8%: lead in osservazione, nessuna azione.
|
||||||
|
|
||||||
|
## Promemoria trigger attivi a questa data
|
||||||
|
|
||||||
|
- Gate deploy STATARB: **2026-09-27**.
|
||||||
|
- Dossier 0DTE: riapertura solo dopo **≥90g** di snapshot (serie partita 24/07) con
|
||||||
|
mediana IV_daily/RV_forward netto-haircut > 0.
|
||||||
|
- WATCH STABLE: ritest a **≥12 mesi** di snapshot point-in-time (serie partita 24/07).
|
||||||
|
- CC01: riapertura a funding 30g **≥15% ann.** (watch in cron; oggi QUIET, BTC +8,4%).
|
||||||
|
|
||||||
|
Book live Deribit e pesi INVARIATI in tutta la sessione.
|
||||||
@@ -0,0 +1,161 @@
|
|||||||
|
# 2026-07-24 — Caccia strategie via web (3 agenti + 3 ondate empiriche): 0 slot, 2 lead operativi, 1 pista infrastrutturale
|
||||||
|
|
||||||
|
**Goal**: "trova altre strategie, sfruttiamo anche internet". Seconda metà della serata
|
||||||
|
(la prima è l'ondata on-chain, diario `2026-07-24-onchain-sentiment-wave.md`). Tre agenti
|
||||||
|
di ricerca web in parallelo (accademia 2022-26, on-chain/fonti dati, pratica non
|
||||||
|
convenzionale) + meccanizzazione immediata di tutto ciò che era testabile stanotte.
|
||||||
|
|
||||||
|
## Convergenza ricerca ↔ empirica (il quadro)
|
||||||
|
|
||||||
|
La letteratura di replicazione 2024-26 dice: dei 36 fattori crypto pubblicati ne
|
||||||
|
sopravvivono **2-3** (tutti liquidity/momentum — Mercik/Zaremba IRFA 2026); le anomalie
|
||||||
|
sono micro-cap e bull-conditional (Fieberg IRFA 2024); attention/volume falliscono OOS;
|
||||||
|
i flussi opzioni predicono la VOL, non la direzione (Alexander JFM 2022). Le prime 5
|
||||||
|
raccomandazioni degli agenti (MVRV, stablecoin, exchange-flow, F&G, hash ribbons)
|
||||||
|
**coincidono con le famiglie uccise stanotte dall'ondata on-chain** — la convergenza
|
||||||
|
indipendente ricerca/empirica è essa stessa il finding: il soffitto ~1.3 direzionale
|
||||||
|
BTC/ETH non si aggira con "informazione nuova" che è funzione del prezzo.
|
||||||
|
|
||||||
|
## Ondata PREMI CROSS-VENUE (empirica, stanotte) — 0/2, con lezione
|
||||||
|
|
||||||
|
`scripts/research/r0724_premium_wave.py` — unica famiglia flow con dati 100%
|
||||||
|
auto-calcolati da candele raw (zero rischio-vintage): Coinbase premium (2015→) e
|
||||||
|
kimchi premium Upbit/ECB (2017→), allineamento 00:00 UTC verificato (le daily Upbit
|
||||||
|
ancorano a 09:00 KST = mezzanotte UTC).
|
||||||
|
|
||||||
|
- **CBPREM**: medio −1bp (il feed certificato è un indice che include Coinbase →
|
||||||
|
premio smorzato, strutturale); miglior cella = HEDGE, hold −0.46 → MORTO.
|
||||||
|
- **KIMCHI d30-follow**: il candidato più forte della serata — **EARNS_SLOT=True al
|
||||||
|
marginal scorer** (ADDS, robust_oos, uplift positivo OGNI anno 2020-26, non-hedge,
|
||||||
|
hold standalone 0.74) ma DSR 0.891<0.95. Lo scettico (`r0724_kimchi_skeptic.py`) lo
|
||||||
|
uccide in due mosse: **niente plateau** (d15 0.44 / d30 1.07 / d45 0.51 / d60 0.24 =
|
||||||
|
spike isolato) e **lag +1g lo azzera** (hold 0.74→0.14, uplift blend negativo).
|
||||||
|
→ SCARTATO, parameter-luck. **Lezione: un EARNS_SLOT con DSR<0.95 va SEMPRE allo
|
||||||
|
scettico plateau+lag prima di qualsiasi entusiasmo** — il DSR aveva ragione.
|
||||||
|
|
||||||
|
## Probe HLP vault (dati reali API HL, 89 periodi ~14g, 2023-05→oggi)
|
||||||
|
|
||||||
|
L'unico stream **crash-long** mai visto dal progetto: corr col book **−0.19**, nei
|
||||||
|
periodi in cui il book perde HLP fa in media **+2.5%**; crash ott-2025 **+10.4%**,
|
||||||
|
liquidazione feb-2026 +7.0%. Sharpe grezzo 1.98 (su barre 14g — il daily vero è più
|
||||||
|
brutto), maxDD 5.8%. MA: **decay netto** (+60%/+79% 2023/24 → +19% 2025 → ~+12%
|
||||||
|
run-rate 2026, TVL diluisce) e la coda di protocollo (JELLY mar-2025, −$12M
|
||||||
|
quasi-socializzati; contract/bridge risk) NON è nella serie → lo Sharpe è
|
||||||
|
event-luck + short-tail-risk travestito da income. **Verdetto: ALLOCATION-WATCH**
|
||||||
|
(non è una strategia: è un deposito USDC con lockup 4g). A $600 la materialità è
|
||||||
|
~€10-30/anno → decisione operatore, non urgente. Dati: `data/external/hlp_vault.json`.
|
||||||
|
|
||||||
|
## LEAD infrastrutturale nuovo: Polymarket ↔ Deribit (probabilità implicite)
|
||||||
|
|
||||||
|
Il best-find dell'agente pratica: le binarie BTC/ETH su Polymarket vs le probabilità
|
||||||
|
implicite della chain opzioni Deribit — **gap medio 11pp vs Deribit** (arXiv 2606.19517),
|
||||||
|
half-life ~4h (= retail-compatible), delta-hedge col perp che già tradiamo. Unico
|
||||||
|
candidato 2026 che è insieme: meccanismo NUOVO (non prezzo), eseguibile a $600 (PM min
|
||||||
|
$1, no fee), e costruibile su infra ESISTENTE (motore BS/DVOL di VRP01 + cerbero-bite).
|
||||||
|
Scettici seri dichiarati: campione accademico piccolo e clusterizzato; parte del gap è
|
||||||
|
probabile **spec-mismatch** (fonte/orario di risoluzione PM vs settle Deribit) da
|
||||||
|
riconciliare contratto-per-contratto PRIMA di credere a un bp; book PM sottili vicino a
|
||||||
|
risoluzione; l'arb veloce è dei bot (73% sub-100ms) — l'angolo onesto è la convergenza
|
||||||
|
lenta a limit-order. **→ Prossima ondata di ricerca: studio di riconciliazione** (dati:
|
||||||
|
PM CLOB API gratuita + DB storico pubblicato arXiv 2606.04217). Nessun codice stasera.
|
||||||
|
|
||||||
|
## Altre azioni a costo zero raccomandate dagli agenti (per l'operatore)
|
||||||
|
|
||||||
|
1. **Puntare cerbero-bite anche sulle scadenze DAILY Deribit** da subito: 365 expiry/anno
|
||||||
|
= una serie di premi REALI si accumula 7× più veloce delle weekly → in 6 mesi decide
|
||||||
|
il dossier 0DTE/calendar (che resta bloccato dalla regola no-short-vol-da-modello).
|
||||||
|
2. Dataset Reservoir S3 (tape completo HL: fill, liquidazioni, ADL, L2) = primo dataset
|
||||||
|
non-di-prezzo del progetto, requester-pays (serve account AWS) → abilita studio
|
||||||
|
liquidation-exhaustion + listing-effects. Parcheggiato: richiede setup infra.
|
||||||
|
3. ETF flows: storia 2.6 anni → NON testabile onestamente fino al ~2028 (parcheggiato
|
||||||
|
con data di rivisita).
|
||||||
|
|
||||||
|
## Test cross-sectional su HL (lead-lag JEDC 2024 + salience/MAX) — DEAD 2/2
|
||||||
|
|
||||||
|
`scripts/research/r0724_xs_leadlag_max.py` (agente, 19 major HL, 2024→2026-07, 936g,
|
||||||
|
0 backfill verificato a runtime, convenzioni XS01: fee 0.10% RT/gamba, vol-target 20%,
|
||||||
|
holdout 2025).
|
||||||
|
|
||||||
|
- **LEAD-LAG (Guo et al. JEDC 2024)**: finding strutturale — con predictor equal-weight
|
||||||
|
"all-others", S_i = (Σr − r_i)/(A−1) è affine DECRESCENTE nel ritorno proprio
|
||||||
|
(rank-corr empirica **−1.000**): il "lead-lag accademico" sull'universo È lo
|
||||||
|
short-term reversal, già morto (3ª conferma FOLLOW>FADE). Le 8 celle hanno IS Sharpe
|
||||||
|
TUTTE negative (best −0.11); le celle large5 "buone" in hold-out (1.18) non sono
|
||||||
|
selezionabili in-sample (trappola selection-on-holdout) E sono degenerate (14/19
|
||||||
|
asset a segnale identico). DSR 0.237. **DEAD.**
|
||||||
|
- **MAX/lottery (Cai&Zhao JBF 2024)**: cella IS L30/H10 FULL 0.59 / HOLD 0.47,
|
||||||
|
DSR **0.412**, il segno si INVERTE tra L7 e L30 (plateau assente), 34 ribilanci IS
|
||||||
|
(small-n), fee-zero non salva (edge lordo piccolo, non morte-per-fee). Sotto lo
|
||||||
|
standard STATARB (0.84/DSR 0.929) → **DEAD**, non lead. Direzione coerente con la
|
||||||
|
letteratura ma indistinguibile dal rumore su ~2.5 anni.
|
||||||
|
|
||||||
|
Nota metodologica in omaggio: la degenerazione "predictor affine nel ritorno proprio"
|
||||||
|
è un check di 3 righe (rank-corr segnale↔momentum proprio) che smaschera i lead-lag
|
||||||
|
cross-section travestiti — da riusare su ogni futura proposta XS.
|
||||||
|
|
||||||
|
## Bilancio del goal "trova altre strategie"
|
||||||
|
|
||||||
|
Su tutta la serata: **10 famiglie nuove meccanizzate e giudicate coi gate completi + 1
|
||||||
|
probe** (6 on-chain/sentiment + 2 premi cross-venue + 2 cross-sectional HL + probe HLP),
|
||||||
|
3 report di ricerca web con ~50 fonti primarie, **0 slot nuovi** — coerente con la
|
||||||
|
storia del progetto (il book attuale resta il massimo onesto raggiunto) — ma:
|
||||||
|
1 pista genuinamente nuova con meccanismo non-di-prezzo (Polymarket↔Deribit, prossima
|
||||||
|
ondata), 1 allocation-watch crash-long (HLP), 2 azioni a costo zero (daily options
|
||||||
|
capture, rivisita ETF 2028), e 2 regole metodologiche nuove a diario (vintage-risk
|
||||||
|
delle fonti esterne; scettico plateau+lag obbligatorio sugli EARNS_SLOT con DSR<0.95).
|
||||||
|
|
||||||
|
Book/pesi INVARIATI.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Addendum (sera, goal "un agente per ogni case") — i 3 verdetti
|
||||||
|
|
||||||
|
Tre agenti dedicati, uno per case, tutti su DATI LIVE (nessun claim di seconda mano).
|
||||||
|
Script: `r0724_pm_deribit_probe.py`, `r0724_hlp_deepdive.py`, `r0724_daily_opt_snapshot.py`.
|
||||||
|
|
||||||
|
### 1. Polymarket ↔ Deribit (con opzioni in copertura) — **SKIP come trade; il lead "11pp" è REFUTATO dalla misura**
|
||||||
|
34 binarie PM matchate alle daily options Deribit, spec verificata su 66 mercati (PM
|
||||||
|
risolve su candela 1m Binance USDT alle 16:00 UTC; Deribit TWAP 30m indice USD alle
|
||||||
|
08:00). Il gap si decompone in: **fonte USDT +9,3bps di basis = +4-5pp di probabilità
|
||||||
|
ATM**, tempo 8h ∓5pp, e replica ingenua su book ITM morti (la banda sub/super-replica
|
||||||
|
ATM è [39%,91%] con strike ogni $500 su orizzonti a 1σ≈$350). Residuo spec-adjusted:
|
||||||
|
ATM −5…+6pp a segno instabile DENTRO la banda di replica; tail +1,8-3,1pp
|
||||||
|
(favorite-longshot) sotto i costi. Trade coperto reale a size minima: lock netto
|
||||||
|
$0,1-5, capitale $200-1.000 (il margine SM del leg corto domina: Deribit non netta i
|
||||||
|
vertical), **P(gambe in conflitto 08→16 UTC) 2-22%** → non è un arb. Più geoblock/ToS
|
||||||
|
PM per residenti IT. Facoltativo: WATCH a costo zero (cron dello script per la serie
|
||||||
|
del gap tail). Lezione: anche il "best lead" accademico muore alla riconciliazione di
|
||||||
|
spec — la parte vera del gap era spec, non alpha.
|
||||||
|
|
||||||
|
### 2. HLP vault — **SKIP come income, WATCH con trigger meccanici; il carry 2026 ex-evento è +0,2%/anno**
|
||||||
|
Trovata la serie daily vera (wrapper wHLP via CoinGecko, 364 giorni + thunderhead per
|
||||||
|
i tail di marzo 2025): il daily smaschera la lens 14g — Sharpe 0,69 (non ~2), maxDD
|
||||||
|
−7,9%, worst day −5,96%; e l'uscita-in-stress via wrapper costa ~5% di sconto NAV.
|
||||||
|
**Il finding killer: il +12% headline 2026 è UN SOLO periodo evento (feb-2026 +7%);
|
||||||
|
gli altri 15 periodi sommano +0,10%** → carry ex-evento ~0,2%/anno, PnL-$ piatto vs
|
||||||
|
TVL (ritorno ∝ 1/TVL, e i depositanti lo sanno: TVL −59% dal picco). Coda JELLY
|
||||||
|
ricostruita: −4,7% MtM su inventario EREDITATO illimitato, troncato SOLO da un voto
|
||||||
|
discrezionale dei validator in 2 minuti — il crash-long può morire NEL crash
|
||||||
|
(pattern is_hedge-che-fallisce). Kelly onesto con code: **f*=0 al carry corrente**.
|
||||||
|
Trigger di ri-arma meccanici: 90g return-on-AUM ≥8% ann. AND TVL<$350M AND nessun
|
||||||
|
evento di socializzazione in 180g. Legale: HL accessibile dall'IT ma non autorizzato
|
||||||
|
MiCA → rischio geoblock non copribile con lock 4g.
|
||||||
|
|
||||||
|
### 3. Opzioni DAILY Deribit (0DTE) — **CAPTURE-AND-WAIT con prior negativo; cattura AVVIATA**
|
||||||
|
Misura live (22:35 UTC): mercato 2-sided reale anche sulle ali, MA il cap fee 12,5%
|
||||||
|
è quasi sempre binding a tenor daily → **drag fee 2-3× il weekly** (legge Albimarini
|
||||||
|
dal vivo: premio ~√T, fee ~costante; haircut mid→netto 0DTE ~45-50%) e stanotte
|
||||||
|
**IV_daily/RV = 0,43-0,54× (VRP NEGATIVO al front)** mentre il weekly fa 1,13×
|
||||||
|
(coerente con VRP01: il premio vive lì). Capitale minimo per defined-risk vero
|
||||||
|
(Portfolio Margin) ≈ $32k; a $600 = 1 lotto ETH a EV negativo. **Pipeline scritta e
|
||||||
|
attiva**: `r0724_daily_opt_snapshot.py` → `data/options_daily/snapshots.jsonl`
|
||||||
|
(primo snapshot 160 righe già su disco; raccomandate 2 run/g 08:05+07:55 UTC — da
|
||||||
|
cablare in cron alla merge, read-only). Regola pre-registrata: riaprire il dossier
|
||||||
|
solo dopo ≥90g di serie E mediana(IV_daily/RV_forward) netto-haircut > 0.
|
||||||
|
Diario dedicato: `2026-07-24-daily-options-0dte.md`.
|
||||||
|
|
||||||
|
### Bilancio dei 3 case
|
||||||
|
0 trade nuovi (ed è il punto: due lead famosi refutati coi numeri, non con le
|
||||||
|
opinioni), 1 pipeline di cattura reale avviata che tra 90 giorni decide da sola,
|
||||||
|
regole di ri-arma meccaniche per HLP, e il metodo confermato: ogni claim muore o
|
||||||
|
sopravvive alla RICONCILIAZIONE DI SPEC prima che al backtest. Book/pesi INVARIATI.
|
||||||
@@ -0,0 +1,295 @@
|
|||||||
|
# 2026-07-25 — Caccia a strategie nuove: MAT01 (trend multi-asset) + generalizzazione di STATARB, e uno SPLIT non aggiustato nel feed equity
|
||||||
|
|
||||||
|
Goal di sessione: **trovare nuove strategie**. Tre filoni scelti cercando i vuoti reali nella
|
||||||
|
mappa (89 diari, famiglie calendario/funding/VRP/CRT gia' dichiarate sature). Esito: **0 sleeve
|
||||||
|
nuovi**, 2 refutazioni pulite, 1 **difetto di dato che tocca il libro live** trovato e riparato,
|
||||||
|
1 addendum pre-registrato al gate STATARB del 27/09.
|
||||||
|
|
||||||
|
Book e pesi **INVARIATI**.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## (1) MAT01 — trend difensivo su 18 ETF multi-asset-class invece di 6 → **SCARTATO**
|
||||||
|
|
||||||
|
Script: `scripts/research/r0725_mat01_multiasset_trend.py`, `r0725_mat01b_regime.py`.
|
||||||
|
|
||||||
|
**Il vuoto.** GTAA01 gira su 6 ETF (SPY QQQ IWM TLT GLD HYG), 4 su 6 azionari US. I 12 ETF
|
||||||
|
multi-classe (DIA EFA EEM FXI EWJ AGG LQD IEF USO SLV DBC VNQ) sono su disco certificati dal
|
||||||
|
2026-06-22 con 9-30 anni di storia, ma erano stati usati SOLO per il test lead-lag crypto→X
|
||||||
|
(diario 2026-06-23-crossmarket-beyond-sp500), mai per un programma di trend. Il TSMOM
|
||||||
|
multi-asset-class e' l'anomalia meglio replicata della finanza quantitativa: valeva il test.
|
||||||
|
|
||||||
|
**Disciplina.** Meccanismo CONGELATO (import di `_exposure` da `src/portfolio/gtaa.py`: orizzonti
|
||||||
|
21/63/126/252, vol-target 12%, long-flat, EW, fee 2bps/lato). Cambia SOLO l'universo. L'universo
|
||||||
|
ALL18 e' definito a priori per classe d'attivo: **a k=18 la liberta' di selezione e' zero**
|
||||||
|
(esiste un solo sottoinsieme di 18 su 18), quindi il confronto ALL18-vs-GTAA6 non e' selezionabile.
|
||||||
|
|
||||||
|
**Risultati.**
|
||||||
|
|
||||||
|
| | Sh FULL | Sh IS<2015 | Sh OOS2015+ | maxDD OOS | vol |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| GTAA6 (incumbent) | 0.62 | 0.49 | **0.89** | −8.2% | 6.05% |
|
||||||
|
| MAT18 (candidato) | 0.56 | 0.43 | 0.80 | −6.9% | 4.62% |
|
||||||
|
| MAT18-CLS (per classe) | 0.57 | — | 0.73 | — | 4.38% |
|
||||||
|
|
||||||
|
corr(GTAA6, MAT18) = 0.91. Sostituzione nel book a peso invariato 20%: Sharpe FULL 2.22→2.19,
|
||||||
|
HOLD 2.36→2.38, DD 6.2%→6.6%. Corr→crypto praticamente identica (0.110 vs 0.116): **nessun
|
||||||
|
guadagno di diversificazione**, che era l'unica ragione plausibile per farlo.
|
||||||
|
|
||||||
|
**Perche' scartato — quattro ragioni indipendenti:**
|
||||||
|
1. **Finestre disgiunte: MAT18 perde 3/4** (1998-2004 0.28 vs 0.40; 2005-2011 0.63 vs 0.54 —
|
||||||
|
unica vittoria; 2012-2018 0.55 vs 0.72; 2019-2026 0.99 vs 1.13). Non e' regime-luck
|
||||||
|
dell'incumbent: GTAA6 vince anche nella finestra che contiene dot-com e GFC.
|
||||||
|
2. **A PARI VOLATILITA' il vantaggio di DD sparisce e si inverte**: MAT18 va scalato ×1.31 per
|
||||||
|
eguagliare la vol di GTAA6, e a quel punto maxDD −20.6% contro −15.4%. Il suo DD piu' basso
|
||||||
|
era **solo de-levering** — replicabile meglio abbassando `target_vol`.
|
||||||
|
→ **3ª occorrenza della stessa lezione** (overlay DD del VRP01 2026-07-03: 4/4 refutati dal
|
||||||
|
null de-levering; TP01×DVOL 2026-06-26: il taglio di DD era de-levering). Il null de-levering
|
||||||
|
e' ormai il primo test da fare su ogni claim di "meno drawdown".
|
||||||
|
3. Beta azionario e alpha quasi identici (GTAA6 beta 0.19 / alpha 1.56%; MAT18 0.14 / 0.97%):
|
||||||
|
MAT18 non e' meno "equity travestito", e' solo piu' piccolo.
|
||||||
|
4. Nei bear MAT18 e' migliore (GFC −3.0% vs −5.1%, 2022 −3.2% vs −6.1%) ma paga quel conforto
|
||||||
|
con Sharpe piu' basso in ogni altro regime.
|
||||||
|
|
||||||
|
**Il risultato POSITIVO da conservare — l'ampiezza funziona, ma il soffitto e' gia' raggiunto.**
|
||||||
|
La curva di ampiezza (400 sottoinsiemi casuali per k, Sharpe OOS) e' monotona in 13/17 passi:
|
||||||
|
mediana **0.44 a k=1 → 0.80 a k=18**, DD mediano **−16.0% → −6.9%**, satura verso k≈10-12.
|
||||||
|
Cioe': allargare l'universo di un trend difensivo *e' un meccanismo reale*. Ma GTAA6 sta al
|
||||||
|
**95° percentile dei 6-subset casuali** — e non perche' sia un best-of cherry-picked (contiene
|
||||||
|
TLT, il PEGGIORE dei 18 con Sh OOS 0.03): e' la sua composizione (equity US + oro + credito HY)
|
||||||
|
a stare sopra il soffitto d'ampiezza. **Non c'e' piu' ampiezza da raccogliere su questo sleeve.**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## (2) STATARB-MULTI — il meccanismo generalizza fuori da ETH/BTC? → **si', debolmente; nessuno sleeve nuovo**
|
||||||
|
|
||||||
|
Script: `scripts/research/r0725_statarb_multi.py`.
|
||||||
|
|
||||||
|
**Perche'.** STATARB-RESID e' il miglior lead del progetto e ha un gate di deploy al **2026-09-27**,
|
||||||
|
ma e' stato scoperto su UNA coppia dentro uno sweep. Test out-of-pair-sample: meccanismo congelato
|
||||||
|
(W=45, sgn=+1) su tutte le **50 coppie alt/BTC** di Hyperliquid, che non hanno partecipato alla
|
||||||
|
scoperta.
|
||||||
|
|
||||||
|
**Cosa regge:**
|
||||||
|
- **82% delle 50 coppie ha Sharpe netta > 0** (media 0.38, mediana 0.32).
|
||||||
|
- **0/50 coppie degeneri**: il segno del segnale e' quasi bilanciato (mono medio 53%) → NON e' la
|
||||||
|
scommessa statica "short alt vs BTC" travestita, che era il modo di fallire pre-registrato.
|
||||||
|
- p-permutazione a blocchi < 0.05 nel **18%** delle coppie (atteso 5% per caso).
|
||||||
|
- **ETH/BTC e' al rango 22/50, 58° percentile: la coppia scopritrice NON e' un outlier.** E'
|
||||||
|
l'informazione piu' utile per il gate del 27/09: l'ipotesi "fortuna di una coppia" non regge.
|
||||||
|
- Paniere EW delle 50 coppie: Sharpe 0.82, maxDD −6.0%, **corr a XS01 solo 0.207** (non ridondante).
|
||||||
|
|
||||||
|
**Cosa NON regge — e perche' non e' uno sleeve:**
|
||||||
|
- **Ampiezza effettiva ~4.5, non 50** (corr media fra coppie 0.204: condividono la gamba BTC).
|
||||||
|
- **Block-bootstrap sul paniere: IC95% [−0.12, +1.72], t ≈ 1.31** → non distinguibile da zero su
|
||||||
|
2.6 anni. Il t cross-coppie apparente di 5.05 e' gonfiato dalla dipendenza.
|
||||||
|
- Contro il null **"sempre short alt vs BTC"** (a priori, nessun parametro stimato) l'uplift medio
|
||||||
|
e' **−0.11** e solo il 40% delle coppie lo batte: una parte del rendimento e' beta di regime
|
||||||
|
2024-2026, non timing.
|
||||||
|
- Eseguibilita': 50 coppie = 51 gambe → STAT-MODE come XS01, fuori portata a $600.
|
||||||
|
|
||||||
|
⚠ **Correzione a un mio errore di metodo, dentro questa stessa sessione.** La prima stesura del
|
||||||
|
null statico usava `sign(mean(segnale))` sull'INTERO campione: un null che conosce gia' la
|
||||||
|
direzione giusta, cioe' look-ahead. Rifatto in due versioni oneste — (a) causale con media
|
||||||
|
espandente, (b) a priori sempre-short. L'uplift vs la versione causale e' mediana +0.10 / 58%
|
||||||
|
positivo (debolmente favorevole); vs sempre-short e' negativo. Il numero pubblicabile e' questo,
|
||||||
|
non quello della prima stesura.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## (3) STATARB-EQ — lo stesso meccanismo su coppie ETF con 20-30 anni di storia → **SCARTATO, e il crypto non ne esce rafforzato**
|
||||||
|
|
||||||
|
Script: `scripts/research/r0725_statarb_eq.py`.
|
||||||
|
|
||||||
|
**Perche'.** La debolezza di STATARB-RESID non e' il segno dei numeri, e' la statistica: 2.6 anni,
|
||||||
|
ampiezza effettiva 4.5. Le coppie ETF la attaccano frontalmente — 12 coppie definite **a priori
|
||||||
|
dentro la stessa classe d'attivo** (DIA/SPY, IWM/SPY, QQQ/SPY, EEM/EFA, EWJ/EFA, FXI/EEM, EFA/SPY,
|
||||||
|
SLV/GLD, IEF/TLT, HYG/LQD, LQD/AGG, USO/DBC), **28.5 anni**, ampiezza effettiva **9.9**, 4 regimi
|
||||||
|
completi. Nessun data-mining di cointegrazione: cercare le coppie piu' cointegrate sugli stessi
|
||||||
|
dati sarebbe selezione.
|
||||||
|
|
||||||
|
**Esito: il meccanismo NON si trasferisce.**
|
||||||
|
|
||||||
|
| | valore |
|
||||||
|
|---|---|
|
||||||
|
| Sharpe LORDA media / mediana | −0.17 / −0.16 (25% positive) |
|
||||||
|
| Sharpe NETTA media / mediana | −0.50 / −0.51 (8% positive) |
|
||||||
|
| paniere EW, 28.5 anni | Sharpe **−1.00**, IC95% [−1.36, −0.64], **t −5.33** |
|
||||||
|
| per decade | −0.56 / −1.61 / −1.83 / −0.78 — **negativo in 4/4** |
|
||||||
|
| p-permutazione < 0.05 | **0%** delle coppie |
|
||||||
|
| turnover | 0.40/giorno → drag di fee **0.33 Sharpe** |
|
||||||
|
| borrow 0 / 30 / 100 bps | −1.00 / −1.06 / −1.21 |
|
||||||
|
|
||||||
|
**La lettura corretta e' nella decomposizione lordo/netto, non nel netto.** La lorda e' −0.17, non
|
||||||
|
−1.00: due terzi del disastro sono drag di turnover. Quindi **non esiste una "strategia specchio"
|
||||||
|
da girare**: sgn=−1 avrebbe lorda ≈ +0.17 e netta ≈ −0.16, morta anch'essa sui costi. Il segno
|
||||||
|
lordo dice pero' una cosa vera e interessante: **sulle coppie azionarie il residuo REVERTE
|
||||||
|
debolmente, mentre sul crypto CONTINUA** (sgn=+1 vince). Il meccanismo di STATARB e' quindi
|
||||||
|
plausibilmente specifico del crypto, non universale.
|
||||||
|
|
||||||
|
**Onesta' sull'inferenza:** che non funzioni sulle azioni NON dimostra che non funzioni sul crypto
|
||||||
|
— gli indici azionari sono efficienti e le coppie alt/BTC hanno microstruttura e flussi diversi.
|
||||||
|
Il punto e' negativo in modo preciso: il gate del 27/09 **non puo' appoggiarsi** all'argomento
|
||||||
|
"e' un fenomeno universale, quindi e' reale". Non lo e'.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## (4) ⚠ DIFETTO DI DATO: split NON aggiustati nel feed equity — trovato, riparato, gate chiuso
|
||||||
|
|
||||||
|
Emerso mentre diagnosticavo ritorni giornalieri impossibili in (3) (min −99.9%, max +112%).
|
||||||
|
|
||||||
|
**Il fatto.** `data/raw/eq_iwm_1d.parquet` e `eq_efa_1d.parquet` avevano uno **split non aggiustato
|
||||||
|
il 2005-06-09** (tornata di split iShares): IWM 94.13→47.53 (−49.5%, rapporto 1.981 ≈ **2:1**),
|
||||||
|
EFA 85.91→28.76 (−66.5%, rapporto 2.987 ≈ **3:1**). IB `ADJUSTED_LAST` non li aveva aggiustati.
|
||||||
|
|
||||||
|
**Perche' la certificazione non li vedeva — ed e' un punto cieco strutturale, non sfortuna.**
|
||||||
|
L'unica guardia sui salti era `maxret > 50% → SPIKE?`. Uno split 2:1 non aggiustato produce
|
||||||
|
**esattamente −50%**: cade sul filo della soglia. IWM passava a 49.5% con status **OK**. La soglia
|
||||||
|
era tarata precisamente sul valore che il difetto piu' comune genera.
|
||||||
|
|
||||||
|
**Perche' importa: IWM e' una delle 6 gambe di GTAA01, sleeve in PRODUZIONE.** Impatto misurato:
|
||||||
|
|
||||||
|
| GTAA6 | FULL Sh | IS<2015 Sh | OOS2015+ Sh | maxDD |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| con difetto | 0.61 | 0.49 | 0.86 | −15.38% |
|
||||||
|
| riparato | **0.64** | **0.54** | 0.86 | −15.38% |
|
||||||
|
|
||||||
|
Il difetto **sottostimava** lo sleeve (l'artefatto e' nel 2005, fuori dall'hold-out) → **nessuna
|
||||||
|
decisione presa va rivista**, ma il dato e' ora corretto.
|
||||||
|
|
||||||
|
**Il discriminante split-vs-crollo (la parte riusabile).** Non basta il rapporto: SLV il
|
||||||
|
2026-01-30 ha fatto −28.5% con rapporto **1.3994**, a 4 bps da 1.4. Il discriminante e' il **range
|
||||||
|
intraday**:
|
||||||
|
- **SPLIT**: la barra APRE gia' al nuovo livello, range intraday normale. IWM 2005-06-09: open
|
||||||
|
47.00, range 1.7%. Un crollo del 50% con range 1.7% non esiste.
|
||||||
|
- **CROLLO VERO**: il movimento avviene DENTRO la barra. SLV: open 89.33, low 69.12, range 33%,
|
||||||
|
volume raddoppiato, e **GLD −10.3% lo stesso giorno**. Stessa verifica su EEM 2008-10-28 (+26%,
|
||||||
|
reale).
|
||||||
|
|
||||||
|
**Cosa e' stato fatto:**
|
||||||
|
- Nuovo modulo `src/data/eq_splits.py` — `detect_unadjusted_splits()` (tre condizioni congiunte:
|
||||||
|
|ret|>20% AND rapporto entro 1.5% da un fattore comune AND range intraday <5%) e
|
||||||
|
`repair_splits()` (riscala i prezzi precedenti; split multipli si compongono; volume opposto).
|
||||||
|
- Riparazione **in lettura** in entrambi i loader: `src/portfolio/gtaa.py::_close` (produzione) e
|
||||||
|
`scripts/research/eqlib.py::load_eq` (ricerca).
|
||||||
|
- Certificazione indurita: `fetch_ib_equities.certify()` ha ora lo status **`SPLIT-NON-AGG`** e
|
||||||
|
riporta gli split rilevati.
|
||||||
|
- Test `tests/test_eq_splits.py` (8 casi): i due split reali, il falso positivo SLV, un crollo
|
||||||
|
−50% esatto con range grande, split multipli componibili, serie pulita invariata, ed end-to-end
|
||||||
|
sui parquet. **Suite completa: 180 passed.**
|
||||||
|
|
||||||
|
**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.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## (5) Addendum PRE-REGISTRATO al gate STATARB del 27/09
|
||||||
|
|
||||||
|
Registrato **oggi, forward-day 26 di 90, 64 giorni prima della decisione** — pre-registrazione
|
||||||
|
vera, non selezione a posteriori. Motivo: il null "sempre short alt vs BTC" batte il segnale sul
|
||||||
|
60% delle coppie crypto, e su ETH/BTC (finestra HL 2024-2026) il pareggio e' quasi esatto
|
||||||
|
(segnale 0.46 vs statica 0.48).
|
||||||
|
|
||||||
|
`r0724_statarb_deploy_gate.py` ora calcola e riporta anche lo Sharpe della **statica sempre-short
|
||||||
|
a pari vol-target sulla stessa finestra forward**. **Le soglie pre-registrate il 2026-07-24
|
||||||
|
(Sharpe≥0.5, DD<10%, haircut<0.5pp) NON sono state toccate**: il benchmark e' una diagnostica
|
||||||
|
obbligatoria da leggere insieme, e la decisione se renderlo binding spetta all'operatore.
|
||||||
|
|
||||||
|
**Lettura di oggi (26 barre, da non sovrainterpretare):** STATARB **+5.70** contro benchmark
|
||||||
|
statico **−4.98**. La posizione forward corrente e' LONG lo spread (+0.61), cioe' **opposta** alla
|
||||||
|
scommessa statica → la finestra forward sta testando il segnale in un modo che il beta di regime
|
||||||
|
non spiega. Prima lettura favorevole.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## (6) ✅ XSR01 — il candidato che e' uscito dal filone (2): **CROSS-SECTIONAL RESIDUAL**
|
||||||
|
|
||||||
|
Script: `r0725_statarb_basket_gate.py` (gate), `r0725_statarb_demean_skeptic.py` (scettico),
|
||||||
|
monitor `scripts/live/paper_xsr.py`, gate `r0725_xsr_deploy_gate.py`, test `tests/test_paper_xsr.py`.
|
||||||
|
|
||||||
|
Il paniere di coppie del punto (2) non era uno sleeve per un motivo **diagnosticato, non subito**:
|
||||||
|
ampiezza effettiva 4.5 invece di 50, perche' le 50 coppie **condividono la gamba BTC**. Da qui una
|
||||||
|
variante **pre-registrata per ragione strutturale** (prima di guardare i risultati): demeanare le
|
||||||
|
posizioni cross-sezionalmente ogni giorno. L'algebra dice cosa succede:
|
||||||
|
|
||||||
|
sum_i (p_i − p̄)(r_i − r_btc) = sum_i (p_i − p̄) r_i perche' sum_i (p_i − p̄) = 0
|
||||||
|
|
||||||
|
**la gamba BTC si annulla**, e con essa il fattore comune. Il risultato non e' piu' un paniere di
|
||||||
|
coppie: e' una strategia **cross-sectional dollar-neutral sui 50 alt** con pesi (p_i − p̄)/N.
|
||||||
|
|
||||||
|
| | V1 ALL50 | V2 MAJ19 | **V3 DEMEAN** |
|
||||||
|
|---|---|---|---|
|
||||||
|
| Sharpe netta | 0.82 | 0.75 | **1.82** |
|
||||||
|
| maxDD | −6.0% | −8.1% | **−2.6%** |
|
||||||
|
| ampiezza effettiva | 4.5 | 4.0 | **37.4** |
|
||||||
|
| marginale vs TP01 | ADDS | NOISE | **ADDS** |
|
||||||
|
| deflated-Sharpe | 0.701 | 0.660 | **0.985 PASS** |
|
||||||
|
|
||||||
|
**Gate superati.** Marginale **ADDS** con `robust_oos`, `beats_noise_null`, `is_hedge=False`,
|
||||||
|
`has_insample_edge=True`. **Deflated-Sharpe 0.985** (soglia 0.95) su 3 varianti pre-registrate — e
|
||||||
|
la config W=45/sgn=+1 viene da un altro studio, su questi dati non e' stata cercata.
|
||||||
|
**Correlazione ~0 a TUTTI e 5 gli sleeve attivi**: 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.
|
||||||
|
|
||||||
|
**Verifica avversariale** (`r0725_statarb_demean_skeptic.py`) — numeri cosi' puliti sono, in questo
|
||||||
|
progetto, il momento in cui di solito si trova l'artefatto. Quattro attacchi:
|
||||||
|
- **Tre null a fee-neutrale** (permutazione cross-sezionale delle etichette-asset; posizioni
|
||||||
|
casuali; permutazione temporale a blocchi 20g): tutti centrati a **~0.01** con p95 1.0-1.3, e il
|
||||||
|
candidato **LORDO 2.70 sopra il massimo di 300 estrazioni** → p < 0.004 su tutti e tre.
|
||||||
|
⚠ Correzione di metodo: la prima stesura confrontava a fee piene, e i null uscivano a −3.7/−4.2
|
||||||
|
perche' permutare **fa esplodere il turnover** → il null perdeva per COSTO, non per assenza di
|
||||||
|
segnale, dando un p-value trionfale e falso. A fee zero il confronto isola l'informazione.
|
||||||
|
- **Lag**: 1.82 → 1.19 → 0.81 → 0.51 a +0/1/2/3 giorni. **Decadimento dolce = segnale lento reale;**
|
||||||
|
un look-ahead crollerebbe a zero al primo giorno di ritardo.
|
||||||
|
- **Ridondanza**: contro un momentum cross-sectional semplice sugli stessi 50 (che fa Sharpe
|
||||||
|
0.03/0.17/−0.79 a L=30/45/90) la correlazione e' 0.29/0.17/−0.10 → **non e' XS01 travestito**.
|
||||||
|
- **Struttura**: netto 2e−17 (dollar-neutral esatto), 23.8 gambe long su 50 (bilanciato), lordo
|
||||||
|
14.4% del capitale.
|
||||||
|
|
||||||
|
**Le tre debolezze, dichiarate — e' per queste che va in MONITOR e non nel book:**
|
||||||
|
1. **Storia 2.6 anni, un regime solo**, e il rendimento e' **crescente** (Sharpe 2024 1.03 / 2025
|
||||||
|
1.98 / 2026 3.11): la maggior parte dell'edge e' recente.
|
||||||
|
2. **`weights_tilt_null` NON passa** (gate_pass=False a w=10% e 15%, delta_insample −0.004/−0.007).
|
||||||
|
E' un effetto strutturale della storia corta — ma un gate fallito resta fallito.
|
||||||
|
3. **Margine di costo sottile**: 1.82 a 0.05%/gamba, **0.93 a 0.10%, NEGATIVA a 0.20%**. Turnover
|
||||||
|
38.5% del lordo al giorno su 50 alt fra cui illiquidi (GALA, BLUR, JTO, ORDI, WIF) e **slippage
|
||||||
|
non modellato**: e' il rischio numero uno.
|
||||||
|
|
||||||
|
**Eseguibilita' — il numero che serve davvero:** ticket medio per gamba $1.73 a $600 (**sotto il
|
||||||
|
min-order $5: STAT-MODE al capitale attuale**), $5.76 a $2000, **$14.41 a $5000**. Cioe' XSR01
|
||||||
|
diventa reale intorno ai **$5.000**, non ai $20.000 di XS01.
|
||||||
|
|
||||||
|
**Cablato come ogni lead del progetto:** `scripts/live/paper_xsr.py` (config CONGELATA, **tre**
|
||||||
|
libri paralleli MODELED $2000 / REAL $600 / REAL $5000 con min-order per gamba, stato append-only),
|
||||||
|
inserito in `cron_daily.sh`, test a 7 casi che bloccano config, dollar-neutralita', causalita' dello
|
||||||
|
step, min-order e la trappola dei timestamp. Gate di decisione pre-registrato oggi a forward-day 0:
|
||||||
|
**2026-10-23**, con soglia Sharpe ≥ 1.0 **E** una guardia di costo esplicita (haircut di
|
||||||
|
eseguibilita' a $5000 ≤ 40%, altrimenti RITIRO a prescindere dallo Sharpe).
|
||||||
|
|
||||||
|
⚠ Trappola pandas ri-pagata e ri-documentata: `astype("int64")` su `DatetimeIndex` tz-aware dava
|
||||||
|
epoche 1970 nel monitor. E' la gemella di quella dell'ondata 2026-07-01. Ora c'e' un test.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Bilancio
|
||||||
|
|
||||||
|
- **1 candidato nuovo: XSR01**, il primo da molte ondate a superare marginale-ADDS, deflated-Sharpe
|
||||||
|
0.95, tre null avversariali e il test di lag, con corr ~0 a tutti e 5 gli sleeve. In
|
||||||
|
forward-monitor (NON nel book) per tre ragioni dichiarate: storia 2.6 anni, `weights_tilt_null`
|
||||||
|
fallito, margine di costo sottile. Gate pre-registrato al **2026-10-23**.
|
||||||
|
**Nota di onesta' su come e' nato:** non e' uscito da un'idea nuova, e' uscito dalla
|
||||||
|
DIAGNOSI di un fallimento — l'ampiezza effettiva 4.5 del paniere di coppie indicava un fattore
|
||||||
|
comune da togliere, e toglierlo era una mossa algebrica obbligata, non una ricerca di parametri.
|
||||||
|
- 2 refutazioni pulite con diagnostica riusabile: il soffitto d'ampiezza di GTAA01 e' gia'
|
||||||
|
raggiunto; STATARB non e' un fenomeno universale (non si trasferisce alle azioni).
|
||||||
|
- 1 difetto di dato sul **libro live** trovato, quantificato, riparato, testato e chiuso alla fonte.
|
||||||
|
- Il gate del 27/09 arriva alla decisione con **un'ipotesi alternativa in meno** (fortuna di una
|
||||||
|
coppia: refutata, 58° percentile) e **un benchmark in piu'** (beta statico, gia' favorevole).
|
||||||
|
- Due errori di metodo miei, trovati e corretti dentro la sessione: null statico con look-ahead
|
||||||
|
(STATARB-MULTI) e null a fee piene contro un segnale permutato ad alto turnover (scettico XSR01).
|
||||||
|
Entrambi avrebbero prodotto numeri piu' belli e sbagliati.
|
||||||
|
|
||||||
|
Script: `r0725_mat01_multiasset_trend.py`, `r0725_mat01b_regime.py`, `r0725_statarb_multi.py`,
|
||||||
|
`r0725_statarb_eq.py`, `r0725_statarb_basket_gate.py`, `r0725_statarb_demean_skeptic.py`,
|
||||||
|
`r0725_xsr_deploy_gate.py`; monitor `scripts/live/paper_xsr.py`; modulo `src/data/eq_splits.py`;
|
||||||
|
test `tests/test_eq_splits.py`, `tests/test_paper_xsr.py`.
|
||||||
@@ -0,0 +1,234 @@
|
|||||||
|
# 2026-07-25 — La lente wick ACCOPPIATA: chiusura del follow-up dichiarato
|
||||||
|
|
||||||
|
**Script:** `scripts/research/r0725_prop_coupled.py` · **Test:** `tests/test_prop_coupled.py` (13 casi)
|
||||||
|
**Segue:** `2026-07-25-rendita-capcurve-prop.md` §5 (scala prop) e §7 (HyroTrader)
|
||||||
|
**Book / pesi / cron: INVARIATI.** Nessuna decisione di portafoglio dipende da questo lavoro.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. Cosa era rimasto aperto, e perché contava
|
||||||
|
|
||||||
|
La scala di conti funded (§5 del diario di stamattina) era stata giudicata con **due lenti** che
|
||||||
|
differiscono di un **ordine di grandezza** su P(≥50 €/g in 3 anni):
|
||||||
|
|
||||||
|
| lente | P(≥50/g) | com'era descritta |
|
||||||
|
|---|---|---|
|
||||||
|
| close-only | **20.7%** | tetto ottimista — le regole prop scattano sull'equity intraday, non sulla chiusura |
|
||||||
|
| wick indipendente | **1.6-2.5%** | pavimento pessimista — gap lognormale estratto **indipendente** dal rendimento del giorno |
|
||||||
|
|
||||||
|
Una banda 1.6%-20.7% non decide niente: è la differenza fra "scommessa a coda destra che vale i
|
||||||
|
600 euro" e "non vale la pena". E il difetto del pavimento era **già dichiarato** nel docstring:
|
||||||
|
|
||||||
|
> *«nella realtà i wick profondi stanno sulle giornate brutte (sono ACCOPPIATI): estrarli
|
||||||
|
> indipendenti aggiunge finti tuffi anche nelle giornate buone → breach spuri → stima troppo
|
||||||
|
> severa. Il modo giusto è il bootstrap delle TUPLE (ritorno, gap) come in
|
||||||
|
> r0724_goal50_intraday_mc.py, che però ha il recon solo per TP01+SKH01 → FOLLOW-UP dichiarato.»*
|
||||||
|
|
||||||
|
Questo lavoro chiude quel follow-up.
|
||||||
|
|
||||||
|
## 2. Metodo
|
||||||
|
|
||||||
|
Tre pezzi, tutti verificati contro qualcosa di indipendente:
|
||||||
|
|
||||||
|
1. **Recon per-sleeve a risoluzione oraria.** `r0724` calcola il minimo intraday del book Deribit
|
||||||
|
con i pesi 75/25 **cablati dentro**. Qui i pesi si dividono via per ottenere gli sleeve nudi
|
||||||
|
(ret, wick) di TP01 e SKH01 — così il minimo si compone **esattamente** sul path orario per
|
||||||
|
**qualsiasi** vettore di pesi. Logica invariata: exit-al-livello, SL prioritario, fee.
|
||||||
|
2. **Lente accoppiata per XS01**, che su Hyperliquid è 1d nativo. L'escursione intraday si
|
||||||
|
ricostruisce dagli **OHLC giornalieri** dei 19 alt: il book si valuta ai 4 checkpoint
|
||||||
|
O / primo estremo / secondo estremo / C, con **ordinamento condiviso** fra le gambe (le alt
|
||||||
|
co-muovono) preso nell'ordine **avverso**. Non è path-exact, ma è **accoppiato al giorno vero**,
|
||||||
|
che è tutto il punto.
|
||||||
|
*Sanity:* il recon riproduce lo sleeve ufficiale con `max|Δ| = 0.0` esatto.
|
||||||
|
3. **Le tre lenti sulla stessa macchina di simulazione** (close / indipendente / accoppiata), così
|
||||||
|
il confronto non mescola differenze di modello con differenze di lente.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3. Il risultato principale: la calibrazione era giusta, l'**indipendenza** era l'errore
|
||||||
|
|
||||||
|
Confronto delle distribuzioni **marginali** del gap (book live TP01/SKH01, 2691 giorni):
|
||||||
|
|
||||||
|
| | p50 | p90 | p99 | peggiore |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| **accoppiato (recon)** | −0.17pp | −1.03pp | −2.70pp | −5.96pp |
|
||||||
|
| indipendente (calibrazione 25/07) | −0.17pp | −0.90pp | −3.50pp | — |
|
||||||
|
|
||||||
|
**Sono quasi identiche.** La calibrazione lognormale di stamattina era buona. Quello che era
|
||||||
|
sbagliato non è *quanto* sono profondi i tuffi, ma **su quali giorni cadono**.
|
||||||
|
|
||||||
|
### 3.1 E la dipendenza va nel verso inatteso
|
||||||
|
|
||||||
|
Mi aspettavo — e lo avevo scritto — che i gap profondi stessero sui giorni brutti. **È il
|
||||||
|
contrario:**
|
||||||
|
|
||||||
|
| book | giorni | m==R | gap medio | gap \| decile PEGGIORE | gap \| decile MIGLIORE |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| A TP01/SKH01 (live) | 2691 | 26% | −0.38pp | **−0.48pp** | **−1.58pp** |
|
||||||
|
| B +XS01 (diversif.) | 937 | 20% | −0.36pp | −0.39pp | −1.30pp |
|
||||||
|
| TP01 solo | 2691 | 33% | −0.39pp | −0.59pp | −1.57pp |
|
||||||
|
| SKH01 solo | 2691 | 76% | −0.39pp | −0.40pp | −2.97pp |
|
||||||
|
| XS01 solo | 937 | 53% | −0.44pp | −0.22pp | −2.32pp |
|
||||||
|
|
||||||
|
L'escursione intraday è **~3× più profonda nei giorni che finiscono BENE** che in quelli che
|
||||||
|
finiscono male. Il meccanismo, una volta visto, è ovvio: un giorno brutto **scende tutto il
|
||||||
|
giorno e chiude sul minimo** (`m == R` nel 26% dei giorni: la chiusura *è* il peggio), mentre
|
||||||
|
un recupero a V ha un minimo profondo e una chiusura alta.
|
||||||
|
|
||||||
|
Il breach però si valuta **sul minimo**. Quindi ciò che conta è quanto gap si aggiunge **nei
|
||||||
|
giorni brutti** — e lì il gap vero è ~1/3 di quello dei giorni buoni. Un'estrazione indipendente
|
||||||
|
usa la stessa distribuzione ovunque, e così **carica i giorni brutti con la coda che nella realtà
|
||||||
|
appartiene ai giorni buoni**.
|
||||||
|
|
||||||
|
### 3.2 Quanto costa, misurato sui giorni storici (nessun bootstrap)
|
||||||
|
|
||||||
|
Frazione di giorni che sfondano la regola di daily-loss:
|
||||||
|
|
||||||
|
| book | leva | regola | close-only | **ACCOPPIATO** | indipendente | gonfiaggio |
|
||||||
|
|---|---|---|---|---|---|---|
|
||||||
|
| A (live) | 0.75 | daily 4% (HYRO) | 0.00% | 0.21% | 0.40% | **1.9×** |
|
||||||
|
| A (live) | 1.00 | daily 4% (HYRO) | 0.00% | 0.32% | 0.78% | **2.4×** |
|
||||||
|
| B (+XS01) | 0.75 | daily 4% (HYRO) | 0.00% | 0.11% | 0.25% | **2.4×** |
|
||||||
|
| B (+XS01) | 1.00 | daily 5% (FTMO) | 0.00% | 0.11% | 0.31% | **2.9×** |
|
||||||
|
|
||||||
|
Due letture:
|
||||||
|
- la lente indipendente **raddoppia** i breach da daily-loss (2.0-2.9×);
|
||||||
|
- **close-only non è "leggermente ottimista": è strutturalmente cieca.** Fa `0.00%` su ogni riga —
|
||||||
|
la regola di daily-loss **non scatta mai** sulle chiusure. Non è una lente approssimata, è una
|
||||||
|
lente che non vede affatto quel vincolo.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4. Tre verifiche — perché un "nessuna differenza" va provato, non assunto
|
||||||
|
|
||||||
|
### (1) Risoluzione: l'1h basta? — **sì, misurato**
|
||||||
|
|
||||||
|
TP01 tiene peso costante nel giorno, quindi il suo minimo intraday si può calcolare **anche a 5m**
|
||||||
|
ed è un confronto pulito:
|
||||||
|
|
||||||
|
| | p50 | p90 | p99 | peggiore |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| gamba TP01 @1h | −0.337pp | −1.358pp | −3.056pp | −5.34pp |
|
||||||
|
| gamba TP01 @5m | −0.336pp | −1.366pp | −3.136pp | −5.33pp |
|
||||||
|
|
||||||
|
Identici. **Il caveat "i wick a 1h sono un tetto, i 5m sarebbero più profondi" — portato avanti dal
|
||||||
|
24/07 — è quantificato e trascurabile.** L'ora cattura già il minimo del giorno: i 5m aggiungono
|
||||||
|
solo rumore dentro un'ora di minimo già individuata.
|
||||||
|
|
||||||
|
*Nota di metodo:* entrambe le righe riportavano `n=1865` e la cosa sembrava un errore (stessa
|
||||||
|
serie confrontata due volte). Non lo era: il filtro scarta i giorni in cui TP01 è **flat** (~30%),
|
||||||
|
che sono gli stessi a qualsiasi risoluzione. Verificato prima di accettare il risultato.
|
||||||
|
|
||||||
|
### (2) Riconciliazione col 24/07 — **la discrepanza dichiarata è risolta**
|
||||||
|
|
||||||
|
CLAUDE.md portava un ⚠ aperto: *«Discrepanza col 24/07 (P(vivo) A@0.75x 58% vs 10% mio)»*, con
|
||||||
|
l'ipotesi che fosse un effetto-finestra. **Non era la finestra, era la lente:**
|
||||||
|
|
||||||
|
| finestra | lente | P(pass) | P(vivo 1a) | E[payout/a] |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 2019-03+ FULL | close | 53.8% | 79.7% | $2.085 |
|
||||||
|
| **2019-03+ FULL** | **accoppiato** | 48.1% | **63.2%** | $1.618 |
|
||||||
|
| 2024+ comune | close | 47.0% | 74.8% | $1.632 |
|
||||||
|
| 2024+ comune | accoppiato | 35.6% | 39.4% | $770 |
|
||||||
|
|
||||||
|
Sulla **stessa finestra piena** del 24/07 (recon MTM indipendente, che dava **58%**) la mia lente
|
||||||
|
accoppiata dà **63.2%** — accordo entro 5pp, con due implementazioni scritte separatamente. Il
|
||||||
|
**10%** del 25/07 era l'artefatto della lente indipendente. La finestra spiega il resto
|
||||||
|
(63.2% full → 39.4% sul 2024+, dove config A è debole).
|
||||||
|
|
||||||
|
### (3) Bound severo su XS01 — **non ribalta niente**
|
||||||
|
|
||||||
|
È XS01 a reggere il vantaggio della config diversificata, e il suo gap dipende da una convenzione
|
||||||
|
(ordinamento condiviso). Girato anche il bound opposto — ogni gamba al **proprio** peggio nello
|
||||||
|
stesso istante, fisicamente impossibile su 10 gambe co-moventi ma utile a delimitare l'errore:
|
||||||
|
|
||||||
|
| convenzione | gap p90 | peggiore | P(pass) | P(vivo 1a) | E[payout/a] |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| ordine condiviso (base) | −0.86pp | −4.81pp | 42.9% | **76.0%** | $1.144 |
|
||||||
|
| per-gamba (bound severo) | −1.83pp | −15.56pp | 32.3% | **57.6%** | $814 |
|
||||||
|
| *config A, per confronto* | — | — | 35.6% | **39.4%** | $770 |
|
||||||
|
|
||||||
|
Anche al bound severo **config B resta sopra config A** (57.6% vs 39.4%, $814 vs $770). La
|
||||||
|
conclusione non dipende dalla convenzione.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5. Cosa cambia nelle decisioni
|
||||||
|
|
||||||
|
### 5.1 La raccomandazione HyroTrader si sposta da 0.50x a **0.75x**
|
||||||
|
|
||||||
|
Config B (book diversificato, +XS01), lente accoppiata, finestra 2024+:
|
||||||
|
|
||||||
|
| leva | P(pass eval) | P(vivo 1a) | E[payout/a] | **E[payout] su 3 anni** |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 0.50x | 28.6% | 99.5% | $412 | ~$1.230 |
|
||||||
|
| **0.75x** | 42.9% | 76.0% | $1.144 | **~$2.674** |
|
||||||
|
| 1.00x | 46.6% | 42.1% | $1.246 | ~$1.992 |
|
||||||
|
|
||||||
|
Stamattina la scelta era **0.50x**, perché la lente indipendente dava a 0.75x una sopravvivenza
|
||||||
|
del 55%. Con la lente onesta la sopravvivenza a 0.75x è **76%**, e 0.75x **massimizza il payout
|
||||||
|
atteso su 3 anni** — batte 0.50x di 2,2× e 1.00x di 1,3× (a 1.00x la sopravvivenza crolla e
|
||||||
|
l'effetto composto la punisce). L'argomento del 25/07 — *"la sopravvivenza compone su più anni"* —
|
||||||
|
resta valido; è il punto in cui morde che si sposta.
|
||||||
|
|
||||||
|
### 5.2 La scala di conti: il ranking regge, i livelli no
|
||||||
|
|
||||||
|
| lente | leva | MISTO EUR/g med | P(≥10/g) | P(≥50/g) | P(zero) |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| close-only | 1.00x | 11.11 | 50.8% | **22.0%** | 33.9% |
|
||||||
|
| **accoppiata** | **0.75x** | 0.00 | **29.7%** | 5.6% | **52.2%** |
|
||||||
|
| **accoppiata** | **1.00x** | 0.00 | 20.8% | **6.5%** | 65.5% |
|
||||||
|
| indipendente | 1.00x | 0.00 | 5.2% | 1.0% | 81.5% |
|
||||||
|
|
||||||
|
- **L'ordinamento fra politiche SOPRAVVIVE a tutte e tre le lenti**: MISTO ≥ CONC-DIV >
|
||||||
|
CONC-2SL ≈ SPARSO. L'affermazione di stamattina — *«il confronto fra POLITICHE è robusto:
|
||||||
|
è la stessa lente applicata a tutte»* — è confermata su una lente che allora non esisteva.
|
||||||
|
**CONC-2SL (= il book live attuale su ogni conto) resta la peggiore o penultima ovunque.**
|
||||||
|
- **I livelli si spostano parecchio.** La stima onesta di P(≥50/g) in 3 anni è **~5,6-6,5%**, non
|
||||||
|
1,6-2,5% e non 20,7%. La scala è **~3-4× più probabile** di quanto diceva il pavimento e
|
||||||
|
**~3,4× meno** di quanto diceva il tetto.
|
||||||
|
- **P(≥10/g) è massima a 0.75x (29,7%)**, non alla leva piena: l'ottimo di leva della scala
|
||||||
|
coincide con quello del conto singolo.
|
||||||
|
- Il prezzo resta alto: **P(bruciare i €600) = 52% a 0.75x, 65% a 1.00x.**
|
||||||
|
|
||||||
|
### 5.3 Il verdetto sul goal, ristretto
|
||||||
|
|
||||||
|
Il 25/07 concludeva: *«una via da €600 a €50/g ESISTE con P ~2-21% in 3 anni e P(bruciare i €600)
|
||||||
|
~33-78% → scommessa a coda destra, NON una rendita»*. Con la lente onesta la banda si stringe:
|
||||||
|
|
||||||
|
> **P(≥50 €/g entro 3 anni) ≈ 6%, con P(perdere i €600) ≈ 52-65%.**
|
||||||
|
> Resta una scommessa a coda destra. Ma è una scommessa con una probabilità **conoscibile**,
|
||||||
|
> non un intervallo di un ordine di grandezza.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6. Cosa NON cambia
|
||||||
|
|
||||||
|
- **Book, pesi, cron: invariati.** Niente qui tocca il portafoglio.
|
||||||
|
- Il fronte prop **non è aperto**: questo lavoro dice *cosa costerebbe e con quale probabilità*,
|
||||||
|
non che vada fatto.
|
||||||
|
- Resta il caveat di finestra del 25/07: il **2024+** è la finestra in cui XS01 è stato scoperto e
|
||||||
|
affinato → la **taglia** del vantaggio di config B è ottimista; il **meccanismo** (correlazione
|
||||||
|
bassa → meno DD → più sopravvivenza sotto vincolo di DD) è robusto. La verifica (2) qui sopra
|
||||||
|
quantifica per la prima volta quanto pesa la finestra da sola (63.2% → 39.4% su config A).
|
||||||
|
- XS01 resta **STAT-MODE sul capitale proprio** (serve ~$20k). Su un conto funded da $100k è
|
||||||
|
eseguibile: è esattamente l'asimmetria capitale-proprio vs funded del §4 di stamattina.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7. Lezione da portare avanti
|
||||||
|
|
||||||
|
> **Un modello di rischio intraday non si valida sulla distribuzione marginale del wick, ma sul suo
|
||||||
|
> ACCOPPIAMENTO al rendimento del giorno.** Qui la marginale era calibrata quasi perfettamente
|
||||||
|
> (p50 −0.17pp identico) e ciò nonostante il modello sbagliava di 2-3× sui breach, perché metteva
|
||||||
|
> i tuffi sui giorni sbagliati. Un test "i percentili del mio wick sintetico coincidono con quelli
|
||||||
|
> del recon" sarebbe **passato**, e la stima sarebbe rimasta sbagliata.
|
||||||
|
|
||||||
|
Corollario controintuitivo, da ricordare perché è il contrario dell'intuizione: **l'escursione
|
||||||
|
intraday è più profonda nei giorni che chiudono bene**. I giorni che chiudono male chiudono *sul*
|
||||||
|
minimo. Ogni regola valutata sul minimo (daily-loss, trailing DD, stop di conto) va misurata su
|
||||||
|
tuple accoppiate, mai su un wick estratto a parte.
|
||||||
|
|
||||||
|
Terzo: **close-only non è una lente conservativa, è una lente cieca** per le regole intraday —
|
||||||
|
0.00% di breach da daily-loss su ogni configurazione testata. Va usata come controllo, mai come
|
||||||
|
stima.
|
||||||
@@ -0,0 +1,408 @@
|
|||||||
|
# 2026-07-25 — Rendita passiva: la curva capitale→book, il muro vero, e l'asimmetria del funded
|
||||||
|
|
||||||
|
**Contesto.** Goal: "altra sessione di ricerca per arrivare allo scopo (rendita passiva, 50 EUR/g),
|
||||||
|
i 600 euro si possono usare come si vuole". La roadmap del 24/07 aveva già chiuso i *canali*
|
||||||
|
(prop / vault / copy / legale). Questa ondata attacca i due punti che quella roadmap **assumeva**
|
||||||
|
invece di calcolare: (a) il tasso di crescita del book è preso come **CAGR fisso 15%**, (b) il
|
||||||
|
capitale-rendita è calcolato come **target/CAGR**, cioè ignorando il rischio di sequenza.
|
||||||
|
Entrambe le assunzioni sono risultate sbagliate, e nella stessa direzione: ottimista.
|
||||||
|
|
||||||
|
Script: `scripts/research/r0725_capcurve.py`, `scripts/research/r0725_prop_config.py`.
|
||||||
|
Test: `tests/test_capcurve.py` (10 casi). **Book live, pesi e config: INVARIATI.**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1) Difetto di eseguibilità su GTAA01 — il 5° sleeve del book attivo
|
||||||
|
|
||||||
|
`src/portfolio/gtaa.py` modella il costo come **2bps proporzionali** e lo sleeve è documentato
|
||||||
|
come *"eseguibile su IB a basso capitale (ETF frazionabili, switch mensile/basso turnover)"*.
|
||||||
|
Entrambe le cose sono false come codificate:
|
||||||
|
|
||||||
|
- il segnale è un vol-target **continuo**: l'esposizione cambia **ogni giorno** su **6 gambe**;
|
||||||
|
- IB non ha una fee proporzionale ma un **pavimento FISSO per ordine**:
|
||||||
|
`min(max($0.35, $0.0035/azione), 1% del controvalore)` → ~**$530/anno di commissioni
|
||||||
|
indipendenti dal capitale**.
|
||||||
|
|
||||||
|
| capitale allocato a GTAA | CAGR reale | Sharpe reale | drag commissioni |
|
||||||
|
|---|---|---|---|
|
||||||
|
| $600 | **−3.5%** | **−0.55** | 7.2%/anno |
|
||||||
|
| $2.000 | −0.7% | −0.09 | 4.4%/anno |
|
||||||
|
| $5.000 | +1.5% | 0.28 | 2.2%/anno |
|
||||||
|
| $50.000 | +3.4% | 0.59 | 0.2%/anno |
|
||||||
|
| *modello vecchio (2bps propor.)* | *+3.8%* | *0.64* | — |
|
||||||
|
|
||||||
|
⚠️ **Correzione a un errore MIO, trovata implementando il fix.** La prima stesura di questa
|
||||||
|
sezione citava il modello vecchio a *Sharpe 0.77 / CAGR 5.5%*: era un **artefatto di
|
||||||
|
annualizzazione** del mio script di analisi — metricavo la serie GTAA grezza (solo giorni di
|
||||||
|
borsa, ~252/anno) con `metrics()`, che annualizza a 365 e calcola `years = n/365.25` → Sharpe
|
||||||
|
gonfiato di √(365/252) = 1.20× e CAGR di ~1.45×. Le righe per-capitale erano già su calendario
|
||||||
|
365 (reindex + weekend a zero), quindi **il confronto era falsato solo sulla riga di riferimento**.
|
||||||
|
Valore corretto del modello vecchio: **0.64 / 3.8%**.
|
||||||
|
|
||||||
|
**La formulazione giusta del difetto cambia di conseguenza.** Non è "il modello sovrastimava lo
|
||||||
|
Sharpe di 0.13": alla taglia grande il modello vecchio era sostanzialmente **giusto** (0.64 contro
|
||||||
|
0.59-0.66 reali). Il difetto è che era **CIECO AL CAPITALE** — dava 0.64 sia a $50.000 sia a $600,
|
||||||
|
mentre a $600 la realtà è **−0.55**. Un modello di costo proporzionale non può descrivere un
|
||||||
|
pavimento fisso, e l'errore è tutto concentrato dove lo sleeve verrebbe realmente deployato.
|
||||||
|
|
||||||
|
**La banda lo salva.** Con costo fisso la banda ottimale non è il minimo eseguibile (come su
|
||||||
|
Deribit) ma un valore molto più alto. Plateau robusto = **cadenza settimanale × banda $25-100**
|
||||||
|
→ Sharpe 0.45-0.64 a *ogni* capitale; a $600 la config scelta sul plateau (banda $50, weekly)
|
||||||
|
dà **Sh 0.52 / CAGR 3.0%** invece di −0.55/−3.5%. (La cella argmax a $600 era banda $50 *daily*
|
||||||
|
a 0.57, ma è isolata — crolla a 0.28 a banda 100 → scartata: il parametro è di costo, si sceglie
|
||||||
|
sul plateau, non sull'argmax in-sample.)
|
||||||
|
|
||||||
|
**Conseguenza operativa: CABLATO** (stessa sessione, `src/portfolio/gtaa.py`). Il modulo ora
|
||||||
|
modella il costo IB reale (`ib_commission`), esegue a **banda + cadenza** (settimanale, $50/gamba),
|
||||||
|
prende il **capitale allocato** come parametro (`gtaa_returns(capital=...)`), dichiara la soglia
|
||||||
|
di deployabilità (`GTAA_MIN_CAPITAL = $3.000`, `gtaa_is_deployable`) ed espone
|
||||||
|
**`gtaa_rebalance_plan(held, capital)`** — il piano che l'esecutore deve usare per non ribilanciare
|
||||||
|
ogni giorno per pochi dollari. `sleeves.py` dichiara esplicitamente il capitale assunto
|
||||||
|
(`GTAA_DEFAULT_CAPITAL = $10.000` allocati ≈ book $50k al peso 20%) invece di nasconderlo.
|
||||||
|
|
||||||
|
**Impatto sul book, misurato prima/dopo** (non citato: ricalcolato sostituendo la sola gamba GTAA):
|
||||||
|
|
||||||
|
| | GTAA01 standalone | book 5 sleeve FULL | HOLD | maxDD |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| prima (2bps, continuo) | Sh 0.64 / CAGR 3.76% | 2.22 | 2.36 | 6.2% |
|
||||||
|
| dopo (IB reale + banda) | Sh 0.61 / CAGR 3.65% | 2.22 | **2.38** | **6.0%** |
|
||||||
|
|
||||||
|
Alla taglia assunta l'impatto sul book è **trascurabile** — il fix non è cosmetico per i numeri
|
||||||
|
storici, lo è per il **deploy**: è a $600-2.000 che cambia tutto (da −3.5%/anno a +3.0%/anno).
|
||||||
|
Pesi **invariati** (nessun cambio pesi → nessun `weights_tilt_null` richiesto).
|
||||||
|
|
||||||
|
**Regola nuova (generale): il costo di un venue va modellato nella sua FORMA — fisso vs
|
||||||
|
proporzionale — non solo nel suo livello.** Due venue con lo stesso "costo medio" danno
|
||||||
|
risultati **opposti** al variare del capitale: la fee proporzionale è neutrale alla taglia, il
|
||||||
|
pavimento fisso è una tassa regressiva che si mangia i piccoli. Ogni sleeve nuovo va incrociato
|
||||||
|
col modello di costo del suo venue *prima* di dichiararlo eseguibile.
|
||||||
|
|
||||||
|
**Controprova su Deribit (fee proporzionale, nessun pavimento):** lo Sharpe realistico di TP01
|
||||||
|
coincide col modellato da ~$500 in su (1.29 a $1k = 1.29 a $50k) → conferma indipendente della
|
||||||
|
lezione già a libro *"a $600 il min-order $5 è già la banda ottimale"*.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 2) La rendita NON è `capitale × CAGR` — il muro del 24/07 era ottimista di 2-4×
|
||||||
|
|
||||||
|
Una rendita passiva si preleva **mentre** il book è in drawdown: è rischio di sequenza, e
|
||||||
|
`target/CAGR` non lo vede. Calcolato col bootstrap a blocchi (20g) dei ritorni **reali** del book
|
||||||
|
(TP01 75 / SKH01 25, SKH01 sul **path live** orario, non sul backtest):
|
||||||
|
|
||||||
|
| lente | Sharpe | CAGR | SWR 20a (95% sopravv.) | **rendita perpetua** | capitale per 50 EUR/g |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| modellato (backtest) | 1.75 | 20.5% | 13.10% | 13.57% | $219k |
|
||||||
|
| path live | 1.64 | 19.7% | 12.48% | 12.78% | $232k |
|
||||||
|
| **path live de-luck ×0.6** | **0.98** | **11.1%** | **7.31%** | **5.98%** | **$497k** |
|
||||||
|
|
||||||
|
*"Rendita perpetua"* = prelievo massimo con **P(capitale a 20 anni ≥ capitale iniziale) ≥ 90%**.
|
||||||
|
È il criterio giusto: "sopravvivere 20 anni" non è una rendita, è un piano di consumo del capitale.
|
||||||
|
|
||||||
|
**Il muro vero per 50 EUR/g perpetui è $300k-$500k**, non i €122k del diario 24/07. L'errore si
|
||||||
|
componeva di due fattori nella stessa direzione: (a) `capital×CAGR` ignora la sequenza (−45%
|
||||||
|
circa sul tasso), (b) CAGR 15% invece del de-luckato 11%.
|
||||||
|
|
||||||
|
⚠️ **Sul de-luck, onestà metodologica:** il ×0.6 sul drift è la convenzione ereditata dal 24/07,
|
||||||
|
ma qui è applicato **sopra** il path live orario, che *già* incorpora la degradazione di SKH01
|
||||||
|
(fill al livello → fill orario). C'è quindi un rischio concreto di **doppio conteggio** della
|
||||||
|
stessa penalità. Il muro va perciò letto come una **banda**, non come un punto:
|
||||||
|
**$232k (path live, nessun de-luck ulteriore) — $497k (path live + de-luck ×0.6)**, con la stima
|
||||||
|
centrale ragionevolmente attorno a **$300-400k**. Ciò che NON dipende dal de-luck è il risultato
|
||||||
|
strutturale: la rendita perpetua vale ~**45-55% del CAGR**, non il 100% — quindi qualunque muro
|
||||||
|
calcolato come `target/CAGR` è sbagliato per un fattore ~2, indipendentemente dalla lente.
|
||||||
|
|
||||||
|
Al capitale attuale: **$600 → ~€0.11/giorno** di rendimento atteso, ~€0.06/g come rendita perpetua.
|
||||||
|
|
||||||
|
*(Fisco incluso: 50 EUR/g netti = €18.250/anno netti = **$29.690/anno lordi** al 33%.)*
|
||||||
|
|
||||||
|
**Validazione della macchineria** (obbligatoria, 3 casi a risposta nota): asset deterministico
|
||||||
|
al 10%/anno → rendita perpetua fra 9% e 10% ✓; random walk a drift zero → rendita 0 ✓; book a
|
||||||
|
prelievo nullo → P(rovina)=0 e mediana 37.6× in 20 anni ≈ 1.197²⁰ ✓.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 3) La diversificazione non crea reddito a pari nozionale — libera budget di rischio
|
||||||
|
|
||||||
|
Il test che conta, per tier di sblocco (tutti de-luck ×0.6, GTAA01 a costo IB reale con banda):
|
||||||
|
|
||||||
|
| tier | Sharpe | vol | rendita @iso-nozionale | capitale | @ISO-RISCHIO (vol 15%) | capitale |
|
||||||
|
|---|---|---|---|---|---|---|
|
||||||
|
| $600 — 2 sleeve | 0.98 | 11.4% | 5.98% | $497k | 1.32× → **7.51%** | $395k |
|
||||||
|
| $2k — + GTAA01 | 1.02 | 9.2% | 5.39% | $551k | 1.64× → 7.92% | $375k |
|
||||||
|
| $20k — + XS01 | 1.11 | 9.3% | 6.28% | $472k | 1.61× → **9.25%** | **$321k** |
|
||||||
|
| $20k — + XS01 + VRP01 (contro-fattuale) | 1.15 | 8.8% | 6.35% | $467k | 1.70× → 9.82% | $302k |
|
||||||
|
|
||||||
|
**A pari nozionale il muro NON si abbassa** (5.98% → 6.35%: nulla). Un diversificatore a basso
|
||||||
|
CAGR toglie vol e ritorno insieme. **A iso-rischio sì**: −19% di muro ($395k → $321k).
|
||||||
|
|
||||||
|
**Regola: un diversificatore a basso CAGR si giudica a ISO-RISCHIO, mai a iso-nozionale.** È il
|
||||||
|
"null de-levering" del progetto applicato al contrario — lì si smascherava un finto taglio di DD
|
||||||
|
comprato con la size, qui si smaschera un finto *mancato* guadagno per non aver rilevato la size.
|
||||||
|
|
||||||
|
*(L'ipotesi di partenza — "più capitale → più sleeve → CAGR super-lineare" — è quindi **refutata**
|
||||||
|
nella forma forte: la curva Sharpe del book eseguibile è **piatta** da $600 a $200k, perché TP01 su
|
||||||
|
Deribit non ha pavimento di costo e SKH01 nemmeno. Sopravvive solo nella forma debole, via iso-rischio.)*
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 4) Traiettoria onesta (bootstrap, de-luck, target $497k)
|
||||||
|
|
||||||
|
| deposito | p10 | mediana | p90 | P(entro 10a) | P(entro 20a) |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| €0/mese | — | — | — | 0% | **0%** |
|
||||||
|
| €250/mese | 18.9a | 22.4a | 24.6a | 0% | 8% |
|
||||||
|
| €500/mese | 15.6a | 19.6a | 23.4a | 0% | 48% |
|
||||||
|
| €1.000/mese | 11.6a | 14.8a | 18.7a | 2% | 95% |
|
||||||
|
| €2.000/mese | 8.1a | 10.1a | 12.8a | 48% | 100% |
|
||||||
|
|
||||||
|
Senza depositi, da $600, la rendita da 50 EUR/g **non arriva mai** (0% dei path in 20 anni).
|
||||||
|
Il moltiplicatore è il deposito, non il rendimento: è la stessa conclusione del 24/07, ma su un
|
||||||
|
target 4× più alto e quindi con tempi ~2× più lunghi.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 5) L'ASIMMETRIA — il risultato strategico della sessione
|
||||||
|
|
||||||
|
Il 24/07 ha valutato il fronte prop **solo col book a 2 sleeve** (quello eseguibile a $600). Ma su
|
||||||
|
un conto funded il capitale non è $600, è **$100k** — e gli sleeve che a casa nostra sono STAT-MODE
|
||||||
|
*per taglia* (XS01 serve ~$20k) **diventano eseguibili**. Le regole prop, inoltre, passano sul
|
||||||
|
**drawdown**, non sul CAGR: premiano esattamente ciò che la diversificazione produce.
|
||||||
|
|
||||||
|
Finestra comune 2024+, de-luck ×0.6, crypto-only (niente GTAA01 che è equity su IB, niente VRP01):
|
||||||
|
|
||||||
|
| | P(pass) HYRO 1.0× | P(pass) FTMO 1.5× | **funded HYRO 1.0×: P(vivo 1a)** | funded FTMO 1.0×: P(vivo) | E[payout] FTMO | EUR/g atteso |
|
||||||
|
|---|---|---|---|---|---|---|
|
||||||
|
| A: TP01/SKH01 (live oggi) | 44.4% | 51.9% | **18.9%** | 58.8% | $8.655 | 14.58 |
|
||||||
|
| B: + XS01 (19 alt perp) | **54.7%** | **70.0%** | **57.6%** | **92.0%** | **$9.333** | **15.72** |
|
||||||
|
|
||||||
|
**Il salto è nella sopravvivenza: 18.9% → 57.6% (3×) sul conto funded HYRO a leva 1.0×.** E la
|
||||||
|
raccomandazione del 24/07 ("funded a 0.75×, mai 1.0×") si **ribalta** col book diversificato: su
|
||||||
|
FTMO a 1.0× la sopravvivenza è 92%.
|
||||||
|
|
||||||
|
**L'asimmetria in una riga:** sul **capitale proprio** diversificare non aumenta il reddito (il
|
||||||
|
reddito è `C × tasso`, e il tasso sale poco); su un **conto funded** lo aumenta molto, perché lì
|
||||||
|
il vincolo binding non è il capitale ma la **regola di drawdown**. → **Gli sleeve "inutili a $600
|
||||||
|
perché STAT-MODE" sono esattamente gli asset di maggior valore sull'unico canale che scala in mesi.**
|
||||||
|
Questo inverte la priorità implicita di dieci ondate di ricerca.
|
||||||
|
|
||||||
|
**Caveat forte, dichiarato.** (1) Il MC è **close-only**: C-bis del 24/07 ha dimostrato che i wick
|
||||||
|
intraday tagliano 6-37pp → **i livelli assoluti qui sono un TETTO**. Il ricostruttore MTM intraday
|
||||||
|
esiste solo per TP01+SKH01 (feed 5m); XS01 è 1d nativo su Hyperliquid e il suo intraday non è
|
||||||
|
ricostruibile dai nostri dati → non l'ho inventato. Il **delta** fra config è la misura onesta ed
|
||||||
|
è **conservativo** (B ha vol minore → wick minori → haircut minore). (2) La finestra comune 2024+
|
||||||
|
è **quella in cui XS01 è stato scoperto e affinato** → la *taglia* del guadagno è ottimista; sulla
|
||||||
|
finestra piena il delta si riduce (P(pass) 56.9%→58.5%, P(vivo) 14.9%→21.8%) ma quella è
|
||||||
|
sfavorevole a B per costruzione (pre-2024 B degenera in A). Il **meccanismo** (corr bassa → meno
|
||||||
|
DD → più sopravvivenza sotto vincolo di DD) è robusto; la sua taglia no.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 6) LA VIA — i 600 euro come BIGLIETTO, non come capitale (`r0725_prop_ladder.py`)
|
||||||
|
|
||||||
|
Se i €600 come *capitale* sono refutati (§2, §4), restano i €600 come **biglietto**: si compra
|
||||||
|
un'evaluation, il conto funded moltiplica il **nozionale** senza possedere capitale, i payout
|
||||||
|
comprano altri biglietti. È l'unica leva che non richiede depositi. Il 24/07 si era fermato a
|
||||||
|
**un** conto ($100k → ~€14.5/g, cap $200k/firm). Ma €50/g richiede **più conti in parallelo** —
|
||||||
|
e qui c'è il problema che nessuno aveva studiato:
|
||||||
|
|
||||||
|
> **N conti che girano lo stesso book bustano INSIEME.** La diversificazione fra conti è
|
||||||
|
> illusoria salvo assegnare **sleeve diversi a conti diversi**.
|
||||||
|
|
||||||
|
È un problema di costruzione di portafoglio sotto **barriera di rovina per-conto**, e non è ovvio
|
||||||
|
quale verso vinca: concentrare alza lo Sharpe *per conto* (sopravvivenza individuale) ma rende le
|
||||||
|
morti perfettamente correlate; sparpagliare decorrela le morti ma ogni conto ha Sharpe più basso
|
||||||
|
e quindi buca più spesso la propria barriera.
|
||||||
|
|
||||||
|
Simulazione: 36 mesi, cassa iniziale €600, max 6 conti, 2 firm (cap $200k/$400k), regole vere,
|
||||||
|
payout mensile 80% prelevato subito, fisco 33%, **rischio-morte firm 10%/anno**, bootstrap a
|
||||||
|
blocchi **congiunto** dei 3 sleeve (la correlazione fra conti è quella *reale*: TP01–SKH01 +0.10,
|
||||||
|
TP01–XS01 −0.12, SKH01–XS01 −0.00).
|
||||||
|
|
||||||
|
| politica (leva 1.0×) | EUR/g mediano | p90 | P(≥10/g) | **P(≥50/g)** | P(zero) |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| CONC-2SL — ogni conto = book live attuale | 0.00 | 63.2 | 26.1% | 13.1% | 55.6% |
|
||||||
|
| CONC-DIV — ogni conto = book diversificato | 5.70 | 70.6 | 44.9% | 17.8% | 33.4% |
|
||||||
|
| SPARSO — 1 sleeve per conto | 0.00 | 76.3 | 26.2% | 16.8% | **66.0%** |
|
||||||
|
| **MISTO — metà diversificati, metà single** | **10.70** | 75.1 | **50.6%** | **20.7%** | 33.4% |
|
||||||
|
|
||||||
|
*(lente close-only)*
|
||||||
|
|
||||||
|
**Risultato non ovvio: vince il MISTO, non gli estremi.** Ogni conto ha bisogno di abbastanza
|
||||||
|
Sharpe per sopravvivere alla *propria* barriera (questo uccide SPARSO: P(zero) 66%), ma i conti
|
||||||
|
hanno anche bisogno di essere decorrelati fra loro (questo penalizza CONC). E il **book live
|
||||||
|
attuale a 2 sleeve è la politica peggiore** di tutte.
|
||||||
|
|
||||||
|
**La lente onesta però è più dura.** Le regole prop scattano sull'equity *intraday*. Con i wick
|
||||||
|
(lognormale calibrato sui percentili del recon MTM 1h del 24/07: p50 −0.17pp, p90 −0.90pp,
|
||||||
|
p99 −3.50pp, scalati sulla vol di ogni config):
|
||||||
|
|
||||||
|
| politica (leva 1.0×, INTRADAY) | EUR/g mediano | p90 | P(≥10/g) | **P(≥50/g)** | P(zero) |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| CONC-2SL | 0.00 | 2.18 | 4.8% | 1.7% | 85.1% |
|
||||||
|
| CONC-DIV | 0.00 | 7.34 | 9.0% | **2.5%** | 78.1% |
|
||||||
|
| SPARSO | 0.00 | 0.02 | 1.3% | 0.3% | 89.9% |
|
||||||
|
| MISTO | 0.00 | 4.89 | 6.6% | 1.6% | 78.1% |
|
||||||
|
|
||||||
|
⚠️ **Il mio modello di wick è un PAVIMENTO, non una stima puntuale**: il gap è estratto
|
||||||
|
**indipendente dal rendimento del giorno**, mentre i wick veri sono *accoppiati* alle giornate
|
||||||
|
brutte → estrarli indipendenti aggiunge finti tuffi anche nelle giornate buone, cioè breach spuri.
|
||||||
|
Il modo corretto è il bootstrap delle **tuple (ritorno, gap)** come in `r0724_goal50_intraday_mc.py`,
|
||||||
|
che però ha il recon solo per TP01+SKH01 (XS01 è 1d nativo su Hyperliquid, intraday non
|
||||||
|
ricostruibile dai nostri dati) → **follow-up dichiarato, non simulato**.
|
||||||
|
|
||||||
|
**Verdetto in banda (ed è la risposta al goal):**
|
||||||
|
> Una via da €600 a €50/giorno **esiste** ed è la scala di conti funded. In 3 anni ha una
|
||||||
|
> probabilità **fra il 2% e il 21%** di arrivarci, e una probabilità **fra il 33% e il 78%** di
|
||||||
|
> bruciare interamente i €600. Il valore atteso è positivo rispetto ai €600 tenuti come capitale
|
||||||
|
> (~€0.11/g ⇒ ~€120 in 3 anni), ma è una **scommessa a coda destra, non una rendita**.
|
||||||
|
|
||||||
|
Il confronto fra *politiche* è invece robusto (stessa lente per tutte) e ha un'implicazione
|
||||||
|
diretta: **se si apre il fronte prop, non mandarci il book live attuale** — è l'ultima delle
|
||||||
|
quattro politiche in entrambe le lenti.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 7) ADDENDUM — "e se metto 10K su IB?" (`r0725_ib10k.py`)
|
||||||
|
|
||||||
|
Domanda dell'operatore a valle dell'ondata. Non è una domanda su GTAA01: è **allocazione fra due
|
||||||
|
venue** con profili opposti — Deribit (TP01+SKH01) è il **motore** (CAGR ~11% de-luck, vol 11.3%),
|
||||||
|
IB (GTAA01) è un **diversificatore** (CAGR ~3.9%, vol ~5%, corr ~+0.10). Tre effetti da contare
|
||||||
|
insieme: (a) il deposito **sblocca** GTAA01 (il pavimento di commissione passa dall'1-3% per ordine
|
||||||
|
a ~0.02% → §1 risolto); (b) sposta il baricentro su un venue a CAGR basso; (c) cambia l'**aliquota**
|
||||||
|
(ETF 26% vs crypto 33%, assunzione dichiarata).
|
||||||
|
|
||||||
|
Capitale totale $11.500 ($600 Deribit + €10k), de-luck ×0.6, SKH01 path live:
|
||||||
|
|
||||||
|
| quota su IB | Sharpe | CAGR | maxDD | €/g atteso | rendita perpetua |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| 0% (tutto Deribit) | 0.99 | 11.2% | 15.3% | **2.16** | €1.16/g |
|
||||||
|
| 25% | 1.06 | 9.3% | 12.0% | 1.85 | €1.08/g |
|
||||||
|
| 50% | **1.13** | 7.5% | 11.2% | 1.54 | €0.98/g |
|
||||||
|
| 94% (= i 10k su IB) | 0.84 | 4.4% | 10.5% | **0.93** | €0.61/g |
|
||||||
|
|
||||||
|
**Mettere i 10k su IB più che dimezza il reddito** (€0.93 vs €2.16/g): è la §3 di questo stesso
|
||||||
|
diario vista dal lato pratico — un diversificatore a basso CAGR diluisce l'income a pari nozionale.
|
||||||
|
|
||||||
|
**E la via d'uscita (levare) è chiusa dai costi.** Lo Sharpe migliore (1.13 a 50/50) si converte in
|
||||||
|
reddito solo con leva; ma su ETF a IB con €10k c'è la **Reg-T (2× max**, il portfolio margin parte
|
||||||
|
da ~$110k) e il margine costa **~5.5%/anno**. Contando il finanziamento:
|
||||||
|
|
||||||
|
| quota IB | leva attuabile | CAGR lordo | costo leva | CAGR netto | rendita |
|
||||||
|
|---|---|---|---|---|---|
|
||||||
|
| **0%** | 1.33× | 14.8% | 0.7% | **14.1%** | **€1.33/g** |
|
||||||
|
| 25% | 1.71× | 15.9% | 2.0% | 13.9% | €1.25/g |
|
||||||
|
| 50% | 2.27× | 17.1% | 4.8% | 12.4% | €0.92/g |
|
||||||
|
| 94% | 2.06× | 9.0% | 5.6% | 3.4% | €0.00/g |
|
||||||
|
|
||||||
|
→ **con leva attuabile E costo del margine, vince tutto-Deribit a 1.33×.** Il diversificatore
|
||||||
|
permetterebbe di levare di più, ma il finanziamento costa più di quanto aggiunge.
|
||||||
|
**Regola: l'argomento iso-rischio (§3) vale solo se la leva è (a) disponibile e (b) a costo
|
||||||
|
inferiore all'uplift — su un conto retail da €10k su ETF non lo è.**
|
||||||
|
|
||||||
|
**Il confronto che ridimensiona GTAA01:** €10k in GTAA01 = **€0.93/g con maxDD 10.5%**; gli stessi
|
||||||
|
€10k **fermi** a interesse ~2% = **€0.54/g con maxDD ~0%**. Il premio dello sleeve sopra la
|
||||||
|
liquidità è **~€0.50/g pagato con un drawdown del 10%** — in isolamento un cattivo affare (e un
|
||||||
|
monetario/BTP EUR renderebbe più del 2% assunto).
|
||||||
|
|
||||||
|
**Raccomandazione:** se arrivano €10k, il posto produttivo è **Deribit**. Chi vuole meno drawdown
|
||||||
|
può tenere **25% su IB**: costa ~€0.08/g di rendita e taglia il maxDD dal 15.3% al 12.0% — è
|
||||||
|
l'unico split che regge anche coi costi di finanziamento. Il 94% su IB no.
|
||||||
|
|
||||||
|
⚠️ **Caveat che rende il confronto meno netto di come appare:** il CAGR crypto (11%) viene da ~7
|
||||||
|
anni che contengono **due bull market**; il 3.9% di GTAA01 da ~30 anni con dentro più orsi. Il
|
||||||
|
confronto **favorisce il crypto per costruzione** — il numero crypto ha più probabilità di deludere.
|
||||||
|
Tassi (margine 5.5%, liquidità 2%) e aliquote (26%/33%) sono assunzioni dichiarate; le aliquote
|
||||||
|
vanno confermate col commercialista (**non è un parere fiscale**).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 8) HYROTRADER nello specifico (`r0725_hyro.py`)
|
||||||
|
|
||||||
|
La firm che il 24/07 aveva messo prima in classifica per *questo* book: unica con **API reale** da
|
||||||
|
funded (sub-account Bybit) → il book gira automatico; **nessun limite di tempo** sull'eval (una
|
||||||
|
strategia lenta non è penalizzata); **weekend consentito** — non banale, l'ondata 2026-07-17 ha
|
||||||
|
misurato che il weekend porta il **38% del gross di TP01**. Biglietti $25k/$249, $50k/$379,
|
||||||
|
$100k/$579, cap $200k, split 80%, fee rimborsata al pass.
|
||||||
|
|
||||||
|
Due regole mordono proprio noi, e nessuna analisi le aveva modellate: **maxDD 6% STATICO** e
|
||||||
|
**consistency 40%** (nessun giorno > 40% del profitto totale, in eval).
|
||||||
|
|
||||||
|
**Ipotesi refutata: la consistency NON morde.** Avevo previsto una tagliola (SKH01 ha P&L a
|
||||||
|
scalino, TP01 fa strappi di trend). Misurato: **costo ≈ 0pp** a ogni leva e in entrambe le lenti.
|
||||||
|
Ragione strutturale: il book accumula il 10% in **130-300 giorni**, quindi nessun singolo giorno
|
||||||
|
si avvicina al 40% del cumulato. ⚠️ Prima di dichiararlo ho dovuto **provare che il controllo
|
||||||
|
funziona** (un "costo 0" può essere un bug): `test_consistency_MORDE_su_un_book_grumoso` mostra
|
||||||
|
che su un book con profitto concentrato in 1-2 giorni la regola porta P(pass) da >90% a <5%. Il
|
||||||
|
meccanismo c'è; è il book a non essere grumoso abbastanza. *(Il primo probe era sbagliato — strappi
|
||||||
|
ripetuti si diluiscono a vicenda, e sim_eval fa block-bootstrap, non replay: due iterazioni di test
|
||||||
|
prima di avere un discriminante valido.)*
|
||||||
|
|
||||||
|
**Il vincolo vero è il DD 6% statico.** Finestra comune 2024+, de-luck ×0.6:
|
||||||
|
|
||||||
|
| | Sharpe | CAGR | vol | maxDD |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| A — book live (TP01/SKH01) | 0.74 | 7.2% | 10.1% | 9.5% |
|
||||||
|
| B — + XS01 | **1.13** | 10.0% | 8.8% | **6.2%** |
|
||||||
|
|
||||||
|
Config A ha maxDD 9.5% contro un limite di 6%: **strutturalmente incompatibile a leva piena**.
|
||||||
|
|
||||||
|
**Funded $100k, P(vivo 1 anno) / €-giorno:**
|
||||||
|
|
||||||
|
| config | leva | close-only (tetto) | intraday (pavimento) |
|
||||||
|
|---|---|---|---|
|
||||||
|
| A | 0.50× | 80.2% / €8.33 | 44.0% / €6.86 |
|
||||||
|
| A | 0.75× | 51.1% / €12.21 | **10.1%** / — |
|
||||||
|
| A | 1.00× | 27.1% / €13.89 | **1.4%** / — |
|
||||||
|
| B | 0.50× | 98.5% / €8.69 | **71.0%** / €7.69 |
|
||||||
|
| B | 0.75× | 85.4% / €12.78 | 31.6% / €8.66 |
|
||||||
|
| B | 1.00× | 66.0% / €16.20 | 9.9% / — |
|
||||||
|
|
||||||
|
**EV del biglietto** (config B, eval 1.0×, funded a leva ottima, 1 anno): close-only P(pass) 73.0%
|
||||||
|
→ EV **+$6.789** sul biglietto $100k; intraday P(pass) 31.1% → EV **+$1.166**. **Positivo in
|
||||||
|
entrambe le lenti** — ma con ~69% di probabilità di perdere la fee nella lente pessimista.
|
||||||
|
|
||||||
|
**Raccomandazione operativa:**
|
||||||
|
1. **Config B (con XS01), non il book live attuale.** A 1.0× intraday config A sopravvive l'1.4%:
|
||||||
|
mandarci il book a 2 sleeve a leva piena è morte quasi certa.
|
||||||
|
2. **Funded a 0.50×** (non 0.75× come indicava il 24/07 per la config A): E[payout] scende poco
|
||||||
|
(€7.69 vs €8.66/g) ma la sopravvivenza raddoppia (71% vs 32%) — e su orizzonti pluriennali la
|
||||||
|
sopravvivenza **compone**, un conto bustato smette di produrre per sempre.
|
||||||
|
3. Eval a 0.75-1.0×; biglietto $25-50k come test economico — l'EV scala **linearmente** con la
|
||||||
|
taglia, quindi la ragione per partire piccoli è varianza e apprendimento, non EV.
|
||||||
|
4. **Cap $200k/trader ⇒ ~€15-30/g anche negli scenari buoni.** Per €50/g servono più firm → §6.
|
||||||
|
|
||||||
|
⚠️ **Discrepanza dichiarata col 24/07:** lì il funded di config A a 0.75× dava P(vivo) 58%, qui
|
||||||
|
10%. Due cause note: (a) il mio wick è a estrazione indipendente (più severo — §6); (b) finestra
|
||||||
|
2024+, dove config A è debole (Sharpe 0.74 vs 0.99 sulla finestra piena). **La direzione concorda
|
||||||
|
(meno leva è meglio), il livello no** — e il numero del 24/07 usa il recon MTM vero, quindi sul
|
||||||
|
livello è più affidabile del mio.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Bug catturato in sessione
|
||||||
|
|
||||||
|
**Modello funded, base di prelievo aggiornata ogni giorno come un HWM mobile** → al checkpoint
|
||||||
|
mensile `eq > hwm` è quasi sempre falso → guadagno misurato ≈ 0 → **payout $230/anno invece di
|
||||||
|
~$7.000**. Le regole vere sono a max-loss **statico dal saldo iniziale**, con la base ripristinata
|
||||||
|
dopo ogni prelievo. Corretto e bloccato da `test_funded_payout_non_e_zero_regressione_hwm`.
|
||||||
|
Famiglia nota: numero plausibile, meccanismo sbagliato — si prende solo con una sanity a risposta nota.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Decisioni e non-decisioni
|
||||||
|
|
||||||
|
**Cablato:** nulla sul path live. Book, pesi, config, cron: **invariati**.
|
||||||
|
|
||||||
|
**Raccomandazioni all'operatore (non automatizzabili):**
|
||||||
|
1. **Se si apre il fronte prop** (l'unico canale che scala in mesi): mandarci il book
|
||||||
|
**diversificato** TP01+SKH01+XS01, non il book a 2 sleeve. È la differenza fra P(vivo) 19% e
|
||||||
|
58% a leva 1.0×. Richiede una venue con i 19 alt perp (Bybit sub-account HyroTrader li ha).
|
||||||
|
E se si arriva a più conti, **politica MISTA** (§6): metà conti col book diversificato, metà
|
||||||
|
con singoli sleeve decorrelati. Budget mentale onesto: **P(perdere tutto) 33-78%**.
|
||||||
|
2. **GTAA01 su IB**: non andare live senza banda+cadenza (weekly, banda ~$50/gamba). È un cambio
|
||||||
|
al modello dello sleeve → passa dai gate, non lo cablo in questa sessione.
|
||||||
|
3. **Aspettativa onesta ricalibrata**: rendita perpetua da 50 EUR/g = **$300k-$500k** di capitale
|
||||||
|
(non €122k). A $600 il book rende ~**€0.11/giorno**.
|
||||||
|
|
||||||
|
**Cosa NON fare (confermato):** niente cambio pesi senza `weights_tilt_null`; niente leva "per
|
||||||
|
accelerare" sul capitale proprio (il muro si sposta del 20%, non dell'ordine di grandezza).
|
||||||
@@ -0,0 +1,112 @@
|
|||||||
|
# 2026-07-26 — "come faccio a capire se l'edge è morto?"
|
||||||
|
|
||||||
|
Domanda dell'operatore dopo la misura del decadimento. Scopre un buco: il progetto ha gate di kill
|
||||||
|
**pre-registrati per i candidati** (DVOLSPREAD 24/10, XSR01 23/10, STATARB 27/09) e **nessuno per
|
||||||
|
il book che gira con soldi veri**. La risposta implicita era "si vedrà" — cioè esattamente ciò che
|
||||||
|
il progetto non accetta dai candidati.
|
||||||
|
|
||||||
|
**Script:** `r0726_edge_death.py` (taratura) + `scripts/live/edge_watch.py` (sorveglianza, cablata
|
||||||
|
in `cron_daily.sh`). **Test:** `tests/test_edge_watch.py` (11). **Book/pesi/config INVARIATI.**
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## 1. La risposta scomoda: non puoi saperlo in fretta
|
||||||
|
|
||||||
|
Con Sharpe ~1.6 e vol ~8%, un anno di risultati non distingue nulla. Distribuzione dello Sharpe
|
||||||
|
rolling su 4.000 percorsi bootstrap, con edge **vivo** e con edge **morto** (drift a zero, stessa vol):
|
||||||
|
|
||||||
|
```
|
||||||
|
finestra VIVO (p5..p50..p95) MORTO (p5..p50..p95) sovrapposizione
|
||||||
|
6m -1.06 1.60 4.15 -3.24 -0.10 2.71 67.8%
|
||||||
|
12m -0.24 1.62 3.43 -2.20 -0.04 1.99 56.0%
|
||||||
|
24m 0.34 1.64 2.92 -1.51 -0.02 1.44 34.6%
|
||||||
|
36m 0.57 1.62 2.68 -1.22 -0.03 1.19 21.1%
|
||||||
|
```
|
||||||
|
|
||||||
|
**A 12 mesi il 56% dei casi "morto" è indistinguibile da uno vivo.** Un anno brutto non è
|
||||||
|
informazione, è rumore.
|
||||||
|
|
||||||
|
## 2. La taratura: falsi kill contro velocità
|
||||||
|
|
||||||
|
*"Sharpe rolling a N mesi scende sotto S almeno una volta in 10 anni"*, con edge **intatto** —
|
||||||
|
cioè quanto spesso la regola ucciderebbe una strategia che funziona:
|
||||||
|
|
||||||
|
```
|
||||||
|
finestra S<-0.5 S<0.0 S<+0.5
|
||||||
|
6m 100.0% 100.0% 100.0%
|
||||||
|
12m 80.5% 95.9% 99.5%
|
||||||
|
24m 14.1% 43.7% 78.8%
|
||||||
|
36m 1.8% 12.3% 43.2%
|
||||||
|
```
|
||||||
|
|
||||||
|
Con il controllo positivo (edge davvero morto) accanto:
|
||||||
|
|
||||||
|
| finestra | soglia | falso kill | lo prende | rilevamento mediano |
|
||||||
|
|---|---|---|---|---|
|
||||||
|
| 12m | −0.5 | 80.5% | 100% | 1.1 anni |
|
||||||
|
| 24m | −0.5 | 14.1% | 98.5% | 2.5 anni |
|
||||||
|
| **36m** | **−0.5** | **1.8%** | **90.8%** | **3.8 anni** |
|
||||||
|
|
||||||
|
**→ CRITERIO A: Sharpe rolling 36 mesi sotto −0.5.** Falso kill 1.8% in 10 anni, riconosce l'edge
|
||||||
|
morto nel 91% dei casi, in **3.8 anni** mediani.
|
||||||
|
|
||||||
|
⚠️ **La lentezza non è un difetto della regola: è statistica.** Una versione a 12 mesi ucciderebbe
|
||||||
|
un edge vivo nell'80% dei casi. **Non esiste una versione veloce e onesta.**
|
||||||
|
|
||||||
|
## 3. TP01 non si giudica così — e questo è il punto
|
||||||
|
|
||||||
|
Il leave-one-out del 26/07 ha misurato il contributo hold-out di TP01 **negativo nel 99.1% delle
|
||||||
|
configurazioni d'ancora**. È la firma dell'assicurazione: paga premio negli anni senza incendio.
|
||||||
|
**"Non ha guadagnato" non è evidenza di morte per uno sleeve difensivo** — la sua morte è *non
|
||||||
|
proteggere quando serve*.
|
||||||
|
|
||||||
|
```
|
||||||
|
anno DD buy&hold DD TP01 protezione
|
||||||
|
2019 56.4% 10.3% 5.5x
|
||||||
|
2020 59.2% 8.4% 7.0x
|
||||||
|
2021 52.0% 6.8% 7.6x
|
||||||
|
2022 68.4% 2.8% 24.2x
|
||||||
|
2023 22.0% 12.3% 1.8x <- il peggiore, e passa comunque
|
||||||
|
2024 35.6% 7.1% 5.0x
|
||||||
|
2025 45.1% 6.8% 6.6x
|
||||||
|
2026 46.6% 1.4% 34.4x
|
||||||
|
```
|
||||||
|
|
||||||
|
**→ CRITERIO B: in un anno con DD buy&hold > 10%, il DD di TP01 deve restare sotto il 75% di
|
||||||
|
quello.** Storico: **8 anni di sinistro, 8/8 superati**. Negli anni **senza** sinistro il criterio
|
||||||
|
non si valuta: non c'è informazione.
|
||||||
|
|
||||||
|
Questo criterio è **veloce** dove l'altro è lento — si pronuncia a ogni anno con un crash, che nel
|
||||||
|
campione è ogni anno.
|
||||||
|
|
||||||
|
## 4. Cosa succede se scattano
|
||||||
|
|
||||||
|
Dichiarato ora per non doverlo decidere nel momento sbagliato:
|
||||||
|
|
||||||
|
* **(A) scatta** → il book **non si spegne da solo**. Si apre una revisione: `weights_tilt_null` +
|
||||||
|
deflated-Sharpe ricalcolato sui dati nuovi. Spegnere è una decisione dell'operatore.
|
||||||
|
* **(B) fallito in due anni di sinistro consecutivi** → TP01 non assicura più, e il suo peso (75%)
|
||||||
|
va rimesso in discussione: proteggere è **l'unico motivo** per cui sta lì.
|
||||||
|
|
||||||
|
Cablato in `cron_daily.sh`, allerta Telegram, non tocca l'esecuzione. Stato al 2026-07-26:
|
||||||
|
**Sharpe 36m +1.51**, protezione **8/8**.
|
||||||
|
|
||||||
|
## 5. Il limite, di nuovo
|
||||||
|
|
||||||
|
Il criterio A misura se l'edge è morto **dopo** che è morto, con ~4 anni di ritardo. Questo non è
|
||||||
|
riparabile con una regola migliore — è il contenuto informativo dei dati. La difesa vera non è la
|
||||||
|
rilevazione: è che **il piano regge a un edge dimezzato** (misurato: traguardo da 11.6 a 15.8 anni,
|
||||||
|
P(entro 20a) ancora 77%) e che i rischi *veloci* — venue, esecuzione, feed — hanno sorveglianze
|
||||||
|
proprie che scattano in ore.
|
||||||
|
|
||||||
|
## 6. Regole trasferibili
|
||||||
|
|
||||||
|
1. **Se si pretende un gate di kill dai candidati, se ne deve avere uno per ciò che gira.**
|
||||||
|
L'asimmetria era invisibile finché non è stata nominata.
|
||||||
|
2. **Un criterio di kill si tara sul nullo e si valida su un controllo positivo** — identico al
|
||||||
|
tripwire di venue costruito lo stesso giorno. "Non è mai scattato" non è una buona notizia
|
||||||
|
finché non si è provato che sa scattare.
|
||||||
|
3. **Uno sleeve difensivo richiede un criterio DIVERSO**, o lo si uccide per aver fatto il suo
|
||||||
|
mestiere. Il criterio giusto guarda il sinistro, e negli anni senza sinistro **non si valuta**.
|
||||||
|
4. **Quando la rilevazione è strutturalmente lenta, dirlo e spostare la difesa altrove** invece di
|
||||||
|
accorciare la finestra fino a ottenere una risposta veloce e falsa.
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user