← Torna agli articoli
August 3, 2026
5 min di lettura

Metodi d'insieme: combinare studenti deboli per un alfa robusto

Metodi d'insieme: combinare studenti deboli per un alfa robusto
#machine-learning
#ensemble
#bagging
#stacking
#alpha

La maggior parte degli scritti sugli insiemi di trading sostiene che più modelli sono migliori. Questo è l'asse sbagliato. L'errore di un insieme si scompone in tre termini, e nel commercio solo uno di essi costituisce sempre il vincolo vincolante.

Questo articolo tratta di questo termine e di due sue conseguenze che il resto di questo blog non tratta: lo stacking come livello esplicito di combinazione di segnali e la possibilità che la combinazione di molti segnali riduca effettivamente il fatturato prima che le operazioni raggiungano il mercato.

Il termine che realmente lega: Bias-Varianza-Covarianza

Per un insieme di regressione di NN modelli, l’errore quadratico atteso della previsione media fˉ\bar{f} si decompone come:

E[(fˉy)2]=bias2+1Nvariance+(11N)covarianceE\left[\left(\bar{f} - y\right)^2\right] = \overline{\text{bias}^2} + \frac{1}{N}\overline{\text{variance}} + \left(1 - \frac{1}{N}\right)\overline{\text{covariance}}

Tre termini, tre leve:

  • Bagging attacca il termine di varianza eseguendo la media sui campioni bootstrap.
  • Boosting attacca il termine bias correggendo iterativamente i residui.
  • Stacking attacca il termine di covarianza apprendendo le combinazioni di pesi invece di assumerne di uguali.
  • **In aumento NN**riduce solo il contributo della varianza. Non fa assolutamente nulla alla covarianza: il (11/N)(1 - 1/N) il coefficiente è già 0,99 a N=100N = 100.

Quest’ultimo punto è l’intera argomentazione. Nel trading, i modelli vengono addestrati sugli stessi strumenti, sulla stessa storia, rispetto a obiettivi che sono essi stessi trasformazioni quasi identiche della stessa serie di prezzi. I loro errori non sono vicini all'indipendenza. Quindi il termine di covarianza è ampio e il termine di varianza è già esaurito, il che significa che il conteggio dei modelli non ti dà quasi nulla e la differenza strutturale ti compra tutto.

La forma concreta e falsificabile dell'affermazione: l'aggiunta del 101esimo albero potenziato dal gradiente dovrebbe spostare la metrica dell'insieme meno dell'aggiunta di un modello strutturalmente diverso - un LSTM, un modello lineare su un dominio di caratteristiche disgiunte, qualsiasi cosa con una diversa polarizzazione induttiva. L'albero marginale è quasi collineare con gli alberi già presenti nel libro; il modello strutturalmente diverso non lo è.

La correlazione, non il conteggio dei modelli, stabilisce l'ampiezza effettiva di un insieme: la derivazione, i fattori di correlazione misurati tramite criptovaluta per classe di asset e la simulazione rispetto ai dati delle coppie reali si trovano in Correlazione del segnale: quante coppie monitorare.

Non ridurre la diversità d'insieme a un singolo numero. L'indice di Sharpe deflazionato calcola cinque effettivi-NN stimatori (correlazione media, rapporto di partecipazione, PCA-95%, Kaiser, Cheverud-Nyholt) su una griglia reale da 640 celle, mostrano che si estendono NeffN_{\text{eff}} da 1,6 a 370, e sostiene che il risultato finale è la banda, e non una stima puntuale. Segnala la banda.

Stacking come livello di combinazione di segnali

L'insaccamento e il potenziamento sono ben trattati altrove. Spread Modeling with Machine Learning fornisce la configurazione di potenziamento del gradiente, la selezione delle perdite per obiettivi distorti, i risultati dell'importanza SHAP, la tassonomia delle funzionalità e una suddivisione eliminata del walk-forward con la sovrapposizione della finestra in avanti che motiva il divario. Inizia da lì; questa sezione lo presuppone.

