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>
This commit is contained in:
Adriano Dal Pastro
2026-06-11 09:49:17 +00:00
parent 8adf388e86
commit 8d69a0cef5
16 changed files with 2193 additions and 5 deletions
+113
View File
@@ -0,0 +1,113 @@
# 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).