← Kembali ke artikel
August 3, 2026
Bacaan 5 minit

Kaedah Ensembel: Menggabungkan Pelajar Lemah untuk Alfa Teguh

Kaedah Ensembel: Menggabungkan Pelajar Lemah untuk Alfa Teguh
#machine-learning
#ensemble
#bagging
#stacking
#alpha

Kebanyakan penulisan tentang ensemble perdagangan berpendapat bahawa lebih banyak model adalah lebih baik. Itu adalah paksi yang salah. Kesilapan ensemble terurai kepada tiga istilah, dan dalam perdagangan hanya satu daripadanya yang sentiasa menjadi kekangan yang mengikat.

Artikel ini adalah mengenai satu penggal itu, dan kira-kira dua akibat daripadanya yang tidak meliputi keseluruhan blog ini: susun sebagai lapisan gabungan isyarat yang jelas, dan sama ada menggabungkan banyak isyarat benar-benar menurunkan perolehan sebelum dagangan mencapai pasaran.

Istilah Yang Sebenarnya Mengikat: Bias-Variance-Kovarians

Untuk ensembel regresi NN model, ralat kuasa dua yang dijangkakan bagi ramalan purata fˉ\bar{f} terurai sebagai:

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}}

Tiga sebutan, tiga tuas:

  • Bagging menyerang istilah varians dengan membuat purata ke atas sampel bootstrap.
  • Boosting menyerang istilah bias dengan membetulkan sisa secara berulang.
  • Tindan menyerang istilah kovarians dengan mempelajari berat gabungan dan bukannya menganggap yang sama.
  • Meningkat NN mengecut hanya sumbangan varians. Ia tidak melakukan apa-apa kepada kovarians — the (11/N)(1 - 1/N) pekali sudah 0.99 pada N=100N = 100.

Perkara terakhir itu adalah keseluruhan hujah. Dalam perdagangan, model dilatih pada instrumen yang sama, dalam sejarah yang sama, terhadap sasaran yang sendiri adalah transformasi yang hampir serupa daripada siri harga yang sama. Kesilapan mereka tidak dekat dengan bebas. Jadi istilah kovarians adalah besar dan istilah varians sudah habis, yang bermaksud kiraan model membeli anda hampir tiada apa-apa dan perbezaan struktur membelikan anda segala-galanya.

Bentuk tuntutan yang konkrit dan boleh dipalsukan: menambah pepohon yang dirangsang kecerunan ke-101 seharusnya menggerakkan metrik ensembel kurang daripada menambah satu model yang berbeza dari segi struktur — LSTM, model linear pada domain ciri terputus-putus, apa-apa sahaja dengan pincang induktif yang berbeza. Pokok marginal hampir sejajar dengan pokok yang sudah ada dalam buku; model struktur berbeza tidak.

Korelasi, bukan kiraan model, menetapkan keluasan berkesan ensembel — terbitan, faktor korelasi yang diukur kripto mengikut kelas aset, dan simulasi terhadap data pasangan sebenar adalah dalam Korelasi Isyarat: Berapa Banyak Pasangan untuk Dipantau.

Jangan kurangkan kepelbagaian ensemble kepada satu nombor. Nisbah Tajam Kempis mengira lima berkesan-NN penganggar (purata korelasi, nisbah penyertaan, PCA-95%, Kaiser, Cheverud-Nyholt) pada grid 640-sel sebenar, menunjukkan ia menjangkau NeffN_{\text{eff}} dari 1.6 hingga 370, dan berhujah bahawa kumpulan itu — bukan sebarang anggaran titik tunggal — adalah yang boleh dihantar. Laporkan kumpulan itu.

Susun sebagai Lapisan Gabungan Isyarat

Bagging dan boosting dilindungi dengan baik di tempat lain. Pemodelan Spread dengan Pembelajaran Mesin menghantar persediaan meningkatkan kecerunan, pemilihan kehilangan untuk sasaran yang condong, penemuan kepentingan SHAP, taksonomi ciri dan pemisahan berjalan ke hadapan yang telah dibersihkan dengan pertindihan tingkap hadapan yang mendorong jurang itu. Mulakan di sana; bahagian ini menganggapnya.