Ciò che non viene trattato è il livello superiore: un meta-studente che prende le previsioni del modello base come caratteristiche di input e impara come combinarle.

  • Livello 0 (studenti base): diversi modelli che producono previsioni da caratteristiche grezze.
  • Livello 1 (meta-discente): un modello che apprende di quali studenti base fidarsi e quando.

Il meccanismo che lo rende sicuro sono le meta-funzionalità out-of-fold. Il meta-studente non deve mai vedere una previsione del modello base fatta sui dati su cui è stato addestrato il modello di base: tali previsioni sono ottimisticamente distorte in un modo che non sopravvive al trading dal vivo, e il meta-studente le valuterà di conseguenza.

import numpy as np
import pandas as pd
from sklearn.base import clone
from sklearn.model_selection import TimeSeriesSplit


class TradingStackingEnsemble:
    """
    Two-level stacking ensemble for return prediction.

    Level 0: base learners, each on its own feature domain
    Level 1: meta-learner trained on out-of-fold base predictions
    """

    def __init__(self, base_models: list, meta_model, n_splits: int = 5):
        self.base_models = base_models  # list of (name, model, feature_cols)
        self.meta_model = meta_model
        self.n_splits = n_splits
        self.fitted_base_models_ = {}

    def _generate_meta_features(
        self,
        X: pd.DataFrame,
        y: pd.Series
    ) -> pd.DataFrame:
        """Out-of-fold predictions from each base model."""
        tscv = TimeSeriesSplit(n_splits=self.n_splits)
        meta_features = pd.DataFrame(index=X.index)

        for name, model, feature_cols in self.base_models:
            oof_preds = pd.Series(np.nan, index=X.index)

            for train_idx, val_idx in tscv.split(X):
                X_train = X.iloc[train_idx][feature_cols]
                y_train = y.iloc[train_idx]
                X_val = X.iloc[val_idx][feature_cols]

                fold_model = clone(model)
                fold_model.fit(X_train, y_train)

                if hasattr(fold_model, 'predict_proba'):
                    oof_preds.iloc[val_idx] = fold_model.predict_proba(X_val)[:, 1]
                else:
                    oof_preds.iloc[val_idx] = fold_model.predict(X_val)

            meta_features[name] = oof_preds

        return meta_features.dropna()

    def fit(self, X: pd.DataFrame, y: pd.Series):
        meta_features = self._generate_meta_features(X, y)
        y_meta = y.loc[meta_features.index]

        self.meta_model.fit(meta_features, y_meta)

        for name, model, feature_cols in self.base_models:
            model.fit(X[feature_cols], y)
            self.fitted_base_models_[name] = model

        return self

    def predict(self, X: pd.DataFrame) -> np.ndarray:
        meta_features = pd.DataFrame()

        for name, model, feature_cols in self.base_models:
            fitted = self.fitted_base_models_[name]
            if hasattr(fitted, 'predict_proba'):
                meta_features[name] = fitted.predict_proba(X[feature_cols])[:, 1]
            else:
                meta_features[name] = fitted.predict(X[feature_cols])

        return self.meta_model.predict(meta_features)

La disciplina della scissione qui non è facoltativa e non è nuova: usa un walk-forward epurato e sottoposto a embargo e comprendi quanto vale ogni classe di fuga di notizie in Sharpe gonfiato prima di fidarti di uno qualsiasi di questi numeri. Entrambi sono già misurati: la tassonomia del bias look-ahead quantifica l'esecuzione, l'indicatore e la perdita di normalizzazione in un simulatore controllato, e l'ottimizzazione walk-forward copre le finestre ancorate e scorrevoli, il CPCV, l'eliminazione e la diagnostica del degrado WFER.

Tre decisioni di progettazione sono specifiche per l'impilamento e vale la pena menzionarle.

Semplicità del meta-studente. Utilizza un modello lineare: cresta, lazo, regressione logistica. Gli studenti di base gestiscono la non linearità; il meta-studente gestisce solo la combinazione. Un meta-apprendimento complesso sopra studenti di base complessi è un overfitting di secondo ordine e la regolarizzazione L1 al livello di combinazione ha l'utile effetto collaterale di azzerare i modelli di base che contribuiscono solo al rumore.

