book: leva_tetto unica per cuscino USDE e giornale (#28)
La leva lorda massima del libro era ridichiarata con tre formule diverse: usde.frazione_cuscino (N_ASSET fisso, senza scala), la regola `leva` del giornale (senza scala) e journal.movimenti_capitale (con scala). A scala 1,25 il cuscino USDC risultava 0,30 dell'equity invece di 0,375. Nuova src/live/book.leva_tetto(cfg) = len(ASSETS) x min(WEIGHT, frac) x scala, al piu' LEVA_LORDA_MAX; su ScalaNonAutorizzata non solleva, ritorna il tetto di codice (cuscino_watch non deve morire sulla config sbagliata). usde.frazione_cuscino e la regola `leva` del giornale ora la derivano; movimenti_capitale idem, nel suo try/except esistente. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
+12
-14
@@ -192,12 +192,10 @@ def movimenti_capitale(con, fino_ts: str, rows=None) -> dict:
|
||||
return dict(eventi=[], certi=0.0, ambigui=0.0, soglia=soglia, avvisi=avvisi)
|
||||
try:
|
||||
cfg = json.loads((PROJECT_ROOT / "config" / "live.json").read_text())
|
||||
# la leva lorda massima che il libro puo' tenere: frac x n_asset x scala, mai oltre il
|
||||
# tetto di CODICE (P1: derivata da `book`, non ridichiarata — la chiave di scala del
|
||||
# 01/09 entra qui da sola)
|
||||
scala = float(cfg.get("book_scale_k") or 1.0)
|
||||
leva_tetto = min(float(cfg["max_notional_per_asset_frac"]) * len(ASSETS) * scala,
|
||||
float(_book.LEVA_LORDA_MAX))
|
||||
# la leva lorda massima che il libro puo' tenere: UNA sola formula, in `book.leva_tetto`
|
||||
# (P1: derivata da `book`, non ridichiarata — #28 ne aveva tre diverse fra qui,
|
||||
# usde.frazione_cuscino e la regola `leva` sotto, e non tornavano)
|
||||
leva_tetto = _book.leva_tetto(cfg)[0]
|
||||
except Exception:
|
||||
leva_tetto = float(_book.LEVA_LORDA_MAX) # config illeggibile: il tetto di codice
|
||||
px = {a: _px_1h(a) for a in ASSETS} if candidati else {}
|
||||
@@ -567,17 +565,17 @@ def lettura(con, voce: dict) -> list[dict]:
|
||||
# --- quanto capitale e' esposto ----------------------------------------------------------
|
||||
lv = lb.get("leva_lorda")
|
||||
if lv is not None:
|
||||
# Il tetto si LEGGE da config/live.json. Ridichiararlo qui e' lo schema che questo
|
||||
# progetto ha gia' pagato quattro volte (fee_watch, test di guardia sul cap, taratura
|
||||
# venue_watch, indice del namespace): un sorvegliante che ridichiara il proprio
|
||||
# bersaglio continua a passare il giorno che il bersaglio cambia.
|
||||
# Il tetto si LEGGE da `book.leva_tetto`, non ridichiarato qui. Ridichiararlo e' lo schema
|
||||
# che questo progetto ha gia' pagato quattro volte (fee_watch, test di guardia sul cap,
|
||||
# taratura venue_watch, indice del namespace) — e una quinta, con una formula diversa da
|
||||
# quella di `movimenti_capitale` e di `usde.frazione_cuscino`, e' quella corretta da #28.
|
||||
from src.live import book as _book # lazy: prende il tetto vivo, anche monkeypatchato
|
||||
try:
|
||||
cfg = json.loads((PROJECT_ROOT / "config" / "live.json").read_text())
|
||||
cap_frac = float(cfg["max_notional_per_asset_frac"])
|
||||
tetto = cap_frac * len(lb["asset"])
|
||||
tetto, come = _book.leva_tetto(cfg)
|
||||
dire("leva", f"Leva lorda **{lv:.2f}x** su un tetto di {tetto:.2f}x "
|
||||
f"(`max_notional_per_asset_frac` {cap_frac:.2f} x {len(lb['asset'])} "
|
||||
f"asset, letto da `config/live.json`): margine {tetto - lv:.2f}x.")
|
||||
f"({come}, da `config/live.json` e `book.leva_tetto`): "
|
||||
f"margine {tetto - lv:.2f}x.")
|
||||
except Exception as e:
|
||||
dire("leva", f"Leva lorda **{lv:.2f}x**; tetto non verificabile "
|
||||
f"({type(e).__name__} su config/live.json).", "attenzione")
|
||||
|
||||
Reference in New Issue
Block a user