diff --git a/scripts/live/edge_watch.py b/scripts/live/edge_watch.py index c44bd19..8a82881 100644 --- a/scripts/live/edge_watch.py +++ b/scripts/live/edge_watch.py @@ -140,7 +140,7 @@ def main() -> int: print(f"\n {n_ok}/{len(r['protection'])} anni di sinistro superati ยท " f"fallimenti consecutivi in corso: {r['consec_fail']}") if r["alerts"]: - notify("๐Ÿšจ EDGE WATCH โ€” criterio di kill scattato sul book LIVE", + notify("๐Ÿšจ EDGE WATCH โ€” criterio di kill scattato sul book (serie backtest dei sleeve, non il P&L eseguito)", {f"alert {i+1}": a for i, a in enumerate(r["alerts"])}) for a in r["alerts"]: print(f" ALERT: {a}") diff --git a/src/portfolio/sleeves.py b/src/portfolio/sleeves.py index 7f4d4a0..0944340 100644 --- a/src/portfolio/sleeves.py +++ b/src/portfolio/sleeves.py @@ -400,8 +400,14 @@ def deribit_book_sleeves() -> list[Sleeve]: e VRP01 (opzioni modellate). FULL Sharpe ~1.78 / HOLD ~1.17 / DD ~9% (research; SKH01 daily-step). Pensato per il deploy reale a basso capitale: stesso conto, stesso feed, ribilanciamento periodico (vedi src.portfolio.portfolio.rebalance_sim + scripts/portfolio/run_deribit_book.py). - TP01 e' gia' armato live; SKH01 e' il candidato 2a gamba (da validare codice d'esecuzione).""" + TP01 e' gia' armato live; SKH01 e' il candidato 2a gamba (da validare codice d'esecuzione). + + I pesi si DERIVANO da src.live.book (P1): due letterali qui erano una seconda dichiarazione, + libera di divergere dal book vero (#35 B12). Import locale: book importa questo modulo + (_skyhook_positions) a livello di modulo -> un import in testa qui creerebbe un ciclo (come + fa usde.py con book).""" + from src.live import book as B # lazy: vedi nota sul ciclo qui sopra return [ - tp01_sleeve(weight=0.75), - skyhook_sleeve(weight=0.25), + tp01_sleeve(weight=B.W_TP01), + skyhook_sleeve(weight=B.W_SKH), ] diff --git a/tests/test_book_live.py b/tests/test_book_live.py index 3407d93..301ade4 100644 --- a/tests/test_book_live.py +++ b/tests/test_book_live.py @@ -150,6 +150,27 @@ def test_weights_match_backtest_sleeves(): assert abs((W_TP01 + W_SKH) - 1.0) < 1e-12 +def test_deribit_book_sleeves_deriva_i_pesi_da_book_non_li_ridichiara(): + """#35 B12 โ€” P1: stesso pattern di test_r0909_libro_nei_crolli.test_P1_i_pesi_sono_QUELLI_del_book_live_non_una_copia. + `test_weights_match_backtest_sleeves` sopra passerebbe anche con due letterali per coincidenza + di valore (0.75/0.25 riscritti a mano): qui si verifica l'IDENTITA' con B.W_TP01/B.W_SKH e + che il letterale non sia piu' nella fonte di `deribit_book_sleeves`.""" + import inspect + import re + + import src.live.book as B + from src.portfolio.sleeves import deribit_book_sleeves + + pesi = {s.name.split("_")[0]: s.weight for s in deribit_book_sleeves()} + assert pesi["TP01"] is B.W_TP01 or pesi["TP01"] == B.W_TP01 + assert pesi["SKH01"] is B.W_SKH or pesi["SKH01"] == B.W_SKH + + src = inspect.getsource(deribit_book_sleeves) + assert "from src.live import book" in src, "i pesi devono derivare da src.live.book (P1)" + assert not re.search(r"weight\s*=\s*0\.75", src), "peso TP01 ancora cablato" + assert not re.search(r"weight\s*=\s*0\.25", src), "peso SKH01 ancora cablato" + + # --------------------------------------------------------------------------- # Costruzione ordine: side, reduce_only, flip, close, soglia minima. # ---------------------------------------------------------------------------