Risultati probabilistici su etichette rigide. predict_proba trasporta informazioni sulla confidenza che l'etichetta di una classe scarta e consente al meta-studente di ponderare più pesantemente le previsioni di base sicure.

Partizionamento del dominio delle funzionalità. Questa è la leva di diversità con il massimo effetto e deriva direttamente dall'argomento della covarianza: i modelli che vedono le stesse funzionalità producono errori correlati indipendentemente dall'algoritmo.

FEATURE_GROUPS = {
    'momentum': ['ret_5d', 'ret_10d', 'ret_21d', 'ret_63d'],
    'volatility': ['vol_21d', 'vol_ratio', 'vol_skew', 'garch_vol'],
    'volume': ['volume_ratio', 'obv_slope', 'vwap_dist', 'adv_ratio'],
    'mean_reversion': ['dist_from_ma21', 'dist_from_ma63', 'rsi_14', 'bb_pct'],
    'microstructure': ['bid_ask_spread', 'kyle_lambda', 'amihud_illiq'],
    'fundamental': ['ep_ratio', 'bp_ratio', 'roe', 'accruals'],
}

base_models = []
for domain, features in FEATURE_GROUPS.items():
    model = GradientBoostingClassifier(
        n_estimators=200, max_depth=3,
        learning_rate=0.05, subsample=0.7
    )
    base_models.append((domain, model, features))

Ogni modello base diventa un esperto di dominio: il modello del momento apprende i modelli del momento senza interferenze dovute al rumore del volume e il meta-discente impara di quale esperto fidarsi e in quali condizioni.

Due avvertenze sull'ultima clausola. In primo luogo, la ponderazione condizionale al regime è un problema risolto e pubblicato: rilevamento del regime con HMM deriva correttamente i regimi tramite Forward/Viterbi/Baum-Welch e li fornisce come caratteristiche a un insieme a valle, e strategie di combinazione dinamica copre la inversione della media ponderata del regime vs slancio con i risultati riportati. Non sostituire nessuno dei due con un proxy di segno di slancio ad hoc. In secondo luogo, la selezione sulla performance interna al campione produce vincitori che non sopravvivono; il meccanismo generico e la difesa CSCV sono misurati in la probabilità di overfitting del backtest. Lo stacking è un esempio più ristretto esattamente di quel problema.

Per ponderare i flussi di rendimento anziché le previsioni del modello, non ricalcolare la varianza media. 12 algoritmi di ottimizzazione del portafoglio, confrontati gare HRP, HERC, GHRP, MHRP, Black-Litterman, NCO, MVO, parità di rischio e uguale peso con risultati misurati e codice open source; La teoria del portafoglio di Markowitz per le criptovalute ha l'implementazione della media-varianza SLSQP; e il risultato 1/N-è-difficile-da-battire è già testato rispetto a HRP e CVaR nella pipeline del portafoglio HRP/CVaR.

Compensazione del fatturato: l'affermazione da verificare

Ecco la parte dell'argomento della libreria alpha che il cluster dei costi di esecuzione di questo blog attualmente non copre.

Quando Alpha # 4.721 dice "acquista MSFT" e Alpha # 8.392 dice "vendi MSFT" nello stesso ribilanciamento, tali operazioni si incrociano internamente. Solo la posizione netta raggiunge il mercato. L’affermazione è che con segnali sufficienti una grande frazione del fatturato lordo previsto si annulla prima di incorrere in spread, commissioni o impatto sul mercato – il che significherebbe che un insieme è più economico da gestire rispetto alla somma dei suoi componenti, non semplicemente più stabile.

Si tratta di un meccanismo distinto da quello già gestito dall'orchestrazione della strategia a cascata. Cascade risolve i conflitti a livello di slot: stessa coppia, direzione opposta è vietata e regolata dal punteggio, lo sfratto di coppie incrociate viene eseguito attraverso una coda di priorità e l'articolo dimostra empiricamente che il PnL per strategia non può essere semplicemente sommato a causa della sovrapposizione temporale e dei vincoli di capitale. Il netting riguarda l'aritmetica della posizione lorda-netta che riduce la quantità scambiata stessa.

