research(wave-0822): MAKER scartato (il segno dipende da < contro <=) + CRITICO — la cucitura dell'ondata, non i filoni

This commit is contained in:
Adriano Dal Pastro
2026-08-22 20:51:47 +00:00
parent 103dd7bce5
commit 0f2e195674
4 changed files with 271 additions and 18 deletions
+74 -14
View File
@@ -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)