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
This commit is contained in:
@@ -174,5 +174,66 @@ def test_i_monitor_reali_sono_leggibili_e_giudicati():
|
||||
# legato al REGISTRO, non a una costante: aggiungere un monitor e' normale (30/07:
|
||||
# collect_chain), dimenticarne uno per strada no.
|
||||
assert len(rows) == len(MONITORS) >= 6
|
||||
assert all(r["status"] in ("OK", "NUOVO", "FERMO", "BUCATO", "ASSENTE") for r in rows)
|
||||
assert all(r["status"] in ("OK", "NUOVO", "FERMO", "BUCATO", "ASSENTE", "PREMATURO")
|
||||
for r in rows)
|
||||
assert {"paper_xsr", "paper_statarb", "paper_dvolspread"} <= {r["name"] for r in rows}
|
||||
|
||||
|
||||
# ===========================================================================
|
||||
# PREMATURO — barra registrata prima della sua chiusura (difetto §5.1)
|
||||
# ===========================================================================
|
||||
# La freschezza e la copertura NON possono vederlo: una serie fresca, completa e SBAGLIATA le
|
||||
# passa entrambe (misurato: paper_statarb registrava 4 min/giorno con monitor_health "OK").
|
||||
# Controllo positivo in ENTRAMBI i versi, come raccomandato dall'audit.
|
||||
|
||||
def _spec_1d(**kw):
|
||||
from src.live.monitor_health import MonitorSpec
|
||||
return MonitorSpec("t", "t", "returns.jsonl", 24.0, **kw)
|
||||
|
||||
|
||||
def test_prematuro_si_accende_su_barra_scritta_prima_della_chiusura():
|
||||
from src.live.monitor_health import assess
|
||||
stamps = [NOW.replace(hour=0, minute=0) - timedelta(days=2),
|
||||
NOW.replace(hour=0, minute=0) - timedelta(days=1),
|
||||
NOW.replace(hour=0, minute=0)] # barra del giorno IN CORSO
|
||||
mtime = NOW.replace(hour=0, minute=35) # scritta alle 00:35 di oggi
|
||||
r = assess(_spec_1d(), stamps, NOW, mtime=mtime)
|
||||
assert r["status"] == "PREMATURO"
|
||||
assert "rigenerata" in r["why"]
|
||||
|
||||
|
||||
def test_prematuro_tace_su_una_serie_sana():
|
||||
from src.live.monitor_health import assess
|
||||
stamps = [NOW.replace(hour=0, minute=0) - timedelta(days=3),
|
||||
NOW.replace(hour=0, minute=0) - timedelta(days=2),
|
||||
NOW.replace(hour=0, minute=0) - timedelta(days=1)] # ultima barra = IERI, chiusa
|
||||
mtime = NOW.replace(hour=0, minute=35) # scritta stanotte alle 00:35
|
||||
r = assess(_spec_1d(), stamps, NOW, mtime=mtime)
|
||||
assert r["status"] == "OK"
|
||||
|
||||
|
||||
def test_prematuro_rispetta_la_grazia_di_clock():
|
||||
from src.live.monitor_health import assess
|
||||
# barra chiusa alle 00:00, file scritto alle 23:58 di IERI (orologio del feed avanti di 2'):
|
||||
# dentro la grazia di 5 min -> non e' un allarme
|
||||
stamps = [NOW.replace(hour=0, minute=0) - timedelta(days=2),
|
||||
NOW.replace(hour=0, minute=0) - timedelta(days=1)]
|
||||
mtime = NOW.replace(hour=0, minute=0) - timedelta(minutes=2)
|
||||
r = assess(_spec_1d(), stamps, NOW, mtime=mtime)
|
||||
assert r["status"] != "PREMATURO"
|
||||
|
||||
|
||||
def test_prematuro_non_giudica_i_timbri_di_esecuzione():
|
||||
from src.live.monitor_health import assess
|
||||
# collect_chain timbra l'ORA DEL GIRO, non un'apertura di barra: il timbro coincide con
|
||||
# la scrittura per costruzione e il controllo mentirebbe sempre (P14) -> open_labeled=False
|
||||
stamps = [NOW - timedelta(hours=2), NOW - timedelta(hours=1)]
|
||||
r = assess(_spec_1d(open_labeled=False), stamps, NOW, mtime=NOW - timedelta(hours=1))
|
||||
assert r["status"] != "PREMATURO"
|
||||
|
||||
|
||||
def test_prematuro_senza_mtime_non_inventa_un_verdetto():
|
||||
from src.live.monitor_health import assess
|
||||
stamps = [NOW.replace(hour=0, minute=0) - timedelta(days=1), NOW.replace(hour=0, minute=0)]
|
||||
r = assess(_spec_1d(), stamps, NOW, mtime=None)
|
||||
assert r["status"] != "PREMATURO" # senza mtime il controllo tace, non indovina
|
||||
|
||||
Reference in New Issue
Block a user