Files
PythagorasGoal/docs/diary/2026-07-02-timing-crt-wave.md
T
Adriano Dal Pastro 73d74c5e53 research(wave-0702): ondata timing + CRT — 8 filoni, 0 nuovi sleeve, finding anchor timing-luck TP01
Goal: "altre strategie su Deribit con timing differenti". 8 filoni multi-agente + scettico:
- event-clock bars, expiry calendar Deribit, clock lenti/bande, regime-speed: SCARTATI
- CRT (Candle Range Theory) base/multi-TF/contesto: SCARTATA 3/3 (DSR~0, ritest =
  informazione negativa; sottoprodotto: FOLLOW>FADE sui livelli prior-day ogni anno,
  conferma il lead prevday)
- FINDING (confermato da scettico indipendente): hold-out 0.31 di TP01 = migliore delle
  24 ancore orarie (mediana 0.04, banda [-0.13,+0.30]) -> narrativa corretta in CLAUDE.md
  e docstring: l'hold-out non risolve l'edge di ritorno, regge il taglio DD a ogni ancora.
  Tranching K=2/4 = solo varianza della stima, no deploy a $600. Audit d'ancora pendente
  su XS01/SKH01. Book live e portafoglio INVARIATI. Test 168/168.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-02 22:12:22 +00:00

13 KiB
Raw Blame History

2026-07-02 — Ondata timing + CRT (8 filoni multi-agente + scettico): 0 nuovi sleeve, 1 finding strutturale (anchor timing-luck di TP01)

Obiettivo (goal utente): "cerca su Deribit altre strategie profittevoli magari con timing differenti oltre a quelle già valutate". Prima ondata interamente dedicata al TIMING: dopo che le ondate precedenti hanno coperto segnali (104 famiglie alt-sweep), universi (HL cross-sectional), opzioni (VRP/gamma) e pesi (EW-STR/weights_tilt_null), qui si attacca la dimensione rimasta: quando si campiona, si decide e si esegue. Su richiesta utente, seconda tranche dedicata alla CRT (Candle Range Theory), il pattern sweep-and-reclaim a 3 candele di scuola ICT/Wyckoff.

Inventario preventivo per non rifare lavoro: SEA01-09 coprivano già hour-of-day, day-of-week, weekend, turn-of-month, sessioni; l'onda intraday 2026-06-21 il sub-daily (con il lead prevday in forward-monitor); tp01_lowfreq i TF 4h/12h/1d. Angoli NON coperti individuati e testati: clock a eventi, calendario scadenze Deribit, ancora di ribilanciamento, clock più lenti del daily, velocità del segnale regime-condizionata — più i 3 tagli CRT (base, multi-TF, contesto).

