research(wave-0822): BOCPD — il falsificatore eseguito con potenza, 0/68 celle adattive; l'adattivita' spiega il -7% del vantaggio

This commit is contained in:
Adriano Dal Pastro
2026-08-22 20:50:03 +00:00
parent 0bcc5bc5d0
commit 103dd7bce5
8 changed files with 5514 additions and 1 deletions
+60 -1
View File
@@ -694,9 +694,68 @@ stessi hanno nominato senza poterli eseguire**. Stesso contratto di consegna, st
|---|---|---|---|
| 21 | XS01-OOS | il vantaggio del PROP-ALLOC poggia sul drift di XS01 misurato sulla sua finestra di scoperta: regge fuori? | _in corso_ |
| 22 | MAKER | l'esecuzione passiva e' una fonte di ritorno, al netto del costo di non essere eseguiti? | _in corso_ |
| 23 | BOCPD | un rilevatore di cambio di regime vero batte il miglior lookback COSTANTE? | _in corso_ |
| 23 | BOCPD | un rilevatore di cambio di regime vero batte il miglior lookback COSTANTE? | **SCARTATO** — filone chiuso definitivamente |
| 24 | CRITICO | cosa NON e' stato misurato, e quale singola misura mancante vale di piu' | _in corso_ |
| 25 | BIN-FREQ | il binario di frequenza su SKH01 e' un candidato o un sottoprodotto? | _in corso_ |
| 26 | TP01-SINISTRO | quanto pesa TP01 se l'obiettivo include un crash che nel campione non c'e'? | _in corso_ |
| 27 | SURFACE-RV | la superficie e' internamente incoerente, e l'incoerenza vale piu' del costo di attraversarla? | _in corso_ |
---
## 23 — BOCPD (orizzonte adattivo, il falsificatore eseguito)
`scripts/research/r0822b_bocpd.py` (123 s). **169 trial dichiarati**, conteggio al rialzo, inclusi i
13 di taratura fatti guardando **solo il numero di change-point**, mai uno Sharpe.
**Il falsificatore che il 22/08 restava aperto e' stato eseguito con i rilevatori che nominava**:
BOCPD (Adams & MacKay, run-length posterior online, Normale-InverseGamma, hazard costante) e
**optimal partitioning causale** (l'obiettivo che PELT accelera, ricorsione in avanti, mai un
`fit_predict` retrospettivo), piu' `L` scelto per walk-forward sul PnL realizzato.
📌 **E questa volta il test HA AVUTO POTENZA — e' il fatto che rende il "no" esaustivo.**
Il vincitore del 22/08 aveva lookback **costante** (stava al bordo il 100% del tempo, corr 1,000):
si era chiusa una famiglia di *proxy*, non il meccanismo. Qui **68/96 celle sono davvero adattive**
(BOCPD 24/24: `L_t` mediano 25-107 g, IQR 28-134 g, **0-4% al tetto**, 7-44 reset/anno).
| | Sh FULL | Sh HOLD | maxDD | CAGR | corr→TP01 |
|---|---|---|---|---|---|
| (A) adattivo, cella in-sample | 1,618 | 0,627 | 14,48% | 22,05% | 0,757 |
| **(B) miglior COSTANTE** (L=15g triple 12h) | **1,639** | **0,657** | 12,68% | 22,31% | 0,737 |
| (C) walk-forward su PnL | 1,385 | 0,382 | 16,33% | 17,20% | 0,860 |
| TP01 30/90/180 | 1,314 | 0,489 | 14,31% | 16,44% | 1,000 |
📌 **La decomposizione E' il risultato:** adattivo TP01 = **+0,305**; miglior costante TP01 =
**+0,326**; adattivo miglior costante = **0,021** → **l'adattivita' spiega il 7% del vantaggio
su TP01. Il 100% e' "un orizzonte piu' corto", non "adattarlo".**
**Gate:** `earns_slot_honest=False`; `marginal_vs_tp01` **NEUTRAL** con **corr→TP01 0,861**;
appaiato per anno vs il null giusto (B) **3/8 anni** (mediana 0,15); **banda d'ancora 12 ancore,
mediana delle differenze appaiate 0,136, positiva in 0/12**, e la canonica sta al **92° pctl** =
fortuna d'ancora a suo favore. `causality_ok` ok, e **troncamento manuale esplicito** su 4
combinazioni: `max|L(prefisso) L(pieno)| = 0` → la trappola del change-point retrospettivo e'
esclusa **per misura, non per fiducia**. Null del de-levering **non applicabile e dichiarato**
(il candidato NON riduce il maxDD: 14,5% contro 12,7%).
**Il criterio del falsificatore applicato a tutte le 68 celle adattive: 0/68**, e nessuna delle due
condizioni va vicina — corr→TP01 **minimo 0,754** (soglia 0,60), **nessuna** batte il miglior
costante sul FULL (la migliore e' 0,013), massimo **4/8** anni battuti (richiesti 6).
⚠️ **Cosa l'agente NON propone, e perche':** il miglior costante batte TP01 di +0,326 — ma il salto
di Sharpe fra **L adiacenti** e' **+0,190, cioe' il 58% dell'intero vantaggio**: e' un max-of-24 su
un crinale di rumore, non una curva. **Nessun cambio a TP01, al libro, ai pesi.**
🚨 **Sottoprodotto che vale fuori dal filone: un deflated-Sharpe calcolato dentro una famiglia
OMOGENEA e' CIECO.** Qui dice **0,998-1,000 PASS**; ricalcolato con l'sr0 **di screen** misurato dal
filone ORTHO (1,572 su 168 trial) dice **0,555 / 0,580 / 0,237 FAIL** — TP01 compreso. Il motivo e'
strutturale: `deflated_sharpe` stima il massimo-dal-rumore dalla **varianza** degli Sharpe della
griglia, e una griglia di varianti molto correlate ha varianza piccola → sr0 basso → DSR alto **per
costruzione**. Gonfiare N col padding alza N e non la varianza: **non basta contare i trial di
screen, serve la VARIANZA di screen.**
📌 **Secondo sottoprodotto, un controllo da mettere in ogni famiglia con un parametro clippato: la
PROVA DI IDENTITA' batte la diagnostica.** Invece di dire "questa cella sta al bordo", l'agente
mostra che la sua serie e quella del lookback costante coincidono a **max|Δ| = 0,000e+00 su
n=2719** — non *somiglia a*, **lo e'**.
**VERDETTO: SCARTATO. IL FILONE ORIZZONTE-ADATTIVO E' CHIUSO DEFINITIVAMENTE.**