feat(live): SWAP fade 1h -> 15m su PORT06 (scelta utente, gate fade15m_port06_gate)

FADE specs tf=15m (sid invariati -> pesi/alloc intatti; DIP01 resta 1h);
builder canonico allineato (combine_portfolio.FADE_TF) -> parita' delle due
facce; regression-lock aggiornato al nuovo baseline (FULL Sh 7.34->8.13
DD 3.46->2.47, OOS Sh 10.07->10.86 DD 1.48->2.09). Runner invariato (fetch
15m gia' esistente dal blend pairs). Suite 126 passed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Adriano Dal Pastro
2026-06-12 20:47:44 +00:00
parent 82a1c60e08
commit f78380596a
4 changed files with 55 additions and 9 deletions
+12 -4
View File
@@ -40,9 +40,17 @@ ANN = 365.0 # giorni/anno per annualizzare
# ---------------- equity giornaliere ----------------
def fade_daily_equity(asset: str, fn, params) -> pd.Series:
"""Equity giornaliera di uno sleeve fade: trade 1h (filtro trend 3.0) -> equity -> daily."""
df = load_data(asset, "1h")
# SWAP fade 1h -> 15m (2026-06-12, scelta utente). Gate fade15m_port06_gate.py: parametri
# 1h NON ri-tunati trasferiti a 15m, corr 15m-1h media 0.26, SWAP promosso (FULL CAGR
# 74->101% DD 3.46->2.47%, OOS Sh 10.07->10.86; OOS DD 1.48->2.09 accettato), edge ETH
# regge il flat-entry-skip. Il canonico segue il deployato per tenere la parita' delle
# due facce. Diario docs/diary/2026-06-12-fade15m-gate.md.
FADE_TF = "15m"
def fade_daily_equity(asset: str, fn, params, tf: str = FADE_TF) -> pd.Series:
"""Equity giornaliera di uno sleeve fade: trade (filtro trend 3.0) -> equity -> daily."""
df = load_data(asset, tf)
ts = pd.to_datetime(df["timestamp"], unit="ms", utc=True)
trades = build_trades(fn(df, **params), df, trend_max=3.0)
n = len(df); eq = np.full(n, INIT, dtype=float); cap = INIT
@@ -55,7 +63,7 @@ def fade_daily_equity(asset: str, fn, params) -> pd.Series:
def build_all_sleeves() -> dict[str, pd.Series]:
sleeves: dict[str, pd.Series] = {}
# --- FADE: 8 sleeve ---
# --- FADE: 6 sleeve (15m dal 2026-06-12, vedi FADE_TF) ---
for asset in ["BTC", "ETH"]:
for nm, (fn, params) in strats_for(asset).items():
sleeves[f"{nm}_{asset}"] = fade_daily_equity(asset, fn, params)
+12 -2
View File
@@ -61,8 +61,18 @@ def _fade_params(c: str, a: str) -> dict:
return p
FADE = [SleeveSpec(kind="single", name=c, sid=f"{c}_{a}", asset=a, cluster=f"{a}-rev",
params=_fade_params(c, a))
# SWAP timeframe 1h -> 15m (2026-06-12, scelta utente "swap secco"). Gate
# fade15m_port06_gate.py: parametri 1h trasferiti a 15m NON ri-tunati (pre-registrati,
# anti-overfit), corr daily 15m-1h media 0.26 (NON e' lo stesso edge piu' veloce),
# SWAP promosso — FULL CAGR 74->101% DD 3.46->2.47%, OOS Sh 10.07->10.86 (OOS DD
# 1.48->2.09 accettato); l'edge ETH sopravvive al flat-entry-skip (non e' stale-print
# come pairs-alt). Stessi sid -> pesi/alloc invariati; il worker cambia cadenza
# (max_bars=24 barre = 6h; EXIT-16 confirm sulla barra 15m completata). Il backtest
# canonico segue (combine_portfolio.FADE_TF). MR02_BTC e' il piu' fee-sensitive
# (fee2x OOS Sh 0.60): monitorare le fee reali nel report orario.
# Diario docs/diary/2026-06-12-fade15m-gate.md.
FADE = [SleeveSpec(kind="single", name=c, sid=f"{c}_{a}", asset=a, tf="15m",
cluster=f"{a}-rev", params=_fade_params(c, a))
for a in ("BTC", "ETH") for c in ("MR01", "MR02", "MR07")]
HONEST = [
# DIP01: single-asset 1h -> StrategyWorker (Strategy DIP01_dip_buy). TR01/ROT02: multi-asset.