research(wave): ondata 3 filoni — esecuzione SKH01, DVOLSPREAD, XSR01 fuori dal crypto

Tre questioni che il progetto aveva lasciato aperte e decidibili oggi.

T1 — ESECUZIONE SKH01. Testato l'unico meccanismo che non e' un cron: ordini
resting on-book (TP=limit al livello per costruzione + fee maker, SL=stop-market).
A offset 0 recupera il 94% del degrado, ma l'audit 02/07 aveva de-luckato i
numeri headline di SKH01 e NON il degrado. Sulla banda appaiata dei 23 offset il
degrado recuperabile e' +0.054 Sh di book, non -0.35 di sleeve.

Errore di metodo corretto in sessione: mediana(A)-mediana(B) fra offset confronta
offset diversi; serve la mediana delle DIFFERENZE appaiate. Col fix il verdetto
si ribalta: solo TP a limite = +0.054 FULL / +0.061 HOLD, positivo in 19/23 e
21/23 offset; lo SL on-book PEGGIORA (mediana -0.010, positivo in 11/23) perche'
cristallizza la perdita mentre l'exit ritardata incassa il rimbalzo.
Raccomandazione NON eseguita: TP a limite si, SL strategico on-book no.

T2 — DVOLSPREAD esce dal limbo (fermo dal 21/06). Passato ai due gate che allora
non esistevano. La griglia dichiarata "72 celle" ne contiene 729: valutate tutte.
Plateau reale (729/729 hold-out positivo). Selection-on-holdout confermata ma
mite: cella pubblicata 83a/729 sull'hold-out, 471a/729 in-sample. Cella onesta
FULL 0.68 / HOLD 0.69 (non 0.93) e DSR 0.953 PASS; la pubblicata fallisce 0.947.
Promosso a forward-monitor coi parametri onesti, NON nel book (hold-out attivo
1.6 anni, DSR sul filo, weights_tilt_null mai affrontato).

T3 — XSR01 non generalizza. Meccanismo congelato su 9 settoriali (1998+) e 28 ETF
(30 anni), versione DEMEANATA (il test del 25/07 era a coppie). Lordo +0.24
p=0.193 e -0.14 p=0.747 vs null a fee zero. Il risultato che conta e' l'ampiezza:
il demean fa 4.5->37.4 (8x) sul crypto ma 5.3->6.2 (1.2x) sulle azioni, perche'
sul crypto il residuo-vs-BTC lascia un enorme fattore comune e sulle azioni il
residuo-vs-SPY e' gia' indipendente. XSR01 e' crypto-specifico; NON e' falso.
Soglie del gate 23/10 non toccate.

