Files
TR_Agent/PaPP v2/Modello/README.md
T
Pietro GiacobazziandDevin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> 7d329a0591 PaPP v2 Modello: modello mean-reversion (rev/speed/disc) pooled 4 FX + LOSO + doc
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
2026-06-17 09:28:15 +00:00

112 lines
5.0 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# PaPP v2 — Fase 3: modelli
> **Modello principale → [`README_mean_reversion.md`](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
```bash
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.