diff --git a/docs/report/strategie_attive.html b/docs/report/strategie_attive.html index 8acaaa9..3c04c1a 100644 --- a/docs/report/strategie_attive.html +++ b/docs/report/strategie_attive.html @@ -21,7 +21,7 @@ font-size:13px;margin-top:10px}
Portafoglio live PORT06 (17 sleeve, capitale pool €2.000, leva 2x) · -v1.1.9 · generato 2026-06-07 16:55 UTC · backtest canonico: FULL Sharpe 6.61 / DD 3.58% — OOS Sharpe 8.77 / DD 1.34%
+v1.1.9 · generato 2026-06-07 17:31 UTC · backtest canonico: FULL Sharpe 6.61 / DD 3.58% — OOS Sharpe 8.77 / DD 1.34%Tre famiglie principali quasi scorrelate fra loro (fade↔honest ~0.05, pairs ~0.02-0.09, shape ~0.08): la diversificazione è la leva anti-drawdown. Pesi equal con tetti per famiglia, @@ -39,15 +39,15 @@ non si fada un crollo/parabolica), EXIT-16 (stop solo sul close confermat
FADEESECUZIONE REALE (testnet)
Quando il close chiude fuori dalla banda ±2.5σ attorno alla SMA50, entra CONTRO il movimento (short sopra, long sotto). TP alla media (il prezzo "torna a casa"), SL a 2·ATR, -time-limit 24 barre. Edge OOS validato: BTC +201% / ETH +1238% (fee incluse).
| anno | BTC | ETH | ||||
|---|---|---|---|---|---|---|
| trd | PnL% | DD% | trd | PnL% | DD% | |
| 2018 | 48 | -78 | 10 | 42 | -85 | 14 |
| 2019 | 57 | -84 | 12 | 46 | +21 | 7 |
| 2020 | 68 | -29 | 14 | 55 | -35 | 9 |
| 2021 | 82 | +326 | 8 | 60 | +238 | 12 |
| 2022 | 108 | +567 | 5 | 76 | +749 | 6 |
| 2023 | 122 | +318 | 4 | 73 | +248 | 2 |
| 2024 | 113 | +413 | 11 | 126 | +888 | 7 |
| 2025 | 90 | +368 | 2 | 86 | +361 | 8 |
| 2026 | 29 | +69 | 4 | 24 | -9 | 7 |
| TOT | 717 | +1870 | 32 | 588 | +2376 | 23 |
PnL = Σ rendimenti netti per trade (%, leva 3x, fee 0.10% RT, convenzione test; il live gira a leva 2x); DD = max drawdown nell'anno (equity compounding pos 0.15); riga TOT: DD dell'intero periodo. NB: la finestra canonica di valutazione del portafoglio parte dal 2021 — gli anni 2018-2020 (regime microstrutturale diverso, spesso negativi) sono mostrati per onestà storica.
FADEESECUZIONE REALE (testnet)
Fada la rottura degli estremi del canale Donchian a 20 barre (max/min recenti): short sulla rottura del massimo, long sulla rottura del minimo. TP al centro del canale. -Stessa tesi di MR01 con trigger diverso → si combinano bene.
| anno | BTC | ETH | ||||
|---|---|---|---|---|---|---|
| trd | PnL% | DD% | trd | PnL% | DD% | |
| 2018 | 127 | +69 | 8 | 127 | +10 | 13 |
| 2019 | 118 | +18 | 16 | 114 | +120 | 8 |
| 2020 | 112 | +100 | 14 | 135 | -94 | 23 |
| 2021 | 136 | +332 | 18 | 127 | +160 | 23 |
| 2022 | 106 | +728 | 5 | 91 | +650 | 12 |
| 2023 | 96 | +235 | 3 | 146 | +524 | 6 |
| 2024 | 149 | +868 | 5 | 180 | +1952 | 4 |
| 2025 | 136 | +386 | 4 | 151 | +931 | 6 |
| 2026 | 37 | +88 | 4 | 41 | +25 | 8 |
| TOT | 1017 | +2823 | 19 | 1112 | +4278 | 31 |
PnL = Σ rendimenti netti per trade (%, leva 3x, fee 0.10% RT, convenzione test; il live gira a leva 2x); DD = max drawdown nell'anno (equity compounding pos 0.15); riga TOT: DD dell'intero periodo. NB: la finestra canonica di valutazione del portafoglio parte dal 2021 — gli anni 2018-2020 (regime microstrutturale diverso, spesso negativi) sono mostrati per onestà storica.
FADEESECUZIONE REALE (testnet)
Guarda il rendimento della singola barra: se lo z-score supera ±3.5 (movimento estremo in un'ora), fada il movimento. Exit in multipli di ATR. È la fade più selettiva -(esposizione ~8% del tempo).
| anno | BTC | ETH | ||||
|---|---|---|---|---|---|---|
| trd | PnL% | DD% | trd | PnL% | DD% | |
| 2018 | 38 | -12 | 7 | 25 | +15 | 14 |
| 2019 | 52 | +55 | 7 | 35 | -40 | 15 |
| 2020 | 53 | -11 | 12 | 43 | +39 | 5 |
| 2021 | 45 | +245 | 7 | 24 | +72 | 5 |
| 2022 | 82 | +446 | 5 | 58 | +472 | 7 |
| 2023 | 67 | +168 | 4 | 58 | +337 | 1 |
| 2024 | 75 | +377 | 5 | 87 | +645 | 6 |
| 2025 | 60 | +190 | 2 | 55 | +226 | 17 |
| 2026 | 17 | +58 | 2 | 17 | +40 | 4 |
| TOT | 489 | +1517 | 12 | 402 | +1806 | 23 |
PnL = Σ rendimenti netti per trade (%, leva 3x, fee 0.10% RT, convenzione test; il live gira a leva 2x); DD = max drawdown nell'anno (equity compounding pos 0.15); riga TOT: DD dell'intero periodo. NB: la finestra canonica di valutazione del portafoglio parte dal 2021 — gli anni 2018-2020 (regime microstrutturale diverso, spesso negativi) sono mostrati per onestà storica.
MECCANISMO COMUNE
Scoperta chiave della ricerca exit (34 agenti, 23 famiglie): gli stop intrabar da wick sono falsi negativi — l'overshoot che buca lo stop e rientra è esattamente il movimento che @@ -58,28 +58,28 @@ portafoglio: OOS Sharpe 8.82→10.06. Esteso oggi anche a DIP01 (grid 36/36).
HONESTESECUZIONE REALE (testnet)
Compra il dip: quando lo z-score del prezzo incrocia sotto −2.5 (sell-off rapido), entra long. TP alla SMA50, EXIT-16 sul SL, max 24 barre. È l'unico sleeve BTC con round-trip -reali su Deribit testnet (TP limit resting + disaster-stop a −30% sul book).
| anno | BTC | ||
|---|---|---|---|
| trd | PnL% | DD% | |
| 2018 | 79 | -78 | 28 |
| 2019 | 62 | -104 | 17 |
| 2020 | 56 | +67 | 14 |
| 2021 | 69 | +315 | 11 |
| 2022 | 83 | +407 | 11 |
| 2023 | 83 | +228 | 5 |
| 2024 | 81 | +332 | 5 |
| 2025 | 85 | +303 | 3 |
| 2026 | 29 | +7 | 6 |
| TOT | 627 | +1476 | 37 |
PnL = Σ rendimenti netti per trade (%, leva 3x, fee 0.10% RT, convenzione test; il live gira a leva 2x); DD = max drawdown nell'anno (equity compounding pos 0.15); riga TOT: DD dell'intero periodo. NB: la finestra canonica di valutazione del portafoglio parte dal 2021 — gli anni 2018-2020 (regime microstrutturale diverso, spesso negativi) sono mostrati per onestà storica.
HONESTSIMULATO
Trend-following difensivo: long quando EMA20>EMA100 sulle 4 ore, flat altrimenti, su un paniere equal-weight di 5 asset (BNB, BTC, DOGE, SOL, XRP). Cattura i trend lunghi che -le fade per costruzione non prendono. Valuta solo barre 4h COMPLETE.
| anno | TR01 (paniere 5) | ||
|---|---|---|---|
| trd | PnL% | DD% | |
| 2021 | — | +3 | 6 |
| 2022 | — | -9 | 12 |
| 2023 | — | +45 | 5 |
| 2024 | — | +38 | 19 |
| 2025 | — | -15 | 19 |
| 2026 | — | -10 | 11 |
| TOT | — | +51 | 30 |
PnL = ritorno % dell'anno dall'equity giornaliera canonica (2021-2026, leva 3x convenzione test); DD = max drawdown nell'anno; trd non applicabile (ribilancio giornaliero del book).
HONESTSIMULATO
Rotazione: ogni giorno ordina 8 crypto per momentum a 60 giorni e tiene le top-3 (solo se positive), gross 0.45. Gate di regime: tutto cash se BTC<SMA100. Diversificare su 3 -asset invece di 2 ha quasi dimezzato il DD (40%→26%) alzando il ritorno.
| anno | ROT02 (universo 8) | ||
|---|---|---|---|
| trd | PnL% | DD% | |
| 2021 | — | +0 | 0 |
| 2022 | — | +0 | 0 |
| 2023 | — | +81 | 10 |
| 2024 | — | +43 | 7 |
| 2025 | — | +13 | 12 |
| 2026 | — | -8 | 9 |
| TOT | — | +130 | 19 |
PnL = ritorno % dell'anno dall'equity giornaliera canonica (2021-2026, leva 3x convenzione test); DD = max drawdown nell'anno; trd non applicabile (ribilancio giornaliero del book).
PAIRSSIMULATO
Market-neutral: quando il rapporto fra due asset si allontana troppo dalla sua media (|z| del log-ratio ≥ 2), compra la gamba debole e shorta la forte; chiude quando il rapporto rientra (|z| ≤ 0.75) o dopo 72 barre. Config universale per tutte le coppie (niente tuning per-coppia = anti-overfit). Correlazione col mercato ~0.05: rende anche quando il mercato è fermo. -Fee su 2 gambe. Senza stop per design → position size ridotto a 0.20 (esposizione ≈ validato).
| anno | ETH/BTC | LTC/ETH | ADA/ETH | BTC/LTC | ETH/SOL |
|---|---|---|---|---|---|
| 2018 | -343 (177, dd 45) | — | — | — | — |
| 2019 | +233 (198, dd 8) | — | — | — | — |
| 2020 | +323 (211, dd 25) | — | — | — | — |
| 2021 | +549 (202, dd 12) | — | — | — | — |
| 2022 | +1344 (206, dd 3) | +292 (45, dd 14) | +899 (157, dd 5) | +328 (58, dd 8) | +1243 (147, dd 9) |
| 2023 | +464 (213, dd 4) | +56 (94, dd 5) | +341 (173, dd 10) | +61 (106, dd 14) | +125 (168, dd 24) |
| 2024 | +1661 (253, dd 6) | +1024 (195, dd 9) | +1078 (225, dd 16) | +638 (186, dd 10) | +1302 (199, dd 12) |
| 2025 | +1173 (225, dd 16) | +962 (196, dd 10) | +1046 (187, dd 19) | +686 (178, dd 7) | +1264 (202, dd 11) |
| 2026 | +61 (71, dd 2) | +279 (76, dd 3) | +140 (71, dd 3) | +265 (71, dd 3) | +270 (88, dd 4) |
| TOT | +5464 (1756, dd 48) | +2614 (606, dd 14) | +3504 (813, dd 19) | +1978 (599, dd 21) | +4204 (804, dd 24) |
cella: PnL% anno (n trade, max DD% anno) — Σ rendimenti netti per trade, fee 0.20% RT/coppia (2 gambe), leva 3x convenzione test. NB: la finestra canonica del portafoglio parte dal 2021; gli anni precedenti (spesso negativi) sono mostrati per onestà storica.
TSMSIMULATO
Long sugli asset con consenso pieno di momentum su 3 orizzonti (3/6/12 mesi), gross 0.30, cash totale se BTC<SMA100. Mai un anno negativo nel backtest. Non è un motore di ritorno: è il diversificatore che lavora nei regimi in cui le fade soffrono. -Attualmente flat by-design (risk-off).
| anno | TSM01 (universo 8) | ||
|---|---|---|---|
| trd | PnL% | DD% | |
| 2021 | — | +0 | 0 |
| 2022 | — | +0 | 0 |
| 2023 | — | +0 | 0 |
| 2024 | — | -2 | 2 |
| 2025 | — | +7 | 6 |
| 2026 | — | +0 | 0 |
| TOT | — | +5 | 6 |
PnL = ritorno % dell'anno dall'equity giornaliera canonica (2021-2026, leva 3x convenzione test); DD = max drawdown nell'anno; trd non applicabile (ribilancio giornaliero del book).
SHAPESIMULATO
Una LogisticRegression legge 17 feature della forma delle ultime 24 barre e @@ -88,7 +88,7 @@ orizzonte. Training walk-forward causale (mai dati futuri). Win-rate ~50% nell'asimmetria, non nella frequenza. Senza stop-loss by design (ogni stop testato rompe l'edge): la coda si gestisce dimezzando il peso della famiglia (cap 5.88%).
Fix di oggi (punto-10): il training live usa la storia COMPLETA dal parquet -locale (il regime corto a 365g non era robusto: trade-rate 22% vs 10% validato).
| anno | BTC | ETH | ||||
|---|---|---|---|---|---|---|
| trd | PnL% | DD% | trd | PnL% | DD% | |
| 2018 | 237 | -66 | 23 | 239 | +74 | 15 |
| 2019 | 318 | +88 | 15 | 365 | -19 | 21 |
| 2020 | 240 | +194 | 10 | 219 | -293 | 53 |
| 2021 | 224 | +301 | 13 | 146 | +67 | 18 |
| 2022 | 142 | +64 | 11 | 91 | +79 | 22 |
| 2023 | 118 | +17 | 5 | 17 | +21 | 5 |
| 2024 | 144 | +110 | 8 | 47 | +108 | 6 |
| 2025 | 85 | +77 | 5 | 108 | +540 | 7 |
| 2026 | 23 | +59 | 2 | 25 | -30 | 7 |
| TOT | 1531 | +845 | 23 | 1257 | +547 | 61 |
PnL = Σ rendimenti netti per trade (%, leva 3x, fee 0.10% RT, convenzione test; il live gira a leva 2x); DD = max drawdown nell'anno (equity compounding pos 0.15); riga TOT: DD dell'intero periodo. NB: la finestra canonica di valutazione del portafoglio parte dal 2021 — gli anni 2018-2020 (regime microstrutturale diverso, spesso negativi) sono mostrati per onestà storica.
| anno | {head}
|---|
{note or base}
') + + +def stats_fades(): + """Per-anno delle 3 fade × BTC/ETH col PATH LIVE (EXIT-16 + trend 3.0).""" + from scripts.analysis.risk_management import strats_for + from scripts.analysis.trendmax_port06_impact import build_trades_variant + out = {} + for asset in ("BTC", "ETH"): + df = load_data(asset, "1h") + ts = pd.to_datetime(df["timestamp"], unit="ms", utc=True) + for nm, (fn, params) in strats_for(asset).items(): + tr = build_trades_variant(fn(df, **params), df, mode="exit16", trend_max=3.0) + out.setdefault(nm, {})[asset] = yearly_stats(tr, ts) + return out + + +def stats_dip(): + from scripts.analysis.dip01_exit16_impact import dip_entries, dip_trades + df = load_data("BTC", "1h") + ts = pd.to_datetime(df["timestamp"], unit="ms", utc=True) + tr = dip_trades(dip_entries(df), df, "exit16") + return {"BTC": yearly_stats(tr, ts)} + + +def stats_pairs(): + """Tabella compatta: per anno 'PnL% (n)' per coppia + righe TOT/DD.""" + from scripts.analysis.pairs_research import pairs_sim + from scripts.strategies.PR01_pairs_reversion import PAIRS as PAIRS_CFG + cols, data = [], {} + for a, b, p in PAIRS_CFG: + r = pairs_sim(a, b, **p) + tag = f"{a}/{b}" + cols.append(tag) + s = pd.Series(r["eq_v"], index=pd.to_datetime(r["eq_ts"], utc=True)) + ydd = {int(y): float(((g.cummax() - g) / g.cummax()).max() * 100) + for y, g in s.groupby(s.index.year)} + data[tag] = dict(yearly=r["yearly"], n=r["yearly_n"], dd=r["dd"], + trades=r["trades"], ydd=ydd) + yrs = sorted({y for d in data.values() for y in d["yearly"]}) + rows = [] + for y in yrs: + cells = "".join( + (f"| anno | {head}
|---|
cella: PnL% anno (n trade, max DD% anno) — Σ rendimenti netti ' + "per trade, fee 0.20% RT/coppia (2 gambe), leva 3x convenzione test. NB: la " + "finestra canonica del portafoglio parte dal 2021; gli anni precedenti " + "(spesso negativi) sono mostrati per onestà storica.
") + + +def stats_multi(): + """TR01/ROT02/TSM01: per-anno ret/DD dall'equity giornaliera canonica (2021+).""" + from scripts.analysis.combine_portfolio import IDX + from scripts.analysis.honest_improve2 import _tr_basket_daily, _rot_daily_equity + from scripts.analysis.tsmom_research import tsmom_sim + from scripts.analysis.report_families import daily_from + tr = _tr_basket_daily(["BNB", "BTC", "DOGE", "SOL", "XRP"], IDX) + rot = _rot_daily_equity(IDX) + t = tsmom_sim() + tsm = daily_from(t["eq_ts"], t["eq_v"]) + note = ("PnL = ritorno % dell'anno dall'equity giornaliera canonica (2021-2026, leva 3x " + "convenzione test); DD = max drawdown nell'anno; trd non applicabile (ribilancio " + "giornaliero del book).") + return (yearly_table({"TR01 (paniere 5)": equity_yearly(tr)}, note), + yearly_table({"ROT02 (universo 8)": equity_yearly(rot)}, note), + yearly_table({"TSM01 (universo 8)": equity_yearly(tsm)}, note)) + + +def stats_sh01(): + """SH01 per-anno dal walk-forward EXPANDING (il regime validato e ora live).""" + from scripts.analysis.shape_ml_research import ml_wf_entries + out = {} + for asset in ("BTC", "ETH"): + df = load_data(asset, "1h") + ts = pd.to_datetime(df["timestamp"], unit="ms", utc=True) + c = df["close"].values + ents = ml_wf_entries(df, W=24, H=12, model="logit", thresh=0.58) + tr, last = [], -1 + for e in ents: + i, d, mb = e["i"], e["d"], e["max_bars"] + j = min(i + mb, len(c) - 1) + if i <= last or j <= i: + continue + ret = (c[j] - c[i]) / c[i] * d * LEV_T - FEE_T * LEV_T + tr.append((i, j, ret)) + last = j + out[asset] = yearly_stats(tr, ts) + return out + + # ----------------------------------------------------------------- HTML CSS = """ body{font-family:-apple-system,Segoe UI,Roboto,sans-serif;margin:0;background:#f4f5f7;color:#222} @@ -433,6 +599,14 @@ def main(): print("genero grafici (episodi reali)...") panel = _daily_panel() + print("calcolo statistiche per anno (engine canonici/live-path)...") + st_fade = stats_fades() + st_dip = stats_dip() + t_pairs = stats_pairs() + t_tr, t_rot, t_tsm = stats_multi() + print(" SH01 walk-forward expanding (il piu' lento)...") + st_sh = stats_sh01() + g_w = chart_weights() g_mr01 = chart_fade("scripts.strategies.MR01_bollinger_fade", "BTC", dict(trend_max=3.0, ema_long=200), mr01_bands, @@ -460,17 +634,20 @@ def main(): c_mr01 = card("MR01 — Bollinger Fade (BTC, ETH)", B("fade", "FADE") + real, """Quando il close chiude fuori dalla banda ±2.5σ attorno alla SMA50, entra CONTRO il movimento (short sopra, long sotto). TP alla media (il prezzo "torna a casa"), SL a 2·ATR, -time-limit 24 barre. Edge OOS validato: BTC +201% / ETH +1238% (fee incluse).
""", g_mr01) +time-limit 24 barre. Edge OOS validato: BTC +201% / ETH +1238% (fee incluse).""", g_mr01, + yearly_table({"BTC": st_fade["MR01"]["BTC"], "ETH": st_fade["MR01"]["ETH"]})) c_mr02 = card("MR02 — Donchian Fade (BTC, ETH)", B("fade", "FADE") + real, """Fada la rottura degli estremi del canale Donchian a 20 barre (max/min recenti): short sulla rottura del massimo, long sulla rottura del minimo. TP al centro del canale. -Stessa tesi di MR01 con trigger diverso → si combinano bene.
""", g_mr02) +Stessa tesi di MR01 con trigger diverso → si combinano bene.""", g_mr02, + yearly_table({"BTC": st_fade["MR02"]["BTC"], "ETH": st_fade["MR02"]["ETH"]})) c_mr07 = card("MR07 — Return Reversal (BTC, ETH)", B("fade", "FADE") + real, """Guarda il rendimento della singola barra: se lo z-score supera ±3.5 (movimento estremo in un'ora), fada il movimento. Exit in multipli di ATR. È la fade più selettiva -(esposizione ~8% del tempo).
""", g_mr07) +(esposizione ~8% del tempo).""", g_mr07, + yearly_table({"BTC": st_fade["MR07"]["BTC"], "ETH": st_fade["MR07"]["ETH"]})) c_e16 = card("EXIT-16 — perché lo stop scatta solo sul CLOSE", B("fade", "MECCANISMO COMUNE"), """Scoperta chiave della ricerca exit (34 agenti, 23 famiglie): gli stop intrabar da wick @@ -482,17 +659,17 @@ portafoglio: OOS Sharpe 8.82→10.06. Esteso oggi anche a DIP01 (grid 36/36).
Compra il dip: quando lo z-score del prezzo incrocia sotto −2.5 (sell-off rapido), entra long. TP alla SMA50, EXIT-16 sul SL, max 24 barre. È l'unico sleeve BTC con round-trip -reali su Deribit testnet (TP limit resting + disaster-stop a −30% sul book).""", g_dip) +reali su Deribit testnet (TP limit resting + disaster-stop a −30% sul book).""", g_dip, yearly_table(st_dip)) c_tr = card("TR01 — Basket Trend (4h)", B("honest", "HONEST") + sim, """Trend-following difensivo: long quando EMA20>EMA100 sulle 4 ore, flat altrimenti, su un paniere equal-weight di 5 asset (BNB, BTC, DOGE, SOL, XRP). Cattura i trend lunghi che -le fade per costruzione non prendono. Valuta solo barre 4h COMPLETE.
""", g_tr) +le fade per costruzione non prendono. Valuta solo barre 4h COMPLETE.""", g_tr, t_tr) c_rot = card("ROT02 — Dual Momentum (1d)", B("honest", "HONEST") + sim, """Rotazione: ogni giorno ordina 8 crypto per momentum a 60 giorni e tiene le top-3 (solo se positive), gross 0.45. Gate di regime: tutto cash se BTC<SMA100. Diversificare su 3 -asset invece di 2 ha quasi dimezzato il DD (40%→26%) alzando il ritorno.
""", g_rot) +asset invece di 2 ha quasi dimezzato il DD (40%→26%) alzando il ritorno.""", g_rot, t_rot) c_pr = card("PR01 — Pairs Reversion (ETH/BTC, LTC/ETH, ADA/ETH, BTC/LTC, ETH/SOL)", B("pairs", "PAIRS") + sim, """ @@ -500,13 +677,13 @@ asset invece di 2 ha quasi dimezzato il DD (40%→26%) alzando il ritorno."" (|z| del log-ratio ≥ 2), compra la gamba debole e shorta la forte; chiude quando il rapporto rientra (|z| ≤ 0.75) o dopo 72 barre. Config universale per tutte le coppie (niente tuning per-coppia = anti-overfit). Correlazione col mercato ~0.05: rende anche quando il mercato è fermo. -Fee su 2 gambe. Senza stop per design → position size ridotto a 0.20 (esposizione ≈ validato).""", g_pr) +Fee su 2 gambe. Senza stop per design → position size ridotto a 0.20 (esposizione ≈ validato).""", g_pr, t_pairs) c_tsm = card("TSM01 — TSMOM (1d)", B("tsm", "TSM") + sim, """Long sugli asset con consenso pieno di momentum su 3 orizzonti (3/6/12 mesi), gross 0.30, cash totale se BTC<SMA100. Mai un anno negativo nel backtest. Non è un motore di ritorno: è il diversificatore che lavora nei regimi in cui le fade soffrono. -Attualmente flat by-design (risk-off).
""", g_tsm) +Attualmente flat by-design (risk-off).""", g_tsm, t_tsm) c_sh = card("SH01 — Shape-ML (BTC, ETH)", B("shape", "SHAPE") + sim, """Una LogisticRegression legge 17 feature della forma delle ultime 24 barre e @@ -515,7 +692,7 @@ orizzonte. Training walk-forward causale (mai dati futuri). Win-rate ~50% nell'asimmetria, non nella frequenza. Senza stop-loss by design (ogni stop testato rompe l'edge): la coda si gestisce dimezzando il peso della famiglia (cap 5.88%).
Fix di oggi (punto-10): il training live usa la storia COMPLETA dal parquet -locale (il regime corto a 365g non era robusto: trade-rate 22% vs 10% validato).
""", g_sh) +locale (il regime corto a 365g non era robusto: trade-rate 22% vs 10% validato).""", g_sh, yearly_table(st_sh)) html = f"""