research(wave-0822): MAKER scartato (il segno dipende da < contro <=) + CRITICO — la cucitura dell'ondata, non i filoni
This commit is contained in:
@@ -444,13 +444,19 @@ def main() -> None: # noqa: C901
|
||||
wins_sk += d > c
|
||||
print(f" {str(IDX[t].date()):>12} {win[t]:>9.1%} {a:>11.1%} {b:>11.1%} "
|
||||
f"{c:>10.1%} {d:>11.1%} {('si' if b > a else 'no'):>9}")
|
||||
pre = [t for t in w12 if IDX[t] < pd.Timestamp(RECENT_START, tz="UTC")]
|
||||
wins_pre = sum(1 for t in pre
|
||||
if float(np.expm1(lr_opt[t:t + EPI_LEN].sum()))
|
||||
> float(np.expm1(lr_live[t:t + EPI_LEN].sum())))
|
||||
print(f"\n OPT batte LIVE in **{wins}/12** finestre -> test dei segni "
|
||||
f"p = {binom_two_sided(wins, 12):.4f}")
|
||||
print(f" SKH01 puro batte TP01 puro in **{wins_sk}/12** -> p = "
|
||||
f"{binom_two_sided(wins_sk, 12):.4f}")
|
||||
print(" ⚠️ 5 di queste 12 finestre stanno nel 2024+, cioe' DENTRO la finestra su cui")
|
||||
print(" SKH01 e' stato tarato e su cui PROP-ALLOC ha ottimizzato: la potenza sale ma")
|
||||
print(" l'indipendenza scende. Il test va letto come **una diagnostica, non una prova**.")
|
||||
print(f" ⚠️ {12-len(pre)} di queste 12 finestre stanno nel 2024+, cioe' DENTRO la finestra")
|
||||
print(" su cui SKH01 e' stato tarato e su cui PROP-ALLOC ha ottimizzato: la potenza sale")
|
||||
print(" ma l'indipendenza scende. **Sul solo sotto-campione pre-2024**, che e' quello")
|
||||
print(f" indipendente: OPT batte LIVE in **{wins_pre}/{len(pre)}** -> p = "
|
||||
f"{binom_two_sided(wins_pre, len(pre)):.4f}. E' questo il numero da citare.")
|
||||
|
||||
tick("§2 conto assicurazione")
|
||||
|
||||
@@ -583,11 +589,15 @@ def main() -> None: # noqa: C901
|
||||
bw_c = max(s2, key=lambda w: s2[w][2])
|
||||
print(f"\n argmax della colonna 'peggiore': leva-da-2024+ -> TP01 {bw_a:.3f} | "
|
||||
f"leva comune 0.50x -> TP01 {bw_c:.3f}")
|
||||
print(" Lettura: se la sopravvivenza al crash SALISSE col peso di TP01, l'assicurazione")
|
||||
print(" servirebbe. **A leva comune non sale**: la curva e' piatta-decrescente. Il difensivo")
|
||||
print(" non compra sopravvivenza su questa barriera, perche' cio' che la barriera punisce e'")
|
||||
print(" la PERDITA nel crash, e nel crash TP01 perde (prende la prima gamba giu' e poi va")
|
||||
print(" flat) mentre SKH01 si gira short e GUADAGNA.")
|
||||
print(" ⚠️ LE DUE COLONNE DICONO COSE DIVERSE, E LA SECONDA E' A CAMPANA: a leva COMUNE la")
|
||||
print(f" sopravvivenza al crash SALE col peso di TP01 fino a {bw_c:.3f} ("
|
||||
f"{s2[0.0][2]:.1%} a TP01=0 -> {s2[bw_c][2]:.1%}) e poi ricade.")
|
||||
print(" **Quindi TP01 protegge davvero: a pari leva, il libro con piu' difensivo sopravvive")
|
||||
print(" di piu' al crash.** Il punto e' che quella protezione si compra anche abbassando la")
|
||||
print(" leva — ed e' esattamente cio' che misura §5. Alla leva che ciascun libro sceglierebbe")
|
||||
print(" (prima colonna) il vantaggio sparisce, perche' il libro senza TP01 la sceglie piu'")
|
||||
print(" bassa. E' la firma del **null del de-levering**, qui in veste di 'protezione dal")
|
||||
print(" crash' invece che di 'meno drawdown'.")
|
||||
|
||||
|
||||
tick("§4 S2 replay")
|
||||
@@ -637,9 +647,16 @@ def main() -> None: # noqa: C901
|
||||
ret, _, _, _, _ = replay22(w, lo)
|
||||
_, _, _, why, _ = replay22(w, hi)
|
||||
print(f" {w:>7.3f} {lo:>23.2f}x {ret:>20.1%} {why:>25}")
|
||||
print("\n ⚠️ La leva di rottura e' MONOTONA DECRESCENTE nel peso di TP01 solo se la")
|
||||
print(" protezione fosse reale. Si legga la colonna: se il libro con piu' TP01 rompe PRIMA,")
|
||||
print(" l'assicurazione non sta assicurando la cosa giusta.")
|
||||
print("\n 📌 La colonna 'leva max viva' CRESCE col peso di TP01 (fino a TP01=0.875; a TP01=1")
|
||||
print(" ricade perche' li' a mordere non e' piu' il giorno singolo ma la perdita CUMULATA).")
|
||||
print(" **L'assicurazione e' reale e si vede: piu' TP01 = piu' leva sopportabile nel 2022.**")
|
||||
print(" E accanto c'e' il prezzo: alla PROPRIA leva massima il libro senza TP01 porta a casa")
|
||||
print(" il +23.3% e quello a TP01 pieno il -5.9%. TP01 compra capacita' di leva, e la")
|
||||
print(" capacita' di leva non si converte in rendimento perche' cio' che TP01 toglie e'")
|
||||
print(" proprio il rendimento. E' il null del de-levering scritto in una riga sola.")
|
||||
print(" ⚠️ Cambia anche il VINCOLO che morde: sotto TP01 0.50 e' la regola a UN GIORNO,")
|
||||
print(" sopra e' il max-loss cumulato. Due libri diversi muoiono di due morti diverse, e una")
|
||||
print(" sola delle due lenti (l'accoppiata) vede la prima.")
|
||||
|
||||
tick("§4 replay 2022")
|
||||
|
||||
@@ -725,8 +742,10 @@ def main() -> None: # noqa: C901
|
||||
print(f" {0.5*wxs30[t_xw]:.1%} al libro. La domanda non e' se XS01 sopravvive a cio' che ha")
|
||||
print(" gia' visto, e' se il suo comportamento nel crash somiglia a cio' che ha gia' visto —")
|
||||
print(" e su questo il campione non ha NIENTE da dire.")
|
||||
W3 = [(0.75, 0.25, 0.00), (0.375, 0.625, 0.00), (0.25, 0.25, 0.50), (0.125, 0.125, 0.75),
|
||||
(0.50, 0.25, 0.25)]
|
||||
# ⚠ le ultime tre righe hanno XS01 FISSO al 50%: senza quel controllo si confonderebbe
|
||||
# "piu' TP01" con "meno XS01", che e' un'altra domanda.
|
||||
W3 = [(0.75, 0.25, 0.00), (0.375, 0.625, 0.00), (0.50, 0.25, 0.25),
|
||||
(0.125, 0.375, 0.50), (0.25, 0.25, 0.50), (0.375, 0.125, 0.50)]
|
||||
com = xs.index.intersection(IDX[i_rec:])
|
||||
xs_al = xs.reindex(com)
|
||||
print(f"\n {'TP/SKH/XS':>16} {'ipotesi XS':>12} {'leva':>6} {'J normale':>10} "
|
||||
@@ -832,7 +851,9 @@ def main() -> None: # noqa: C901
|
||||
n_act = int((np.abs(R) > 1e-12).sum())
|
||||
n_los = int((R[np.abs(R) > 1e-12] < 0).sum())
|
||||
f = A.implausible_sharpe(d, n_trades=n_act, n_losing_trades=n_los)
|
||||
print(f" implausible_sharpe {lab:>11}: {f}")
|
||||
print(f" implausible_sharpe {lab:>11}: implausible={f['implausible']} "
|
||||
f"(Sharpe {f['sharpe']:.2f}, maxDD {f['maxdd']:.1%}, quota barre in perdita "
|
||||
f"{f['loss_frac']:.1%}, Calmar {f['calmar']:.2f}) {f['reasons']}")
|
||||
except Exception as exc: # pragma: no cover
|
||||
print(f" implausible_sharpe: NON GIRATO ({exc})")
|
||||
print(" marginal_vs_tp01 / study_family_honest / deflated_sharpe : **NON GIRATI, e non")
|
||||
@@ -864,6 +885,45 @@ def main() -> None: # noqa: C901
|
||||
am = max(tab, key=lambda w: tab[w][key][1]["J"])
|
||||
print(f" {lab:>26} {am:>14.3f} {tab[am][key][1]['J']:>10.3f} "
|
||||
f"{tab[0.75][key][1]['J']:>10.3f} {tab[0.375][key][1]['J']:>11.3f}")
|
||||
print("\n ESISTE UN PESO DI COMPROMESSO? Il criterio dichiarato: (a) dentro il 5% del")
|
||||
print(" massimo di J sulla finestra 2024+ (la 'regione robusta' del funded) E (b) dentro il")
|
||||
print(" 5% del massimo di J sulla finestra 2019+, che il sinistro ce l'ha dentro.")
|
||||
jr_max = max(tab[w]["rec"][1]["J"] for w in W_GRID)
|
||||
jf_max = max(tab[w]["full"][1]["J"] for w in W_GRID)
|
||||
js_max = max(tab[w]["sin"][1]["J"] for w in W_GRID)
|
||||
print(f"\n {'w TP01':>7} {'J 2024+':>9} {'entro 5%':>9} {'J 2019+':>9} {'entro 5%':>9} "
|
||||
f"{'J solo-sin':>11} {'entro 5%':>9} {'compromesso':>13}")
|
||||
ok_both = []
|
||||
for w in W_GRID:
|
||||
a, b, c = (tab[w]["rec"][1]["J"], tab[w]["full"][1]["J"], tab[w]["sin"][1]["J"])
|
||||
oa, ob, oc = a >= 0.95 * jr_max, b >= 0.95 * jf_max, c >= 0.95 * js_max
|
||||
if oa and ob:
|
||||
ok_both.append(w)
|
||||
print(f" {w:>7.3f} {a:>9.3f} {('si' if oa else 'no'):>9} {b:>9.3f} "
|
||||
f"{('si' if ob else 'no'):>9} {c:>11.3f} {('si' if oc else 'no'):>9} "
|
||||
f"{('SI' if (oa and ob) else '-'):>13}")
|
||||
print(f"\n -> pesi che soddisfano (a) E (b): {ok_both if ok_both else 'NESSUNO'}")
|
||||
print(f" il libro live 75/25 e' {'dentro' if 0.75 in ok_both else 'FUORI'} da questa regione.")
|
||||
print("\n LA RISPOSTA, IN QUATTRO RIGHE")
|
||||
print(" 1) La premessa del caveat e' sbagliata nella FORMA: il 2024+ un crash ce l'ha (b&h")
|
||||
print(" -60% di drawdown, -39.6% in 20 giorni). Manca la TAGLIA, ~2x sulla coda veloce.")
|
||||
print(" 2) Il compromesso ESISTE e non e' un compromesso: lo stesso peso (TP01 ~0.375) e'")
|
||||
print(" l'argmax sulla finestra con il 2022 dentro E su quella senza. Il caveat di")
|
||||
print(" PROP-ALLOC e' onesto come cautela e **falsificato come previsione**.")
|
||||
print(" 3) TP01 protegge davvero (a pari leva sopravvive di piu' al crash, e alza la leva")
|
||||
print(" sopportabile nel 2022 da 0.93x a 2.20x) ma la stessa protezione si compra piu' a")
|
||||
print(" buon mercato ABBASSANDO LA LEVA: a iso-sopravvivenza il payout e' massimo a")
|
||||
print(" TP01 0.125-0.250 e cala monotonamente da li'. **7ª occorrenza del null del")
|
||||
print(" de-levering**, in una veste nuova: 'protezione dal crash' invece di 'meno DD'.")
|
||||
print(" 4) Il rischio vero dell'ottimo di PROP-ALLOC NON e' TP01 sotto-pesato: e' XS01 al")
|
||||
print(" 50% con un comportamento nel crash che il campione non contiene. Un solo giorno")
|
||||
print(" a -8% su XS01 dimezza la sopravvivenza; con TP01 al 50% ne serve uno a -12.3%.")
|
||||
print(" **Se TP01 vale qualcosa su un conto funded, vale come zavorra contro l'ignoto di")
|
||||
print(" XS01, non come assicurazione contro il crash di BTC/ETH — che SKH01 fa meglio.**")
|
||||
print("\n ⚠️ COSA MI SMENTIREBBE: un crash in cui SKH01 NON si gira short in tempo (gap")
|
||||
print(" notturno oltre lo stop, o venue fermo). Il campione ne ha quattro e in tutti e")
|
||||
print(" quattro SKH01 ha girato. Basterebbe un episodio in cui SKH01 perde quanto il")
|
||||
print(" sottostante per rovesciare §2 e §5 — e con n=4 quell'episodio non e' improbabile.")
|
||||
print("\n" + "=" * 106)
|
||||
print(f" fatto in {time.time()-t0:.0f}s | valutazioni: {N_EVAL}")
|
||||
print("=" * 106)
|
||||
|
||||
Reference in New Issue
Block a user