È anche economico falsificare: calcolare il fatturato lordo rispetto a quello netto sui riempimenti reali quando i segnali dei componenti vengono combinati, quindi valutare entrambi attraverso il meccanismo dei costi esistente: commissioni e sconti maker-taker, mancanza di implementazione e TCA e costo di slittamento models.

Una nota su larga scala, poiché l'inquadratura della libreria alpha lo invita. WorldQuant riferisce di aver prodotto una libreria alfa molto ampia e i [101 Formulaic Alpha]( di Kakushadzehttps://arxiv.org/pdf/1601.00991) documenta la forma dei singoli segnali. Ma l'estrazione di alfa su scala industriale è anche la più grande macchina per test multipli immaginabile, e la posizione di questo blog a riguardo è definita: una ricerca di dimensioni KK deve essere sgonfiato rispetto alla buona fortuna attesa da una ricerca di quelle dimensioni. The Deflated Sharpe Ratio mostra una griglia di 640 celle che già supera i test di significatività ingenui, e The Honest Negative mostra una ricerca di circa 37.000 prove che produce un vincitore fuori campione del +16,35% che si sgonfia a DSR 0,00. La dimensione della libreria non è prova di vantaggio. È il denominatore che devi pagare.

Mettere insieme il tutto

Raw Data
  |
  v
Feature Engineering
  |
  v
Feature Subsets (partitioned by domain -> decorrelated errors)
  |
  +---> Base Model 1: RF on momentum features
  +---> Base Model 2: GBM on volatility features
  +---> Base Model 3: LSTM on price sequences
  +---> Base Model 4: Lasso on fundamental features
  +---> Base Model 5: XGBoost on microstructure features
  |
  v
Out-of-Fold Predictions (purged walk-forward)
  |
  v
Meta-Learner (Ridge)
  |
  v
Combined Signal -> Net Position -> Execution
  |
  v
DSR >= 0.95 and PBO <= 0.2 gate, or it does not ship

L'ultima scatola non è una decorazione. Impilabile KK modelli base è una procedura di selezione delle dimensioni KK, e un articolo d'insieme che non si sgonfia è indifendibile.

Da asporto

  1. La differenza strutturale batte il conteggio dei modelli. Il termine di covarianza non si riduce con NN. Aggiungere un sesto albero correlato non è diversificazione; aggiungere una classe di modello diversa o un dominio di funzionalità disgiunto lo è.
  2. Segnalare l'effettivo-NN banda, non un punto. Cinque stimatori, cinque risposte, a volte due ordini di grandezza di differenza.
  3. Mantieni il meta-studente lineare. La complessità a livello di combinazione è quasi sempre eccessiva e L1 esegue un'utile selezione automatica del modello.
  4. Out-of-fold o niente. Un meta-studente addestrato sulle previsioni di base interne al campione apprende i pesi errati con elevata sicurezza.
  5. Sgonfiare l'insieme stesso. L'impilamento è una ricerca. Prezzo come uno.

Ulteriori letture:

Disclaimer: le informazioni fornite in questo articolo hanno solo scopo didattico e informativo e non costituiscono consulenza finanziaria, di investimento o di trading. Il trading di criptovalute comporta un rischio significativo di perdita.

Autori

Eugen Soloviov
Eugen Soloviov

Trading-systems engineer

Trading-systems engineer building bots since 2017: cross-exchange arbitrage (connected up to 30 venues), cointegration-based pairs arbitrage across spot and futures, scalping, news and sentiment-driven strategies, trend algorithms, and portfolio management and balancing algorithms. Also builds sub-millisecond order execution, big-data warehouses, backtesting engines, AI agents, and trading interfaces (incl. open-source profitmaker.cc). Stack: JS/TS, Python, Rust/Zig/Go, DevOps, backend, frontend, architecture.

Newsletter

Resta un Passo Avanti al Mercato

Iscriviti alla nostra newsletter per approfondimenti esclusivi sul trading con IA, analisi di mercato e aggiornamenti sulla piattaforma.

Rispettiamo la tua privacy. Annulla l'iscrizione in qualsiasi momento.