# 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: 1. **Il gate pre-registrato fallisce.** Una soglia dichiarata in anticipo che poi si aggira non è una soglia. 2. **La regione davvero nuova non vince** — quindi questo studio non ribalta il 03/07, lo conferma. 3. **Il vincitore sta nell'angolo dove abbiamo misurato che il modello è meno affidabile**, e lì `f` non è misurato. 4. 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.