Files
PythagorasGoal/docs/diary/2026-08-26-advance-riparato-e-debiti.md
Adriano Dal Pastro d597fc64e8 monitor: advance() consuma solo barre CHIUSE — serie rigenerate, guardia PREMATURO, 4 debiti chiusi
S5.1 RIPARATO E RIGENERATO. Filtro condiviso src/live/paper_guard.py (barra
open-labeled chiusa = ts + cadenza <= adesso) importato da tutti e 6 i monitor;
serie rigenerate dallo stesso start_ts con scripts/live/paper_regen.py (evidenza
in *.pre_regen_20260826.*): statarb +1,95 -> -1,61 (il ribaltamento del gate
27/09 previsto dall'audit), dvolspread -14,73 -> -4,41, xsr -4,98 -> -2,72,
prevday invariato. Nessuna data di gate si sposta. Guardia cablata in
monitor_health: stato PREMATURO (ultima barra che chiude dopo l'mtime, grazia
5 min, open_labeled=False per collect_chain) — sul dato vivo segnala i 5 rotti
e tace sui 2 sani; dopo la rigenerazione 7/7 OK. paper_portfolio non rigenerato
(GTAA su ADJUSTED_LAST: replay != serie registrata, P12), tolta la coda non
chiusa. D6 pagata di nuovo nel fix: asi8 in pandas 3 e' in us, non ns —
blindata con test su tre risoluzioni.

S5.12 ESTESO: conftest devia anche trades.db (wrapper su connect: il default
e' catturato alla definizione) e docs/journal/; book_executions.jsonl
sorvegliato con impronta inizio/fine suite.

S5.5 FATTO: test_leva_massima cancellato con nota (misurava frac*n_asset:
con una chiave di scala avrebbe continuato a passare smettendo di controllare).

S5.9 INDAGATO E RIPARATO (r0826_skh_band_drift): il dato regge (taglio 02/07
riproduce l'audit 1,6376, in-sample identico su ogni taglio); la deriva era la
finestra hold-out — e la sola settimana 15-22/08 vale +0,35 di Sharpe hold-out.
Il test ora taglia il feed al 02/07 e verifica la riproduzione stretta.

Suite: 751 passati, 0 falliti.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01B9UyJLHzR7EJzxR3iQ3RN1
2026-08-26 10:12:23 +00:00

5.5 KiB
Raw Permalink Blame History

2026-08-26 — advance() riparato e rigenerato, quattro debiti chiusi in un giorno

Quattro debiti di CLAUDE.md §5 chiusi: §5.1 (advance + rigenerazione + guardia), §5.12 (isolamento test esteso), §5.5 (test di leva cancellato con nota), §5.9 (test rosso indagato e ancorato). Suite: 751 passati, 0 falliti — tutta verde per la prima volta dal ~24/08.

§5.1 — advance() consuma solo barre CHIUSE, e le serie sono RIGENERATE

Il fix (src/live/paper_guard.py + 6 monitor): la riga new = [i for i in range(len(ts)) if ts[i] > last_ts] diventa PG.nuove_chiuse(ts, last_ts, cadenza) — una barra open-labeled e' chiusa quando ts + cadenza <= adesso. Filtro condiviso, importato da tutti e sei i monitor (anche paper_combo, che era sano per caso: ora e' sano per costruzione).

⚠️ D6 pagata DI NUOVO scrivendo il fix: la prima stesura di indice_chiuso usava asi8 assumendo nanosecondi — pandas 3 usa us di default, e l'intero nella scala sbagliata dava "chiusa" la barra del giorno in corso senza eccezioni. Beccata dal test di fumo, riparata con la sottrazione dall'epoca (la forma di resample_tf), e blindata da un test che prova ns/us/s. La regola che stavo cablando e' quella che stavo violando.

La guardia (era "raccomandata e non cablata"): monitor_health ha ora lo stato PREMATURO — ultima barra che chiude DOPO l'mtime del file, grazia 5 min. Derivata dalle spec esistenti (P1), con open_labeled=False per collect_chain che timbra i giri, non barre (P14: senza il flag avrebbe allertato sempre). Controllo positivo sul dato vivo: ha segnalato esattamente i 5 rotti e taciuto sui 2 sani prima della rigenerazione; dopo, 7/7 OK.

La rigenerazione (scripts/live/paper_regen.py): stesso start_ts pre-registrato, config congelata, replay del codice di produzione riparato — il metodo validato due volte dall'audit del 22/08 (0 barre chiuse cambiate su 1.427/1.488 + 6/6 al bit). Vecchi file archiviati come *.pre_regen_20260826.* (evidenza del difetto, nel perimetro di backup). Nessuna data di gate si sposta.

monitor barre Sharpe rotto → vero
paper_statarb (gate 27/09) 58 → 57 +1,95 → 1,61 — il ribaltamento previsto dall'audit
paper_dvolspread (kill 24/10) 32 → 31 14,73 → 4,41
paper_xsr (gate 23/10) 32 → 31 4,98 → 2,72
paper_prevday 1584 → 1584 +0,39 → +0,40

paper_portfolio non rigenerato (gamba GTAA su ADJUSTED_LAST ri-aggiustato: il replay non sarebbe la serie registrata — P12); tolta la sola coda non chiusa, cosi' la guardia non resta accesa per sempre su un difetto gia' riparato (P14). Storia pre-fix dichiarata corrotta.

§5.12 — un test non puo' piu' scrivere nel libro di bordo vivo

tests/conftest.py: oltre al watermark, ora deviati trades.db (wrapper su connect — il default e' catturato alla definizione, patchare la costante non serviva a niente) e docs/journal/ (pagine tracciate da git). Per book_executions.jsonl, che i test caricano ad-hoc con importlib e conftest non puo' raggiungere prima: impronta a inizio suite, verifica a fine suite, col falso positivo possibile (fill reale del cron :47 durante la suite) dichiarato nel messaggio.

§5.5 — il test di leva e' CANCELLATO, non aggiustato

test_leva_massima_da_config_resta_sotto_o_uguale_a_1x misurava frac x n_asset: con una chiave di scala la grandezza vera diventerebbe frac x n_asset x scala e il test avrebbe continuato a passare smettendo di controllare. Al suo posto una nota che rimanda al tetto sul PRODOTTO di GATE SCALA-01, da cablare nel codice che leggera' la chiave, quando esistera'.

§5.9 — il test rosso non segnalava un guasto: segnalava una banda scritta male

r0826_skh_band_drift.py — feed tagliato a date crescenti, stesso codice di produzione:

taglio Sharpe hold-out
02/07 (audit) 1,6376 — riproduce l'audit
25/07 (banda cablata) 1,5751
01→15/08 1,566 → 1,547 (scivola piano)
22/08 1,8966
oggi 1,9306 — riproduce il rosso

Il dato regge (in-sample 1,424 identico su ogni taglio; il taglio all'epoca riproduce l'epoca). Il codice non c'entra. 📌 La scoperta vera: la SOLA settimana 15-22/08 (rally ETH con SKH01 long) vale +0,35 di Sharpe hold-out — il numero e' cosi' fragile, e chi cita "hold-out 1,9" oggi citerebbe 1,55 di una settimana fa. Coerente con §2: l'hold-out canonico di SKH01 era gia' il numero da non citare.

La riparazione: il test ora taglia il feed al 02/07 e verifica la riproduzione stretta (±0,02) di full/in-sample/hold-out/maxDD. Si rompe se cambiano codice o dato sulla finestra congelata — e per nessun altro motivo. La deriva del vivo non e' affare suo: per quella ci sono i monitor (e da oggi la guardia PREMATURO).

Nel farlo, un altro inciampo istruttivo: la prima esecuzione del drift stampava sette righe identicherun_asset memoizza in un dict di modulo (_CACHE), non in lru_cache, e lo svuotamento non lo toccava. Anche il test riparato ora pulisce quel dict, prima E dopo, per non avvelenare gli altri test.

Conseguenze sui gate (nessuna data si muove)

  • STATARB 27/09: il monitor ora misura la serie vera (1,61 a oggi). Coi criteri pre-registrati invariati, a oggi punta al RITIRO — si legge quel giorno, non prima.
  • XSR01 23/10 / DVOLSPREAD 24/10: metrica primaria finalmente su serie reali. Restano i difetti dichiarati (§5.3 pavimento del gate XSR01; veto DVOLSPREAD ora sorvegliato dalla guardia).