Esito: 7 filoni FAIL + 1 finding strutturale confermato dallo scettico (timing-luck dell'ancora di TP01). Nessun nuovo sleeve. Nessuna modifica al book live. Il soffitto ~1.3 direzionale BTC/ETH resta intatto anche cambiando il clock.


Filone 1 — Event-clock bars (tempo-informazione): FAIL

scripts/research/r0702_eventclock.py. Volume/vol/range bars da 5m certificato (soglie causali EWMA-90g shift(1), barre medie 4h/12h/24h), 5 strategie (TSMOM multi-orizzonte, Donchian 10/30d, EWMA-cross), 45 celle event + 15 controlli wall-clock = 60 trial.

  • Null decisivo (stesso segnale, stessa frequenza, wall-clock): event batte wall su ENTRAMBE le finestre solo in 4/45 coppie (9%) — rumore. Pattern incoerenti (EWMA event vince IS 9/9 ma perde HOLD 9/9; Donchian-30d l'esatto opposto = selection-on-holdout in agguato).
  • Cella scelta in-sample (volume-bars 24h, DONCH-10d): IS 1.45 → HOLD 0.46 (2025 7.4%, 2026 18.1%). Marginal NEUTRAL (corr 0.74 a TP01 = trend travestito), earns_slot_honest=False.
  • Executability comunque assente: in alta attività le barre "24h" chiudono in 3.6-4.6h (p5) → il cron orario le eseguirebbe in ritardo; i clock 4h richiedono monitoraggio sub-orario.

Lezione: campionare a tempo-informazione non normalizza nulla di monetizzabile sul feed certificato; il clock non è la dimensione dove vive l'edge.

Filone 2 — Calendario scadenze Deribit: FAIL (0/24 celle)

scripts/research/r0702_expiry_calendar.py. Griglia dichiarata a priori: 4 finestre × 3 tipi expiry (weekly ven 08:00 UTC / monthly ultimo ven / quarterly) × 2 asset, Bonferroni |t|≥3.08; 3 null (placebo weekday, anchor-shift ±2/4h, permutation 500 calendari).

  • Nessuna cella passa Bonferroni (max |t| 2.69). Il post-expiry drift monthly (+0.61/+0.77%) ha il segno della teoria ma: non batte il placebo giovedì, permutation pctl 84-95 (non estremo), si INVERTE sul quarterly (dove l'OI massimo dovrebbe amplificarlo) ed è guidato dal 2019 → rumore.
  • Unica cella robusta ai null: weekly [-24,0) negativa (gio→ven), ma è indistinguibile dal day-of-week (famiglia SEA già morta) e netta fee fa Sharpe ~0.08 (52 eventi/anno × 0.10% RT).
  • Best-in-sample tradabile: IS +0.90 → HOLD 0.52; DSR 0.230 su 24 trial.
  • Nota tecnica: colpito ESATTAMENTE il pitfall pandas 2.x documentato (epoca in secondi da date_range su tz-aware → matching vuoto); fix con epoca ms esplicita. La lezione 2026-07-01 ha pagato.

Filone 3 — Anchor timing-luck di TP01 + tranching: FINDING (verificato dallo scettico)

scripts/research/r0702_tp01_offset.py + scettico indipendente r0702_skeptic_offset.py (ricostruzione bit-exact con codice diverso, zero riuso; h=0 riproduce tp01_baseline_daily esattamente; vol-target ricalcolata per ancora; nessun look-ahead — verificato con troncamenti).

Claim 1 CONFERMATO: l'hold-out 2025-26 "Sharpe 0.31" di TP01 è in larga parte fortuna dell'ancora 00:00 UTC. La stessa strategia CANONICAL alle altre 23 ancore orarie: HOLD mediano 0.04, banda [0.13, +0.30] — e il massimo è proprio h=0 (98° pctl; in-sample era al 10°: sfortunato lì, fortunato qui). Spike, non plateau (h=23/h=1 fanno 0.13/0.04). Bootstrap dello scettico: P(una qualsiasi ancora mostri uno spike ≥ così) = 0.86 — è il massimo atteso di 24 stime correlate, non un'anomalia; best-anchor per finestra annuale ruota a caso (16→23→21→12→5→0, Spearman ≈ 0, nessuna seasonality d'ancora). Formulazione corretta (NON "il vero hold-out è 0.07", che ha CI95 [1.2,+1.4] su 547 giorni): l'hold-out 2025-26 non risolve l'edge di RITORNO di TP01 (ritorno totale mediano ancore ≈ 0%); ciò che regge A OGNI ancora è il claim DIFENSIVO (DD 6.7-10.1% vs ~60% B&H). Che è da sempre il vero valore dichiarato di TP01.

Claim 2 (tranching multi-ancora) RIDIMENSIONATO: K=4 ≡ esattamente EW di 4 book ancorati (diff 1.4e-17), turnover identico (~8.3/y), haircut $600 ≈ 0. MA il "miglioramento" IS 1.49→1.56 è per ~90% tornare alla media delle ancore (h=0 era sfortunato in-sample): vs ancora tipica +0.005 mediano, P(K4≤h0)=0.18 n.s.; il taglio DD strutturale è ~0.5pt (non 2.8: la mediana delle singole è già 12.6%). Ciò che regge: la compressione della VARIANZA DELLA STIMA (HOLD [0.12,+0.30]→[0.01,+0.13] a K=4) → lens di reporting, non alpha.

Impatto a valle (quantificato dallo scettico):

  • Blend SKH: HOLD 1.16 (h=0) → 0.97 mediana ancore, ma l'UPLIFT a mediana è +0.93 > +0.86 dichiarato → il verdetto ADDS di SKH01 era conservativo, regge.
  • Book 5-sleeve: HOLD 2.44 → 2.34 mediana (min 2.22), FULL 2.24→2.22 → eredita ~+0.10 di fortuna d'ancora (non +0.25: il peso di TP01 diluisce). Nessuna decisione (GTAA/SKH/pesi) cambia.
  • NON toccati: tutti i FULL (h=0 al 31° pctl = normale), plateau, deflated-Sharpe, fee-sweep, causalità, validazione GTAA (equity OOS), gate weights_tilt_null (relativo).

Raccomandazione operativa (sottoscritta dallo scettico): cambio di narrativa e di standard di reporting, NESSUN cambio del book live oggi. (1) I numeri hold-out di TP01 si citano d'ora in poi come banda d'ancora (mediana 0.04, [0.13,+0.30]) con valore = taglio DD; (2) valutazione anchor-agnostic (media 24 ancore) come lens di reporting per i futuri hold-out; (3) NO deploy K=2/K=4 a $600: guadagno ≈ 0, e a $225/asset di quota TP01 i delta per-ancora ($1-2) sono sotto il min-order $5 → degenererebbe comunque in K=1; inoltre le ancore intraday richiederebbero un feed fresco fuori dal path certificato (staleness ×4 finestre di guasto). Rivalutare K=2 (0,12) a capitale ≥ ~5-10k. (4) ⚠️ Audit analogo RACCOMANDATO su XS01 (rebalance 10g ancorato = spazio di luck 10g×24h, potenzialmente peggiore) e SKH01 (fase griglia 230m/690m) — TP01 è oggi l'unico sleeve de-luckato.

Filone 4 — Clock lenti + banded rebalancing: FAIL (negativo utile)

scripts/research/r0702_slow_clock.py. Fatto a monte che chiude il filone: il fee drag di TP01 a 1d è ~0.40%/anno ≈ 0.03 Sharpe (8 turnover/y × 0.10% RT) — il tetto di QUALSIASI risparmio.

  • Clock N∈{2,3,5,7}g: degrado monotono dell'ensemble di fase (HOLD 0.34→0.11 da N=2 a N=7); lo spread TRA fasi esplode a N≥5 (HOLD 0.19…+0.37 a N=7) = timing luck pura, coerente col filone 3.
  • Bande di isteresi {2.5,5,10,20}%: tagliano il 77-94% degli ORDINI ma quasi zero TURNOVER (gli ordini di TP01 sono micro-aggiustamenti del vol-target). Cella best-IS (band 20%): hold-out 0.13 vs 0.30 baseline, e il "guadagno" IS è effetto-segnale (posizioni stantie fortunate), non effetto-costo → fitting. Non-monotonia sulla griglia = firma di rumore.
  • Finding utile per il live: a $600 il vincolo min-order $5 È GIÀ la banda ottimale (ordini 427→111/y a costo Sharpe ~0, banda implicita 1.67%): cattura ~100% del risparmio catturabile. Nessun cambio al book, a nessun capitale testato (600/2k/10k).

Filone 5 — Velocità del trend regime-condizionata: FAIL

scripts/research/r0702_regime_speed.py. Pesi tra gli orizzonti TSMOM 30/90/180g condizionati al percentile espandente di vol (realized e DVOL), 16 celle, sanity = riproduzione esatta del canonico.

  • Cella best-IS (alta-vol→lento, linear, rv): FULL +0.06 ma HOLD BTC 0.31, 50/50 +0.005 → dominanza fallita; multi-cut a segno instabile (+0.18/0.08/+0.00).
  • Null decisivo (300 pesi statici Dirichlet): la cella sta al pctl 0.71-0.72, sotto il p90 — un peso statico casuale la batte spesso. Meccanismo smascherato: corr(peso-30d, Sharpe) = +0.93 → le celle "regime" vincono in-sample perché tengono il tilt-30d la maggior parte dei giorni = tilt statico travestito da regime, la stessa trappola di EW-STR. E il tilt statico verso il 30d NON regge su BTC hold-out (0.15). RV e DVOL indistinguibili come misura di regime (coerente con l'esito overlay DVOL 2026-06-26). Pesi canonici 1/3-1/3-1/3 confermati.

Filoni 6-8 — CRT "Candle Range Theory" (base / multi-TF / contesto): FAIL 3/3

Il pattern sweep-and-reclaim a 3 candele (C1 range forte; C2 rompe un estremo ma chiude dentro = "manipolazione"; C3 ingresso contro il breakout, stop dietro lo sweep, target all'estremo opposto), meccanizzato onestamente in tre tagli. Overlap dichiarato: MRV01-11 e MIC07 non coprivano questa meccanica; ora è coperta.

6. Base single-TF (r0702_crt_base.py, 864 trial su 1h/4h/12h/1d, motore trade-level conservativo SL-first cross-checkato con l'harness): DSR 0.000 (il null best-of-grid atteso è Sharpe 2.27, ottenuto 0.74); cella best-IS (4h long color-rule) IS 0.90 → HOLD 0.07 con 2026 a WR 0%; anchor-shift +1/+2h flippa l'hold-out a 1.0 (artifact-risk); lo short su sweep dell'alto (la narrativa smart-money canonica) perde perfino in-sample (0.59). Autopsia: l'expectancy IS veniva dal time-exit in trend (beta del toro ETH 2021-23), non dal target strutturale. Dettaglio informativo: CRT batte nettamente sia il fade incondizionato (IS 0.49) sia il breakout-confermato (IS 0.31) → il close-back-inside FILTRA davvero tossicità, ma "meno tossico del fade morto" non è un edge.

7. Multi-timeframe (r0702_crt_mtf.py, 4h→15m e 1h→5m, ~10k trade): expectancy netta negativa OVUNQUE (FULL e HOLD, entrambi gli asset); il MTF alza il R:R medio da ~3 a ~10-20 ma il WR collassa da ~36% a 9-16% → "migliora" solo perdendo meno. Refutazione strutturale: il ritest è informazione negativa — pattern CON ritest 40 bps, SENZA +52 bps (non tradabile: condiziona sul futuro): aspettare il ritest per entrare seleziona sistematicamente i pattern peggiori; i buoni scappano subito e il metodo non li prende mai. A fee ZERO l'edge lordo è ~0 (non è morte per fee: non c'è). Stop 0.1-0.35% ineseguibili col cron orario (26-75% dei segnali già invalidati all'esecuzione).

8. Contesto (r0702_crt_context.py, 22 trial: livelli prevday/Donchian/prevweek × equal-H/L × FVG × sessioni): baseline incondizionata morta (8/8 celle HOLD<0); FVG semmai peggiora; sessione EU consistentemente negativa; unica cella IS-positiva (sweep in Asia su livello prevday) uccisa 4 volte (DSR 0.001, anchor-flip a 2/4h con la firma di open_drive — la sessione "Asia" inizia dove il livello prevday viene ricreato —, solo-ETH, morta a 0.20% fee). Sottoprodotto prezioso: sugli STESSI livelli prior-day, FOLLOW batte FADE ogni singolo anno 2019-2026 (follow IS/HOLD +1.22/+1.25 vs fade 0.66/1.46, corr 0.19/0.27) → conferma indipendente e rafforzativa del lead prevday-breakout in forward-monitor (paper_prevday).

Verdetto CRT: concetto Wyckoff riverniciato che, spogliato della discrezionalità, non contiene edge su BTC/ETH Deribit certificati. La direzione giusta sui livelli affollati resta il FOLLOW (breakout), non il fade — coerente con SKH01 (breakout) vivo e mean-reversion morta.


Lezioni codificabili

  1. Il timing-luck dell'ancora è una dimensione di multiple-testing NON coperta dai gate esistenti (deflated-Sharpe conta i trial, non le ancore implicite). Nuova regola di reporting: ogni metrica hold-out di una strategia a ribilanciamento ancorato si cita con la banda d'ancora (o la media anchor-agnostic). Candidato gate futuro: anchor_luck_band() in altlib. Audit pendente: XS01 (10g), SKH01 (fase 230m/690m).
  2. La famiglia day_boundary_robust / anchor-shift continua a uccidere (CRT base, CRT-Asia, 6/24 celle expiry): ogni effetto legato a etichettatura di barre VA spostato d'ancora prima di crederci. Confermata la regola 2026-06-21.
  3. Il fee drag di TP01 (~0.4%/anno) non è un problema da risolvere — chiude a priori il filone "esecuzione più furba" a questo turnover; il min-order small-cap è già la banda ottimale.
  4. Il pitfall pandas tz-aware/epoca (2026-07-01) è stato evitato/gestito 2 volte su 9 agenti grazie alla documentazione in CLAUDE.md — il costo di documentare i bug paga.

Stato finale

  • 0 nuovi sleeve; portafoglio e book live INVARIATI (5-sleeve 33/15/12/20/20; book Deribit TP01+SKH01 75/25, flat da armamento — il segnale resta risk-off).
  • Narrativa TP01 aggiornata (CLAUDE.md + docstring): hold-out = banda d'ancora, valore = difesa DD.
  • Script: scripts/research/r0702_{eventclock,expiry_calendar,tp01_offset,slow_clock,regime_speed, crt_base,crt_mtf,crt_context,skeptic_offset}.py. Test suite: invariata, verde.