Compare commits
12 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 8292e5e6b8 | |||
| 922947d2aa | |||
| 69be9eb75f | |||
| 58fc10de77 | |||
| eac2aa1d00 | |||
| 7b34e11476 | |||
| ae7f3d17f2 | |||
| 3b6ff02197 | |||
| 8dbdadd509 | |||
| 33267584d9 | |||
| dc2b5697da | |||
| 6b9c469832 |
@@ -1,11 +0,0 @@
|
||||
Old/
|
||||
data/
|
||||
.venv/
|
||||
.git/
|
||||
logs/
|
||||
__pycache__/
|
||||
**/__pycache__/
|
||||
*.pyc
|
||||
.env
|
||||
.env.mainnet
|
||||
docs/
|
||||
@@ -1,7 +0,0 @@
|
||||
# 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
|
||||
-45
@@ -6,8 +6,6 @@ build/
|
||||
.venv/
|
||||
.env
|
||||
!.env.example
|
||||
.env.ibgw
|
||||
!.env.ibgw.example
|
||||
.vscode/
|
||||
.idea/
|
||||
.DS_Store
|
||||
@@ -31,7 +29,6 @@ data/funds_watch.json
|
||||
|
||||
# dati regime (DVOL/funding/feature cache, rigenerabili)
|
||||
data/regime/
|
||||
data/venue_watch/
|
||||
_disp_scratch/
|
||||
data/regime/dispersion_features.parquet
|
||||
|
||||
@@ -46,47 +43,5 @@ data/games/
|
||||
# archived data (mirrors top-level data/ ignores, which are top-level-anchored)
|
||||
Old/data/
|
||||
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
|
||||
|
||||
-11
@@ -1,11 +0,0 @@
|
||||
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"]
|
||||
@@ -1,24 +0,0 @@
|
||||
{
|
||||
"_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). ⚠️ 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) — 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,
|
||||
"_nota_usde": "Collaterale USDE a rendimento (test di eligibilita' 2026-08-26: 500 USDE, verdetto entro il 29/08 — diario 2026-08-26-usde-analisi). L'autorita' che LEGGE questa sezione e' src/live/usde.py; la usano shadow._collaterale_usde (equity oraria del book) e scripts/live/usde_watch.py (sorveglianza giornaliera 12:35 UTC). Criteri delle soglie, dichiarati (P6): depeg_warn 0.99 = fuori dalla banda operativa dello spot (~3 bps) e oltre il clamp +-0.5% per fonte dell'indice usde_usdc — a quel prezzo non e' rumore di book; depeg_crit 0.95 = meta' del buffer di haircut (10%) consumata. quota_target 0.70 = la quota DECISA dall'operatore il 2026-08-30 (la decisione di quota che il gate USDE-01 apriva; anticipata di un giorno sul rinvio al 31/08, su richiesta esplicita dell'operatore \"porta in usde tutto il capitale che non viene usato\"). Il 70% NON e' un argmax (M8): e' il massimo compatibile col CUSCINO DI REGOLAMENTO, cioe' il vincolo che r0830_usde_quota non aveva guardato — il P&L e il funding dei perp USDC-lineari si regolano in USDC, non nel collaterale, quindi a quota alta il saldo USDC va negativo alla prima perdita del libro e Deribit lo finanzia a interesse. Il cuscino richiesto e' il disaster-SL sulla massima esposizione lorda: n_asset x frac x disaster_sl_pct = 2 x 0.5 x 0.30 = 30% dell'equity, che lascia esattamente il 70%. quota_max_frac 0.50 = tetto di ALLERTA sulla quota USDE/equity totale (N4: la quota e' l'unica leva contro il rischio emittente, -100% = 25 anni di resa, non recuperabile). Alzato a 0.85 il 2026-08-30 in previsione della quota al 70% e RIMESSO A 0.50 lo stesso giorno: il 70% NON e' raggiungibile. 🚨 venue_cap_frac 0.312 = TETTO DEL VENUE sull'USDE, misurato e NON documentato da Deribit (l'articolo ufficiale 'Yield/reward bearing coins' descrive un Cap ETHENA che diluisce il TASSO a livello di exchange, e nessun limite sulle quantita' detenibili da un conto). Ogni acquisto oltre il tetto e' rifiutato con `not_enough_funds_in_currency` pur avendo $1.400 disponibili: messaggio FUORVIANTE, non c'entrano fondi/taglia/prezzo/liquidita'/cadenza. E' una FRAZIONE DELL'EQUITY TOTALE, non un livello fisso — provato il 31/08 facendo scendere l'equity di $8: il tetto e' sceso con lei (30/08 in [644,18·645,18) con equity $2.063,79 = 31,21-31,26%; 31/08 in [643,18·644,18) con equity $2.055,56 = 31,29-31,34%; i due bracket distano 0,05pp, dentro il rumore dell'equity che oscilla +-$2-8/ora). ⇒ **il tetto SCALA col conto**: la quota resta ~31% e il valore in dollari cresce col capitale, e il 70% di quota_target NON e' raggiungibile ne' ora ne' mai. Il valore 0.312 e' il bordo BASSO dei bracket, scelto per far fallire il piano PRIMA dell'ordine invece che dopo il rifiuto; va ri-sondato se cambia qualcosa sul venue. Con la quota reale al 31% il tetto d'allerta 0.50 e' di nuovo quello giusto e MORDE: allargarlo a 0.85 avrebbe disarmato la guardia per uno scenario che non si e' verificato. Se il tetto del venue si alzera', il criterio per 0.85 e' 'meta' del cuscino di regolamento consumata' (USDC sotto il 15% dell'equity). haircut 0.10 verificato sul venue il 26/08 (USDC 0%): il 90% dell'USDE fa margine.",
|
||||
"usde": {
|
||||
"index_name": "usde_usdc",
|
||||
"haircut": 0.1,
|
||||
"quota_target": 0.7,
|
||||
"venue_cap_frac": 0.312,
|
||||
"venue_cap_misurato": "2026-08-31",
|
||||
"quota_max_frac": 0.5,
|
||||
"depeg_warn": 0.99,
|
||||
"depeg_crit": 0.95
|
||||
}
|
||||
}
|
||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -1,37 +0,0 @@
|
||||
# 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
|
||||
@@ -1,35 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,62 +0,0 @@
|
||||
# 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`.
|
||||
@@ -1,60 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,81 +0,0 @@
|
||||
# 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).
|
||||
@@ -1,58 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,69 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,62 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,44 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,31 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,43 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,84 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,28 +0,0 @@
|
||||
# 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).
|
||||
@@ -1,35 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,44 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,62 +0,0 @@
|
||||
# 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).
|
||||
@@ -1,167 +0,0 @@
|
||||
# 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).
|
||||
@@ -1,86 +0,0 @@
|
||||
# 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).
|
||||
@@ -1,93 +0,0 @@
|
||||
# 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%).
|
||||
@@ -1,43 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,133 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,111 +0,0 @@
|
||||
# 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).
|
||||
@@ -1,88 +0,0 @@
|
||||
# 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`.
|
||||
@@ -1,99 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,68 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,67 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,68 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,64 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,62 +0,0 @@
|
||||
# 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`.
|
||||
@@ -1,53 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,40 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,57 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,45 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,48 +0,0 @@
|
||||
# 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).
|
||||
@@ -1,96 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,33 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,38 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,29 +0,0 @@
|
||||
# 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).
|
||||
@@ -1,37 +0,0 @@
|
||||
# 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)
|
||||
@@ -1,141 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,66 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,69 +0,0 @@
|
||||
# 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`.
|
||||
@@ -1,58 +0,0 @@
|
||||
# 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).
|
||||
@@ -1,57 +0,0 @@
|
||||
# 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).
|
||||
@@ -1,74 +0,0 @@
|
||||
# 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).
|
||||
@@ -1,66 +0,0 @@
|
||||
# 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).
|
||||
@@ -1,47 +0,0 @@
|
||||
# 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).
|
||||
@@ -1,118 +0,0 @@
|
||||
# 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).
|
||||
@@ -1,145 +0,0 @@
|
||||
# 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).
|
||||
@@ -1,71 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,106 +0,0 @@
|
||||
# 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).
|
||||
@@ -1,65 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,91 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,58 +0,0 @@
|
||||
# 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) |
|
||||
@@ -1,114 +0,0 @@
|
||||
# 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).
|
||||
@@ -1,174 +0,0 @@
|
||||
# 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.**
|
||||
@@ -1,132 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,98 +0,0 @@
|
||||
# 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).
|
||||
@@ -1,74 +0,0 @@
|
||||
# 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).
|
||||
@@ -1,69 +0,0 @@
|
||||
# 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).
|
||||
@@ -1,132 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,168 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,186 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,111 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,47 +0,0 @@
|
||||
# 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").
|
||||
@@ -1,156 +0,0 @@
|
||||
# 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).
|
||||
@@ -1,167 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,109 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,108 +0,0 @@
|
||||
# 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**.
|
||||
@@ -1,126 +0,0 @@
|
||||
# 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`.
|
||||
@@ -1,111 +0,0 @@
|
||||
# 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.**
|
||||
@@ -1,76 +0,0 @@
|
||||
# 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`.
|
||||
@@ -1,293 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,72 +0,0 @@
|
||||
# 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).
|
||||
@@ -1,132 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,42 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,161 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,295 +0,0 @@
|
||||
# 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`.
|
||||
@@ -1,234 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,408 +0,0 @@
|
||||
# 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).
|
||||
@@ -1,112 +0,0 @@
|
||||
# 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.
|
||||
@@ -1,123 +0,0 @@
|
||||
# 2026-07-26 — Nuovo schema fee Deribit (dal 1 agosto 2026): la curva, non il numero
|
||||
|
||||
**Input:** annuncio Deribit di un nuovo schema fee **effettivo 2026-08-01** — taker piu' bassi e
|
||||
maker rebate piu' bassi su futures/perpetual, soglie VIP abbassate, nuovo tier VIP7,
|
||||
**liquidation fee 1% su tutti i prodotti** (opzioni: cap premio 25%), fee spot temporaneamente
|
||||
azzerate fino al collegamento coi mercati spot Coinbase.
|
||||
|
||||
**Script:** `r0726_fee_sensitivity.py`. **Test:** `tests/test_fee_sensitivity.py` (6).
|
||||
**Book, pesi, cron, config: INVARIATI.**
|
||||
|
||||
---
|
||||
|
||||
## 0. Perche' non ho aspettato la tabella
|
||||
|
||||
La fee e' un **vincolo di prim'ordine** dichiarato di questo progetto ("0.10% RT baseline; molte
|
||||
operazioni = morte per fee"). Ma l'annuncio non contiene un solo numero, e **la tabella numerica
|
||||
nell'articolo Insights e' un'IMMAGINE**: non l'ho letta da fonte primaria.
|
||||
|
||||
⚠️ I valori che cito del nuovo schema vengono da un **riassunto testuale secondario**, non dalla
|
||||
tabella di Deribit: tier base ~**5 bps taker / 2 bps maker**, VIP7 **2/0 bps**. Vanno trattati come
|
||||
indicativi finche' non si legge il tier reale in Account Settings.
|
||||
|
||||
Quindi invece di assumere un numero ho misurato la **curva**: quando la tabella e' leggibile si
|
||||
prende il valore giusto da qui, senza rifare l'analisi.
|
||||
|
||||
Il progetto modella ovunque **5 bps/lato = 0.10% RT (taker)**: `trend_portfolio.CANONICAL
|
||||
.fee_side = 0.0005`, `sleeves._skyhook_returns fee_rt=0.001`, paper monitor `FEE_SIDE = 0.0005`.
|
||||
Le repliche parametrizzate riproducono **bit-exact** gli sleeve di produzione alla fee canonica
|
||||
(`max|dif| = 0.0`, test permanenti) — altrimenti la curva descriverebbe un'altra strategia.
|
||||
|
||||
---
|
||||
|
||||
## 1. La curva
|
||||
|
||||
```
|
||||
bps/lato %RT | TP01 Sh CAGR | SKH01 Sh CAGR | BOOK Sh CAGR maxDD
|
||||
0.0 0.00% | 1.322 16.60% | 1.567 35.66% | 1.849 21.69% 8.92%
|
||||
1.0 0.02% | 1.316 16.51% | 1.543 34.95% | 1.833 21.46% 9.02%
|
||||
2.0 0.04% | 1.309 16.42% | 1.519 34.24% | 1.816 21.22% 9.12%
|
||||
3.0 0.06% | 1.303 16.33% | 1.495 33.53% | 1.799 20.99% 9.22%
|
||||
5.0 0.10% | 1.290 16.15% | 1.446 32.14% | 1.766 20.53% 9.42% <- oggi
|
||||
7.5 0.15% | 1.274 15.92% | 1.385 30.41% | 1.724 19.96% 9.67%
|
||||
10.0 0.20% | 1.258 15.69% | 1.324 28.70% | 1.682 19.39% 9.92%
|
||||
15.0 0.30% | 1.226 15.24% | 1.200 25.36% | 1.597 18.26% 10.59%
|
||||
|
||||
drag della fee attuale vs fee zero: TP01 -0.032 Sh / -0.46% CAGR
|
||||
SKH01 -0.121 Sh / -3.52% CAGR
|
||||
BOOK -0.084 Sh / -1.15% CAGR
|
||||
sensibilita' marginale: BOOK -0.017 Sharpe/bps -0.23% CAGR/bps
|
||||
```
|
||||
|
||||
**Il book e' poco sensibile.** Anche un raddoppio del taker a 10 bps costerebbe 0.08 di Sharpe —
|
||||
**meno della banda d'ancora misurata oggi stesso** (book FULL canonico 2.222 vs mediana 1.946).
|
||||
Mettere la fee nella giusta scala di grandezza: e' un effetto piu' piccolo dell'ancora.
|
||||
|
||||
### I due sleeve NON sono uguali
|
||||
|
||||
**SKH01 e' ~4x piu' sensibile di TP01** (−0.69% vs −0.09% di CAGR per bps/lato). Il motivo e'
|
||||
strutturale: SKH01 fa round-trip **discreti** (~500 trade sui 7 anni per asset), TP01 e' una
|
||||
posizione **continua vol-targeted** che ribilancia poco. Conseguenza operativa: **se il taker
|
||||
salisse in modo serio, il primo parametro da rivedere e' il peso 75/25, non il resto**; se scende,
|
||||
SKH01 e' quello che guadagna di piu'.
|
||||
|
||||
---
|
||||
|
||||
## 2. I quattro punti dell'annuncio, uno per uno
|
||||
|
||||
| punto | ci tocca? |
|
||||
|---|---|
|
||||
| **Taker piu' basso** | bene o neutro: a 3 bps il book va 1.766 → 1.799 di Sharpe. Nessuna decisione cambia. |
|
||||
| **Maker rebate piu' basso** | **non oggi**: il book manda ordini **market** (taker). |
|
||||
| **Liquidation fee 1%** | **irrilevante** — vedi sotto. |
|
||||
| **Soglie VIP piu' basse + VIP7** | **irrilevante a $600**: volume 30g trascurabile, restiamo al tier base a qualunque soglia. |
|
||||
|
||||
### Il maker tocca una raccomandazione non implementata
|
||||
|
||||
L'idea **T1 del 26/07** — TP di SKH01 come **limit resting** per incassare il maker — perderebbe
|
||||
parte della sua convenienza se il maker passa da rebate a **+2 bps**. Ma: (a) **non e'
|
||||
implementata** (lo blocca il fatto che TP01 e SKH01 tradano lo stesso strumento con una sola
|
||||
posizione netta), e (b) il beneficio misurato era quasi tutto *"convertire una lotteria in
|
||||
certezza"*, non la fee. Quindi il cambio maker **non riapre** quella decisione, la rende solo
|
||||
meno appetibile se un giorno si riaprisse.
|
||||
|
||||
### Liquidation fee 1%: perche' e' irrilevante
|
||||
|
||||
`live.json` impone `max_notional_per_asset_frac = 0.5` su **2 asset** → nozionale lordo massimo
|
||||
**1.00x l'equity**, con `disaster_sl_pct = 0.30`. A leva ≤1x la liquidazione richiederebbe un
|
||||
movimento avverso ~100%, e il disaster-SL interviene a −30%.
|
||||
|
||||
⚠️ Questa conclusione **poggia sul cap**, non sulla strategia. Se il cap sale, decade. Per non
|
||||
lasciarla valida per inerzia c'e' una **guardia di decisione** cablata
|
||||
(`test_leva_massima_da_config_resta_sotto_o_uguale_a_1x`): alzare il cap **rompe il test** e
|
||||
rimanda qui.
|
||||
|
||||
---
|
||||
|
||||
## 3. Azione
|
||||
|
||||
**Nessuna adesso.** Il 1 agosto: leggere il tier reale in Account Settings e confrontarlo con la
|
||||
curva. Regola decisa in anticipo, per non decidere col numero davanti:
|
||||
|
||||
* taker **≤5 bps/lato** → non si tocca nulla (il modello e' gia' giusto o conservativo);
|
||||
* taker **>10 bps/lato** → rivedere per primo il peso di SKH01 (e' li' che morde 4x).
|
||||
|
||||
**Cio' che il cambio NON puo' rompere:** tutti i backtest del progetto sono a 0.10% RT, quindi se
|
||||
la fee scende diventano **conservativi** — la direzione dell'errore e' quella giusta.
|
||||
|
||||
---
|
||||
|
||||
## 4. Regole trasferibili
|
||||
|
||||
1. **Quando arriva un annuncio senza numeri, misurare la CURVA invece di aspettare il numero.**
|
||||
Il risultato vale per qualunque valore esca, e sposta la decisione da "aspettiamo" a "sappiamo
|
||||
gia' cosa fare in ogni caso".
|
||||
2. **Dichiarare la qualita' della fonte.** Qui la tabella e' un'immagine non letta: i numeri del
|
||||
nuovo schema sono **secondari** e vanno etichettati come tali, non usati come se fossero il
|
||||
listino.
|
||||
3. **Una conclusione che poggia su un parametro di config va legata a un test su quel parametro.**
|
||||
"Liquidation fee irrilevante" e' vera *perche'* la leva e' ≤1x; senza guardia sopravviverebbe
|
||||
al cambio di cap che la rende falsa.
|
||||
4. **Mettere ogni effetto nella sua scala di grandezza.** Un raddoppio della fee vale meno della
|
||||
fortuna d'ancora dello stesso book: senza il confronto si rischia di dedicare a una fee un
|
||||
allarme che merita altro.
|
||||
@@ -1,613 +0,0 @@
|
||||
# 2026-07-26 — GTAA01 sugli UCITS: la via d'uscita dal blocco PRIIPs è aperta, e il broker non è la variabile
|
||||
|
||||
**Domanda dell'operatore:** *"usiamo revolut o degiro"* — dopo che il conto reale ha rifiutato
|
||||
l'ordine sui 6 ETF USA di GTAA01 con `Trading limitato — Questo prodotto non dispone di un KID`.
|
||||
|
||||
**Risposta breve:** cambiare broker non sblocca niente (il PRIIPs è una norma, non una politica di
|
||||
IB). Ciò che sblocca è cambiare **veicolo**. Misurato: il cambio di veicolo costa **~0**, e con la
|
||||
scelta giusta delle linee lo sleeve è eseguibile **senza frazionamento** già a $3.000.
|
||||
|
||||
**Book, pesi, cron, config: INVARIATI.** GTAA01 non entra nel book live (resta la decisione venue
|
||||
del 26/07: 100% Deribit fino a $20k).
|
||||
|
||||
Script: `scripts/research/fetch_ib_ucits.py`, `scripts/research/r0726_gtaa_ucits.py`.
|
||||
Modulo nuovo: `src/data/eq_crosscheck.py`. Test: `tests/test_eq_crosscheck.py` (14),
|
||||
`tests/test_gtaa_ucits.py` (10).
|
||||
|
||||
---
|
||||
|
||||
## 0. La premessa che era falsa, ed è la ragione per cui il problema è piccolo
|
||||
|
||||
La nota che avevo scritto in `src/portfolio/gtaa.py` diceva:
|
||||
|
||||
> storia più CORTA (diversi nati dopo il 2010) → si perde la validazione a 30 anni che è ciò che
|
||||
> rendeva credibile questo sleeve
|
||||
|
||||
**È falsa, per un motivo strutturale: il PRIIPs vieta di COMPRARE, non di GUARDARE.** I prezzi di
|
||||
SPY/QQQ/IWM/TLT/GLD/HYG restano leggibili — l'operatore li aveva sotto gli occhi sul terminale
|
||||
*mentre* l'ordine veniva rifiutato. Quindi il **segnale** di GTAA01 può continuare a girare sui 30
|
||||
anni di serie USA per sempre; cambia solo il **veicolo** su cui si incassa il rendimento.
|
||||
|
||||
La storia corta degli UCITS non serve a validare la strategia. Serve a misurare una cosa sola: la
|
||||
**deviazione del veicolo**, che è un drift lento e si stima bene anche su pochi anni.
|
||||
|
||||
> **Regola:** prima di dichiarare che un vincolo esterno distrugge un risultato, chiedersi
|
||||
> *esattamente cosa* vincola. Qui la differenza fra "non posso comprare" e "non posso vedere"
|
||||
> separa uno sleeve morto da uno sleeve con un problema di esecuzione.
|
||||
|
||||
---
|
||||
|
||||
## 1. Il dato, prima della strategia — e il feed equity non aveva un cross-check
|
||||
|
||||
Estratti 12 veicoli UCITS da IB (`LSEETF`, **tutti in USD**: quotare in USD elimina un livello di
|
||||
costo, la conversione per ordine). Alla prima certificazione, **7 su 10 con gap lunghi** e CSPX con
|
||||
un **+27.8% giornaliero** su un tracker S&P 500.
|
||||
|
||||
I gap sono tutti **al lancio** della linea USD (ultimo gap lungo: CSPX 2014-04, XRSU 2016-10,
|
||||
IGLN/IHYU 2011); negli ultimi 3 anni tutti i veicoli fanno 253 barre/anno. Non è un problema
|
||||
corrente.
|
||||
|
||||
Il +27.8% invece è un difetto vero. La barra CSPX 2012-01-13:
|
||||
|
||||
```
|
||||
open 112.740 high 112.740 low 88.010 close 88.010
|
||||
```
|
||||
|
||||
**`open`/`high` in USD, `low`/`close` in EUR** — fattore dai close adiacenti **1.2797**, cioè
|
||||
l'EURUSD di quel giorno (reale 1.266-1.282). Andata e ritorno: 112.63 → 88.01 → 112.47 mentre SPY
|
||||
faceva −0.39% e +0.23%.
|
||||
|
||||
**La certificazione esistente non lo vedeva.** L'unica guardia sui movimenti era
|
||||
`maxret > 50% → SPIKE?`, e una contaminazione EUR/USD vale ~22-28%. È lo **stesso schema** dello
|
||||
split 2:1 non aggiustato del 25/07 (che valeva *esattamente* −50%): una soglia tarata su una classe
|
||||
di difetto non sorveglia le altre.
|
||||
|
||||
### Perché serviva il gemello e non una regola locale
|
||||
|
||||
Il discriminante del 25/07 (**range intraday**) qui non funziona: una barra contaminata ha un range
|
||||
enorme, ma anche un crollo vero (SLV 2026-01-30 aveva 33% di range). Ciò che separa i due casi è che
|
||||
**un evento di mercato lo fa anche il gemello**: nel *rapporto* veicolo/gemello i movimenti veri si
|
||||
cancellano.
|
||||
|
||||
Controprova su dati reali: la stessa scansione fatta sui **prezzi** segnalava IDTL 2020-03
|
||||
(liquidazione dei treasury) e IGLN 2013-04 (crollo dell'oro) — andate-e-ritorni identiche nella
|
||||
forma. Sul **rapporto** spariscono, e resta la sola CSPX 2012-01-13.
|
||||
|
||||
Questo è il buco che il feed equity aveva: nel crypto la certificazione incrocia sempre più venue
|
||||
(`certify_feed.py` vs Coinbase USD); il feed equity aveva **solo controlli locali**.
|
||||
|
||||
### La soglia non è tarabile sulla deviazione, ed è il punto interessante
|
||||
|
||||
| statistica | rumore massimo misurato | difetto CSPX | margine |
|
||||
|---|---|---|---|
|
||||
| deviazione dal gemello | **9.90%** (2025-04-09) | 21.4% | 2.2× ❌ |
|
||||
| **|dev| / movimento del gemello** | **8.1** | **42.7** | **5.3×** ✅ |
|
||||
|
||||
Il 9.90% è **legittimo**: Londra chiude alle 11:30 di New York, quindi in un giorno violento le due
|
||||
chiusure sono davvero lontane. Ma **un disallineamento d'orario non può superare il movimento del
|
||||
mercato**: se il gemello si è mosso dello 0.4% e il veicolo se ne va del 21%, non c'è orario che lo
|
||||
spieghi. La statistica adimensionale porta il margine da 2.2× a 5.3× — sopra il 3× che questo
|
||||
progetto richiede a un rilevatore.
|
||||
|
||||
Tre condizioni congiunte (come il rilevatore di split, e per la stessa ragione): deviazione oltre
|
||||
`MIN_DEV`, non-spiegato oltre `MIN_UNEXPLAINED=18.0`, e **rientro** entro 5 barre (una divergenza di
|
||||
NAV vera persiste, una stampa sbagliata no).
|
||||
|
||||
**Riparazione = scartare la barra, non ricostruirla.** Del prezzo vero non sappiamo niente;
|
||||
sappiamo che quello scritto è sbagliato. Scartarla rende corretto il rendimento 12/01→17/01
|
||||
(−0.14%); "ripararla" con un fattore stimato inventerebbe un dato.
|
||||
|
||||
### ⚠️ Limite dichiarato, e come è stato chiuso
|
||||
|
||||
GBPUSD ~1.27 → 21% di deviazione = **sempre rilevata**. EURUSD ~1.09 → 8.3% = **dentro il rumore**
|
||||
dei giorni violenti. Non è tappabile abbassando la soglia (sotto 12 si segnalano i giorni veri).
|
||||
|
||||
Invece di inseguire la rilevabilità ho misurato il **danno** di una contaminazione non vista:
|
||||
iniettando 60 contaminazioni casuali, **dSharpe mediano −0.003, peggiore −0.056, |Δ|>0.05 nel 2%
|
||||
dei casi**. Il limite resta, ma è quantificato e irrilevante.
|
||||
|
||||
> **Regola:** quando un rilevatore ha un buco che non si può chiudere senza generare falsi positivi,
|
||||
> si misura il **danno** del caso non rilevato, non la sua probabilità. Un buco quantificato e
|
||||
> innocuo è un risultato; un buco taciuto è un debito.
|
||||
|
||||
---
|
||||
|
||||
## 2. Quanto costa il veicolo: ~zero — ma lo stimatore ovvio dà la risposta sbagliata
|
||||
|
||||
Prima stesura: media delle differenze giornaliere → **CSPX −0.47%/anno**. Sbagliato.
|
||||
|
||||
Le due serie seguono lo **stesso indice** ma sono campionate a orari diversi. La differenza
|
||||
giornaliera è dominata da uno sfasamento che si **inverte il giorno dopo**: volatilità 17-22%
|
||||
annualizzata, **errore standard ~7%/anno** sulla stima del drag — cioè **15 volte più grande del
|
||||
drag stesso**. In più la media delle differenze *semplici* è contaminata dal drag di varianza.
|
||||
|
||||
Il rapporto veicolo/gemello invece è **stazionario**: il suo drift *è* il drag.
|
||||
|
||||
| gamba | UCITS | drag misurato | atteso da TER | + ritenuta USA | banda annua |
|
||||
|---|---|---|---|---|---|
|
||||
| SPY | CSPX | **−0.06%** | +0.02% | +0.20% | [−0.52,+0.63] |
|
||||
| QQQ | EQQQ | **−0.00%** | −0.10% | −0.03% | [−0.13,+1.29] |
|
||||
| IWM | XRSU | **−0.15%** | −0.11% | +0.07% | [−0.91,+0.37] |
|
||||
| TLT | IDTL | **+0.18%** | +0.08% | +0.68% | [−0.45,+1.60] |
|
||||
| GLD | IGLN | **+0.36%** | +0.28% | +0.28% | [−0.56,+0.99] |
|
||||
| HYG | IHYU | **+0.28%** | −0.01% | +0.89% | [−0.83,+1.88] |
|
||||
| **media EW** | | **+0.10%/anno** | +0.03% | **+0.35%** | |
|
||||
|
||||
Controllo di plausibilità: **segno concorde in 4/6, scarto < 30bps in 6/6**. Il caso più netto è
|
||||
l'oro (GLD 0.40% vs IGLN 0.12% → atteso +0.28%, misurato +0.36%): è un controllo indipendente che la
|
||||
misura sta cogliendo il TER e non rumore. Le due gambe discordi restano entro 30bps, e su una banda
|
||||
annua larga [−0.9%,+1.9%] il segno di uno scarto così piccolo non è informativo. **Ciò che il
|
||||
controllo stabilisce è la scala: decine di bps, non punti.**
|
||||
|
||||
⚠️ La colonna "ritenuta" è **a favore dell'UCITS e non è nel drag misurato**: `ADJUSTED_LAST` sulle
|
||||
serie USA è al **lordo** della ritenuta USA del 15% che un residente italiano paga davvero sui
|
||||
dividendi. Comprando SPY quella ritenuta la paghi e nella serie non c'è; un UCITS irlandese la
|
||||
subisce una volta a livello di fondo e non una seconda all'incasso. *(Ipotesi fiscale dichiarata,
|
||||
fonte secondaria, da confermare col commercialista — non è un parere fiscale.)*
|
||||
|
||||
### Le tre lenti
|
||||
|
||||
| lente | Sharpe | CAGR | maxDD | vol |
|
||||
|---|---|---|---|---|
|
||||
| L0 segnale USA + rend. USA (pubblicato) | 0.81 | 3.96% | −7.9% | 5.0% |
|
||||
| L1 segnale USA + rend. UCITS (veicolo) | 0.89 | 4.22% | −7.0% | 4.8% |
|
||||
| L2 segnale UCITS + rend. UCITS (+orologio) | **0.84** | **4.08%** | −7.5% | 4.9% |
|
||||
|
||||
**Totale L2−L0: dSharpe +0.03, dCAGR +0.12%/anno.** Il cambio di veicolo *non costa*.
|
||||
|
||||
⚠️ `corr(L0,L2) = 0.65`, bassa per due serie sullo stesso indice — ed è l'**orologio**, non un
|
||||
difetto: le due chiusure condividono la notte e la mattina americana ma non il pomeriggio.
|
||||
Verificato che non sia uno sfasamento di date: la correlazione veicolo/gemello è **massima a lag 0
|
||||
su 6/6 coppie** (0.46-0.78). Conseguenza: le statistiche *giornaliere* delle due lenti non sono
|
||||
confrontabili una a una, mentre il **drift** sì — che è esattamente perché la sezione 2 usa il
|
||||
rapporto cumulato.
|
||||
|
||||
---
|
||||
|
||||
## 3. Il vincolo vero non è il broker: è il prezzo di UNA azione
|
||||
|
||||
Senza frazionamento un ordine è almeno una azione. **Il prezzo unitario è una scelta
|
||||
dell'emittente, non una proprietà dell'indice**: CSPX costa $802 e VUAA $144 sullo *stesso* S&P 500.
|
||||
|
||||
| gamba | STORIA | prezzo | DEPLOY | prezzo | a $3.000 | a $10.000 |
|
||||
|---|---|---|---|---|---|---|
|
||||
| SPY | CSPX | $801.86 | **VUAA** | $143.80 | 29% | 9% |
|
||||
| QQQ | EQQQ | $692.67 | **XNAS** | $65.74 | 13% | 4% |
|
||||
| IWM | XRSU | $437.80 | **R2US** | $86.35 | 17% | 5% |
|
||||
| TLT | IDTL | $3.09 | IDTL | $3.09 | 1% | 0% |
|
||||
| GLD | IGLN | $79.06 | IGLN | $79.06 | 16% | 5% |
|
||||
| HYG | IHYU | $94.12 | IHYU | $94.12 | 19% | 6% |
|
||||
|
||||
*(% = quanto pesa una azione sull'allocazione di quella gamba)*
|
||||
|
||||
Danno misurato dell'esecuzione a numero **intero** di azioni, stessa finestra per entrambi:
|
||||
|
||||
| insieme | capitale | Sh fraz. | Sh intero | Δ | vol fraz. | vol intero | **gambe vive** | esposta |
|
||||
|---|---|---|---|---|---|---|---|---|
|
||||
| STORIA | $3.000 | 0.84 | 0.80 | −0.04 | 5.1% | **2.2%** | **4/6** | **33%** |
|
||||
| STORIA | $10.000 | 1.08 | 1.02 | −0.06 | 5.1% | 4.2% | 6/6 | 63% |
|
||||
| **DEPLOY** | **$3.000** | 0.88 | 0.84 | −0.04 | 5.1% | **4.5%** | **6/6** | **65%** |
|
||||
| DEPLOY | $10.000 | 1.10 | 1.09 | −0.02 | 5.1% | 4.9% | 6/6 | 66% |
|
||||
|
||||
**Con i veicoli giusti il frazionamento non serve.** Con quelli sbagliati, a $3.000 lo sleeve perde
|
||||
due gambe su sei ed è a mercato un terzo del tempo: non è GTAA01 con un vincolo, è un'altra cosa.
|
||||
|
||||
⚠️ **Si legge `gambe vive` e `vol`, non `Sharpe`.** Un vincolo che alza lo Sharpe non è un
|
||||
miglioramento: arrotondando in giù riduce l'esposizione e paga meno commissioni. È il **null
|
||||
de-levering** (4ª occorrenza dopo VRP-DD, TP01×DVOL, MAT01). Qui il controllo è stato eseguito e
|
||||
il verdetto è che con l'insieme DEPLOY il de-levering **non c'è**.
|
||||
|
||||
⚠️ Scartati di proposito, benché con più storia: **RTWO** (Russell 2000 *quality* = fattore),
|
||||
**CSUSS** (MSCI USA Small Cap *ESG*), **IDP6** (S&P 600, indice diverso). Equivalenza dell'indice
|
||||
prima della storia.
|
||||
|
||||
---
|
||||
|
||||
## 4. Il costo del venue, per FORMA — la sola cosa su cui i broker differiscono davvero
|
||||
|
||||
**Ordini/anno** (dipendono da banda e cadenza, non dal listino): **77 a $3.000, 102 a $10.000, 149 a
|
||||
$50.000**. Con questo numero ogni listino è calcolabile a mano.
|
||||
|
||||
| costo fisso/ordine | $3.000 Sh | CAGR | $10.000 Sh | CAGR | $50.000 Sh | CAGR |
|
||||
|---|---|---|---|---|---|---|
|
||||
| $0.00 | 0.92 | 4.45% | 0.92 | 4.48% | 0.92 | 4.48% |
|
||||
| $0.35 (IB US) | 0.73 | 3.52% | 0.84 | 4.11% | 0.90 | 4.37% |
|
||||
| $1.00 | 0.39 | 1.80% | 0.71 | 3.42% | 0.86 | 4.17% |
|
||||
| $2.00 | −0.13 | −0.79% | 0.50 | 2.37% | 0.79 | 3.86% |
|
||||
| $5.00 | −1.51 | −8.17% | −0.12 | −0.71% | 0.61 | 2.93% |
|
||||
|
||||
| costo proporzionale | $3.000 | $10.000 | $50.000 |
|
||||
|---|---|---|---|
|
||||
| 5 bps/ordine | 0.89 | 0.89 | 0.88 |
|
||||
| 25 bps/ordine | 0.77 | 0.76 | 0.75 |
|
||||
| 50 bps/ordine | 0.62 | 0.60 | 0.59 |
|
||||
|
||||
**Le soglie da verificare presso il broker:**
|
||||
|
||||
| capitale allocato | CAGR = 0 | Sharpe = 0.45 |
|
||||
|---|---|---|
|
||||
| $3.000 | $1.68/ordine | **$0.90/ordine** |
|
||||
| $10.000 | $4.34/ordine | **$2.23/ordine** |
|
||||
| $50.000 | $14.65/ordine | **$7.62/ordine** |
|
||||
|
||||
Un listino **proporzionale** è quasi indifferente al capitale (0.75-0.89 di Sharpe a ogni taglia);
|
||||
uno **fisso** è una tassa regressiva. È la regola del 25/07 riconfermata su un venue diverso.
|
||||
|
||||
---
|
||||
|
||||
## 5. Risposta operativa alla domanda
|
||||
|
||||
**Revolut o Degiro non sbloccano gli ETF USA**: il PRIIPs vale per ogni intermediario che serve
|
||||
retail UE. IB è anzi fra i più permissivi. Aprire un terzo conto per lo stesso rifiuto aggiunge
|
||||
rischio di venue senza guadagno.
|
||||
|
||||
Ciò che si compra su *qualunque* dei tre sono gli **UCITS**, e a quel punto la scelta si gioca su
|
||||
**una sola dimensione misurabile**: il costo per ordine, contro le soglie della tabella sopra, con
|
||||
77-149 ordini l'anno.
|
||||
|
||||
**Raccomandazione: restare su IB**, perché (a) il conto esiste già, (b) i dati per il segnale
|
||||
arrivano dallo stesso gateway, (c) è l'unico dei tre di cui la forma di costo è già modellata in
|
||||
`gtaa.py`. La verifica che resta da fare è **una sola**: la tariffa IB per ordine su LSEETF in USD,
|
||||
contro $2.23 (a $10.000) o $0.90 (a $3.000).
|
||||
|
||||
**Nessuna azione oggi**: la decisione venue del 26/07 tiene tutto su Deribit fino a $20k, cioè
|
||||
~2028 col piano di versamenti corrente.
|
||||
|
||||
---
|
||||
|
||||
## Lezioni
|
||||
|
||||
1. **Prima di dichiarare che un vincolo esterno distrugge un risultato, chiedersi cosa vincola
|
||||
esattamente.** "Non posso comprare" ≠ "non posso vedere": tutta la validazione a 30 anni era
|
||||
salva, e la nota che diceva il contrario era mia.
|
||||
2. **Un feed senza secondo parere non è certificato**, e la regola valeva già nel crypto. Il feed
|
||||
equity ha vissuto 5 settimane con soli controlli locali, e il primo veicolo estero ha trovato
|
||||
il buco alla prima estrazione.
|
||||
3. **Una soglia tarata su una classe di difetto non sorveglia le altre** — 2ª conferma dopo lo
|
||||
split 2:1 del 25/07. E quando la taratura non regge il margine richiesto, la risposta non è
|
||||
accettarla ma **cambiare statistica**: qui il passaggio da assoluta ad adimensionale
|
||||
(deviazione / movimento del gemello) porta il margine da 2.2× a 5.3×.
|
||||
4. **La media delle differenze giornaliere non è la deviazione fra due veicoli sullo stesso
|
||||
indice.** Errore standard 15× più grande della quantità stimata, più il drag di varianza. La
|
||||
domanda "quanto mi costa il veicolo" è una domanda sul **drift**, quindi si misura sul rapporto
|
||||
cumulato.
|
||||
5. **Il prezzo unitario di un ETF è un parametro di progetto, non un dato.** Sceglierlo cambia la
|
||||
soglia di capitale di uno sleeve più di qualunque negoziazione con un broker.
|
||||
6. **Il grado d'accordo si conta, non si dichiara.** La prima stesura stampava "stesso segno su 6/6
|
||||
gambe"; i dati dicevano 4/6. Scriverlo a mano nel `print` è il modo più facile di pubblicare una
|
||||
conclusione che i propri dati smentiscono — 3ª occorrenza in questa sessione.
|
||||
|
||||
---
|
||||
|
||||
# Addendum 2026-07-27 — "io ho già Revolut e Degiro, IB sono solo iscritto"
|
||||
|
||||
L'informazione ribalta la raccomandazione di ieri. L'argomento principale per IB era **"il conto
|
||||
esiste già"**, e non è vero: i conti reali sono Revolut e Degiro, IB è una registrazione.
|
||||
|
||||
Cosa **non** cambia: il gateway IB serve per i **dati** del segnale (ADJUSTED_LAST sui 6 ETF USA),
|
||||
e per quello basta il paper — non serve eseguire lì. La scelta del broker di **esecuzione** è
|
||||
quindi libera, e si gioca su una sola dimensione misurabile: il **costo per ordine**.
|
||||
|
||||
Script: `scripts/research/r0727_gtaa_broker.py`. Test: `tests/test_gtaa_broker.py` (9).
|
||||
**Book, pesi, cron, config: INVARIATI.**
|
||||
|
||||
## Il numero di ordini è un parametro, non un dato
|
||||
|
||||
I 77-149 ordini/anno del 26/07 sono la conseguenza di `REBAL_EVERY=5` e `REBAL_BAND_USD=50`,
|
||||
scelti il 25/07 sul plateau **per il listino IB su azioni USA e a una taglia sola**.
|
||||
|
||||
| cadenza | banda | ord/anno | Sh @ $0 | Sh @ $1 | Sh @ $2 |
|
||||
|---|---|---|---|---|---|
|
||||
| settimanale | $25 | 102 | 1.28 | 1.08 | 0.87 |
|
||||
| settimanale | **$50** (canonico) | 84 | 1.27 | 1.10 | 0.94 |
|
||||
| settimanale | $400 | **23** | **1.27** | 1.22 | 1.18 |
|
||||
| mensile | $50 | 33 | **1.12** | 1.06 | 1.00 |
|
||||
| bimestrale | $400 | 10 | 1.10 | 1.08 | 1.06 |
|
||||
|
||||
**Si legge `Sh @ $0` per prima**: è il prezzo della banda *in assenza di commissioni*. Allargare la
|
||||
banda a cadenza settimanale **non lo tocca** (1.27 → 1.27), rallentare la cadenza sì (1.27 → 1.12).
|
||||
|
||||
Il meccanismo è interpretabile: `_exposure` è la media di 4 indicatori binari, quindi si muove a
|
||||
scatti di 0.25 ≈ $417 su una gamba da $1.667. **La banda filtra la deriva del vol-target, non il
|
||||
segnale di trend.**
|
||||
|
||||
### Controllo su finestra lunga e veicoli diversi
|
||||
|
||||
Sui **veicoli USA**, finestra comune ai 6 (10 anni, limitata dalla cache TLT dal 2016):
|
||||
|
||||
| banda | ord/anno | Sh @ $0 | Sh @ $1 |
|
||||
|---|---|---|---|
|
||||
| $25 | 133 | 0.98 | 0.72 |
|
||||
| $400 | **35** | **0.96** | **0.89** |
|
||||
|
||||
✅ Lo Sharpe a costo zero perde **0.02** mentre gli ordini calano del **74%**. Non è un artefatto
|
||||
della finestra corta.
|
||||
|
||||
## ⚠️ Ma la banda in dollari assoluti è la parametrizzazione sbagliata
|
||||
|
||||
| capitale | banda | % della gamba | ord/anno | **esposta** | Sharpe | |
|
||||
|---|---|---|---|---|---|---|
|
||||
| $3.000 | $400 | **80%** | **3** | **45%** | 0.71 | ❌ congelato |
|
||||
| $10.000 | $400 | 24% | 23 | 66% | 1.22 | OK |
|
||||
| $50.000 | $400 | 5% | 75 | 66% | 1.25 | OK |
|
||||
|
||||
A $3.000 la banda da $400 è l'80% della gamba: **3 ordini l'anno**, a mercato il **45%** del tempo
|
||||
invece del 66%. Lo Sharpe resta 0.71 — accettabile — **su una strategia che ha smesso di seguire il
|
||||
proprio target**. È il null de-levering in una veste nuova: qui non travestito da "meno drawdown"
|
||||
ma da "meno costi".
|
||||
|
||||
> **Regola: quando un parametro di esecuzione è espresso in valuta assoluta, il suo effetto dipende
|
||||
> dal capitale — e il controllo non è lo Sharpe ma la QUOTA DI TEMPO A MERCATO.**
|
||||
|
||||
## La configurazione: banda = 25% della gamba
|
||||
|
||||
| capitale | banda | ord/anno | esposta | soglia $/ordine | budget/anno |
|
||||
|---|---|---|---|---|---|
|
||||
| $3.000 | $125 | **21** | 66% | **$5.65** | $120 |
|
||||
| $6.000 | $250 | **21** | 66% | $11.34 | $240 |
|
||||
| $10.000 | $417 | **21** | 66% | $18.90 | $400 |
|
||||
| $25.000 | $1.042 | **21** | 66% | $47.26 | $1.000 |
|
||||
| $50.000 | $2.083 | **21** | 66% | >$60 | — |
|
||||
|
||||
**21 ordini l'anno a ogni capitale**, esposizione 66% ovunque. Contro il canonico: a $3.000 la
|
||||
soglia passa da **$2.08 a $5.65 per ordine** — cioè dalla differenza fra *"serve un broker
|
||||
economico"* e *"va bene qualunque broker europeo"*.
|
||||
|
||||
⚠️ **Non è un cambio di produzione.** È una configurazione **proposta**, tarata su questa finestra,
|
||||
non passata per `study_family_honest` né per un deflated-Sharpe. Regge il controllo su 10 anni e
|
||||
veicoli diversi, ma GTAA01 non è deployabile prima dei $20k (decisione venue 26/07): c'è tempo per
|
||||
validarla come si deve.
|
||||
|
||||
## Cosa cercare sul proprio conto — per ISIN, non per ticker
|
||||
|
||||
| gamba | ticker | ISIN | prezzo | descrizione |
|
||||
|---|---|---|---|---|
|
||||
| SPY | VUAA | `IE00BFMXXD54` | $143.80 | Vanguard S&P 500 UCITS (Acc, USD) |
|
||||
| QQQ | XNAS | `IE00BMFKG444` | $65.74 | Xtrackers Nasdaq 100 UCITS 1C |
|
||||
| IWM | R2US | `IE00BJ38QD84` | $86.35 | SPDR Russell 2000 US Small Cap UCITS |
|
||||
| TLT | IDTL | `IE00BSKRJZ44` | $3.09 | iShares $ Treasury Bond 20+yr UCITS |
|
||||
| GLD | IGLN | `IE00B4ND3602` | $79.06 | iShares Physical Gold ETC |
|
||||
| HYG | IHYU | `IE00B4PY7Y77` | $94.12 | iShares $ High Yield Corp Bond UCITS |
|
||||
|
||||
*(ISIN da contract details IB: i ticker cambiano da borsa a borsa, le ISIN no. Tutti domiciliati in
|
||||
Irlanda — è il motivo per cui sono acquistabili nell'UE.)*
|
||||
|
||||
Tutti quotati a **Londra in USD**. ⚠️ Le stesse ISIN esistono su altre borse e in altre valute: una
|
||||
linea in **EUR** aggiunge la conversione per ordine, che a 25bps costa **~0.15 di Sharpe** — più del
|
||||
costo per ordine di qualunque broker a questa cadenza. **La valuta della linea conta più del
|
||||
broker.**
|
||||
|
||||
## Verdetto
|
||||
|
||||
Con 21 ordini l'anno e una tolleranza di $5.65/ordine già a $3.000, **il vincolo di costo smette di
|
||||
essere binding su qualunque broker retail europeo**. La domanda "Revolut o Degiro" perde quindi la
|
||||
sua parte quantitativa e resta solo la parte di disponibilità: quale dei due quota le sei ISIN sopra
|
||||
sulla linea in USD.
|
||||
|
||||
Restano due criteri non misurabili da qui, entrambi a favore di Degiro su Revolut per questo uso
|
||||
(universo ETF europeo tipicamente più ampio, e accesso diretto a LSE), **ma vanno verificati
|
||||
guardando i due conti** — non sono cose che posso misurare da questo lato.
|
||||
|
||||
## Lezione
|
||||
|
||||
**Una raccomandazione poggiata su un fatto non verificato sul conto reale vale quanto quel fatto.**
|
||||
Ieri ho consigliato IB in parte perché "il conto esiste già": era un'assunzione, e per la seconda
|
||||
volta in due giorni un'assunzione sul conto reale ha cambiato la conclusione. La prima volta era la
|
||||
negoziabilità (PRIIPs), questa volta quale conto è davvero operativo.
|
||||
|
||||
---
|
||||
|
||||
# Addendum 2026-07-27 (2) — "degiro ha api?"
|
||||
|
||||
**Fatto:** DEGIRO **non** espone una API di trading ufficiale per il retail. Revolut nemmeno (la sua
|
||||
API è per pagamenti, non per il portafoglio titoli). IB sì, documentata e supportata — è quella che
|
||||
il progetto già usa per i dati.
|
||||
|
||||
Esistono wrapper **non ufficiali** degli endpoint interni del web trader DEGIRO. Girano su
|
||||
credenziali + seed 2FA depositati sulla macchina, sono fuori dai termini di servizio, e si rompono
|
||||
**in silenzio** a ogni cambio di front-end. Questo progetto ha già pagato una volta il prezzo di un
|
||||
guasto silenzioso (`fresh_5m`, 26/07: fallimento muto → latenza d'uscita di SKH01 da ~1h a ~1 giorno
|
||||
senza che nulla lo segnalasse). **Un esecutore automatico che può rompersi senza dirlo è peggio
|
||||
dell'esecuzione manuale.**
|
||||
|
||||
Quindi la domanda utile non è "si può automatizzare" ma **"quanto costa non farlo"**.
|
||||
|
||||
## Carico operativo (banda 25%, controllo settimanale, $10.000)
|
||||
|
||||
| | |
|
||||
|---|---|
|
||||
| controlli/anno | 50 |
|
||||
| **settimane con ≥1 ordine** | **15** (29% dei controlli) |
|
||||
| ordini per settimana attiva | 1.4 (max 5) |
|
||||
|
||||
Nel 71% dei controlli non c'è nulla da fare.
|
||||
|
||||
## Costo del ritardo di esecuzione
|
||||
|
||||
Veicoli USA, 10 anni. ⚠️ Sulla finestra UCITS di 3.2 anni la curva **non risulta monotona** (5
|
||||
giorni −0.26, 10 giorni −0.13): il campione corto non risolve differenze di questa taglia, quindi
|
||||
il numero si legge sulla finestra lunga.
|
||||
|
||||
| ritardo | Sharpe | ΔSharpe | stabilità |
|
||||
|---|---|---|---|
|
||||
| 0 giorni | 0.90 | — | — |
|
||||
| **1 giorno** | 0.89 | **−0.02** | peggiora in 6/11 anni = **moneta** |
|
||||
| 2 giorni | 0.83 | −0.07 | 7/11 |
|
||||
| 3 giorni | 0.78 | −0.13 | 7/11 |
|
||||
| 5 giorni | 0.73 | −0.18 | 7/11 |
|
||||
| **10 giorni** | 0.63 | **−0.27** | 6/11 |
|
||||
|
||||
**Il costo non è il ritardo tipico, è la coda.** Eseguire il giorno stesso o il giorno dopo costa
|
||||
nulla; dieci giorni valgono quasi un terzo dello sleeve.
|
||||
|
||||
## Conseguenza
|
||||
|
||||
Il rischio dell'operatività manuale non è la lentezza, è la **dimenticanza** — e quella si compra
|
||||
con un **allarme**, non con una API. `gtaa_rebalance_plan(held, capital)` esiste già in produzione
|
||||
ed è nato esattamente per un esecutore; il progetto ha già l'allerta Telegram sul book live. Un cron
|
||||
settimanale che calcola il piano e notifica quando c'è da agire copre il caso 15 volte l'anno.
|
||||
|
||||
⚠️ **L'altro lato, che resta vero:** il resto del book è automatico (TP01 e SKH01 mandano ordini
|
||||
veri su cron). Aggiungere una gamba manuale introduce un modo di fallire che il sistema oggi non ha.
|
||||
È un argomento reale a favore di IB — che l'API ce l'ha — ma richiede finanziare un secondo venue, e
|
||||
la decisione venue del 26/07 tiene tutto su Deribit fino a $20k. **La scelta è quindi rimandata al
|
||||
punto in cui la si riaprirebbe comunque.**
|
||||
|
||||
## Lezione
|
||||
|
||||
**Una capacità mancante si valuta sul costo di non averla, non sulla sua assenza.** Qui l'assenza di
|
||||
API sembra squalificante e vale −0.02 di Sharpe se si esegue entro un giorno; ciò che vale davvero
|
||||
(−0.27) è un rischio operativo che si copre con una notifica.
|
||||
|
||||
---
|
||||
|
||||
# Addendum 2026-07-27 (3) — "r2us in revolut non c'è, ma ho zprr e spy4"
|
||||
|
||||
## ZPRR **è** R2US
|
||||
|
||||
| ticker | borsa | valuta | ISIN |
|
||||
|---|---|---|---|
|
||||
| R2US | Londra | USD | `IE00BJ38QD84` |
|
||||
| **ZPRR** | **Xetra** | **EUR** | **`IE00BJ38QD84`** |
|
||||
|
||||
Stessa ISIN = stessa classe di quote = **stesso fondo, stesso NAV**. Cambia solo dove e in che
|
||||
valuta si negozia. La gamba small cap è risolta: **compra ZPRR**, non si perde niente.
|
||||
|
||||
> **Regola: si cerca per ISIN, non per ticker.** Lo stesso fondo ha ticker diversi su borse diverse,
|
||||
> e un ticker copiato da una lista può essere un altro prodotto.
|
||||
|
||||
## ⚠️ SPY4 non è quello che sembra
|
||||
|
||||
`IE00B4YBJ215` = SPDR **S&P 400 US Mid Cap**. Non è small cap, e non è l'S&P 500 (quello è SPY5,
|
||||
`IE00B6YX5C33`). Non serve, dato che ZPRR c'è — ma misurato come ripiego, su 6.5 anni:
|
||||
|
||||
| gamba small cap | Sharpe | CAGR | maxDD |
|
||||
|---|---|---|---|
|
||||
| R2US (small) | 0.86 | 4.20% | −8.2% |
|
||||
| SPY4 (mid) | 0.86 | 4.26% | −8.3% |
|
||||
|
||||
Correlazione dei due sleeve **0.991**, SPY4 peggiore in **3/7 anni** = moneta. *(Sulla finestra
|
||||
corta di 3.2 anni sembrava −0.15 di Sharpe: era rumore.)*
|
||||
|
||||
**Ripiego accettabile**, e il motivo è meccanico: small e mid cap USA hanno correlazione giornaliera
|
||||
~0.95, e un TSMOM su due serie così vicine si accende quasi negli stessi giorni. ⚠️ Non è
|
||||
"validato" — 6.5 anni non bastano a distinguere due gambe così simili, ed è **esattamente per
|
||||
questo** che la scelta fra le due non conta.
|
||||
|
||||
## ⚠️ Correzione a un'indicazione data ieri: sulla valuta avevo ragionato al contrario
|
||||
|
||||
Ieri ho scritto che *"una linea in EUR aggiunge la conversione per ordine"*. È vero **solo per un
|
||||
conto in USD**. Per un conto in **euro** — cioè un retail italiano su Revolut o Degiro — vale
|
||||
l'opposto: comprare la linea in USD costringe a convertire a ogni ordine, la linea in EUR no.
|
||||
|
||||
L'esposizione economica è identica nei due casi: il fondo detiene attivi in USD e **nessuna delle
|
||||
due linee è coperta**. La valuta di quotazione non copre niente — decide solo se serve una
|
||||
conversione.
|
||||
|
||||
> **Regola giusta: prendere la linea nella valuta del proprio saldo.**
|
||||
|
||||
Quanto vale, misurato (turnover lordo **$13.655/anno** su $10.000, 21 ordini):
|
||||
|
||||
| bps FX per ordine | ΔSharpe | costo/anno |
|
||||
|---|---|---|
|
||||
| 15 bps | −0.04 | $20 |
|
||||
| 25 bps | −0.07 | $34 |
|
||||
| 50 bps | −0.14 | $68 |
|
||||
|
||||
A 25bps la conversione equivale a ~**$1.6 in più su ciascuno dei 21 ordini**: reale, ma piccolo
|
||||
rispetto alla soglia di $18.90/ordine a $10.000. Quindi **ZPRR in EUR su un conto in euro è la
|
||||
scelta migliore**, non un compromesso.
|
||||
|
||||
## Lezione
|
||||
|
||||
**Un costo di conversione non è una proprietà dello strumento ma della coppia strumento-conto.**
|
||||
Avevo dedotto "linea in EUR = costo in più" da un caso (conto in USD) e l'avevo scritta come regola
|
||||
generale; per il conto che l'operatore usa davvero il segno è invertito. È la terza volta in due
|
||||
giorni che un'assunzione non verificata sul conto reale cambia la conclusione — dopo la
|
||||
negoziabilità PRIIPs e quale conto è operativo.
|
||||
|
||||
---
|
||||
|
||||
# Addendum 2026-07-27 (4) — DEGIRO ha tutte e sei
|
||||
|
||||
Screenshot della watchlist "Pythagoras" su flatexDEGIRO: **le sei gambe ci sono tutte**, con i
|
||||
ticker esatti raccomandati. (Era Revolut a non avere R2US.)
|
||||
|
||||
| gamba | ticker | borsa | valuta | prezzo Degiro |
|
||||
|---|---|---|---|---|
|
||||
| SPY | VUAA | TDG | **EUR** | € 126,795 |
|
||||
| QQQ | XNAS | TDG | **EUR** | € 58,10 |
|
||||
| IWM | R2US | LSE | USD | $ 86,66 |
|
||||
| TLT | IDTL | LSE | USD | $ 3,09987 |
|
||||
| GLD | IGLN | LSE | USD | $ 79,585 |
|
||||
| HYG | IHYU | LSE | USD | $ 94,32 |
|
||||
|
||||
## Verifica indipendente che le linee in EUR siano gli stessi fondi
|
||||
|
||||
Non dallo screenshot ma dai dati: il rapporto fra il prezzo IB (Londra USD) e il prezzo Degiro deve
|
||||
essere **un solo cambio** per entrambe le linee EUR.
|
||||
|
||||
| ticker | Degiro | IB (LSE USD) | rapporto |
|
||||
|---|---|---|---|
|
||||
| VUAA | 126,795 | 143,80 | **1.1341** |
|
||||
| XNAS | 58,10 | 65,74 | **1.1315** |
|
||||
| R2US / IDTL / IGLN / IHYU | — | — | 0.993-0.998 (già USD) |
|
||||
|
||||
EURUSD implicito **1.1341 vs 1.1315, scarto 0.23%**. Due fondi diversi non darebbero lo stesso
|
||||
cambio: sono le stesse quote, quotate in euro.
|
||||
|
||||
## ⚠️ Un errore mio, dello stesso tipo che avevo appena codificato come regola
|
||||
|
||||
Per cercare le linee in euro delle altre quattro gambe ho interrogato IB **per ticker** sulle borse
|
||||
tedesche: risultato "nessuna linea EUR" su 4/4. **Falso.** Il ticker cambia da borsa a borsa — R2US
|
||||
su Xetra si chiama ZPRR. Cercando **per ISIN**:
|
||||
|
||||
| gamba | linea USD | **linea EUR** | ISIN |
|
||||
|---|---|---|---|
|
||||
| SPY | VUAA (LSE) | VUAA (Xetra/BIt) | `IE00BFMXXD54` |
|
||||
| QQQ | XNAS (LSE) | XNAS (Xetra) | `IE00BMFKG444` |
|
||||
| IWM | R2US (LSE) | **ZPRR** (Xetra) | `IE00BJ38QD84` |
|
||||
| TLT | IDTL (LSE) | **IS04** (Xetra) | `IE00BSKRJZ44` |
|
||||
| GLD | IGLN (LSE) | **EGLN** (Londra) | `IE00B4ND3602` |
|
||||
| HYG | IHYU (LSE) | **IS0R** (Xetra) | `IE00B4PY7Y77` |
|
||||
|
||||
**Ogni gamba ha una linea in euro.** Avevo scritto la regola "si cerca per ISIN, non per ticker" un
|
||||
messaggio prima e poi ho costruito la sonda per ticker. *Un "assente" da una ricerca per ticker su
|
||||
una borsa dove quel ticker non esiste non significa "non esiste".*
|
||||
|
||||
## Quanto vale la conversione, e su quale gamba
|
||||
|
||||
Turnover per gamba a $10.000 (banda 25%, 21 ordini/anno):
|
||||
|
||||
| gamba | ticker | ordini/anno | turnover/anno | quota |
|
||||
|---|---|---|---|---|
|
||||
| **TLT** | **IDTL** | **9** | **$6.257** | **46%** |
|
||||
| SPY | VUAA | 3 | $2.289 | 17% |
|
||||
| GLD | IGLN | 3 | $1.695 | 12% |
|
||||
| QQQ | XNAS | 3 | $1.614 | 12% |
|
||||
| HYG | IHYU | 1 | $958 | 7% |
|
||||
| IWM | R2US | 2 | $843 | 6% |
|
||||
|
||||
- turnover su gambe in **USD** (da convertire): **$9.752/anno = 71%**
|
||||
- costo conversione: **$24/anno a 25bps**, $49 a 50bps (0.24-0.49% del capitale, ~6-12% del CAGR)
|
||||
|
||||
**IDTL da sola vale il 46% del turnover e 9 dei 21 ordini.** Se si vuole ridurre la conversione
|
||||
senza cambiare sei strumenti, si sposta **quella** sulla linea in euro (IS04, `IE00BSKRJZ44`): da
|
||||
sola copre il **64%** del turnover convertibile.
|
||||
|
||||
⚠️ Il risparmio non è netto: le linee di Xetra possono avere spread più larghi delle linee di Londra
|
||||
(che sono le primarie), e Degiro storicamente addebita una tariffa di connettività per borsa. Su
|
||||
$10.000 parliamo di decine di dollari l'anno in entrambe le direzioni — **non è una decisione
|
||||
importante**, e dirlo è più utile che costruire una precisione finta.
|
||||
|
||||
## Cosa NON serve
|
||||
|
||||
Il messaggio in cima allo screenshot — *"Richiedi un'aliquota ridotta della ritenuta alla fonte sugli
|
||||
investimenti statunitensi"* (il W-8BEN) — **non riguarda queste sei posizioni**: sono fondi
|
||||
irlandesi, non titoli USA. La ritenuta del 15% la subisce il fondo al proprio interno e nessun
|
||||
modulo dell'investitore la cambia. Va compilato se un giorno si detengono azioni USA dirette.
|
||||
|
||||
## Stato
|
||||
|
||||
Saldo Degiro €328,92: questa è **preparazione, non azione**. GTAA01 richiede ≥$3.000 per reggere i
|
||||
costi, e la decisione venue del 26/07 tiene tutto su Deribit fino a $20k.
|
||||
@@ -1,225 +0,0 @@
|
||||
# 2026-07-26 — "Quale strategia terrei?" — leave-one-out del book DE-LUCKATO sulle ancore
|
||||
|
||||
**Richiesta:** *"dimmi qual strategia pensi di tenere"*.
|
||||
|
||||
**Script:** `scripts/research/r0726_loo_deluck.py` — **test:** `tests/test_loo_deluck.py` (9).
|
||||
**Book, pesi, cron, config: INVARIATI.** Nessuna decisione di allocazione cambia.
|
||||
Cambia invece un **numero documentato in CLAUDE.md** (§4) e cambiano **due giudizi che avevo
|
||||
dato un'ora prima nella stessa sessione** (§3).
|
||||
|
||||
---
|
||||
|
||||
## 0. Perche' la risposta ovvia non vale
|
||||
|
||||
La domanda "quanto vale ogni sleeve al suo posto nel book" ha una misura ovvia: togli lo sleeve,
|
||||
guarda quanto cala il book. L'ho fatta, e alla prima lettura diceva questo:
|
||||
|
||||
```
|
||||
BOOK COMPLETO FULL +2.222 HOLD +2.364 maxDD 6.07%
|
||||
tolto dFULL dHOLD dDD
|
||||
TP01 (33%) +0.280 -0.219 +0.24pp
|
||||
XS01 (15%) +0.142 +0.640 +0.25pp
|
||||
VRP01 (12%) +0.087 +0.064 +1.08pp
|
||||
SKH01 (20%) +0.432 +0.652 +1.64pp
|
||||
GTAA01 (20%) +0.120 +0.244 +1.70pp
|
||||
```
|
||||
|
||||
Letta cosi', SKH01 e' il motore del book e TP01 e' un peso morto sull'hold-out.
|
||||
**Entrambe le letture sono sbagliate**, e il motivo era gia' scritto nel progetto il giorno prima:
|
||||
|
||||
> *se si de-lucka una strategia va de-luckato anche il suo DEGRADO* — ogni Δ fra due varianti
|
||||
> misurato a un'ancora sola eredita la fortuna di quell'ancora.
|
||||
> (lezione 26/07, codificata in `altlib.anchor_luck_delta`)
|
||||
|
||||
Un leave-one-out **e' esattamente un Δ fra due varianti**. E qui il problema e' al quadrato: 4
|
||||
sleeve su 5 sono ancorati, e per 3 di loro l'ancora canonica era gia' stata misurata come
|
||||
fortunata (TP01 92° pctl su 24 ancore, SKH01 93-98° su 23 offset, XS01 fase 0 al 15° pctl di DD).
|
||||
VRP01 e' l'unico senza firma — la sua fase canonica e' la **peggiore** delle 7.
|
||||
|
||||
---
|
||||
|
||||
## 1. Il metodo: estrazioni CONGIUNTE, non una griglia per sleeve
|
||||
|
||||
Gli audit del 02/07 e del 03/07 hanno de-luckato **uno sleeve alla volta**, tenendo gli altri alla
|
||||
loro ancora canonica. Va bene per giudicare quello sleeve; non basta per giudicare il **book**,
|
||||
perche' i numeri del book sono calcolati con tutti e cinque alla canonica insieme.
|
||||
|
||||
Spazio di luck congiunto: **24 (TP01, ancore orarie) x 10 (XS01, fasi H=10) x 7 (VRP01, fasi
|
||||
settimanali) x 23 (SKH01, offset di griglia 230m/690m) x 5 (GTAA01, fasi della cadenza
|
||||
settimanale) = 193.200 configurazioni.** Non enumerabile: si campiona.
|
||||
|
||||
**2000 estrazioni uniformi e indipendenti** (seed 20260726). Uniformi-indipendenti e' il null
|
||||
onesto: non avevamo nessuna ragione a priori di preferire un'ancora a un'altra — se ce l'avessimo
|
||||
avuta, sarebbe stata parte della strategia.
|
||||
|
||||
Per ogni estrazione: book completo + i 5 leave-one-out, **tutti alla stessa configurazione
|
||||
d'ancora**. La statistica e' la **mediana delle differenze appaiate**, mai la differenza delle
|
||||
mediane (l'errore che il 26/07 aveva ribaltato il verdetto sul recupero on-book di SKH01: le due
|
||||
mediane cadono su ancore diverse).
|
||||
|
||||
**Repliche riusate, non riscritte.** I quattro generatori ancorati vengono dagli audit che li
|
||||
hanno gia' verificati bit-exact (`r0702_tp01_offset.daily_off`, `r0702_anchor_xs01.xs_phase`,
|
||||
`r0703_vrpimp_anchor.combo_weekly`, `r0702_anchor_skh01.skh_port`). Riscriverli avrebbe voluto
|
||||
dire rifare gli stessi errori di convenzione. L'unico pezzo nuovo e' la fase di GTAA01
|
||||
(`i % REBAL_EVERY == ph` invece di `== 0`), ed e' l'unico coperto da test dedicato.
|
||||
|
||||
**Sanity obbligatorio prima di tutto** — ogni replica ancorata deve riprodurre lo sleeve di
|
||||
**produzione** alla sua ancora canonica, altrimenti sto misurando un'altra strategia:
|
||||
|
||||
```
|
||||
TP01 ancora 0 max|dif| = 0.0e+00 (n=2692) OK
|
||||
XS01 ancora 0 max|dif| = 0.0e+00 (n=938) OK
|
||||
VRP01 ancora 0 max|dif| = 0.0e+00 (n=1884) OK
|
||||
SKH01 ancora 0 max|dif| = 0.0e+00 (n=2690) OK
|
||||
GTAA01 ancora 0 max|dif| = 0.0e+00 (n=2690) OK
|
||||
```
|
||||
|
||||
Costo totale: 69 serie, ~8s di precalcolo, 34s per le 2000 estrazioni.
|
||||
|
||||
---
|
||||
|
||||
## 2. Il livello del book: i numeri pubblicati stanno in cima alla banda
|
||||
|
||||
```
|
||||
canonico pctl MEDIANA p10 p90 fortuna
|
||||
Sharpe FULL +2.222 97.0% +1.946 +1.807 +2.116 +0.276
|
||||
Sharpe HOLD-OUT +2.364 99.6% +1.542 +1.109 +1.910 +0.822
|
||||
maxDD FULL 6.07% 12.0% 6.85% 5.99% 7.94% -0.78%
|
||||
```
|
||||
|
||||
**L'hold-out canonico sta al 99.6° percentile dello spazio d'ancora: solo 9 estrazioni su 2000
|
||||
fanno meglio.** La stima onesta e' **1.54**, con banda [1.11, 1.91].
|
||||
|
||||
⚠️ **Un "100%" che ho dovuto correggere.** La prima stampa dava `pctl 100%` — arrotondamento di
|
||||
99.55% con un `%.0f`. In un artefatto di ricerca un 100% stampato significa "e' il massimo, punto"
|
||||
e avrebbe fatto concludere a una sessione futura qualcosa di piu' forte del vero. Verificato a
|
||||
mano (max fra le 2000 = +2.577, a `TP01=0 / XS01=7 / VRP01=1 / SKH01=0 / GTAA01=3`), formato
|
||||
portato a 1 decimale. *Regola pratica: un percentile stampato senza decimali mente esattamente
|
||||
agli estremi, che sono l'unico posto dove lo si legge.*
|
||||
|
||||
---
|
||||
|
||||
## 3. Il leave-one-out de-luckato — e due giudizi miei ribaltati
|
||||
|
||||
```
|
||||
dSharpe FULL canonico pctl MEDIANA >0 in
|
||||
TP01 33% +0.280 5.8% +0.390 100.0%
|
||||
SKH01 20% +0.432 99.0% +0.142 90.8%
|
||||
XS01 15% +0.142 76.8% +0.125 99.9%
|
||||
VRP01 12% +0.087 1.8% +0.122 100.0%
|
||||
GTAA01 20% +0.120 63.5% +0.115 100.0%
|
||||
|
||||
dSharpe HOLD-OUT canonico pctl MEDIANA >0 in
|
||||
XS01 15% +0.640 63.4% +0.497 96.2%
|
||||
GTAA01 20% +0.244 17.3% +0.267 100.0%
|
||||
SKH01 20% +0.652 96.0% +0.190 85.5%
|
||||
VRP01 12% +0.064 47.4% +0.065 84.2%
|
||||
TP01 33% -0.219 39.5% -0.200 0.9%
|
||||
|
||||
dMaxDD (pp, >0 = protegge) pctl MEDIANA >0 in
|
||||
GTAA01 20% +1.695pp 23.8% +1.999pp 100.0%
|
||||
VRP01 12% +1.075pp 55.6% +1.056pp 88.3%
|
||||
SKH01 20% +1.636pp 89.3% +0.322pp 64.0%
|
||||
TP01 33% +0.236pp 48.4% +0.274pp 62.1%
|
||||
XS01 15% +0.251pp 65.0% +0.000pp 43.0%
|
||||
```
|
||||
|
||||
**SKH01 non e' il motore del book.** Del suo contributo apparente, l'ancora canonica regala **2/3
|
||||
sul FULL** (+0.43 → +0.14), **70% sull'hold-out** (+0.65 → +0.19), **80% sulla protezione DD**
|
||||
(+1.64pp → +0.32pp). De-luckato e' indistinguibile dagli altri sul FULL ed e' **il meno affidabile
|
||||
dei cinque**: l'unico sotto il 91% di estrazioni positive su tutte e tre le metriche (91/86/64%).
|
||||
|
||||
**GTAA01 non e' il primo da tagliare** (lo avevo detto un'ora prima, sulla lente canonica). E'
|
||||
**l'unico sleeve positivo nel 100% delle estrazioni su tutte e tre le metriche** e il miglior
|
||||
protettore di DD del book, al doppio del secondo. Non ha fortuna da restituire: il suo canonico
|
||||
sta *sotto* la mediana su FULL e DD. ⚠️ L'altra gamba di quel giudizio resta pero' intatta e
|
||||
indipendente: a $10k comprare ~€0.50/giorno sopra il risk-free con un maxDD del 10% e' caro, e
|
||||
sotto `GTAA_MIN_CAPITAL` = $3k lo sleeve non e' deployabile. **Attribuzione ≠ eseguibilita'.**
|
||||
|
||||
**TP01 e' il maggior contributore, e il canonico lo SOTTOSTIMAVA** (+0.280 al 5.8° pctl → +0.390
|
||||
de-luckato, positivo in 2000/2000, quasi 3x il secondo). Il suo hold-out negativo **non e'
|
||||
artefatto d'ancora**: e' negativo nel **99.1%** delle configurazioni. Le due cose insieme sono la
|
||||
storia dell'assicurazione, finalmente misurata invece che asserita — sul campione pieno (che
|
||||
contiene il 2022) e' il contributore piu' grande; nella finestra 2025-26 e' stato fermo mentre gli
|
||||
altri guadagnavano, e questo costa −0.20. **Giudicarlo sulla finestra in cui non e' servito
|
||||
significa venderlo esattamente prima che serva.**
|
||||
|
||||
**VRP01** conferma per la seconda volta di essere l'unico senza firma di fortuna: canonico al
|
||||
**1.8° pctl** sul FULL, cioe' i numeri di ammissione erano *conservativi*. Secondo protettore di DD.
|
||||
|
||||
**XS01** tiene il primo posto sull'hold-out anche de-luckato (+0.497), ma la sua protezione di DD
|
||||
e' **esattamente zero** (mediana 0.000, positiva nel 43% = moneta). E' un diversificatore di
|
||||
**rendimento, non di rischio** — e conta, perche' sul canale funded il vincolo binding e' il DD,
|
||||
non il CAGR (25/07 §4).
|
||||
|
||||
**Correlazioni:** stabili sotto de-luck, tutte quasi-nulle. La sola sopra 0.1 e' TP01-GTAA01
|
||||
(mediana +0.189, canonica +0.242).
|
||||
|
||||
### Il contrappeso che SKH01 ha diritto ad avere
|
||||
|
||||
Questo de-luck penalizza SKH01 sul path **backtest** (chiusura di bin). Ma le due misure del 26/07
|
||||
dicono che il **path live e' migliore del backtest su entrambi i lati**: ingressi +0.38 di Sharpe
|
||||
mediano, uscite +0.081 di Sharpe FULL di book. Applicare il de-luck senza quel contrappeso lo
|
||||
penalizzerebbe due volte. Verdetto onesto: **SKH01 vale meno dei suoi numeri di ammissione e piu'
|
||||
di questa tabella.** Quanto esattamente resta il follow-up gia' dichiarato e bloccato (serve la
|
||||
versione vol-targeted del path live di SKH01).
|
||||
|
||||
---
|
||||
|
||||
## 4. Correzione a CLAUDE.md
|
||||
|
||||
La stima del 02/07 era **a occhio** — sommava le fortune misurate sleeve-per-sleeve. Oggi e'
|
||||
**misurata congiuntamente**, ed era ottimista su tutte e tre le metriche:
|
||||
|
||||
| | stimato 02/07 | misurato 26/07 |
|
||||
|---|---|---|
|
||||
| HOLD-OUT | ~1.9-2.1 | **1.54** [1.11, 1.91] |
|
||||
| FULL | ~2.0-2.2 | **1.95** [1.81, 2.12] |
|
||||
| maxDD | "~6% invariato" | **6.85%** [5.99, 7.94] |
|
||||
|
||||
L'errore non e' stato usare una stima: e' stato che una stima per somma di effetti marginali
|
||||
**non e' la mediana congiunta**, e la differenza (+0.82 di hold-out) e' piu' grande di quasi
|
||||
tutti gli uplift per cui in questo progetto si e' discusso se ammettere uno sleeve.
|
||||
|
||||
---
|
||||
|
||||
## 5. Cosa NON e' questa misura
|
||||
|
||||
- **Non e' evidenza out-of-sample.** Il book e' valutato sugli stessi anni in cui XS01 e SKH01
|
||||
sono stati scelti e affinati. E' attribuzione, de-luckata.
|
||||
- **Non e' un gate sui pesi.** Ogni proposta di cambio pesi passa da `weights_tilt_null`. Qui non
|
||||
si propone nulla: i pesi restano 33/15/12/20/20.
|
||||
- **Non e' una lente di eseguibilita'.** Dice quanto uno sleeve contribuisce al book modellato,
|
||||
non se lo si puo' comprare a $600 (GTAA01 sotto $3k e XS01 sotto ~$20k non si possono).
|
||||
|
||||
---
|
||||
|
||||
## 6. Risposta alla domanda
|
||||
|
||||
**TP01**, se ne va tenuta una. Maggior contributore de-luckato (+0.390, 2000/2000), l'unico
|
||||
eseguibile davvero oggi a $600 senza haircut, e l'unico il cui valore dichiarato — il taglio del
|
||||
DD ~6x contro il buy&hold — **non e' ancorato** e regge a tutte le ancore testate. Tutto il resto
|
||||
dei suoi numeri e' gia' stato declassato (hold-out 0.31 → ~0.05); quello no.
|
||||
|
||||
Le altre: **SKH01** si tiene al 25% e non un euro di piu'; **GTAA01** si tiene nel book modello
|
||||
(miglior protettore di DD) ma non nel live finche' non ci sono $3k su IB; **VRP01** si tiene come
|
||||
*metro* — e' l'unico i cui numeri sono onesti per costruzione; **XS01** non e' da tenere oggi, e'
|
||||
da accendere quando arriva il capitale (~$20k, o un conto funded, dove vale piu' di tutte).
|
||||
|
||||
Il book live che gira — **TP01 75 / SKH01 25** — e' gia' questa risposta.
|
||||
|
||||
---
|
||||
|
||||
## 7. Regole trasferibili
|
||||
|
||||
1. **Un leave-one-out e' un Δ, quindi va de-luckato come ogni Δ.** L'attribuzione all'ancora
|
||||
canonica ha invertito la classifica su 2 metriche su 3.
|
||||
2. **De-luckare uno sleeve alla volta non de-lucka il book.** La fortuna del book e' un fenomeno
|
||||
*congiunto*: la somma delle fortune marginali ha sbagliato di +0.82 di Sharpe hold-out. Quando
|
||||
serve la banda di un aggregato, si campiona lo spazio congiunto.
|
||||
3. **Un percentile stampato a 0 decimali mente agli estremi**, che sono l'unico posto dove serve.
|
||||
4. **La frazione di estrazioni positive dice piu' della mediana.** Fra +0.142 (SKH01, positivo nel
|
||||
91%) e +0.115 (GTAA01, positivo nel 100%) la mediana preferisce il primo e l'affidabilita' il
|
||||
secondo — ed e' la seconda a decidere se ci si mette del capitale.
|
||||
5. **Uno sleeve difensivo si giudica sul sinistro, non sul premio.** L'hold-out negativo di TP01 e'
|
||||
robusto (99.1% delle ancore) e *non* e' un argomento per ridurlo.
|
||||
@@ -1,113 +0,0 @@
|
||||
# 2026-07-26 — Rivalutazione della strategia dopo le correzioni del giorno
|
||||
|
||||
**Richiesta:** *"in base a quanto definito rivalutiamo la strategia"*.
|
||||
|
||||
**Script:** `r0726_reeval_live_weight.py`. **Test:** `tests/test_reeval_live_weight.py` (6).
|
||||
**Book, pesi, cron, config: INVARIATI.**
|
||||
|
||||
---
|
||||
|
||||
## 0. Cosa c'era da rivalutare davvero
|
||||
|
||||
La giornata ha prodotto sei misure che toccano la strategia. Solo **una** apriva una decisione:
|
||||
|
||||
| misura di oggi | cambia una decisione? |
|
||||
|---|---|
|
||||
| fattore de-luck ×0.6 → ×0.89 | no: cambia i *numeri* (muro −45%), non cosa si fa |
|
||||
| muro come punto fisso ($273.900) | no: la mia previsione era sbagliata, il piano resta |
|
||||
| LOO de-luckato (SKH01 il meno affidabile) | **forse**: e' un argomento per *ridurre* SKH01 |
|
||||
| path live SKH01 migliore su entrambi i lati | **forse**: argomento opposto, per *aumentarlo* |
|
||||
| curva fee (SKH01 4x piu' sensibile) | no oggi: regola gia' decisa per il 1 agosto |
|
||||
| rischio venue + tripwire | no: decisione dell'operatore gia' registrata |
|
||||
|
||||
Le due righe "forse" puntano in **versi opposti** e nessuna delle due si puo' dedurre a tavolino.
|
||||
Il peso 75/25 fu confermato il **24/07** con la lente *hourly* — la stessa che il 26/07 e' risultata
|
||||
pessimistica su entrambi i lati di SKH01 (uscite **+0.081** Sharpe FULL di book, ingressi **+0.048**).
|
||||
Quindi la domanda e' legittima: **se SKH01 vale piu' di come e' stato pesato, 0.25 e' ancora giusto?**
|
||||
|
||||
## 1. La misura
|
||||
|
||||
Path live vero (`intra_entry=True`), 8 offset del sottocampione a priori, statistica = mediana
|
||||
delle differenze **appaiate** per offset.
|
||||
|
||||
```
|
||||
peso SKH Sh FULL med banda p10-p90 Sh HOLD med d vs 0.25 (appaiata)
|
||||
0.00 1.289 [1.289, 1.289] 0.296 -0.322 ( 12%)
|
||||
0.15 1.523 [1.425, 1.714] 0.705 -0.091 ( 12%)
|
||||
0.20 1.575 [1.450, 1.825] 0.825 -0.038 ( 12%)
|
||||
0.25 1.611 [1.463, 1.915] 0.928 +0.000 ( 0%) <- LIVE
|
||||
0.30 1.632 [1.465, 1.982] 1.012 +0.022 ( 88%)
|
||||
0.35 1.639 [1.455, 2.028] 1.078 +0.030 ( 88%)
|
||||
0.40 1.634 [1.435, 2.055] 1.127 +0.025 ( 88%)
|
||||
0.50 1.595 [1.374, 2.064] 1.188 -0.013 ( 38%)
|
||||
```
|
||||
|
||||
**Argmax a w=0.35**, e in **88% degli offset** 0.30-0.40 batte 0.25: il segnale c'e' ed e' nel verso
|
||||
previsto dalla correzione di lente. Ma:
|
||||
|
||||
* **plateau entro 0.05 di Sharpe = [0.25, 0.30, 0.35, 0.40, 0.50]** — il peso live e' dentro, quindi
|
||||
la differenza col massimo non e' distinguibile;
|
||||
* **`weights_tilt_null` FALLISCE** (`delta_insample −0.0026`, `gate_pass False`);
|
||||
* e soprattutto la lettura che la mediana da sola nasconde ⬇.
|
||||
|
||||
## 2. Il motivo vero per non toccarlo: il guadagno e' tutto nella coda ALTA
|
||||
|
||||
```
|
||||
peso p10 mediana p90
|
||||
0.25 1.463 1.611 1.915
|
||||
0.30 1.465 1.632 1.982
|
||||
0.35 1.455 1.639 2.028
|
||||
0.40 1.435 1.634 2.055
|
||||
0.50 1.374 1.595 2.064
|
||||
```
|
||||
|
||||
Il **p10 e' piatto fino a 0.30 e poi SCENDE**, mentre il p90 sale monotono. Alzare il peso di SKH01
|
||||
non compra Sharpe: compra **dipendenza da quale ancora ti e' capitata**. La banda si allarga da
|
||||
0.45 (a w=0.25) a 0.69 (a w=0.50).
|
||||
|
||||
E' coerente con il leave-one-out de-luckato dello stesso giorno — SKH01 e' lo sleeve con la
|
||||
frazione d'ancora piu' grande da restituire — e con la curva fee, dove SKH01 e' **4x** piu'
|
||||
sensibile di TP01. Tre misure indipendenti dicono la stessa cosa: **SKH01 e' la gamba fragile del
|
||||
book, e 0.25 sta all'estremo prudente della regione robusta.**
|
||||
|
||||
**→ Nessun cambio. Il 75/25 e' confermato per la terza volta** (24/07 lente hourly, 26/07 path live
|
||||
intra-bin, e ora il gate sui pesi).
|
||||
|
||||
## 3. La rivalutazione che conta non e' sulla strategia
|
||||
|
||||
Messi in fila, gli ordini di grandezza di oggi:
|
||||
|
||||
| leva | effetto misurato |
|
||||
|---|---|
|
||||
| ottimizzare il peso SKH01 (0.25 → 0.35) | **+0.030 Sharpe**, gate fallito |
|
||||
| versare €250/mese invece di €0 | da **mai** a **16.2 anni** (mediana), P(entro 20a) 92% |
|
||||
| perdere il conto Deribit (p=1%, 20 anni) | **−18%** di probabilita' di arrivare, e si riparte da zero |
|
||||
|
||||
**L'esito del piano non e' piu' governato dalla strategia.** Il book e' dentro il suo plateau su
|
||||
ogni asse misurato; il margine residuo di ricerca vale centesimi di Sharpe, mentre i versamenti
|
||||
valgono la differenza fra "mai" e "16 anni" e il rischio di venue vale il 18% del risultato.
|
||||
|
||||
Questo **non** dice che la ricerca sia finita — dice che la ricerca ha smesso di essere il vincolo
|
||||
binding. Il vincolo binding oggi e' **capitale che entra** e **conto che non sparisce**.
|
||||
|
||||
## 4. Cio' che la rivalutazione NON cambia
|
||||
|
||||
* **La strategia resta quella**: TP01 0.75 / SKH01 0.25 su Deribit, cron orario, cap 1.0x.
|
||||
* **I gate pre-registrati restano alle loro date** (1 ago fee, 27 set STATARB, 23 ott XSR01,
|
||||
24 ott kill DVOLSPREAD, 24 gen 2027 decisione DVOLSPREAD). Rivalutare non vuol dire anticiparli:
|
||||
anticipare un gate e' selezione sull'hold-out.
|
||||
* **La decisione venue resta $20k**, con il tripwire a coprire la parte di rischio che ha una
|
||||
finestra.
|
||||
|
||||
## 5. Regole trasferibili
|
||||
|
||||
1. **Una rivalutazione onesta parte dall'elenco di cosa CAMBIA una decisione**, non dal riassunto
|
||||
di cosa si e' scoperto. Sei misure, una sola apriva qualcosa.
|
||||
2. **Quando due correzioni puntano in versi opposti, si misura**: qui l'una (lente pessimistica)
|
||||
spingeva ad alzare SKH01, l'altra (LOO de-luckato) ad abbassarlo, e a occhio si sarebbe potuto
|
||||
argomentare qualunque cosa.
|
||||
3. **Un argmax dentro un plateau non e' una decisione.** E la mediana da sola nascondeva il fatto
|
||||
decisivo: il guadagno stava tutto nel p90, il p10 peggiorava.
|
||||
4. **Quando le leve hanno ordini di grandezza diversi, dirlo.** +0.030 di Sharpe e "da mai a 16
|
||||
anni" non sono la stessa categoria di scelta, e trattarle come tali e' il modo piu' comune di
|
||||
lavorare molto senza cambiare niente.
|
||||
@@ -1,215 +0,0 @@
|
||||
# 2026-07-26 — Follow-up SKH01 "vol-targeted": il blocco non esisteva. E il ×0.6 era troppo severo del 31-34%.
|
||||
|
||||
**Richiesta:** *"fai il follow-up SKH01 vol-targeted"*.
|
||||
|
||||
**Script:** `r0726_skh_sigcache.py` (cache), `r0726_skh_live_book.py` (misura),
|
||||
`r0726_deluck_factor.py` (decomposizione), `r0726_capwall_refresh.py` (muri ricalcolati).
|
||||
**Test:** `tests/test_skh_live_book.py` (8). **Book, pesi, cron, config: INVARIATI.**
|
||||
|
||||
---
|
||||
|
||||
## 0. Il follow-up era mal diagnosticato
|
||||
|
||||
Portato avanti come bloccante per tre sessioni, con questa motivazione registrata in CLAUDE.md:
|
||||
|
||||
> il book ricalcolato sul path live e' bloccato da una **incompatibilita' di lenti** — il
|
||||
> simulatore SKH01 compone per-trade a nozionale unitario, **lo sleeve e' vol-targeted**;
|
||||
> combinarle darebbe un numero preciso e falso.
|
||||
|
||||
**Lo sleeve SKH01 non e' vol-targeted.** Tre verifiche indipendenti:
|
||||
|
||||
1. `_skyhook_returns` chiama `backtest_signals(..., leverage=1.0, position_size=1.0)` — che nel
|
||||
suo docstring dice *"ogni trade muove capital di position_size \* leverage \* ret_netto"*:
|
||||
compounding per-trade a nozionale pieno, **la stessa lente del simulatore**;
|
||||
2. nel sorgente dello sleeve non compare `target_vol` / `vol_target` / `realized_vol`;
|
||||
3. `r0702_anchor_skh01.sim_equity(mode='canonical')` riproduce `backtest_signals` con
|
||||
**max|diff| = 0.0**.
|
||||
|
||||
Vol annualizzata realizzata per sleeve: SKH01 **20.7%**, TP01 12.2%, XS01 20.9%, GTAA01 5.4%.
|
||||
Il 20.7% e' probabilmente cio' che aveva suggerito "vol-target 20%" — ma e' un **prodotto** della
|
||||
strategia (uscite % asimmetriche + poco tempo a mercato), non un parametro. **SKH01 e' l'unica
|
||||
delle cinque a NON essere vol-targeted**, ed e' il contrario di quanto si credeva.
|
||||
|
||||
**Lezione:** un blocco dichiarato va ri-verificato prima di costruirci sopra, non ereditato. Qui
|
||||
il costo e' stato tre sessioni di follow-up rimandato per un ostacolo inesistente, e la verifica
|
||||
che lo ha smontato e' durata due minuti.
|
||||
|
||||
---
|
||||
|
||||
## 1. La misura: ingressi live vs backtest, de-luckata
|
||||
|
||||
Due path identici in tutto (livelli, uscite intra-barra, cap `max_per_day`, fee, non-overlap)
|
||||
tranne **quando si valuta l'ingresso**: LIVE = a ogni confine orario dentro il bin 230m (cio' che
|
||||
il cron fa), BACKTEST = solo a chiusura di bin.
|
||||
|
||||
Riusa la macchina a stati fedele del 26/07 (`r0726_skh_partial_entry.simulate`). ⚠️ Trovato per
|
||||
strada: **`simulate` non e' mai chiamata da `main()` di quello script** — i numeri headline del suo
|
||||
diario vennero da una corsa ad hoc mai committata. Qui il driver e' committato.
|
||||
|
||||
**Costo:** la ricostruzione del segnale a ogni osservazione oraria costa ~9 min per (asset,
|
||||
offset). Su 2 core con il cron live da non affamare, la griglia piena (23 offset) era fuori
|
||||
portata → **sottocampione uniforme dichiarato a priori: 8 offset**, uno ogni 90m su [0,690).
|
||||
E' un sottocampione per costo, non una selezione; la banda che ne esce ha 8 punti invece di 23.
|
||||
|
||||
**Sanity superato prima di tutto** (campionato sugli EVENTI, non sulla popolazione — lezione del
|
||||
26/07): **120/120** bin con ingresso ricostruiti su entrambi gli asset.
|
||||
|
||||
```
|
||||
off CANON ShBT ShLIVE dSharpe trade LIVE trade BT falsi
|
||||
0 +1.446 +1.174 +1.204 +0.029 534 447 68
|
||||
90 +1.043 +1.182 +1.194 +0.011 538 472 67
|
||||
180 +1.467 +1.505 +1.698 +0.193 544 469 60
|
||||
270 +1.231 +1.199 +1.205 +0.006 605 477 179
|
||||
360 +0.761 +1.069 +1.397 +0.328 570 478 109
|
||||
450 +0.921 +0.917 +2.025 +1.108 530 484 36
|
||||
540 +0.751 +0.374 +0.445 +0.071 531 411 138
|
||||
630 +0.871 +0.991 +1.144 +0.154 460 412 47
|
||||
|
||||
SLEEVE (50/50) mediana appaiata +0.112 positive 8/8 banda [+0.006, +1.108]
|
||||
PER-ASSET mediana appaiata +0.097 positive 13/16 banda [-0.170, +1.086]
|
||||
```
|
||||
|
||||
**Il numero del 26/07 era ~4x troppo grande.** Confrontando like-with-like — quel diario citava la
|
||||
mediana **per-asset** — si passa da **+0.38 su 3 offset** a **+0.097 su 8**, e da "6/6 non
|
||||
negativi" a **13/16**. Il segno regge, la taglia no: ennesimo Δ misurato su poche ancore che ne
|
||||
eredita la fortuna. L'outlier a offset 450 (+1.108) mostra perche' la statistica e' la mediana.
|
||||
|
||||
⚠️ Le due righe della tabella **non sono la stessa grandezza** e vanno tenute separate: nel BOOK
|
||||
entra lo sleeve 50/50, dove la diversificazione BTC/ETH cambia il denominatore.
|
||||
|
||||
### A livello di book
|
||||
|
||||
```
|
||||
dSharpe FULL mediana +0.048 p10 -0.015 p90 +0.677 >0 in 79.3%
|
||||
dSharpe HOLD-OUT mediana +0.051 p10 -0.589 p90 +0.721 >0 in 51.2%
|
||||
d drift annuo mediana +0.731pp p10 +0.044pp p90 +6.800pp >0 in 100.0%
|
||||
```
|
||||
|
||||
Lo Sharpe e' quasi una monetina, **il drift e' positivo nel 100% delle estrazioni**. Meccanismo:
|
||||
l'ingresso intra-bin prende un prezzo migliore (piu' drift) ma i falsi ingressi aggiungono churn
|
||||
(530-605 trade live contro 411-484) → vol e ritorno salgono insieme e lo Sharpe non si muove.
|
||||
Per la domanda del ×0.6, che e' **sul drift**, il numero rilevante e' +0.73pp.
|
||||
|
||||
---
|
||||
|
||||
## 2. Un'ipotesi mia, nata e morta nella stessa sessione
|
||||
|
||||
Guardando i primi **due** offset avevo notato che il canonico oscillava di 0.40 mentre i path del
|
||||
simulatore stavano fermi, e ne avevo tratto un'ipotesi: la *grid timing-luck* di SKH01 (audit
|
||||
02/07: 93-98° pctl, "spike non plateau", gate DD<30% che fallisce in 15/23 offset) sarebbe stata
|
||||
in buona parte un **artefatto della lente a chiusura-di-bin**, non una fragilita' della strategia
|
||||
live — che valuta ogni ora e non e' ancorata al confine del bin.
|
||||
|
||||
**Refutata.** Dispersione dello Sharpe fra gli 8 offset:
|
||||
|
||||
```
|
||||
path min mediana max range std
|
||||
CANONICO (chiusura bin) +0.751 +0.982 +1.467 0.716 0.289
|
||||
BT-sim (chiusura bin) +0.374 +1.122 +1.505 1.131 0.325
|
||||
LIVE-sim (intra-bin) +0.445 +1.204 +2.025 1.580 0.459
|
||||
|
||||
rapporto di dispersione LIVE/CANONICO: 1.59x
|
||||
```
|
||||
|
||||
Il path live e' **piu'** disperso fra le fasi della griglia, non meno. **L'audit del 02/07 resta
|
||||
valido com'e':** la timing-luck di SKH01 e' della strategia, non della lente. L'ipotesi e' nata su
|
||||
2 offset, si e' incrinata a 4 (1.24x) e si e' chiusa a 8 (1.59x) — e la direzione dell'errore era
|
||||
sempre la stessa, il che e' il motivo per cui 2 punti non bastano mai.
|
||||
|
||||
---
|
||||
|
||||
## 3. Il ×0.6 decomposto, misurato, corretto
|
||||
|
||||
Il fattore taglia il **drift** (`b - 0.4*mean(b)`) ed era applicato **sopra** la lente `hourly`,
|
||||
cioe' sopra un modello del live gia' pessimistico. Mescolava due cose separabili.
|
||||
|
||||
**(a) Fortuna d'ancora sul drift** — misurata sullo spazio congiunto:
|
||||
|
||||
| | canonico | pctl | MEDIANA | p10-p90 |
|
||||
|---|---|---|---|---|
|
||||
| book 5-sleeve, drift | 17.33% | 96.0° | **15.15%** | [13.88, 16.49] |
|
||||
| book 5-sleeve, CAGR | 18.56% | 96.0° | **16.00%** | [14.55, 17.56] |
|
||||
| book LIVE 75/25, drift | 19.27% | 93.8° | **17.16%** | [15.75, 18.67] |
|
||||
|
||||
→ fattore d'ancora **×0.874** (5-sleeve) / **×0.890** (book live). La **vol e' invariata** fra le
|
||||
ancore (7.80% → 7.76%): la fortuna sta tutta nel drift, non nel rischio.
|
||||
|
||||
**(b) Degradazione del path live** — non-negativa su tutto cio' che e' stato misurato:
|
||||
uscite SKH01 **+0.081** Sharpe di book (23/23 offset); ingressi SKH01 **+0.73pp** di drift
|
||||
(100% delle estrazioni); TP01 barra parziale trascurabile (24 ancore).
|
||||
|
||||
**Il ×0.6 implicava un residuo ×0.687 attribuito al live oltre l'ancora.** Nessuna misura del
|
||||
progetto lo sostiene. Il sospetto gia' registrato in CLAUDE.md — *"il ×0.6 sopra il path live
|
||||
rischia di contare DUE VOLTE la degradazione SKH01"* — e' **confermato quantitativamente**.
|
||||
|
||||
> **FATTORE ONESTO: ×0.87 – ×0.91** (5-sleeve) / **≥×0.89** (book live), contro il ×0.60 in uso.
|
||||
> **Troppo severo del 31-34%.**
|
||||
|
||||
La componente uscite spingerebbe oltre, ma e' misurata in Sharpe e non in drift: non convertita,
|
||||
per non inventare precisione. Quindi il limite superiore e' esso stesso conservativo.
|
||||
|
||||
---
|
||||
|
||||
## 4. Cosa cambia nei muri di capitale (`r0726_capwall_refresh.py`)
|
||||
|
||||
Stessa macchineria del 25/07 (`book_series`, `survival`, `_boot_paths` importati, non riscritti).
|
||||
|
||||
```
|
||||
fattore leva SWR-20a PERPETUA capitale
|
||||
×0.60 (25/07, a occhio) 1.00 7.36% 6.00% $494,758
|
||||
×0.60 (25/07, a occhio) 1.50 8.16% 8.11% $366,300
|
||||
×0.89 (26/07, ancora MISURATA) 1.00 10.94% 10.91% $272,061
|
||||
×0.89 (26/07, ancora MISURATA) 1.50 13.72% 14.87% $199,625
|
||||
×1.00 (nessun haircut) 1.00 12.48% 12.72% $233,330
|
||||
```
|
||||
|
||||
**Il muro per 50 EUR/g scende del ~45%: da ~$495k a ~$272k** (leva 1.0), e il valore vero sta fra
|
||||
la riga ×0.89 e la riga ×1.00 perche' ×0.89 e' un limite inferiore.
|
||||
|
||||
**Cio' che NON cambia:** $272k restano **~453x** il conto di oggi. La conclusione strutturale del
|
||||
25/07 — *i 600 euro come CAPITALE sono refutati, come BIGLIETTO (prop) no* — regge intatta.
|
||||
Cambia la taglia dell'errore, e cambia che il numero e' misurato invece che scelto.
|
||||
|
||||
Rendita sul conto attuale: EUR 0.12/g (×0.6) → **EUR 0.18/g** (×0.89). A questa taglia sono
|
||||
centesimi: **il fattore conta per il MURO e per le soglie prop, non per il conto di oggi.**
|
||||
|
||||
### La traiettoria — il fattore agisce DUE volte
|
||||
|
||||
Correggere il fattore alza il drift (si accumula prima) **e** abbassa il bersaglio (serve meno
|
||||
capitale). I due effetti pesano quasi uguale, quindi vanno separati invece che sommati alla cieca:
|
||||
|
||||
```
|
||||
dep./mese ×0.60 muro $495k ×0.89 muro $495k ×0.89 muro $272k
|
||||
(25/07) (solo drift) (26/07)
|
||||
€0 mai mai mai
|
||||
€250 22.4a (8% <20a) 19.6a (53%) 16.2a (91%)
|
||||
€500 19.6a (48%) 15.7a (94%) 12.4a (100%)
|
||||
€1000 14.8a (95%) 12.0a (100%) 9.0a (100%)
|
||||
€2000 10.0a (100%) 8.5a (100%) 6.0a (100%)
|
||||
```
|
||||
|
||||
✅ **Validazione indipendente:** la colonna ×0.60 riproduce **esattamente** i numeri pubblicati il
|
||||
25/07 (€500/m → 19.6a, €1000/m → 14.8a). La replica e' fedele, quindi le altre due colonne sono
|
||||
confrontabili con quelle.
|
||||
|
||||
A €500/mese: dei ~7 anni guadagnati, ~4 vengono dal drift e ~3 dal bersaglio piu' basso.
|
||||
|
||||
⚠️ **Cio' che il fattore NON cambia:** senza depositi il capitale-rendita **non si raggiunge mai**
|
||||
(0% dei path a 20 anni, a ogni fattore). L'accumulo viene dai versamenti, non dal rendimento —
|
||||
correggere il ×0.6 accorcia i tempi, non crea una via che non c'era. E la mediana e' una mediana:
|
||||
meta' dei path arriva dopo, e una quota non arriva affatto.
|
||||
|
||||
---
|
||||
|
||||
## 5. Regole trasferibili
|
||||
|
||||
1. **Un blocco dichiarato e' un'ipotesi, non un fatto.** Ri-verificarlo prima di costruirci sopra
|
||||
o di rimandare: qui tre sessioni di attesa contro due minuti di verifica.
|
||||
2. **Un Δ su poche ancore eredita la loro fortuna, sempre** — terza occorrenza in due giorni
|
||||
(recupero on-book, degrado d'esecuzione, e ora gli ingressi: +0.38 → +0.097).
|
||||
3. **Quando un fattore correttivo e' scelto a occhio, decomporlo prima di rifiutarlo o accettarlo.**
|
||||
Il ×0.6 non era "sbagliato": era due fattori moltiplicati insieme, uno dei quali contato due volte.
|
||||
4. **Sharpe e drift rispondono a cose diverse.** L'effetto ingressi e' una monetina sullo Sharpe e
|
||||
certo sul drift: chiedersi *quale* delle due grandezze entra nella decisione prima di misurare.
|
||||
5. **Due punti non fanno una tendenza** — nemmeno quando la meccanica sembra spiegarla. L'ipotesi
|
||||
sulla dispersione era plausibile e sbagliata, e il costo di verificarla era basso.
|
||||
@@ -1,202 +0,0 @@
|
||||
# 2026-07-26 — SKH01: gli INGRESSI su barra 230m PARZIALE. Misura dedicata.
|
||||
|
||||
**Richiesta:** *"fai la misura sugli ingressi con barra parziale"*.
|
||||
**Follow-up dichiarato che chiude** (registrato in CLAUDE.md stamattina, misura T1):
|
||||
|
||||
> la stessa barra parziale tocca anche gli INGRESSI — `ent[n-1]` puo' venire da un breakout non
|
||||
> confermato a fine barra → se evapora, il book apre e richiude. Su 112 bin campionati:
|
||||
> disaccordo parziale-vs-completa in 1 (~1%), ma con sole 3 entry nel campione la taglia non e'
|
||||
> stimabile … serve una misura dedicata prima di decidere il verso.
|
||||
|
||||
**Script:** `scripts/research/r0726_skh_partial_entry.py` — **test:** `tests/test_skh_partial_entry.py` (8).
|
||||
**Book, pesi, cron: INVARIATI.** Nessuna decisione di allocazione cambia.
|
||||
|
||||
---
|
||||
|
||||
## 0. Il fatto meccanico da cui parte tutto
|
||||
|
||||
`resample_5m(..., origin="epoch")` **non scarta il bin in corso**. Il cron gira a ore piene; una
|
||||
barra SKH01 dura 230 minuti. Quindi a ogni giro il live valuta il segnale su una barra 230m che, in
|
||||
media, e' **completa a meta'**. Il backtest invece valuta solo alle chiusure dei bin.
|
||||
|
||||
Stamattina ho misurato il lato **uscite** di questo fatto (e ho scoperto che il live esce
|
||||
gia' intra-barra, quindi le uscite erano modellate troppo pessimisticamente). Restava il lato
|
||||
**ingressi**, che e' l'opposto: il live puo' entrare su un breakout che a fine barra **non c'e' piu'**.
|
||||
|
||||
La domanda non e' "succede?" (succede per costruzione). E' **di che segno e' il saldo**.
|
||||
|
||||
---
|
||||
|
||||
## 1. Come si misura senza misurare la propria aritmetica
|
||||
|
||||
Il rischio di questa misura non e' sbagliare un numero: e' costruire una ricostruzione rotta e non
|
||||
accorgersene. `signal_at(obs_ms, ...)` ricostruisce il segnale che il live *avrebbe visto* a un
|
||||
istante arbitrario: storia completa fino a li' + barra parziale, passata per i **veri**
|
||||
`htf_features` / `merge_htf_to_ltf` / `atr` su una finestra di 200 barre HTF.
|
||||
|
||||
**Due errori catturati in sessione, entrambi del tipo che passa i test se i test sono pigri:**
|
||||
|
||||
**(a) Self-check vacuo + bug di confine.** La prima versione stampava "BTC 80/80 OK". Era falso su
|
||||
due livelli insieme. `obs_ms // MS_LTF` a un'osservazione *alla chiusura* del bin cadeva nel bin
|
||||
**successivo**, ancora vuoto → aggregato vuoto → `signal_at` ritornava `None` → segnale 0. E il
|
||||
check campionava bin **a caso**: gli ingressi sono ~2% dei bin, quindi confrontava **zeri con zeri**
|
||||
e passava comunque. Le uniche 2 divergenze su ETH erano gli unici 2 bin con un segnale vero — cioe'
|
||||
il campione stava gia' dicendo che era rotto al 100%, non al 2.5%.
|
||||
|
||||
Fix: `((obs_ms - 1) // MS_LTF) * MS_LTF`, e `selfcheck` riscritta per testare **esplicitamente i bin
|
||||
CON ingresso**. Esito corretto: **120/120 su BTC, 120/120 su ETH**. I "falsi allarmi" sui bin flat
|
||||
(17 BTC / 22 ETH su 400) sono bin dove il segnale c'e' ma il backtest lo sopprime col cap
|
||||
`max_per_day=1` — atteso, non un difetto.
|
||||
|
||||
> **Regola:** un self-check su eventi rari va campionato **sugli eventi**, non sulla popolazione.
|
||||
> Un check che confronta zeri con zeri ha potenza zero e sembra un successo.
|
||||
|
||||
**(b) Sovrastima ~20× dei falsi ingressi.** La prima scansione contava **1361** falsi ingressi
|
||||
(204% in piu' dei trade veri, costo stimato −3.03%/anno di sleeve). Numero **sbagliato**: `signal_at`
|
||||
riporta il compositore **grezzo**, mentre il live applica anche il cap `max_per_day=1` e il
|
||||
non-overlap. La spia era nella sezione D della stessa stampa — **305 giorni** con un falso ingresso a
|
||||
fronte di 663 "eventi": con cap 1/giorno non possono essere eventi indipendenti. Riscritta come
|
||||
**macchina a stati sequenziale** fedele al live: i falsi ingressi veri sono **~5/anno/asset**.
|
||||
|
||||
> **Regola:** un conteggio di eventi su un segnale grezzo non e' un conteggio di **trade**. Prima di
|
||||
> monetizzare un evento, farlo passare per gli stessi filtri che ha il live.
|
||||
|
||||
---
|
||||
|
||||
## 2. Il risultato
|
||||
|
||||
Due path identici in tutto (stessi livelli SKH01_V2_DD pct-asimmetrici, stesse uscite intra-barra,
|
||||
stesso cap, stesse fee 0.10% RT) tranne **quando si valuta l'ingresso**:
|
||||
|
||||
- **LIVE** — segnale valutato a ogni confine orario interno al bin (= cio' che fa il cron oggi);
|
||||
- **BACKTEST** — segnale valutato solo alle chiusure dei bin (= cio' che il backtest assume).
|
||||
|
||||
| asset | offset | path | equity× | trade | falsi | Sharpe |
|
||||
|---|---:|---|---:|---:|---:|---:|
|
||||
| BTC | 0 | LIVE | 6.58 | 249 | 29 | **1.07** |
|
||||
| BTC | 0 | BACKTEST | 6.28 | 211 | 0 | 1.08 |
|
||||
| ETH | 0 | LIVE | 6.09 | 285 | 39 | **0.95** |
|
||||
| ETH | 0 | BACKTEST | 5.44 | 236 | 0 | 0.91 |
|
||||
| BTC | 230 | LIVE | 27.10 | 254 | 20 | **1.63** |
|
||||
| BTC | 230 | BACKTEST | 8.32 | 226 | 0 | 1.19 |
|
||||
| ETH | 230 | LIVE | 11.47 | 283 | 34 | **1.20** |
|
||||
| ETH | 230 | BACKTEST | 5.08 | 241 | 0 | 0.88 |
|
||||
| BTC | 460 | LIVE | 17.53 | 258 | 18 | **1.44** |
|
||||
| BTC | 460 | BACKTEST | 4.29 | 236 | 0 | 0.85 |
|
||||
| ETH | 460 | LIVE | 72.87 | 281 | 17 | **1.93** |
|
||||
| ETH | 460 | BACKTEST | 6.12 | 253 | 0 | 0.95 |
|
||||
|
||||
**ΔSharpe (live − backtest): −0.01, +0.04, +0.44, +0.32, +0.59, +0.98 → 6/6 non negativi,
|
||||
mediana +0.38.**
|
||||
|
||||
⚠️ **I multipli d'equity NON sono ritorni dello sleeve.** Questo simulatore compone per-trade senza
|
||||
vol-target, senza pesi di book, a nozionale unitario. Servono solo a confrontare due path che
|
||||
differiscono per una cosa sola. La lente onesta qui e' lo **Sharpe** (che non compone), e i multipli
|
||||
sono la sua integrazione su 7 anni.
|
||||
|
||||
**Split in-sample / hold-out (offset 0, dove ho le serie):**
|
||||
|
||||
| asset | path | FULL | IS | HOLD |
|
||||
|---|---|---:|---:|---:|
|
||||
| BTC | LIVE | 1.07 | 1.07 | **1.12** |
|
||||
| BTC | BACKTEST | 1.08 | 1.15 | 0.71 |
|
||||
| ETH | LIVE | 0.95 | 0.93 | 1.03 |
|
||||
| ETH | BACKTEST | 0.91 | 0.88 | 1.03 |
|
||||
|
||||
All'offset 0 il FULL e' un pareggio ma l'hold-out favorisce il live su BTC (**+0.41**) e pareggia su
|
||||
ETH. Coerente col fatto noto che **offset 0 e' l'ancora fortunata del backtest** (93-98° pctl sui 23
|
||||
offset a priori): e' esattamente l'ancora dove il path canonico ha meno da guadagnare.
|
||||
|
||||
---
|
||||
|
||||
## 2-bis. I due controlli che il risultato doveva superare
|
||||
|
||||
Un +0.98 di Sharpe e un 72.87× di equity sono il tipo di numero che va attaccato prima di crederci.
|
||||
|
||||
**(a) E' concentrato in pochi giorni?** No — e il controllo va nella direzione **opposta** al sospetto:
|
||||
|
||||
| offset 460 | ret/trade | win rate | top-5 gg = % del log-equity | equity senza i top-5 |
|
||||
|---|---:|---:|---:|---:|
|
||||
| ETH LIVE | +1.878% | 48.6% | **16.7%** | 35.64× |
|
||||
| ETH BACKTEST | +0.946% | 40.6% | **39.5%** | 2.99× |
|
||||
| BTC LIVE | +1.307% | 46.1% | **22.5%** | 9.20× |
|
||||
| BTC BACKTEST | +0.801% | 44.0% | **38.3%** | 2.46× |
|
||||
|
||||
Togliendo i 5 giorni migliori il divario si **allarga** (ETH 35.6× vs 3.0×). E' il **backtest** il
|
||||
path concentrato (~39% del log-equity in 5 giorni). La differenza vive nella **distribuzione**:
|
||||
ret/trade circa doppio e win rate +8pp (ETH) / +2pp (BTC).
|
||||
|
||||
**(b) C'e' look-ahead intra-bin?** E' il rischio serio, perche' il self-check valida la ricostruzione
|
||||
solo **a chiusura di bin** — un leak che esistesse solo intra-bin gli sarebbe **invisibile per
|
||||
costruzione**. Test decisivo: ricalcolare ogni osservazione intra-bin con la serie 5m **troncata**
|
||||
alle sole barre gia' chiuse a `obs_ms`. Se il futuro contasse, la risposta cambierebbe.
|
||||
|
||||
> **BTC 145/145 e ETH 144/144 osservazioni intra-bin: risposta identica dopo il troncamento**, e il
|
||||
> prezzo d'ingresso coincide sempre con l'ultimo close 5m gia' chiuso (241/241).
|
||||
|
||||
Cablato come test permanente (`test_nessun_lookahead_intra_bin`).
|
||||
|
||||
---
|
||||
|
||||
## 3. Il meccanismo (perche' vince, e perche' non e' una sorpresa)
|
||||
|
||||
Sezione B della scansione: quando il segnale c'e' **anche** a fine bin, il live entra in anticipo di
|
||||
**180 minuti mediani** a un prezzo **0.25-0.26% migliore** in media (0.11-0.12% mediano).
|
||||
|
||||
SKH01 e' un **Donchian breakout**. Aspettare fino a 230 minuti la chiusura del bin significa, sui
|
||||
casi che confermano, **pagare il pezzo di movimento gia' avvenuto**. Il costo di quell'attesa e'
|
||||
sistematico; il beneficio (evitare i breakout che evaporano) e' reale ma raro — **~5 eventi/anno/asset**
|
||||
dopo i filtri del live, perche' il cap `max_per_day=1` e il non-overlap assorbono quasi tutto.
|
||||
|
||||
E l'effetto si amplifica sui **livelli**, che sono percentuali sull'ingresso (long sl4%/tp10%, short
|
||||
sl2%/tp8%). Entrare 0.26% piu' avanti nella direzione del breakout sposta TP **e** SL dello stesso
|
||||
0.26% — ma il TP e' a 4-10% e lo SL a 2-4%: la stessa quantita' assoluta vale il **6-13% della
|
||||
distanza dallo SL** contro il 2.6-3.3% della distanza dal TP. Il vantaggio d'ingresso e' quindi
|
||||
**asimmetrico a favore della sopravvivenza del trade**: e' il canale che spiega il win rate piu' alto,
|
||||
non un giorno fortunato.
|
||||
|
||||
**La cannibalizzazione del cap non morde:** ingressi veri bloccati da un falso ingresso = **2 su BTC
|
||||
(0.6%) e 3 su ETH (0.9%)**.
|
||||
|
||||
---
|
||||
|
||||
## 4. Verdetto
|
||||
|
||||
**L'ingresso su barra parziale NON e' un difetto da correggere. Il verso del follow-up e': lasciarlo.**
|
||||
|
||||
Ma la lettura che conta e' la seconda:
|
||||
|
||||
> **Il live e il backtest stanno girando due strategie diverse, e la differenza non e' neutra.**
|
||||
|
||||
Tutti i numeri di SKH01 nel progetto — Sharpe standalone, il peso 25% del book Deribit, l'audit
|
||||
d'ancora del 02/07, la conferma di peso/cadenza del 24/07 — sono calcolati sul path **a chiusura di
|
||||
bin**, che non e' quello che gira. La misura dice che il path reale e' **≥** in 6/6 coppie
|
||||
asset×offset. Insieme alla misura di stamattina sulle uscite (il live esce gia' intra-barra, +0.081
|
||||
Sharpe FULL di book sottostimato), **il path live di SKH01 e' stato modellato in modo
|
||||
sistematicamente pessimistico su entrambi i lati**.
|
||||
|
||||
**Cosa NON concludo.** Che "l'ingresso intra-bin e' un miglioramento validato". Non ha passato
|
||||
nessuno dei gate del progetto: e' stato *misurato* sugli stessi 7 anni su cui SKH01 e' stato
|
||||
selezionato e affinato, non e' passato per `study_family_honest` ne' per un deflated-Sharpe, e la
|
||||
taglia varia molto fra ancore (da −0.01 a +0.98). Promuoverlo a meccanismo canonico sarebbe
|
||||
esattamente la selezione-sull'hold-out che il progetto ha gia' codificato come gate.
|
||||
|
||||
E non serve promuoverlo: **e' gia' cio' che il live fa**. L'azione richiesta e' l'opposta — smettere
|
||||
di trattare il numero del backtest come l'aspettativa del live, e non "riparare" il live per farlo
|
||||
somigliare a un backtest peggiore.
|
||||
|
||||
**Nessun cambio a book, pesi, cron, config.**
|
||||
|
||||
---
|
||||
|
||||
## 5. Regole nuove
|
||||
|
||||
1. **Un self-check su eventi rari si campiona sugli EVENTI.** Confrontare zeri con zeri ha potenza
|
||||
zero e passa. (Costo: un "80/80 OK" completamente falso.)
|
||||
2. **Un conteggio di eventi su segnale grezzo non e' un conteggio di trade.** I filtri del live
|
||||
(cap giornaliero, non-overlap) vanno applicati prima di monetizzare qualsiasi evento. (Costo:
|
||||
sovrastima 20× e un costo inventato di −3%/anno di sleeve.)
|
||||
3. **Quando live e backtest differiscono, misurare il DELTA con machinery identica** — un solo grado
|
||||
di liberta' cambiato — e quotarlo sulla **banda d'ancora**, non su un'ancora sola. All'ancora
|
||||
canonica questo effetto vale ~0; sulla banda vale +0.38 mediano. Su un'ancora sola avrei
|
||||
concluso "irrilevante".
|
||||
@@ -1,155 +0,0 @@
|
||||
# 2026-07-26 — T1 nel live: il fix richiesto NON va fatto, e il perché è una correzione di modello
|
||||
|
||||
**Richiesta:** implementare nel live il fix T1 (TP di SKH01 come limit resting on-book).
|
||||
**Esito: NON implementato**, con i numeri sotto. **Implementato invece** ciò che le misure
|
||||
sostengono: la sorveglianza della freschezza del feed 5m di SKH01, e la correzione dei docstring
|
||||
che hanno causato tre settimane di misure sbagliate.
|
||||
|
||||
**File toccati (produzione):** `src/live/livefeed.py`, `src/live/book.py`, `src/portfolio/sleeves.py`
|
||||
(solo docstring), `scripts/live/book_execute.py`, `config/live.json`.
|
||||
**Test:** `tests/test_skh_feed_freshness.py` (11 casi) · suite **266 verdi**.
|
||||
**Strategia, pesi, cadenza del cron: INVARIATI.** Nessun ordine inviato.
|
||||
|
||||
---
|
||||
|
||||
## 1. Cosa ho trovato leggendo il codice di produzione
|
||||
|
||||
Il fix T1 nasceva da una simulazione in cui SKH01 esce per conto suo. Il live non funziona così, e
|
||||
il vincolo era scritto nel codice:
|
||||
|
||||
> `book.py`: *«gli exit sono SOFTWARE (no bracket on-book per SKH, sennò chiuderebbero anche la
|
||||
> quota TP01)»*
|
||||
|
||||
TP01 e SKH01 tradano **lo stesso strumento** e Deribit tiene **una sola posizione netta**. Un
|
||||
ordine on-book al livello di TP di SKH chiuderebbe una fetta della posizione netta, che è per il
|
||||
75% di TP01. Ho quindi misurato i due ostacoli invece di assumerli:
|
||||
|
||||
**(A) Compatibilità di segno — risolvibile.** Un ordine reduce-only può muovere la posizione solo
|
||||
verso lo zero. Se SKH è short mentre il netto è long (perché TP01 pesa di più), chiudere lo short
|
||||
significa *aumentare* il netto: non esprimibile. Frequenza sui trade che escono in TP — gli unici
|
||||
che il fix tocca: **97% compatibili** (SKH long 100%, SKH short 94%). Il 3% si sarebbe potuto
|
||||
saltare con fallback all'uscita software.
|
||||
|
||||
**(B) Divergenza modello/live — sembrava bloccante.** Se il limit riempie a metà barra ma il
|
||||
modello non "vede" l'uscita, il cron successivo ricalcola il target includendo ancora la quota SKH
|
||||
e **ricompra ciò che il TP ha appena chiuso**. Misurato assumendo la rilevazione a fine barra 230m:
|
||||
ritardo mediano **115 min**, p90 **210**, e nel **70% dei TP almeno un cron gira nella finestra**
|
||||
(mediana 1.9 cron, p90 3.5).
|
||||
|
||||
## 2. …e poi ho scoperto che il problema (B) non esiste
|
||||
|
||||
Il problema (B) presuppone che il modello veda le uscite solo a barra 230m chiusa. È ciò che dicono
|
||||
i docstring:
|
||||
|
||||
> `sleeves._skyhook_positions`: *«fino all'ultima barra 230m chiusa. Causale: usa solo barre chiuse»*
|
||||
> `book.py`: *«latenza fino alla chiusura della barra 230m corrente»*
|
||||
|
||||
**Sono falsi.** `resample_5m` **non scarta il bin in corso** — aggrega le barre 5m che ci sono
|
||||
finora — e il ciclo di `_skyhook_positions` itera fino a `n-1`, quindi valuta gli hit di SL/TP
|
||||
anche sul bin **parziale**, col suo high/low corrente. Verificato sul feed reale: l'ultimo bin 230m
|
||||
conteneva **21 barre 5m su 46** (105 minuti su 230).
|
||||
|
||||
Quindi il live rileva il tocco **entro il primo cron dopo il tocco (~1h)**, non a fine barra. E non
|
||||
è look-ahead: il livello è fissato all'ingresso da barre chiuse, e osservare che il prezzo l'ha già
|
||||
toccato è esattamente ciò che fa qualunque stop reale.
|
||||
|
||||
### La conseguenza: il path live era modellato male da tre settimane
|
||||
|
||||
La lente `hourly` — usata dall'audit del 02/07, dal follow-up del 24/07 e dal mio stesso T1 di
|
||||
stamattina — assume la rilevazione a fine barra. Il modello fedele è un altro (`fastdetect`:
|
||||
rilevazione intra-barra a 5m, uscita a mercato al primo cron successivo). Sulla banda appaiata dei
|
||||
23 offset, **relativo al path live come veniva modellato**:
|
||||
|
||||
| modalità | ΔFULL mediana [min,max] | ΔHOLD mediana | offset migliorati (FULL) |
|
||||
|---|---|---|---|
|
||||
| **`fastdetect` = il live VERO** | **+0.081** [+0.00,+0.14] | +0.039 | **23/23** |
|
||||
| `canonical` (tetto teorico del backtest) | +0.054 [−0.05,+0.12] | +0.099 | — |
|
||||
| `onbook_tp` (**il fix richiesto**) | +0.054 [−0.03,+0.07] | +0.061 | 19/23 |
|
||||
| `onbook` (TP+SL on-book) | +0.024 [−0.07,+0.11] | +0.031 | 17/23 |
|
||||
|
||||
Due letture, entrambe importanti:
|
||||
|
||||
1. **Il "−0.35 di degrado del path live" è in gran parte un artefatto di modello**, sopra
|
||||
l'artefatto di ancora già trovato stamattina. Sul FULL il live vero sta **sopra** il canonical.
|
||||
2. **Il fix richiesto sarebbe un declassamento**: +0.054 contro i +0.081 che il live già fa — e in
|
||||
cambio si porterebbero in un percorso con soldi veri ordini parziali sul netto, un 3% di casi
|
||||
non esprimibili, e la riconciliazione fra fill del broker e stato del modello.
|
||||
|
||||
**Per questo non l'ho implementato.** Non è una difficoltà tecnica: è che la misura, fatta sulla
|
||||
lente giusta, dice che peggiorerebbe.
|
||||
|
||||
---
|
||||
|
||||
## 3. Il problema vero, trovato per strada
|
||||
|
||||
`fresh_5m` è il pezzo che tiene bassa la latenza d'uscita. E **fallisce in silenzio**:
|
||||
|
||||
```python
|
||||
try:
|
||||
tail = _fetch_recent_5m(sym, lookback_days)
|
||||
except Exception:
|
||||
return base # ← nessun log, nessun errore, nessuna traccia
|
||||
```
|
||||
|
||||
`_fetch_recent_5m` inghiotte a sua volta le eccezioni (`except Exception: break`). Se il fetch
|
||||
pubblico Deribit non risponde, il segnale SKH gira sul **feed certificato**, che il cron ricostruisce
|
||||
**una volta al giorno**. La latenza d'uscita passa da **~1 ora a ~1 giorno**, e niente lo segnala:
|
||||
il conto è online, la posizione è leggibile, il gate di staleness guarda il feed *di TP01* — nessuno
|
||||
dei controlli esistenti scatta. È lo stesso schema del feed-freeze del 2026-07-14, su un altro feed.
|
||||
|
||||
E conta esattamente quanto il resto di questo lavoro: la latenza d'uscita **è** dove vive la qualità
|
||||
del path live.
|
||||
|
||||
### Cosa ho cablato
|
||||
|
||||
- **`livefeed.feed_age_minutes(df5)`** — pura, testabile senza rete: età in minuti dell'ultima barra
|
||||
5m, misurata dalla sua **chiusura**, con `None` per input non interpretabili (`None` = "non
|
||||
misurata", da trattare come sospetta: se tornasse `0.0` sembrerebbe fresca) e clamp a zero sugli
|
||||
skew d'orologio.
|
||||
- **`book.book_report(live_feed=True)`** avvolge il loader per misurare la freschezza del feed
|
||||
**effettivamente usato**, e la espone come `skh_feed_age_min` (massimo fra gli asset: se anche uno
|
||||
solo è stantio, il netto è sospetto).
|
||||
- **`book_execute`** stampa lo stato e **allerta su Telegram** sopra `skh_feed_max_age_min` (30 min,
|
||||
in `config/live.json`).
|
||||
|
||||
**Scelta dichiarata: allerta, NON blocca.** Bloccare fermerebbe anche il ribilancio di TP01 — sono
|
||||
nettati sullo stesso strumento — per un guasto di rete; e forzare SKH a flat chiuderebbe posizioni
|
||||
buone su un glitch. Non ho evidenza su quale politica di blocco sia giusta, quindi la decisione
|
||||
resta all'operatore, informato.
|
||||
|
||||
### Docstring corretti
|
||||
|
||||
I due docstring falsi sono stati corretti *sul posto*, con la misura e il perché. Erano loro a
|
||||
sostenere la catena di ragionamenti sbagliata, ed erano la cosa più economica da riparare.
|
||||
|
||||
---
|
||||
|
||||
## 4. Follow-up dichiarato, non risolto
|
||||
|
||||
La stessa barra parziale che migliora le **uscite** tocca anche gli **ingressi**: `ent[n-1]` può
|
||||
venire da un bin parziale, cioè da un breakout non ancora confermato a fine barra. Se il segnale
|
||||
evapora, il book apre e richiude — churn puro.
|
||||
|
||||
Misurato su **112 bin campionati**: entry sulla barra completa in 3, sulla parziale in 2,
|
||||
**disaccordo in 1 (~1% dei bin)**. Ma con sole 3 entry nel campione la **taglia dell'effetto non è
|
||||
stimabile**: so che esiste, non so quanto pesa. Non l'ho toccato — a differenza delle uscite, qui
|
||||
il comportamento del live **diverge dal backtest in modo sostanziale** (entra su un segnale che il
|
||||
backtest non avrebbe visto), e sistemarlo è un cambio di strategia, non di strumentazione.
|
||||
Serve una misura dedicata prima di decidere in che verso.
|
||||
|
||||
---
|
||||
|
||||
## 5. Lezioni
|
||||
|
||||
1. **Prima di implementare una raccomandazione, leggere il codice che dovrà ospitarla.** T1 era
|
||||
corretto sul suo modello e inapplicabile sull'architettura reale — e leggendo quel codice è
|
||||
saltato fuori che il modello stesso era sbagliato. La ricerca del mattino non lo poteva sapere:
|
||||
simulava lo sleeve, non il book nettato.
|
||||
2. **Un docstring falso costa più di un bug**, perché nessun test lo cattura e tutti ci ragionano
|
||||
sopra. Questi due hanno guidato tre analisi (02/07, 24/07, T1) verso una latenza che il codice
|
||||
non aveva.
|
||||
3. **Un fallback silenzioso è un guasto silenzioso.** `fresh_5m` fa la cosa giusta (mai operare a
|
||||
cieco) ma non dice di averla fatta: la scelta giusta è tenere il fallback **e** misurarlo.
|
||||
4. Terzo caso in due giorni in cui **il numero di partenza era peggio di com'era stato scritto**:
|
||||
la fortuna d'ancora sul degrado (stamattina), la lente `hourly` (qui), il wick indipendente
|
||||
(ieri). Ogni volta il difetto stava nella **lente**, non nella strategia.
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user