Book, pesi, cron, config INVARIATI. La griglia strutture del 03/07 si fermava a 10 giorni. Famiglia dichiarata nel docstring PRIMA di guardare i numeri: 8 tenori (5-35g) x 3 delta corti x 3 lunghi = 72 celle, perche' riaprire il tenore riapre la struttura e i trial si contano al rialzo. study_family_honest e' cablato sui candidati direzionali (factory -> target_fn via candidate_daily) e VRP01 non lo e': usati i suoi tre componenti reali — selezione in-sample-only, altlib.deflated_sharpe, altlib.marginal_vs_tp01 — importati e non riscritti (c'e' un test d'identita'). ESITO. Cella scelta al buio 10g -0.28/-0.05 (Sh IS 1.75 / FULL 1.55 / HOLD 1.01) contro il canonico 7g (1.50/1.32/0.82; rango 17/72 in-sample). Batte il canonico ma DSR 0.948 < 0.95 FAIL. marginal_vs_tp01 = ADDS per entrambe: il verdetto non e' 'VRP01 e' rotto', e' che il vantaggio non sopravvive al conto dei trial. IL BUCO SI CHIUDE SUL CONTENUTO, non sul gate: la regione mai esplorata PERDE. Miglior cella >10g = 18g, rango 8/72, e solo 3/10 della top-10 sta oltre i 10 giorni -> lo studio conferma il 03/07 invece di ribaltarlo. IL VINCITORE STA DOVE IL MODELLO SBAGLIA DI PIU': compra l'ala piu' lontana (delta lungo -0.05), come 5/10 della top-10, cioe' la gamba che il 30/07 ha misurato sottoprezzata ~2.3x. Sospetto motivato, non dimostrazione: il mediano non separa -0.10 da -0.05, si separa la coda alta. Ma f non e' misurato fuori dalla struttura canonica, e la sensibilita' a f uniforme e' la lente sbagliata per una struttura il cui errore e' concentrato in una gamba sola. ROBUSTEZZA DEL VERDETTO, PUBBLICATA: DSR 0.983 PASS a N=8, 0.948 FAIL a N=72, 0.909 a N=360. Il verdetto si ribalta col conteggio. La griglia era dichiarata in anticipo e il conto fatto al rialzo, ma fallisce per 0.002: si cita come tale, non come refutazione netta. Congelato in un test. Seguito giusto = una MISURA, non un altro backtest: quanto vale f sul 10g/-0.05 sulle quote vere, ora che la catena la raccogliamo noi ogni ora. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
6.6 KiB
2026-07-30 (4º filone) — il buco del tenore chiuso col gate onesto: nessun cambio a VRP01
Richiesta dell'operatore: «chiudi il buco del tenore con study_family_honest».
Esito: earns_slot_honest = False. Book, pesi, cron, config INVARIATI.
Script scripts/research/r0730_vrp_tenor_gate.py, test tests/test_vrp_tenor_gate.py (12 casi).
Il buco, e perché era reale
La griglia strutture del 03/07 (r0703_vrpimp_structgrid) cercava su TENOR_GRID = (3, 5, 7, 10):
oltre i 10 giorni non è mai stato guardato. Lo sweep del 30/07 sul profit-take aveva toccato
14/18/21/28g di passaggio e mostrato che il 18g sembrava battere il 7g in hold-to-expiry
(1.51 vs 1.32) — sei celle scelte sul campione pieno, cioè esattamente la selezione che questo
gate esiste per uccidere.
Perché il gate è composto a mano, e non è una scorciatoia
altlib.study_family_honest è cablato sui candidati direzionali: vuole
factory(tf=..., **params) -> target_fn e passa da candidate_daily, che costruisce i rendimenti
da una serie di posizioni su BTC/ETH. VRP01 non è direzionale. Si usano quindi i suoi tre
componenti reali, nello stesso ordine e con le stesse soglie: selezione in-sample-only →
altlib.deflated_sharpe (importato, non riscritto — c'è un test che lo verifica) →
altlib.marginal_vs_tp01 (importato).
Famiglia dichiarata nel docstring PRIMA di guardare i numeri: 8 tenori × 3 delta corti × 3 delta lunghi = 72 celle. Riaprire il tenore riapre la struttura, e il conteggio dei trial si fa al rialzo — contarne meno gonfia il deflated-Sharpe.
Il risultato
| tenore | δ corto | δ lungo | Sh IS | Sh FULL | Sh HOLD | maxDD | CAGR | |
|---|---|---|---|---|---|---|---|---|
| scelta al buio | 10g | −0.28 | −0.05 | 1.75 | 1.55 | 1.01 | 9.6% | 13.5% |
| VRP01 canonico | 7g | −0.28 | −0.10 | 1.50 | 1.32 | 0.82 | 10.5% | 10.5% |
Rango del canonico: 17/72 in-sample, 26/72 sul campione pieno. La selezione al buio sceglie un'altra cella, e quella cella batte il canonico sia in-sample sia full.
Ma il gate si chiude sul deflated-Sharpe:
| DSR su 72 trial | esito | |
|---|---|---|
| cella scelta | 0.948 | FAIL (soglia 0.95) |
| VRP01 canonico | 0.885 | FAIL |
marginal_vs_tp01 dà ADDS a entrambe (corr +0.016, robust_oos True, has_insample_edge
True, is_hedge False). Quindi il verdetto non è «VRP01 è rotto» né «il tenore non conta»:
è che il vantaggio apparente non sopravvive al conto dei trial.
Come il buco si chiude davvero: la regione nuova perde
Questo è il punto che rende la chiusura pulita, più del DSR:
| cella | Sh IS | rango | |
|---|---|---|---|
| miglior cella ≤10g (già coperta dal 03/07) | 10g −0.28/−0.05 | 1.75 | 1/72 |
| miglior cella >10g (territorio mai guardato) | 18g −0.28/−0.05 | 1.56 | 8/72 |
Solo 3 celle su 10 nella top-10 in-sample stanno oltre i 10 giorni. Si è aperta la regione mai esplorata e la regione mai esplorata ha perso contro celle che il 03/07 aveva già visto e non promosso. Il buco non è "chiuso perché il gate boccia": è chiuso perché guardandoci dentro non c'è niente.
⚠️ Il vincitore sta dove il modello sbaglia di più
La cella scelta compra l'ala più lontana (δ lungo −0.05), e 5 delle 10 celle migliori fanno lo stesso. Il 30/07 ha misurato che il modello piatto sottoprezza proprio l'ala che si compra (IV(lunga)−DVOL +7.5pp contro +0.8pp della corta, ~2.3× il modello), e che l'errore cresce con la distanza dallo strike. Una selezione che premia il δ lungo più piccolo sta plausibilmente massimizzando l'errore di modello, non l'edge.
Onestà su questo punto: è un sospetto motivato, non una dimostrazione. Il mediano in-sample
non separa −0.10 da −0.05 (1.37 contro 1.37); a separarsi è la coda alta della griglia. Ma
basta a spostare l'onere della prova, perché f non è misurato fuori dalla struttura canonica.
⚠️ E la sensibilità a f non risolve: applicandolo uniformemente la cella scelta degrada meno
(f=0.73 → 0.84 contro 0.47 del canonico), ma f uniforme è la lente sbagliata proprio per questa
struttura, il cui errore è concentrato in una gamba sola. Un numero rassicurante ottenuto con lo
strumento sbagliato non è rassicurazione.
⚠️ Quanto è robusto il mio stesso verdetto
Il DSR dipende da quanti trial si dichiarano, e qui il verdetto si ribalta:
| conteggio | N | DSR | esito |
|---|---|---|---|
| solo gli 8 tenori | 8 | 0.983 | PASS |
| la griglia dichiarata | 72 | 0.948 | FAIL |
| 72 + 288 simulate del 03/07 | 360 | 0.909 | FAIL |
La griglia è stata dichiarata prima di guardare i numeri e il conteggio fatto al rialzo — ma il
verdetto va citato per quello che è: fallisce per 0.002, non è una refutazione netta. (L'ultima
riga usa trial simulati dalla distribuzione osservata, non le Sharpe vere del 03/07, che vengono
da un motore diverso: indicazione, non misura.) Congelato in
test_il_verdetto_dipende_dal_numero_di_trial_dichiarati, così che nessuno possa farlo passare
un domani restringendo il conteggio.
Decisione
Nessun cambio a VRP01, per quattro ragioni in ordine di peso:
- Il gate pre-registrato fallisce. Una soglia dichiarata in anticipo che poi si aggira non è una soglia.
- La regione davvero nuova non vince — quindi questo studio non ribalta il 03/07, lo conferma.
- Il vincitore sta nell'angolo dove abbiamo misurato che il modello è meno affidabile, e lì
fnon è misurato. - Niente di tutto questo è eseguibile prima di ~$2.6k, e a $3.000 VRP01 è 0 lotti al peso di book.
Il seguito giusto non è un altro backtest, è una misura. Se il 10g/−0.28/−0.05 interessa, la domanda che decide è quanto vale f su quella struttura sulle quote vere — e da oggi la catena la raccogliamo noi ogni ora. Serve però che il collettore accumuli abbastanza scadenze a 10 giorni: oggi ci sono 15 osservazioni sul solo canonico.
Regole
- Quando si riapre un parametro si riapre la sua famiglia, e i trial si contano al rialzo: il deflated-Sharpe è l'unico posto dove barare è indolore e invisibile.
- Dichiarare la griglia prima di guardare i numeri, e pubblicare la sensibilità del verdetto al conteggio — un gate che passa solo con la propria griglia preferita non è un gate.
- Un buco si chiude meglio mostrando che dentro non c'è niente che bocciando il candidato: qui la frase che conta non è «DSR 0.948» ma «la regione mai esplorata è ottava».
- Se la selezione converge dove un difetto di modello è già misurato, il sospetto vale più del numero — e si dice che è un sospetto.