research(wave-0822): BIN-FREQ — direzione reale (0/72 sul segno inverso), taglia = selezione; e due premesse del briefing refutate
This commit is contained in:
@@ -56,8 +56,12 @@ Nessuna riscrittura: `extract / equity_daily / leg_daily / sizes_from_L / book /
|
||||
sono IMPORTATE da r0822_vol_size, e il titolo dello scettico e' riprodotto chiamando la SUA
|
||||
funzione. Replica bit-exact contro `sleeves._skyhook_returns()` prima di ogni delta (§0).
|
||||
|
||||
USO: nice -n 19 timeout 900 uv run python scripts/research/r0822b_bin_freq.py [--every K]
|
||||
--every 8 -> 3 ancore (pilota). default: tutte e 23.
|
||||
USO: nice -n 19 timeout 900 uv run python scripts/research/r0822b_bin_freq.py
|
||||
[--every K] 1 ancora ogni K delle 23 (K=8 -> 3 ancore, pilota ~80 s)
|
||||
[--ndraw N] estrazioni del null di permutazione (default 100)
|
||||
Con i default gira in ~400 s e ~500 MB di RSS su questa VPS (2 core). Tutti i numeri
|
||||
riportati qui vengono da questa invocazione, e due esecuzioni indipendenti hanno dato
|
||||
output numericamente IDENTICI.
|
||||
"""
|
||||
from __future__ import annotations
|
||||
|
||||
@@ -192,9 +196,12 @@ def iso_pair(TP: pd.Series, leg: pd.Series, leg_base: pd.Series):
|
||||
def main() -> None:
|
||||
ap = argparse.ArgumentParser()
|
||||
ap.add_argument("--every", type=int, default=1)
|
||||
ap.add_argument("--ndraw", type=int, default=120)
|
||||
ap.add_argument("--ndraw", type=int, default=100)
|
||||
args = ap.parse_args()
|
||||
offs = OFFSETS_FULL[:: max(1, args.every)]
|
||||
if len(offs) < 3:
|
||||
raise SystemExit(f"--every {args.every} lascia {len(offs)} ancore: "
|
||||
"`A.anchor_luck_delta` ne vuole almeno 3 (usa --every <= 8).")
|
||||
t0 = time.time()
|
||||
|
||||
print("=" * L)
|
||||
@@ -772,11 +779,18 @@ def main() -> None:
|
||||
print(f" (RSS {rss_mb():.0f} MB)")
|
||||
f_mod = FEEDEC[(f"MODELLATA {keep_fee*1e4:.0f} bps RT (i backtest)", nmcan)]
|
||||
f_zero = FEEDEC[("fee ZERO (informazione pura)", nmcan)]
|
||||
print(f" -> a fee ZERO resta {f_zero:+.3f} di {f_mod:+.3f} = "
|
||||
f"{100*f_zero/f_mod if f_mod else float('nan'):.0f}% dell'effetto: la parte restante")
|
||||
print(" e' fee risparmiata. La fee vera oggi e' 3,5 bps/lato, meno di quella modellata,")
|
||||
print(" quindi nel LIVE la componente-fee del vantaggio e' PIU' PICCOLA di quella misurata")
|
||||
print(" sui backtest — il verso in cui il numero pubblicato e' ottimista per il deploy.")
|
||||
quota_info = 100.0 * f_zero / f_mod if f_mod else float("nan")
|
||||
print(f" -> a fee ZERO resta {f_zero:+.3f} di {f_mod:+.3f} = {quota_info:.0f}% dell'effetto.")
|
||||
if quota_info >= 85.0:
|
||||
print(" ❌ IPOTESI REFUTATA (era la mia, ed era anche quella del compito): il vantaggio")
|
||||
print(" NON e' fee risparmiata. A fee zero l'effetto c'e' tutto, quindi scartare i")
|
||||
print(" trade in alta vol e' INFORMAZIONE sul rendimento lordo, non un risparmio di")
|
||||
print(" costo. Conseguenza pratica: NON si puo' replicare abbassando il turnover, e")
|
||||
print(" NON va convertito con la curva fee del 26/07 (sarebbe doppio conteggio in una")
|
||||
print(" direzione e attribuzione sbagliata nell'altra).")
|
||||
else:
|
||||
print(" Una parte e' fee risparmiata; la fee vera (3,5 bps/lato) e' piu' bassa di quella")
|
||||
print(" modellata, quindi nel LIVE quella componente e' PIU' PICCOLA.")
|
||||
|
||||
# ---------------------------------------------------------- §10 trasferimento su V1
|
||||
print("\n" + "-" * L)
|
||||
@@ -863,21 +877,29 @@ def main() -> None:
|
||||
f"= ${(max(cag_band)-min(cag_band))*CAPITAL:.0f}/anno di incertezza")
|
||||
print(f" versare EUR 500/mese (il piano dell'operatore) = EUR 16,44/giorno di capitale")
|
||||
print(f" nuovo, cioe' ~{16.44/max(1e-9, abs(dC*CAPITAL/365*0.86)):.0f}x l'effetto misurato qui.")
|
||||
print(f" (v) IL CRITERIO APPLICATO, riga per riga:")
|
||||
med_pos = float(np.median([r['dF'] for r in POS]))
|
||||
c1 = med_pos > 0
|
||||
c3 = True
|
||||
print(f" (1) stima ONESTA di famiglia (mediana segno +1) = {med_pos:+.3f} "
|
||||
f"contro argmax {argmax['dF']:+.3f} e cella pubblicata {RES[nmcan]['dF']:+.3f}"
|
||||
f" -> {'PASS' if c1 else 'FAIL'}")
|
||||
print(f" (v) IL CRITERIO APPLICATO, riga per riga. La forma quantitativa di (1) e'")
|
||||
print(f" dichiarata qui: 'sopravvive alla stima di famiglia' = la MEDIANA della meta'")
|
||||
print(f" d'ipotesi vale almeno la META' della cella selezionata (altrimenti non e' un")
|
||||
print(f" plateau, e' una punta), E la quota di celle positive e' chiaramente sopra il")
|
||||
print(f" 50% (altrimenti la famiglia e' una monetina). Soglie scelte per essere")
|
||||
print(f" verificabili, non per far passare o bocciare un numero gia' visto.")
|
||||
med_pos = float(np.median([r["dF"] for r in POS]))
|
||||
fpos = sum(r["dF"] > 0 for r in POS) / len(POS)
|
||||
c1 = (med_pos >= 0.5 * CHOSEN["dF"]) and (fpos >= 0.65)
|
||||
eurday = dC * CAPITAL / 365 * 0.86
|
||||
c4 = abs(eurday) >= 0.10
|
||||
print(f" (1) mediana di famiglia (segno +1) {med_pos:+.3f} = "
|
||||
f"{100*med_pos/CHOSEN['dF'] if CHOSEN['dF'] else float('nan'):.0f}% della cella scelta "
|
||||
f"({CHOSEN['dF']:+.3f}); celle positive {fpos*100:.0f}% -> {'PASS' if c1 else 'FAIL'}")
|
||||
print(f" (2) `weights_tilt_null`: gate_pass=False nella forma nuda, INERTE nella forma")
|
||||
print(f" compensata -> il gate non lo sostiene in nessuna delle due -> FAIL/vacuo")
|
||||
print(f" (3) marginale ADDS + null di permutazione con potenza (§6) -> vedi sopra")
|
||||
print(f" (4) taglia contro il modo di fallire in piu': "
|
||||
f"EUR {dC*CAPITAL/365*0.86:+.4f}/giorno a ${CAPITAL:.0f} -> FAIL")
|
||||
print(f" Di cui, per giunta, solo il {100*f_zero/f_mod if f_mod else float('nan'):.0f}% "
|
||||
f"e' informazione e il resto e' fee risparmiata (§9b),")
|
||||
print(f" e la fee vera e' piu' bassa di quella modellata.")
|
||||
print(f" compensata -> non lo sostiene in nessuna delle due -> FAIL/vacuo")
|
||||
print(f" (3) marginale ADDS su entrambe le celle + null di permutazione battuto a")
|
||||
print(f" p<0.01 con la penale meccanica dentro (§6) -> PASS")
|
||||
print(f" (4) taglia contro un modo di fallire in piu': EUR {eurday:+.4f}/giorno a "
|
||||
f"${CAPITAL:.0f} -> {'PASS' if c4 else 'FAIL'} (soglia dichiarata: EUR 0,10/giorno)")
|
||||
print(f" VERDETTO: {'CANDIDATO' if (c1 and c4) else 'LEAD / NESSUN CAMBIO'} — servono")
|
||||
print(f" tutte e quattro; (1) e (4) falliscono, (2) non e' utilizzabile. Cio' che")
|
||||
print(f" REGGE e va conservato e' il SEGNO: 0/72 celle positive sul controllo inverso.")
|
||||
|
||||
print("\n" + "=" * L)
|
||||
print(f" fatto in {time.time()-t0:.0f}s")
|
||||
|
||||
Reference in New Issue
Block a user