Files

PaPP v2 — Fase 3: modelli

Modello principale → README_mean_reversion.md. La validazione esterna (sez. 5b) ha mostrato che l'edge direzionale non generalizza fuori da EURUSD, mentre la mean-reversion sì. Il modeling è quindi orientato sul rientro alla Mediana. Questo documento descrive il primo modello (direzionale), tenuto come riferimento metodologico.


Fase 3 (riferimento): classificatore extra-rendimento direzionale

Architettura del modello che prova a prevedere, al momento di un incrocio, se l'extra-rendimento a 10 giorni (rispetto alla baseline dello stesso regime) sarà positivo o no. È lo scheletro modulare della Fase 3, già pronto per l'export ONNX della Fase 4.

Stato: scaffolding funzionante end-to-end. Il modello di riferimento è un baseline volutamente semplice; i risultati attuali confermano che l'edge è debole (vedi sotto) e indicano dove migliorare. L'obiettivo di questa cartella è la struttura, non ancora un modello ottimizzato.


1. Idea e target

  • Target (binario): 1 se extra-rendimento a 10g > 0, altrimenti 0, dove extra = cret_10(incrocio) media cret_10 della baseline nello stesso regime.
  • Regime = trend (sopra/sotto MA365) × tercile(cluster) × tercile(velocità).
  • Feature (solo informazioni note all'incrocio, nessun esito futuro): dist_med_pct, cluster_pct, cluster_exp, slope_a, slope_b, vel_med, acc_med, vol_med (numeriche) + pair, dir, trend, dow, month (categoriche).

Niente leakage (punto chiave)

Terzili del regime e medie di baseline sono stimati solo sul training (labeling.RegimeBaseline.fit) e applicati a validazione/OOS. Così la label di test non usa mai informazione futura.


2. Validazione

  • Walk-forward espansivo: train = tutti gli anni fino a T, test = anno T+1, scorrendo T (configurabile min_train_years, step_years).
  • Hold-out OOS: tutti gli anni >= oos_start_year (default 2020) sono tenuti fuori dal training e usati solo alla fine.

Metriche (evaluate.py): AUC, accuracy, Brier, e precisione/lift sul decile a probabilità più alta (uso pratico: si opera solo sui segnali più forti).


3. Struttura

Modello/
├── config.yaml            tutti i parametri (target, regime, feature, split, modello)
├── requirements.txt
├── src/
│   ├── data.py            caricamento CSV + etichetta di regime
│   ├── labeling.py        RegimeBaseline: baseline per regime e target (fit su train)
│   ├── features.py        ColumnTransformer (one-hot + impute), selezione X
│   ├── splits.py          split OOS + walk-forward espansivo
│   ├── model.py           factory modello (hist_gbdt | logistic)
│   ├── evaluate.py        metriche
│   └── train.py           pipeline end-to-end
├── results/               metriche walk-forward + OOS (modello .joblib non versionato)
└── data/                  i 2 CSV di input (non versionati)

4. Come eseguire

pip install -r requirements.txt
# copia i 2 CSV in ./data (vedi data/README.md), poi:
cd src
python train.py            # usa ../config.yaml
python selftest.py         # verifiche di correttezza (reproducibilita', anti-leakage, varianti)

5. Risultati attuali (EURUSD, hold-out 2020+)

Con il baseline hist_gbdt e tutte le coppie:

  • walk-forward medio AUC ≈ 0.51, OOS 2020+ AUC ≈ 0.52, lift sul decile ≈ 1.0×.

Lettura onesta: vicino al caso. È coerente con la Fase 2 (edge direzionali piccoli) e ci dà un riferimento pulito e senza leakage da cui partire.

5b. Validazione esterna multi-simbolo (src/external_validation.py)

Addestrando SOLO su EURUSD e testando su USDJPY/USDCHF/GBPUSD (mai visti):

  • i pattern direzionali "robusti" di EURUSD non si replicano: concordanza di segno solo 38%; il modello esterno ha AUC ≈ 0.480.55 (caso) contro AUC 0.91 in-sample (memorizzazione) → l'edge direzionale è specifico di EURUSD, non generale.
  • al contrario la mean-reversion è universale: ritorno alla Mediana entro 20g nell'8790% dei casi su tutti i simboli, mediana 3 giorni.

Conclusione operativa: il bersaglio "su/giù" non regge fuori campione; il segnale generalizzabile e' la mean-reversion. Il modeling va orientato lì.

6. Prossimi miglioramenti previsti

  • Restringere ai pattern robusti (q<0.10): in config.yaml valorizzare restrict_pairs con gli incroci MA121/MA182/MA365 emersi in Fase 2.
  • Target alternativi: classificare solo le code (es. extra nel top/bottom 30%) invece del semplice segno; oppure regressione sull'extra-rendimento.
  • Feature aggiuntive: percentile storico delle metriche (come nel pannello), interazioni coppia×regime, stato di mean-reversion in corso.
  • Calibrazione delle probabilità e scelta soglia per massimizzare la precisione sui segnali operativi.
  • Fase 4: export del Pipeline in ONNX (skl2onnx) e inferenza in MT5.