Files
PythagorasGoal/docs/diary/2026-07-01-strategy-wave-6threads.md
T
Adriano Dal Pastro 491411ac77 research(wave-0701): 6 filoni multi-agente — 0 nuovi sleeve, pesi confermati, gate weights_tilt_null
Ondata onesta su angoli non coperti: funding-TS (chiude il filone funding su 3
lati), breadth alt (non-ridondante ma DSR 0.43, rivisitabile con storia),
XS-residmom (REDUNDANT), pesi+guardia-DD (EW-STR refutato dallo scettico come
selezione-sull'hold-out di 2° ordine, firma best-of-15), VRP-refine (filone
esaurito), stagionalità-XS (morta allo step statistico).

Lezione codificata: weights_tilt_null + combine_outer in src/portfolio
(ogni cambio-pesi vs null di tilt casuali cap-respecting + delta in-sample>=0);
5 test nuovi, suite 165/165.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-01 23:21:59 +00:00

6.9 KiB
Raw Blame History

2026-07-01 — Ondata multi-agente a 6 filoni: 0 nuovi sleeve, pesi CURRENT confermati, 1 gate nuovo

Goal utente: "cerca con diversi agenti altre strategie di trading. Prova di tutto e arriva a migliorare il portfolio presente. Lo scopo è sempre 50 euro days."

Esito in una riga: 6 filoni nuovi (scelti dopo scan dei ~65 diari per non ripetere strade morte)

  • 1 verifica avversariale → nessun candidato supera i gate onesti; il portafoglio a 4 sleeve (41.25/18.75/15/25) sopravvive a un attacco serio, che è l'esito corretto per un book onesto. Miglioramento concreto dell'ondata = metodologico: gate weights_tilt_null codificato (sotto).

I 6 filoni (tutti su harness onesto: study_family_honest, marginal scorer, DSR≥0.95, smallcap $600)

# filone verdetto perché muore
1 Funding time-series BTC/ETH (posizionamento, non carry) — r0701_funding_ts.py SCARTATO FOLLOW = trend-beta ritardato (HOLD 1.69), FADE = shortare il toro; la cella gate è TP01 travestito (controllo senza funding = stessi numeri, corr 0.93, ΔHOLD 0.08); DSR 0.215. Filone funding chiuso su 3 lati (FC01 carry, price-clock, TS-signal).
2 Breadth/internals alt (51 HL) → BTC/ETH — r0701_breadth_internals.py SCARTATO (rivisitabile) Unico non-ridondante col trend (corr→TP01 0.40, lavora dove TP01 è attivo), assoluto PASS, marginal ADDS — ma jackknife 0.068 (uplift su UN mese) e DSR 0.433/104 celle. Con ~8 mesi di IS il 2024-toro non basta. Rivisitare tra 1-2 anni di storia HL nativa.
3 Residual momentum XS (β-hedged vs BTC, 19 major) — r0701_xs_residmom.py REDUNDANT Cross-section la residualizzazione è quasi un no-op (lo z-score di XS01 già rimuove il mercato): corr→XS01 0.54, HOLD 0.24, corr(IS,HOLD) tra le celle 0.37 (anti-predittivo = rumore). L'edge residuo-momentum vive nella coppia ETH/BTC (STATARB-RESID, resta in paper_statarb), non generalizza.
4 Pesi + guardia-DDr0701_portfolio_opt.py vedi sotto Unico candidato dell'ondata (EW-STR) → refutato dallo scettico. Guardia-DD X5%/d0.5: in-sample batte perfino il null de-levering, ma OOS non scatta mai (DD book 3.5-4.8% < trigger): la diversificazione fa già il lavoro. Utilizzabile solo come circuit-breaker di emergenza (risk mgmt, non alpha).
5 Affinamento VRP01 (sizing IVRV, DVOL-mom, gate TP01) — r0701_vrp_refine.py NON MIGLIORA L'alpha è già tutto nel gate binario IV-rank; il gate TP01 è la trappola IS perfetta (schiva il 2022, ma taglia le settimane migliori dell'hold-out: multi-cut 0/5). 3° fallimento del filone "affinare VRP dentro il modello" → esaurito finché cerbero-bite non cattura un crash reale (f di stress).
6 Stagionalità cross-sectional HL — r0701_xs_seasonal.py SCARTATO (allo step statistico) Nessuna persistenza split-half sopra il null permutato max-statistic (p 0.16-0.23); l'unica struttura è il canale-beta dell'effetto weekday di mercato (famiglia trackF, già morta). Turnover ~2×gross/die = fee-death comunque.

