sleeves+edge_watch: pesi derivati da book (import locale), titolo kill corretto (#35 B12)

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-27 15:15:07 +00:00
parent e82f2ee163
commit 8e75e9c9a7
3 changed files with 31 additions and 4 deletions
+1 -1
View File
@@ -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}")
+9 -3
View File
@@ -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),
]
+21
View File
@@ -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.
# ---------------------------------------------------------------------------