Perkara yang tidak diliputi ialah tahap di atas: pelajar meta yang mengambil ramalan model asas sebagai ciri inputnya dan mempelajari cara menggabungkannya.

  • Tahap 0 (pelajar asas): pelbagai model yang menghasilkan ramalan daripada ciri mentah.
  • Tahap 1 (pembelajar meta): model yang mempelajari asas pelajar untuk dipercayai, dan bila.

Mekanisme yang menjadikan ini selamat ialah ciri meta luar kali ganda. Pelajar meta tidak boleh melihat ramalan model asas yang dibuat pada data model asas dilatih — ramalan tersebut secara optimistik berat sebelah dalam cara yang tidak dapat bertahan untuk perdagangan langsung, dan pelajar meta akan menimbangnya dengan sewajarnya.

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)

Disiplin pemisahan di sini bukan pilihan dan bukan novel — gunakan langkah maju yang telah dibersihkan dan diembargo dan fahami nilai setiap kelas kebocoran dalam Sharpe yang melambung sebelum mempercayai mana-mana nombor ini. Kedua-duanya telah diukur: taksonomi berat sebelah pandangan ke hadapan mengukur kebocoran pelaksanaan, penunjuk dan penormalan dalam simulator terkawal, dan pengoptimuman berjalan ke hadapan meliputi diagnostik berlabuh vs rolling windows, CPCVER penyahgradasian dan penyahgradan tetingkap bergulir

Tiga keputusan reka bentuk adalah khusus untuk menyusun dan patut dinyatakan.

Kesederhanaan meta-learner. Gunakan model linear — rabung, laso, regresi logistik. Pelajar asas mengendalikan ketaklinearan; meta-pelajar mengendalikan gabungan sahaja. Meta-pembelajaran yang kompleks di atas pelajar asas yang kompleks ialah pemasangan terlampau tertib kedua, dan penetapan L1 pada lapisan gabungan mempunyai kesan sampingan yang berguna untuk menyifar model asas yang hanya menyumbang hingar.

Kebarangkalian keluaran berbanding label keras. predict_proba membawa maklumat keyakinan yang dibuang oleh label kelas, dan membolehkan pelajar meta-pembelajar mempunyai ramalan asas yakin dengan lebih banyak.

Pembahagian domain ciri. Ini ialah tuil kepelbagaian leveraj tertinggi, dan ia mengikuti terus daripada hujah kovarians: model yang melihat ciri yang sama menghasilkan ralat berkorelasi tanpa mengira algoritma.

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))

Setiap model asas menjadi pakar domain: model momentum mempelajari corak momentum tanpa gangguan daripada hingar kelantangan, dan pelajar meta mempelajari pakar mana yang perlu dipercayai dalam keadaan yang mana.

Dua kaveat pada fasal terakhir itu. Pertama, pemberat bersyarat rejim ialah masalah yang diselesaikan dan diterbitkan — pengesanan rejim dengan HMM memperoleh rejim dengan betul melalui Forward/Viterbi/Baum-Welch dan menyuapkannya sebagai ciri kepada ensembel hiliran, dan menggabungkan secara dinamik strategi meliputi min-reversi wajaran rejim vs momentum dengan keputusan yang dilaporkan. Jangan gantikan proksi tanda momentum ad-hoc untuk kedua-duanya. Kedua, pemilihan pada prestasi dalam sampel mengeluarkan pemenang yang tidak bertahan; mekanisme generik dan pertahanan CSCV diukur dalam kebarangkalian overfitting backtest. Penimbunan adalah contoh yang lebih sempit tentang masalah itu.

Untuk menimbang strim pulangan dan bukannya ramalan model, jangan terbitkan semula varians min. 12 Algoritma Pengoptimuman Portfolio, Berbanding perlumbaan HRP, HERC, GHRP, MHRP, Black-Litterman, NCO, MVO, pariti risiko dan berat yang sama dengan hasil yang diukur dan kod sumber terbuka; Teori portfolio Markowitz untuk crypto mempunyai pelaksanaan min-varians SLSQP; dan keputusan 1/N-adalah-sukar-dipukul telah diuji terhadap HRP dan CVaR dalam talian paip portfolio HRP/CVaR.

Jaringan Pusing Ganti: Tuntutan Berbaloi untuk Diuji

Berikut ialah sebahagian daripada hujah perpustakaan alfa yang tidak diliputi oleh kluster kos pelaksanaan blog ini.

