Files
PythagorasGoal/docs/diary/2026-06-19-trackG-prior-levels.md
T
Adriano Dal Pastro 87af03955c research: porta artefatti da strategy-research-calendar (tracks F-I + eval crypto_backtest + lead OPZIONI/VRP)
Dal branch parallelo strategy-research-calendar (continuazione della linea TP01). Porta su main il
record di ricerca + la fondazione del lead opzioni (NIENTE blob dati, niente codice in conflitto):
- Tracks F/G/H/I (seasonality/calendar, prior-levels, volume-vol, momentum-reversal): tutti
  NEGATIVI/spurii -> confermano il soffitto Sharpe ~1.3 su BTC/ETH direzionale (calendar = buy&hold
  travestito; mean-reversion morta anche a fee 0). Diari + script.
- trackD_lookahead_audit.py: audit anti-look-ahead (stesso esito del nostro fix >=12h).
- eval-crypto-backtest-options.md: valutazione strategia esterna crypto_backtest. Cross-valida TP01
  (il loro sleeve spot 12h ~ TP01: due ricerche indipendenti, stessa conclusione). Identifica il
  LEAD: sleeve income OPZIONI (vendita put settimanali delta-0.28, VRP IV>RV), scorrelato ~0.22 al
  trend -> via per superare il soffitto ~1.3.
- options_real_quote_check.py + cerbero-bite-mainnet-verified.md: VERIFICATO su QUOTE REALI Deribit
  mainnet (cerbero-bite/MCP = mainnet, bit-identico a ccxt.deribit). Premio reale (BID, con skew) =
  1.29x il modellato -> il backtest SOTTOSTIMA il premio; il rischio vero e' la CODA (short-vol) +
  liquidita' di roll in stress, non la magnitudine.

NB: lo sleeve opzioni e' un LEAD, NON deployato: prezzato da modello (BS su DVOL) + 1 snapshot in
regime calmo. Serve validazione real-chain multi-regime + stress crash + paper su testnet prima di
aggiungerlo al portafoglio. Portafoglio attivo invariato: TP01 70% + XS01 30%.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 20:24:16 +00:00

4.6 KiB
Raw Blame History

Track G — Prior-period level breakouts / range (BTC & ETH, calendar-anchored)

Data: 2026-06-19 · Script: scripts/research/trackG_prior_levels.py Harness: src/backtest/harness.py (honest, entry decided at close[i], fill close[i]).

Domanda

Esistono edge net-positivi OOS, robusti su BTC e ETH, definiti rispetto a un periodo calendario precedente (giorno/settimana/opening-range)? E soprattutto: i breakout di livello continuano (trend) o rientrano (fade)?

No look-ahead (garanzie)

  • Livelli prior-day/week costruiti aggregando a barre giornaliere/settimanali (UTC) e poi shift(1) sul frame del periodo chiuso: il periodo corrente vede solo il precedente totalmente chiuso. Mai "oggi"/"questa settimana" nel livello.
  • Opening-range usato solo sulle barre dopo la chiusura della finestra di apertura.
  • Direzione + prezzo decisi a close[i], fill a close[i]. Mai entry sul livello esatto intrabar.
  • Bug iniziale corretto: mismatch tz-aware vs tz-naive nel mapping dei livelli (dava 0 trade).

Risultati (1h, fee 0.10% RT, leva 1x, OOS 65/35)

Continuation vs FADE — il verdetto è netto

Regola (PD = prior-day) BTC OOS ETH OOS Sharpe OOS
PD-high CONT (long su rottura max ieri) +25% +16% +0.5 / +0.3
PD-high FADE 68% 68% 1.6 / 1.2
PD-low CONT (short su rottura min ieri) 33% 60% 0.5 / 0.8
PD-low FADE 36% 8% 0.6 / +0.1
  • I breakout CONTINUANO, non rientrano. Il lato FADE è robustamente negativo su entrambi gli asset (sia high che low), su prior-day, prior-week e opening-range. Conferma diretta della tesi del reset: la mean-reversion / fade è morta su dati certificati.
  • Asimmetria long-only: funziona solo la rottura del massimo (long), non quella del minimo (short). Cioè non è un edge di breakout simmetrico/direzione-neutro: è cattura del drift/trend rialzista del cripto. La PD-low-cont (short sui breakdown) perde perché in questo campione il cripto sale.

Grid robustness (PASS 6) — survivor = OOS>0 su ENTRAMBI

  • PD-high CONT: 3/3 celle (buffer 0/0.1%/0.3%) positive OOS su BTC e ETH → robusto al buffer.
  • PD-high fade, PD-low cont/fade, OR-fade: 0 survivor.
  • OR-cont: positiva solo su ETH, negativa su BTC su tutte le finestre (3/6/8/12h) → artefatto mono-asset, scartato dalla regola "entrambi".

Anchor-hour sweep (PASS 5) — non è un'ora fortunata

PD-high cont positiva su 21/24 ore UTC (BTC) e 20/24 (ETH). Non dipende da un singolo anchor → coerente con un edge reale (ma vedi sotto: è beta di trend).

Fee sweep + per-anno (PD-high cont, full sample)

BTC  RT%: 0.00→+571  0.05→+289  0.10→+126  0.15→ +31  0.20→ 24   (OOS: +84/+52/+25/+3/15)
ETH  RT%: 0.00→+1754 0.05→+1012 0.10→+567  0.15→+299 0.20→+139   (OOS: +67/+39/+16/3/19)
BTC per-anno: 2019 +39  2020 +104  2021 +7  2022 42  2023 +24  2024 +27  2025 16  2026 +3
ETH per-anno: 2020 +164 2021 +160 2022 +7  2023 +1   2024 +12  2025 4  2026 +7
Sharpe full: BTC +0.48 (maxDD 55%, €/d 2k +0.88) · ETH +0.86 (maxDD 34%, €/d 2k +4.27)
  • Fee-fragile: alla baseline 0.10% RT sopravvive (OOS +25/+16%), ma muore già a ~0.15-0.20% RT. Margine di fee sottile (≈1.5x baseline e l'edge sparisce su OOS). ~1000-1100 trade in 8 anni.
  • Drawdown enormi (BTC 55%) e anni negativi (2022 42% BTC, 2025 16%).

Verdetto

  • Sì, esiste un edge net-positivo OOS su entrambi gli asset: PD-high continuation (long quando close supera il massimo di ieri, exit a fine giornata UTC). Robusto al buffer e all'anchor-hour. MA non è deployabile come miglioramento:
    1. È long-only drift capture, non un breakout simmetrico (il lato short fallisce) → è una versione più debole e ridondante del Trend Portfolio TP01 (Sharpe 0.48-0.86 vs 1.32).
    2. Fee-fragile (muore a ~1.5x la fee baseline) e con drawdown molto peggiori.
  • Il contributo scientifico vero è la conferma della direzione: sui dati certificati i breakout di livello-calendario CONTINUANO; il fade è morto (negativo robusto su PD/PW/OR, entrambi gli asset). Nessuna sorpresa mean-reversion nascosta nei livelli giornalieri/settimanali.
  • Niente di nuovo da mettere in produzione. TP01 resta la strategia vincente; i breakout prior-period non aggiungono Sharpe (stessa beta di trend, peggio eseguita).

Come riprodurre

uv run python scripts/research/trackG_prior_levels.py            # full (1h + 15m, ~25s)
uv run python scripts/research/trackG_prior_levels.py --quick    # 1h only