Files
PythagorasGoal/docs/diary/2026-06-10-grid-traders-game3.md
T
Adriano Dal Pastro 8d69a0cef5 feat(games): sessioni 2-3 Blind Traders (opzioni/session/grid) + gate PORT06 e tooling reset
- Gioco GRID TRADERS (sessione 3, regola STRATEGIA_GRIGLIA.md): grid_engine
  (backtest causale fee-aware della griglia geometrica), grid_brief (digest
  anonimo per dimensionare la griglia), grid_arena (torneo 100 agenti);
  diario docs/diary/2026-06-10-grid-traders-game3.md
- Gioco OPZIONI: options_engine (BS + skew fittato + DVOL storica),
  options_arena, opt_calibrate (superficie premi REALE da cerbero-bite)
- Gioco SESSION: session_engine/session_arena (pattern orari intraday)
- arena: vincolo GAME_NO_LIVE=1 (vieta pairs e fade zscore/breakout/momentum
  gia' live, coercizione a trend/ma_cross) + normalize del candidato PRIMA
  della valutazione nel hill-climb
- Gate: grid_game_gate (griglia ETH vincitrice vs PORT06, mark-to-market),
  pairs30m_gate (ETH/BTC 30m ridondante col 15m gia' deployato?)
- reset_flatten: flatten one-shot del conto testnet per il reset portafoglio
- .gitignore: data/portfolio_paper_stats/ (stato runtime sleeve paper-only)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-06-11 09:49:17 +00:00

7.2 KiB
Raw Blame History

2026-06-10 — Gioco "Blind Traders" sessione 3: GRID TRADERS (regola: STRATEGIA_GRIGLIA.md)

Setup

Terza sessione del gioco dei trader ciechi, con una regola nuova: ogni agente deve implementare la strategia descritta in STRATEGIA_GRIGLIA.md (grid trading a griglia geometrica). 100 agenti (haiku, via Workflow) ricevono SOLO un digest anonimo di due serie X/Y (in realtà BTC/ETH, mai rivelato) sul loro timing assegnato (25×15m, 20×30m, 20×1h, 15×2h, 12×4h, 8×1d) + 5 archetipi di stile a rotazione (prudente / aggressivo / asimmetrico-rialzista / asimmetrico-ribassista / data-driven), e propongono la CONFIGURAZIONE della griglia: range_down/up %, grid_levels, sl_buf, tp_buf, max_bars, serie.

Infrastruttura nuova in scripts/games/:

  • grid_engine.py — backtest deterministico, causale, fee-aware della spec: griglia geometrica ratio=((1+ru)/(1-rd))^(1/L) costruita sul close di deploy, capitale 1/L per livello (§3.3), buy su attraversamento ↓ di un livello non riempito, sell del livello su attraversamento ↑ del successivo (§5.2), SL sotto il range e TP sopra che liquidano tutto (§6), redeploy a fine episodio (SL/TP/max_bars). Vincolo break-even §4 implementato alla lettera: passo ≤ 1.5×costo RT → il motore si rifiuta di partire (refused, fitness 2e6); _normalize dell'arena riduce i livelli al massimo legale. Fill intrabar lungo il percorso O→L→H→C / O→H→L→C; fee 0.10% RT per round-trip + slippage opzionale.
  • grid_arena.py — torneo identico alle sessioni 1-2: split 60/20/20 TRAIN/VALID/TEST, 90 epoche di hill-climb sul TRAIN, cull del 10% in VALID ogni 10 epoche → 10 superstiti; TEST = OOS puro mai ottimizzato.
  • grid_brief.py — digest anonimo con statistiche per dimensionare una griglia: escursione max/min rolling (w100/500/2000, mediana e p90) e probabilità di fuga da un range ±5/10/20% entro 500 barre.

Esito

data/games/grid_result.json (+ log grid_tournament.log). 100/100 spec da agenti reali (nessun sostituto random).

  • Alla proposta, 80/100 agenti scelgono X (=BTC): dai soli numeri anonimi capiscono che la griglia sopravvive meglio sulla serie meno volatile (escape ±20% in 500 barre: BTC 34.5% vs ETH 53.2% a 1h).
  • L'evoluzione ribalta la scelta: tutti i 10 superstiti finiscono su Y (=ETH) — nel periodo VALID/TEST la vol più alta di ETH paga di più i round-trip, e il rischio trend è gestito non dal range stretto ma dalla FORMA della griglia (sotto).
  • Convergenza fortissima della forma (9/10 superstiti): griglia asimmetrica ribassista — range profondo sotto (13/20%), corto sopra (+4/+8%), livelli al minimo (4) → passo largo ~4.5-5.5%, SL buffer profondo (5-15%), max_bars lunghi. Tradotto: compra i dip di ETH in 4 tranche distanziate ~5%, rivendi ogni tranche al rimbalzo di un passo, stop catastrofale a ~25/30%. Il gioco ha ri-scoperto per la terza volta la mean-reversion (qui in forma di dip-buying a tranche), e ha imparato da solo la lezione anti-fee: meglio pochi passi larghi che griglie fitte.

Vincitore: agente #11, ETH 15m, griglia 17.1%/+4.6% × 4 livelli, SL buf 12.4%, TP buf 4.8%, max 2143 barre. TEST(OOS): PnL +891% (additivo), win 97%, 38.5 trade/mese, Sharpe 10.1. FULL 2018-2026 (include bear 2018 e 2022): +4284%, Sharpe 9.6. Stress slippage TEST: 0.05%/lato → 871%, 0.10%/lato → 850% (il passo ~5.4% ⋙ costi).

Caveat onesti (perché NON è un candidato deploy così com'è)

  1. Il PnL è additivo per-trade e non misura il drawdown UNREALIZED: l'engine somma i round-trip realizzati; mentre la griglia tiene 4 tranche dentro un drawdown 17%, l'equity vera è sott'acqua (fino a ~15% di episodio + SL 25/30% quando scatta). Il win-rate 97% è il profilo classico della griglia: tante micro-vincite, perdite rare ma grandi (stessa famiglia di rischio del short-vol/martingala). Per un gate serio servirebbe l'equity curve mark-to-market.
  2. Long-only su ETH con VALID/TEST 2023-2026 (regime rialzista/oscillante): l'asimmetria 17/+4.6 è anche un fit al regime. Il FULL positivo (bear inclusi) è incoraggiante ma il grosso del PnL resta nei periodi di reversione rialzista.
  3. Le candele flat ETH 15m (14-30%/anno) e i fill intrabar "al livello" condividono i caveat noti del progetto (bias pro-stop-stretti dell'engine intrabar; qui gli stop sono larghi, quindi l'effetto è minore).

Lezioni

  • La spec STRATEGIA_GRIGLIA.md è implementabile in modo causale e onesto; il suo vincolo break-even (§4) è esattamente la "lezione fee" del progetto, e il torneo l'ha confermato spingendo i livelli al minimo (passo massimo).
  • La griglia evoluta è un parente povero delle fade MR già in live: stesso edge (reversione ETH), ma incassato con inventory risk crescente invece che con TP/SL per-trade. Non sostituisce le MR; eventuale interesse solo come variante "a tranche" da gateare con equity mark-to-market (e confronto con MR01/MR02 a parità di rischio) PRIMA di pensarci per il PORT06.

GATE "si puo' inserire?" (stessa sera) — NO-GO: edge = artefatto delle wick testnet

scripts/analysis/grid_game_gate.py: engine mark-to-market dedicato (equity per barra = capitale + inventario al close, SL gap-aware, flat-skip, fee 0.10% RT), metriche standard del progetto + gate PORT06. Primo passaggio ingannevole: standalone WINNER 15m FULL Sharpe 5.61 DD 15.8%, corr max coi sleeve 0.34, plateau 16/16, e il criterio formale promuoveva il half-size (OOS Sh 10.07->10.12, DD 1.48->1.36). MA il breakdown annuale mostrava +4946% nel 2022 (ETH 70%): impossibile.

Verifica avversariale decisiva: il feed Deribit (testnet) e' pieno di spike print — ETH 15m ha 1064 barre con wick ≥6% sotto i close adiacenti che rientrano subito (fino a 19% in 15 minuti; BTC ha spike a 54% nel feb 2024). La griglia intrabar compra su quelle wick FINTE e rivende al rimbalzo: free money in sim, infillabile dal vivo. Stress close-only (fill solo su attraversamento del close): WINNER 15m CAGR 1544%->21%, Sharpe 5.61->0.92, OOS +2738%->+32%, trades 3803->1156; top3 1h CAGR -1.7%, OOS 18%. ~99% dell'edge vive nelle wick. La versione onesta (Sharpe 0.92, DD 27%) e' molto sotto ogni sleeve deployato → NON inseribile, in nessuna size.

Lezioni aggiuntive:

  • Il torneo ha massimizzato esattamente l'artefatto: la convergenza su ETH 15m range profondo era la firma del wick harvesting, non di un edge.
  • I motori intrabar dei giochi (grid_engine, e in misura minore i TP intrabar di engine.py) vanno SEMPRE stressati con una variante close-only prima di promuovere qualunque vincitore: aggiungere il check ai prossimi giochi.
  • Gli sleeve in produzione NON sono toccati da questo artefatto nello stesso modo: pairs entra/esce sui close, le fade hanno EXIT-16 close-confirm sullo SL, e soprattutto il ledger REAL-TRUTH usa i fill reali (che gli spike non fillano).

Artefatti: scripts/games/grid_{engine,arena,brief}.py, spec agenti in data/games/specs_grid/, digest data/games/grid_digests.json, risultato data/games/grid_result.json, log data/games/grid_tournament.log, gate scripts/analysis/grid_game_gate.py (param close_only per lo stress anti-wick).