Files
PythagorasGoal/docs/diary/2026-08-26-advance-riparato-e-debiti.md
T
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

96 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
identiche** — `run_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).