Apabila Alpha #4,721 mengatakan "beli MSFT" dan Alpha #8,392 mengatakan "jual MSFT" dalam pengimbangan semula yang sama, dagangan tersebut bersilang secara dalaman. Hanya kedudukan bersih mencapai pasaran. Dakwaannya ialah dengan isyarat yang mencukupi, sebahagian besar daripada perolehan kasar yang disasarkan dibatalkan sebelum menanggung spread, yuran atau impak pasaran — yang bermaksud ensemble adalah lebih murah untuk dijalankan daripada jumlah komponennya, bukan semata-mata lebih stabil.

Ini adalah mekanisme yang berbeza daripada apa yang telah dikendalikan oleh orkestrasi strategi lata. Lata menyelesaikan konflik pada tahap slot: pasangan yang sama, arah bertentangan dilarang dan diselesaikan mengikut skor, pengusiran pasangan silang dijalankan melalui baris gilir keutamaan dan artikel itu membuktikan secara empirik bahawa PnL per-strategi tidak boleh dijumlahkan semata-mata kerana pertindihan masa dan kekangan modal. Menjaring adalah mengenai aritmetik kedudukan kasar ke bersih mengurangkan kuantiti dagangan itu sendiri.

Ia juga murah untuk memalsukan: mengira perolehan kasar vs bersih pada isian sebenar apabila isyarat komponen digabungkan, kemudian harga kedua-duanya melalui jentera kos sedia ada — yuran pengambil-pengambil dan rebat, kekurangan pelaksanaan dan TCA, models](/en/blog/post/slippage-cost-models-backtest).

Nota pada skala, kerana pembingkaian alfa perpustakaan menjemputnya. Laporan WorldQuant telah menghasilkan perpustakaan alfa yang sangat besar, dan Kakushadze 101 Formulaic Alphas mendokumenkan bentuk isyarat individu. Tetapi perlombongan alpha pada skala perindustrian juga merupakan mesin ujian berbilang terbesar yang boleh dibayangkan, dan kedudukan blog ini telah diselesaikan: carian saiz KK mesti dikempiskan berbanding jangkaan terbaik demi nasib carian sebesar itu. Nisbah Tajam Kempis menunjukkan grid 640-sel yang sudah melanggar ujian keertian naif dan Negatif Jujur menunjukkan ~37,000-producing outsample-5% pemenang +16% yang mengempis kepada DSR 0.00. Saiz perpustakaan bukan bukti kelebihan. Ia adalah penyebut yang anda perlu bayar.

Menyatukan

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

Kotak terakhir bukan hiasan. Bertindan KK model asas ialah prosedur pemilihan saiz KK, dan artikel ensemble yang tidak mengempis tidak dapat dipertahankan.

Bawa pulang

  1. Perbezaan struktur mengatasi kiraan model. Istilah kovarians tidak mengecut dengan NN. Menambah pokok berkorelasi keenam bukanlah kepelbagaian; menambah kelas model yang berbeza atau domain ciri berpisah ialah.
  2. Laporkan keberkesanan-NN band, bukan titik. Lima penganggar, lima jawapan, kadangkala dua urutan magnitud dipisahkan.
  3. Pastikan meta-pembelajar linear. Kerumitan pada lapisan gabungan hampir selalu terlampau, dan L1 di sana melakukan pemilihan model automatik yang berguna.
  4. Di luar kali ganda atau tiada apa-apa. Seorang pelajar meta yang dilatih mengenai ramalan asas dalam sampel mempelajari pemberat yang salah dengan keyakinan yang tinggi.
  5. Kempiskan ensembel itu sendiri. Penimbunan ialah carian. Harga seperti satu.

Bacaan lanjut:

Penafian: Maklumat yang disediakan dalam artikel ini adalah untuk tujuan pendidikan dan maklumat sahaja dan bukan merupakan nasihat kewangan, pelaburan, atau dagangan. Dagangan mata wang kripto melibatkan risiko kerugian yang ketara.

Pengarang

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

Kekal Mendahului Pasaran

Langgan surat berita kami untuk pandangan dagangan AI eksklusif, analisis pasaran, dan kemas kini platform.

Kami menghormati privasi anda. Berhenti melanggan pada bila-bila masa.