Book/pesi/cron INVARIATI. Suite 245 verdi.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Adriano Dal Pastro
2026-07-25 19:51:52 +00:00
parent 8b4c698ad9
commit 2c3882b60c
6 changed files with 1190 additions and 0 deletions
@@ -0,0 +1,227 @@
# 2026-07-26 — Ondata a 3 filoni: esecuzione SKH01, DVOLSPREAD, XSR01 fuori dal crypto
**Script:** `r0726_skh_onbook.py` · `r0726_dvolspread_gate.py` · `r0726_xsr_equity.py`
**Test:** `tests/test_wave_0726.py` (11 casi) · suite completa **245 verdi**
**Book / pesi / cron: INVARIATI.** Una raccomandazione operativa aperta (T1), nessuna modifica fatta.
Tre filoni scelti non per esplorare aree nuove — quelle sono in gran parte sature — ma perché
il progetto stesso aveva lasciato **tre questioni aperte e decidibili oggi**:
| filone | questione aperta | esito |
|---|---|---|
| **T1** | il degrado del path live di SKH01 (~0.35 Sh) è recuperabile? | ⚠️ **il degrado era a sua volta fortuna d'ancora**; metà del fix funziona, l'altra metà no |
| **T2** | DVOLSPREAD, in limbo dal 21/06, è sleeve o falso positivo? | ✅ **regge i gate che non esistevano allora** — promosso a forward-monitor con parametri onesti |
| **T3** | XSR01 regge fuori dal crypto e da 2.6 anni monoregime? | ❌ **no** — e si scopre *perché* |
---
## T1 — Il degrado d'esecuzione di SKH01 era anch'esso un artefatto d'ancora
### La domanda
Il book live gira SKH01 con cron orario e uscite **software**. Costo misurato (audit 02/07,
riconfermato il 24/07): sleeve FULL 1.46→1.19, HOLD 1.64→1.15, DD 18%→25%. È il buco singolo più
grande del progetto, e il 24/07 aveva già stabilito che **un cron più veloce non lo recupera**.
L'angolo mai testato è l'unico meccanismo che non è un cron: gli **ordini resting on-book**, dove
esiste un'asimmetria che nessuno aveva sfruttato:
- il **TP è un limit order**: se il prezzo ci arriva, il fill è al livello **per costruzione**
(sei il maker), e per giunta a fee maker invece che taker;
- lo **SL è uno stop-market**: al trigger diventa un ordine a mercato, e in un gap riempie peggio.
Ipotesi: il grosso del degrado sta sul lato TP, quindi è recuperabile senza rischio nuovo.
### Il risultato, e la trappola che ha nascosto
A **offset 0** — la griglia che gira davvero — il quadro sembrava trionfale: l'on-book completo
recupera il **94%** del degrado. Ma l'offset 0 è già noto essere al 93-98° percentile dei 23
offset a priori, quindi la lente onesta è la banda.
E qui c'è stato un mio errore di statistica, corretto in corso: avevo confrontato
**mediana(canonical) mediana(hourly)**, che confronta offset *diversi* fra loro. Gli offset sono
**coppie appaiate**: la statistica giusta è la **mediana delle differenze**. Con quella:
| modalità | ΔFULL mediana [min,max] | ΔHOLD mediana | migliora in |
|---|---|---|---|
| canonical (tetto teorico) | **+0.054** [0.05,+0.12] | +0.099 | — |
| **solo TP a limite** | **+0.054** [0.03,+0.07] | **+0.061** | **FULL 19/23 · HOLD 21/23 · DD 19/23** |
| TP + SL on-book | +0.024 [0.07,+0.11] | +0.031 | FULL 17/23 · HOLD 14/23 |
| *contributo del solo lato SL* | **0.010** [0.13,+0.08] | — | **11/23 = una moneta** |
**Due conclusioni, entrambe diverse da quella che cercavo.**
**(1) Il "0.35 del path live" è a sua volta un artefatto dell'offset 0.** L'audit del 02/07 aveva
de-luckato i numeri *headline* di SKH01 ma aveva misurato il **degrado** solo a offset 0. Sulla
banda appaiata il degrado massimo recuperabile è **+0.054 di Sharpe sul book**, non +0.35 sullo
sleeve. Il buco più grande del progetto era in buona parte fortuna d'ancora anche lui.
**(2) Lo stop on-book PEGGIORA.** Mettere lo SL sul book cristallizza la perdita al livello,
mentre l'uscita software ritardata a volte incassa il rimbalzo: contributo mediano **0.010**,
positivo in **11/23** offset = indistinguibile da una moneta. La sensibilità lo conferma: sopra
lo **0.50%** di slippage sullo stop l'on-book è **peggio del live di oggi**.
Il meccanismo è misurato, non ipotizzato: sulle uscite TP il fill orario batte il livello nel
**42%** dei casi (vantaggio medio 0.035%) — è quasi una moneta, quindi il limit TP **converte una
lotteria in una certezza** più che aggiungere ritorno. E solo l'**1% degli SL** gappa davvero
dentro la barra 5m: il gap-through dei crash è reale ma raro.
### Raccomandazione (NON eseguita)
> **Appoggiare il TP come limit resting reduce-only; NON mettere lo SL strategico sul book.**
> Guadagno atteso **+0.054 FULL / +0.061 HOLD** sul book, positivo in **19-21 offset su 23**,
> più il risparmio taker→maker su un quarto dei trade.
È un cambio di **esecuzione**, non di strategia, quindi non passa da `weights_tilt_null`. Ma è
piccolo, e va pesato contro il costo operativo vero: ordini orfani se il cron muore, gestione
del reduce-only, doppio fill. **Non l'ho implementato**: è una decisione dell'operatore, non un
fatto compiuto. Il disaster-SL on-book a 30% resta com'è (è un'altra cosa: protezione, non exit).
---
## T2 — DVOLSPREAD regge i gate che nel giugno non esistevano ✅
### Chi è, e perché era in limbo
`agent_14_dvol_spread` (onda ortho, 21/06) è **l'unico sopravvissuto** al marginal scorer
indurito: dei 18 book relative-value che facevano ADDS con lo scorer vecchio, l'indurito ne lasciò
in piedi **uno**, questo. Da allora non è mai stato ripreso — non è nel book, non è in un monitor,
non è stato rifiutato. Era semplicemente lì.
Il segnale: `log(DVOL_btc) log(DVOL_eth)`, tilt verso la gamba con **vol implicita più ricca**
(tesi VRP / fear-reversal), market-neutral per costruzione, eseguibile a $600.
Nel frattempo il progetto ha codificato **due gate che il 21/06 non c'erano**, ed erano proprio
quelli che colpivano le sue riserve dichiarate:
1. **`deflated_sharpe`** (29/06) — l'agente dichiara *da sé* uno sweep di celle. Nel giugno
"72/72 celle ADDS" si leggeva come robustezza; il DSR dice che sono anche 72 tentativi.
2. **`select_cell_insample`** (29/06) — il plateau dell'agente è descritto in termini di
**`uplift_hold`**, cioè la cella è stata guardata **sull'hold-out**. È la firma esatta che il
gate selection-on-holdout fu scritto per catturare.
### Esito
⚠️ **Prima osservazione: la griglia dichiarata è sbagliata.** Il docstring dice "72-cell sweep", ma
il plateau che descrive è 6 assi × 3 valori = **729** combinazioni. Le ho valutate tutte e 729 —
scelta **conservativa**, perché più trial abbassano il DSR.
**Il plateau è reale e larghissimo:** FULL in [0.60, 0.71], HOLD in [0.68, 0.97], e
**729/729 celle con hold-out positivo**. Non è una cella fortunata.
**La selection-on-holdout c'è, ma è mite.** La cella pubblicata è **83ª/729 sull'hold-out** ma
**471ª/729 in-sample** — la firma è inequivocabile. Solo che, essendo il plateau così piatto,
scegliere onestamente la cella in-sample costa poco:
| cella | FULL | IS | HOLD | DSR (729 trial) |
|---|---|---|---|---|
| scelta **IN-SAMPLE** (onesta) | 0.68 | 0.70 | **0.69** | **0.953 PASS** |
| scelta sull'hold-out (proibita) | 0.68 | 0.58 | 0.97 | — |
| **pubblicata dall'agente** | 0.66 | 0.57 | 0.93 | 0.947 **FAIL** |
Cioè: **l'hold-out onesto è 0.69, non il 0.93 pubblicato** — un haircut reale — ma resta
chiaramente positivo. E la cella onesta **passa il deflated-Sharpe (0.953)** mentre quella
pubblicata lo **fallisce (0.947)**, il che è di per sé una conferma che il gate fa il suo lavoro.
Marginale vs TP01 sulla cella onesta: **ADDS**, `robust_oos` ✓, `multicut_persistent` ✓,
`is_hedge` ✗, `has_insample_edge` ✓, `beats_noise_null` ✓; corr +0.11, alpha annua **+7.4%**,
beta a TP01 +0.117, jackknife_min_uplift **+0.069**; dSharpe sul book **+0.08 FULL / +0.17 HOLD**
a w=15%, **+0.11 / +0.25** a w=25%.
### Verdetto: promosso, ma non nel book
**DVOLSPREAD esce dal limbo e diventa un candidato in forward-monitor con parametri ONESTI**
(`zwin=180, k=2.0, lw=0.6, zw=1.1, tgt=0.17, svw=60` — la cella in-sample), non quelli pubblicati.
**Perché NON entra nel book, dichiarato:**
- **campione ATTIVO 1949 giorni su 2691** (72%): prima del 2021-03 non esiste DVOL e il book è
correttamente flat. L'**hold-out attivo è 1.6 anni**;
- **margine DSR sul filo** (0.953 vs soglia 0.95) — un passaggio, non un'assoluzione;
- non ha ancora affrontato `weights_tilt_null`, che ogni cambio di pesi deve superare;
- il numero headline che circolava (HOLD 0.93) era gonfiato dalla selezione: **va citato 0.69**.
---
## T3 — XSR01 non generalizza fuori dal crypto ❌ (e si capisce perché)
### La domanda
XSR01 ha superato tutto ciò che gli è stato chiesto, ma la sua debolezza numero uno è dichiarata:
**2.6 anni monoregime, con l'edge crescente nel tempo** (Sharpe 2024 1.03 / 2025 1.98 / 2026 3.11).
Con 2.6 anni non si distingue un meccanismo da un regime fortunato. L'unico modo di guadagnare
potenza senza aspettare è portare il meccanismo **congelato** su un pannello lungo decenni.
**Non è il test del 25/07.** `r0725_statarb_eq.py` aveva già scartato le azioni, ma testava il
meccanismo a **coppie**. XSR01 è la versione **DEMEANATA cross-sezionalmente**, ed è proprio il
demeaning ad aver creato l'edge (ampiezza effettiva 4.5 → 37.4). Testare il demean sulle azioni è
una domanda diversa, mai posta.
### Esito
Meccanismo congelato (W=45, sgn=+1, residuo OLS causale vs **SPY**, z-score, tanh, vol-target 20%,
demean giornaliero), split IWM/EFA riparati in lettura, annualizzazione a **√252** (giorni di borsa):
| universo | variante | ampiezza eff. | Sharpe **LORDA** | Sharpe netta | maxDD |
|---|---|---|---|---|---|
| **SECT9** (9 settoriali, 1998+, 26 anni) | coppie | 5.3 | 0.05 | 1.67 | 91% |
| **SECT9** | **DEMEAN (= XSR01)** | **6.2** | **+0.24** | 1.61 | 89% |
| **ALL28** (tutti gli ETF, 30 anni) | coppie | 8.4 | 0.20 | 1.61 | 92% |
| **ALL28** | **DEMEAN** | **11.3** | **0.14** | 1.82 | 91% |
| *XSR01 crypto (25/07, riferimento)* | *DEMEAN* | ***37.4*** | ***+2.70*** | *+1.82* | *2.6%* |
Null di permutazione cross-sezionale **a fee zero** (la lezione XSR01: permutare un segnale ne fa
esplodere il turnover, quindi a fee piena il null perderebbe per *costo* e regalerebbe un p-value
trionfale e falso): SECT9 candidato +0.24 vs null medio 0.00, **p = 0.193**; ALL28 0.14, **p = 0.747**.
Per decennio (DEMEAN, lordo): SECT9 0.88 / +0.49 / +0.29 / +0.74 · ALL28 0.88 / +0.46 / +0.38 / +0.05.
Stesso profilo nei due universi: fortemente negativo 1998-2005, debolmente positivo poi — il che
somiglia più a un cambio di regime che a un edge.
### Il risultato più interessante non è il Sharpe, è l'ampiezza
**Il demeaning non fa sulle azioni quello che fa sul crypto.** Sul crypto porta l'ampiezza
effettiva da 4.5 a 37.4 (**8×**); sulle azioni da 5.3 a 6.2 e da 8.4 a 11.3 (**1.2-1.35×**).
Il perché è strutturale, e spiega XSR01 meglio di quanto lo spiegasse la sua scoperta: il residuo
OLS **rimuove già** il beta al fattore comune. Sul crypto, dopo aver residualizzato su BTC, alle
gambe **resta** un enorme fattore comune (ampiezza 4.5 su 50 gambe = quasi una gamba sola) — ed è
quello che il demeaning toglie. Sulle azioni il residuo-vs-SPY è **già** quasi indipendente
(5.3 su 9 gambe), quindi il demeaning non ha molto da togliere e non c'è guadagno.
### Cosa significa per il gate del 2026-10-23
Il 25/07 aveva già scritto che *«il gate non può appoggiarsi all'argomento fenomeno universale»*.
Questo test **lo conferma e chiude la scappatoia** che il test a coppie lasciava aperta: nemmeno
la versione demeanata — quella vera di XSR01 — funziona sulle azioni.
**Onestà su cosa NON prova:** non prova che XSR01 sia falso. Prova che è **crypto-specifico**, e
suggerisce quale sia il meccanismo (l'esistenza di un fattore comune residuo che sopravvive alla
residualizzazione, cosa che le azioni non hanno). Il gate del 23/10 resta **interamente** appoggiato
sulla finestra forward e sull'haircut di eseguibilità a $5.000, come pre-registrato.
Nessuna soglia toccata.
---
## Lezioni da portare avanti
1. **Se si de-lucka una strategia, va de-luckato anche il suo DEGRADO.** L'audit del 02/07 ha
corretto i numeri headline di SKH01 per la fortuna d'ancora ma ha misurato il costo
d'esecuzione a offset 0 — e quel costo si è rivelato **fortunato quanto i numeri che
correggeva**. Ogni Δ fra due varianti misurato su una griglia ancorata eredita la fortuna
dell'ancora.
2. **Su una griglia di offset appaiati, la statistica è la mediana delle DIFFERENZE, non la
differenza delle mediane.** La seconda confronta offset diversi fra loro e qui ribaltava il
verdetto (faceva sembrare l'on-book completo migliore del solo TP, mentre è il contrario).
3. **Un lead lasciato "in forward-monitor" senza monitor e senza data di scadenza è un lead
perso.** DVOLSPREAD è stato in limbo 35 giorni. La disciplina che il progetto applica ai
candidati nuovi (config congelata + gate pre-registrato + cron) non era stata applicata a lui.
4. **Il claim di multiple-testing di un agente va ricontato, non creduto.** Il docstring diceva
72 celle; la griglia descritta ne contiene 729. Ricontare è conservativo e costa poco.
5. **Quando un meccanismo non generalizza, chiedersi PERCHÉ vale più del fatto che non generalizzi.**
Il fallimento di XSR01 sulle azioni ha prodotto la spiegazione migliore di come funziona sul
crypto: il demeaning vale quanto vale il fattore comune **residuo** dopo la residualizzazione,
ed è una proprietà dell'asset class, non del segnale.