EW-STR: il candidato refutato (caso di scuola di selezione-sull'hold-out di 2° ORDINE)

Il filone 4 proponeva EW-STR (TP01 30 / XS01 25 / VRP01 15 / SKH01 30 = equal-weight proiettato sui cap strutturali): HOLD Sh 2.21→2.35, multi-cut +0.06/+0.13/+0.14, "7/8 anni vinti" — dichiarando onestamente i caveat. La verifica avversariale (r0701_portfolio_skeptic.py, addendum nel diario pesi) lo uccide:

  1. Selezione di 2° ordine: SKH01 fu ammesso (2026-06-23) perché alzava l'hold-out 2025-26; XS01 fu affinato conoscendo l'hold-out. EW-STR vende lo sleeve che collassa OOS (TP01 IS 1.49→ HOLD 0.30) e compra i due selezionati su quell'OOS. Pre-2025: ΔSh 0.05 (perde risk-adjusted).
  2. Su finestre OOS disgiunte: 0.12 (2024H1) / +0.06 (2024H2) / +0.14 (2025+) — tutto l'uplift vive nella finestra che ha selezionato gli sleeve. "7/8 anni" era sul ritorno composto; su Sharpe è 3/8.
  3. Firma best-of-k: su 500 tilt casuali cap-respecting, EW-STR siede al 94-100° percentile ≈ k/(k+1) con k≈15 config viste sull'hold-out → uplift indistinguibile dal best-of-15 scelto sull'hold-out.
  4. Realismo: in pesi effettivi (outer-join rinormalizzato) EW-STR = SKH01 al 40-50% del book 2019-23 (sleeve research a book 230m). Il book Deribit eseguibile (TP+SKH) non cambierebbe comunque.

Residuo onesto: il sub-tilt XS01 18.75→25 è positivo su tutte le finestre disgiunte ma edge≈0 pre-2025 e STAT-MODE → rivalutare solo con storia forward.

GATE NUOVO codificato: weights_tilt_null (src/portfolio/portfolio.py)

La lezione è ora codice, come per marginal-scorer e study_family_honest:

  • combine_outer(daily_cols, weights, lo, hi) — la combinazione outer-join/rinormalizzata di combined_daily estratta come funzione su pesi arbitrari (riusabile per studi di tilt).
  • weights_tilt_null(daily_cols, w_current, w_proposed, caps, floor, n, seed, k_seen) — null di tilt casuali uniformi sul simplesso dentro floor/caps: riporta delta_hold/full/insample, frac_random_beat_hold, pctl_hold, bestofk_pctl=k/(k+1) e gate_pass. Regola: un cambio-pesi si applica solo se (1) delta_insample ≥ 0 e (2) pctl_hold < firma best-of-k (necessario, non sufficiente: restano finestre disgiunte + realismo). Sul caso reale EW-STR: delta_hold +0.139, delta_insample 0.054, pctl 100° vs best-of-15 93.75° → gate_pass=False. Test: tests/test_weights_tilt_null.py (5 test, sintetici, deterministici; incluso lo sleeve "forte-solo-nell'hold-out" che DEVE fallire il gate).

Lezione tecnica riusabile (dal filone 2)

DatetimeIndex.view("int64") su indici tz-aware a risoluzione non-ns (pandas 2.x) produce timestamp in scala sbagliata → un merge_asof può broadcastare l'ultimo valore su tutta la storia = look-ahead che causality_ok non vede (input fisso). Sintomo: decine di celle con Sharpe identico. Fix: epoca esplicita in ms. Verificato: altlib.py non è affetto (grep pulito); dettagli nel diario breadth.

Onestà sul goal €50/giorno

Invariata (vedi CLAUDE.md): a capitale reale ~$600 il book onesto fa ~+€1.5/giorno atteso; la via resta capitale + tempo + target-vol, non un tilt di pesi né leva. Questa ondata conferma che il book attuale è vicino al massimo estraibile dai dati certificati disponibili oggi; le opzioni reali di crescita restano (a) storia forward che promuova i lead (STATARB-RESID, breadth tra 1-2 anni), (b) capitale, (c) nuove fonti di dato (f di stress reale per VRP).

File dell'ondata: scripts/research/r0701_{funding_ts,breadth_internals,xs_residmom,portfolio_opt,portfolio_skeptic,vrp_refine,xs_seasonal}.py; diari 2026-07-01-{funding-ts-signal,alt-breadth-internals,xs-residual-momentum,portfolio-weights-ddguard,vrp-refinement,xs-seasonality}.md; gate in src/portfolio/portfolio.py + tests/test_weights_tilt_null.py.