research(capitale): "5k messi dove" — lo split si ottiene versando di meno
Misura nuova: a $6.050 lo split CON GTAA01 e' impossibile (servirebbe il 50% del conto per i $3.000 di gamba minima), ma quello in LIQUIDITA' non ha soglie. Due correzioni prima dei numeri: - la configurazione vera e' 5.000 + 500/mese (dal commento in config/live.json del 26/07), non i 250/mese di tutte le tabelle. Nessuna azione di config: il cap e' gia' armato e vale min($3.000, equity_osservata x 0.5) = leva lorda <=1x. - a $6.050 non si sblocca nulla (GTAA01/XS01/XSR01 tutti fuori portata o sotto gate): il book resta TP01+SKH01. Split in liquidita' (p=1%, 20a): fuori 10% -> P(perso tutto) 18.4% -> 3.5% (0.0% con cassa in banca), salvati $6.818; 25% -> salvati $17.045, al prezzo di 0.9pp di P(arrivare) e circa un anno di ritardo mediano. P(perso tutto) SATURA a qualunque quota > 0: la protezione binaria si compra col fatto di avere un secondo conto. Cio' che distingue le quote e' il salvataggio. ERRORE CORRETTO IN SESSIONE: la colonna del salvataggio riportava prima il capitale a 20 anni condizionato al fallimento ($77k al 10% = 11x il vero), gonfiato dalla convenzione ereditata dal 26/07 per cui i versamenti si dirottano ai superstiti -> attribuiva allo split il valore di continuare a versare, che si ottiene comunque aprendo un altro conto. Ora misura il salvataggio istantaneo, congelato in un test. simulate() accetta un hazard PER VENUE (una cassa in banca non fallisce come un exchange); la replica esatta dei numeri del 26/07 e' preservata e testata. Test: 4 nuovi (508 totali), tutti verdi. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -151,3 +151,43 @@ def test_il_bersaglio_e_lo_stesso_per_entrambi_i_bracci():
|
||||
usassero due bersagli, il confronto smetterebbe di essere leggibile."""
|
||||
import r0726_venue_risk as VR
|
||||
assert LS.TARGET == VR.TARGET
|
||||
|
||||
|
||||
# ===========================================================================
|
||||
# rischio per-venue: la cassa non e' un exchange
|
||||
# ===========================================================================
|
||||
def test_un_p_per_venue_non_cambia_il_caso_scalare(series):
|
||||
"""La generalizzazione a hazard per-venue deve lasciare identico il caso gia' pubblicato,
|
||||
altrimenti la replica del 26/07 vale solo per la versione vecchia della funzione."""
|
||||
kw = dict(n_paths=300, years=4, seed=9, lump_usd=5_000.0)
|
||||
cfg = {"Deribit": 0.75, "IB": 0.25}
|
||||
a = LS.simulate(cfg, series, 0.02, **kw)
|
||||
b = LS.simulate(cfg, series, {"Deribit": 0.02, "IB": 0.02}, **kw)
|
||||
assert a["p_reach"] == b["p_reach"] and a["p_all_dead"] == b["p_all_dead"]
|
||||
|
||||
|
||||
def test_una_cassa_che_non_fallisce_azzera_la_rovina(series):
|
||||
"""P(perso tutto) richiede che cadano TUTTI i conti: se il secondo non puo' cadere, e' zero
|
||||
a qualunque quota. E' il risultato che rende la protezione indipendente da GTAA01."""
|
||||
kw = dict(n_paths=400, years=6, seed=13, lump_usd=5_000.0)
|
||||
zero = {**series, "IB": series["IB"] * 0.0}
|
||||
r = LS.simulate({"Deribit": 0.9, "IB": 0.1}, zero, {"Deribit": 0.05, "IB": 0.0}, **kw)
|
||||
assert r["p_all_dead"] == 0.0
|
||||
|
||||
|
||||
def test_il_salvataggio_scala_con_la_quota_tenuta_fuori(series):
|
||||
"""P(perso tutto) SATURA a qualunque quota > 0: cio' che distingue il 10% dal 40% e' quanto
|
||||
si salva nel momento del fallimento, e deve crescere con la quota."""
|
||||
kw = dict(n_paths=600, years=8, seed=17, lump_usd=5_000.0)
|
||||
zero = {**series, "IB": series["IB"] * 0.0}
|
||||
sv = [LS.simulate({"Deribit": 1 - q, "IB": q}, zero, {"Deribit": 0.05, "IB": 0.0},
|
||||
**kw)["median_salvage"] for q in (0.10, 0.25, 0.40)]
|
||||
assert sv[0] < sv[1] < sv[2]
|
||||
|
||||
|
||||
def test_il_salvataggio_e_istantaneo_non_a_scadenza(series):
|
||||
"""Deve misurare cio' che resta NEL MOMENTO del fallimento. Il capitale a 20 anni
|
||||
condizionato al fallimento sarebbe gonfiato dai versamenti dirottati ai superstiti —
|
||||
valore che si ottiene comunque aprendo un altro conto, non merito dello split."""
|
||||
assert "SALVA nel momento" in LS.simulate.__doc__ or "salvataggio istantaneo" in (
|
||||
Path(LS.__file__).read_text())
|
||||
|
||||
Reference in New Issue
Block a user