La prova cieca (holdout) non separa le celle vere da quelle fortunate
Il gate cieco riduce le operazioni da 34.369 a 32.639, ma il risultato per lotto scende da 10,66 a 10,49.
Our own idea, measured and abandoned
This research document is written in Italian. The summary above is in English; the body below — method, tables and verdict — is not translated.
Il punto di partenza: una revisione del codice
Leggendo ScanSymbolEvo è emerso che nel backtest ufficiale girano spente le due difese statistiche pure implementate:
un input dell'EA prova cieca (holdout) SPENTA
un input dell'EA correzione test multipli SPENTA
un input dell'EA qualità minima SPENTA
L'elezione è quindi interamente in-sample su ~1.120 celle provate a tornata: si sceglie e si giudica sugli stessi dati.
È questo che spiega perché il voto non predice — ed è lo stesso voto che in eleggere tutte le celle risulta non correlato col risultato futuro: il voto è un t-stat in-sample, cioè in buona parte il rumore che ha fatto sembrare migliore quella cella.
Perché erano spente (e la memoria era giusta)
Con un input dell'EA e un input dell'EA — lo stesso numero — togliere 250 giorni per il test ne lascia 250 per scegliere: il t-stat cala del 29% per pura aritmetica e gli slot si svuotano. L'EA smette di entrare.
Sulla manche lunga però la finestra è 3750 giorni: 250 di test ne lasciano 3500, e il t-stat cala del 3%. Lì la prova cieca si può permettere. Aggiunto un input dell'EA (stessa logica di un input dell'EA, che è già "solo lunga").
I numeri
| senza prova cieca | con prova cieca (lunga) | |
|---|---|---|
| operazioni | 34.369 | 32.639 |
| profitto | 17.671 | 13.177 |
| € per lotto | 10,66 | 10,49 |
| discesa | 38,7% | 40,7% |
Gli slot non si sono svuotati (206 celle lunghe elette). Ma l'edge non si è mosso: 0,17 di differenza contro un errore di ±1,9. Un decimo del rumore.
Il verdetto
Il gate è questo:
if(un input dell'EA>0 && rTe[h2][hi][di] <= 0) continue; // solo: media sul test > 0
Chiedere che la media sui 250 giorni ciechi sia positiva è una condizione che passa una volta su due per caso. Quindi il filtro toglie celle quasi a caso — e togliere celle a caso produce esattamente ciò che si osserva: meno operazioni, meno soldi, qualità media invariata.
Non è una validazione, è una decimazione. Se il test cieco separasse davvero, l'edge per lotto sarebbe salito.
Per farne una difesa vera servirebbe un gate con sostanza — per esempio "la media sul test dev'essere almeno una frazione di quella sul train" — non > 0. Non provato.
Altri due punti della revisione
- Il gate anti-zombie legge tutta la finestra ed è GIUSTO così (è il suo scopo: bocciare chi era bravo dieci anni fa). Ma se un input dell'EA arrivasse a metà finestra coinciderebbe col test cieco e i due controlli diventerebbero uno.
- Il filtro Sharpe (
mm/sg) legge la finestra piena, parte cieca inclusa: unico punto senza una lettura difendibile. È spento.
Come rifare i conti
python3 verifiche/strumenti/rifai_i_conti.py edge_per_lotto
Legge la scatola nera dell'EA: nessun numero copiato a mano, nessun dato preparato. Ma la scatola nera viene sovrascritta a ogni corsa del Tester, e oggi contiene l'ultima. I numeri qui sopra sono la fotografia di quella corsa; il comando è il metodo per rifarla.
Collegate
- Eleggere tutte le celle invece delle prime tre — dove si vede che il voto non predice: qui c'è il perché
Nel registro
Le schede di ricerca che questa verifica tocca:
- ea-cercatore — l'e-process anytime-valid: la difesa statistica fatta bene
- cercatore-griglia-falsificata — cosa succede quando la persistenza non c'è
- elezione-filtro-simbolo — il winner's curse che l'in-sample produce