Metode Ensemble: Menggabungkan Pembelajar yang Lemah untuk Alpha yang Kuat
Kebanyakan tulisan tentang ansambel perdagangan berpendapat bahwa lebih banyak model lebih baik. Itu adalah poros yang salah. Kesalahan ansambel terurai menjadi tiga suku, dan dalam perdagangan hanya satu suku saja yang merupakan batasan yang mengikat.
Artikel ini membahas tentang satu istilah tersebut, dan tentang dua konsekuensi yang tidak dibahas dalam blog ini: penumpukan sebagai lapisan kombinasi sinyal yang eksplisit, dan apakah menggabungkan banyak sinyal benar-benar mengurangi omzet sebelum perdagangan mencapai pasar.
Istilah yang Sebenarnya Mengikat: Bias-Variance-Covariance
Untuk ansambel regresi model, kesalahan kuadrat yang diharapkan dari prediksi rata-rata terurai menjadi:
Tiga istilah, tiga tuas:
- Bagging menyerang istilah varians dengan membuat rata-rata pada sampel bootstrap.
- Boosting menyerang istilah bias dengan mengoreksi residu secara berulang.
- Stacking menyerang istilah kovarians dengan mempelajari bobot kombinasi, bukan mengasumsikan bobot yang sama.
- Meningkat hanya menyusutkan kontribusi varians. Ia tidak berpengaruh sama sekali terhadap kovarians — the koefisien sudah 0,99 pada .
Poin terakhir adalah keseluruhan argumen. Dalam perdagangan, model dilatih pada instrumen yang sama, dalam sejarah yang sama, terhadap target yang merupakan transformasi yang hampir identik dari rangkaian harga yang sama. Kesalahan mereka tidak bisa dikatakan independen. Jadi suku kovariansnya besar dan suku variansnya sudah habis, yang berarti jumlah model hampir tidak memberi Anda apa-apa dan perbedaan struktural memberi Anda segalanya.
Bentuk klaim yang konkrit dan dapat dipalsukan: menambahkan pohon yang ditingkatkan gradien ke-101 akan menggerakkan metrik ansambel lebih sedikit daripada menambahkan satu model yang berbeda secara struktural — LSTM, model linier pada domain fitur yang terpisah, apa pun dengan bias induktif berbeda. Pohon marginal hampir sejajar dengan pohon-pohon yang sudah ada di buku; model yang berbeda secara struktural tidak.
Korelasi, bukan jumlah model, menentukan luas efektif suatu ansambel — derivasi, faktor korelasi yang diukur secara kripto berdasarkan kelas aset, dan simulasi terhadap data pasangan nyata ada di Korelasi Sinyal: Berapa Banyak Pasangan yang Harus Dipantau.
Jangan mereduksi keragaman ansambel menjadi satu nomor saja. Rasio Sharpe yang Deflasi menghitung lima efektif- estimator (korelasi rata-rata, rasio partisipasi, PCA-95%, Kaiser, Cheverud-Nyholt) pada grid 640 sel nyata, menunjukkan rentangnya dari 1,6 hingga 370, dan berargumentasi bahwa rentang tersebut – bukan estimasi satu titik pun – merupakan hasil yang dapat dicapai. Laporkan bandnya.
Menumpuk sebagai Lapisan Kombinasi Sinyal
Bagging dan boosting tercakup dengan baik di tempat lain. Pemodelan Spread dengan Machine Learning mengirimkan penyiapan peningkatan gradien, pemilihan kerugian untuk target yang miring, temuan pentingnya SHAP, taksonomi fitur, dan pemisahan walk-forward yang dihapus dengan jendela depan yang tumpang tindih yang memotivasi kesenjangan tersebut. Mulai dari sana; bagian ini mengasumsikannya.
Yang tidak tercakup adalah level di atasnya: pembelajar meta yang menggunakan prediksi model dasar sebagai fitur masukannya dan mempelajari cara menggabungkannya.
- Level 0 (pelajar dasar): beragam model yang menghasilkan prediksi dari fitur mentah.
- Level 1 (peserta meta): model yang mempelajari dasar mana yang dapat dipercaya oleh pelajar, dan kapan.
Mekanisme yang membuat ini aman adalah fitur-fitur meta yang luar biasa. Pembelajar meta tidak boleh melihat prediksi model dasar yang dibuat pada data tempat model dasar dilatih - prediksi tersebut bias secara optimis sehingga tidak dapat bertahan dalam perdagangan langsung, dan pembelajar meta akan memberikan bobot yang sesuai.
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 bukanlah suatu pilihan dan bukan hal yang baru — gunakan langkah maju yang telah dibersihkan dan diembargo, dan pahami nilai setiap kelas kebocoran di Sharpe yang meningkat sebelum memercayai angka-angka ini. Keduanya sudah diukur: taksonomi bias melihat ke depan mengkuantifikasi kebocoran eksekusi, indikator, dan normalisasi dalam simulator yang terkontrol, dan optimasi berjalan ke depan mencakup jendela berlabuh vs jendela bergulir, CPCV, pembersihan, dan diagnostik degradasi WFER.
Tiga keputusan desain khusus untuk penumpukan dan layak untuk dinyatakan.
Kesederhanaan meta-pelajar. Gunakan model linier — ridge, laso, regresi logistik. Pembelajar dasar menangani nonlinier; meta-pelajar hanya menangani kombinasi. Pembelajar meta yang kompleks di atas pembelajar dasar yang kompleks adalah overfitting tingkat kedua, dan regularisasi L1 pada lapisan kombinasi memiliki efek samping yang berguna dalam menghilangkan model dasar yang hanya menyumbang kebisingan.
Keluaran probabilitas pada label keras. predict_proba membawa informasi keyakinan yang dibuang oleh label kelas, dan memungkinkan pembelajar meta memberikan bobot yang lebih besar pada prediksi dasar percaya diri.
Pemartisian domain fitur. Ini adalah tuas keberagaman dengan leverage tertinggi, dan ini mengikuti langsung dari argumen kovarians: model yang melihat fitur yang sama menghasilkan error yang berkorelasi, apa pun algoritmenya.
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 dasar menjadi pakar domain: model momentum mempelajari pola momentum tanpa gangguan dari kebisingan volume, dan pembelajar meta mempelajari pakar mana yang dapat dipercaya dalam kondisi apa.
Dua peringatan pada klausa terakhir itu. Pertama, pembobotan bersyarat rezim adalah masalah yang telah diselesaikan dan dipublikasikan — deteksi rezim dengan HMM mendapatkan rezim dengan benar melalui Forward/Viterbi/Baum-Welch dan memasukkannya sebagai fitur ke ansambel hilir, dan strategi penggabungan secara dinamis mencakup pengembalian rata-rata tertimbang rezim vs. momentum dengan hasil yang dilaporkan. Jangan mengganti keduanya dengan proksi tanda momentum ad-hoc. Kedua, seleksi pada kinerja dalam sampel menghasilkan pemenang yang tidak bertahan; mekanisme umum dan pertahanan CSCV diukur dalam probabilitas overfitting backtest. Penumpukan adalah contoh yang lebih sempit dari masalah tersebut.
Untuk memberi bobot pada return stream dibandingkan prediksi model, jangan turunkan kembali mean-variance. 12 Algoritma Pengoptimalan Portofolio, Dibandingkan menampilkan HRP, HERC, GHRP, MHRP, Black-Litterman, NCO, MVO, paritas risiko, dan bobot yang setara dengan hasil terukur dan kode sumber terbuka; Teori portofolio Markowitz untuk kripto memiliki implementasi mean-variance SLSQP; dan hasil 1/N yang sulit dikalahkan sudah diuji terhadap HRP dan CVaR di pipa portofolio HRP/CVaR.
Turnover Netting: Klaim yang Layak Diuji
Berikut adalah bagian dari argumen perpustakaan alfa yang saat ini tidak tercakup dalam cluster biaya eksekusi blog ini.
Ketika Alpha #4.721 mengatakan "beli MSFT" dan Alpha #8.392 mengatakan "jual MSFT" dalam penyeimbangan kembali yang sama, perdagangan tersebut bersilangan secara internal. Hanya posisi bersih yang mencapai pasar. Klaimnya adalah bahwa dengan sinyal yang cukup, sebagian besar dari omset kotor yang diharapkan akan dibatalkan sebelum menimbulkan selisih, biaya, atau dampak pasar — yang berarti sebuah ansambel lebih murah untuk dijalankan dibandingkan jumlah komponennya, tidak hanya lebih stabil.
Ini adalah mekanisme yang berbeda dari apa yang sudah ditangani oleh orkestrasi strategi kaskade. Cascade menyelesaikan konflik di tingkat slot: pasangan yang sama, arah berlawanan dilarang dan diselesaikan berdasarkan skor, penggusuran pasangan silang berjalan melalui antrian prioritas, dan artikel tersebut membuktikan secara empiris bahwa PnL per-strategi tidak dapat dijumlahkan begitu saja karena tumpang tindih waktu dan kendala modal. Netting adalah tentang hitungan posisi bruto-ke-net yang mengurangi kuantitas yang diperdagangkan itu sendiri.
Pemalsuan ini juga murah: hitung omzet kotor vs bersih pada pengisian sebenarnya ketika sinyal komponen digabungkan, lalu hargakan keduanya melalui mesin biaya yang ada — biaya dan rabat pembuat-taker, kekurangan implementasi dan TCA, dan biaya slippage model.
Sebuah catatan tentang skala, karena pembingkaian perpustakaan alfa mengundangnya. WorldQuant melaporkan telah menghasilkan perpustakaan alfa yang sangat besar, dan [101 Formulaic Alpha] Kakushadzehttps://arxiv.org/pdf/1601.00991) mendokumentasikan bentuk sinyal individu. Namun menambang alfa pada skala industri juga merupakan mesin pengujian berganda terbesar yang dapat dibayangkan, dan posisi blog ini telah ditetapkan: pencarian ukuran harus dikempiskan terhadap keberuntungan terbaik yang diharapkan dari pencarian sebesar itu. Rasio Sharpe yang Dikempiskan menunjukkan kisi 640 sel sudah melanggar pengujian signifikansi yang naif, dan The Honest Negative menunjukkan ~37.000 penelusuran uji coba yang menghasilkan +16,35% pemenang di luar sampel yang mengempis ke DSR 0,00. Ukuran perpustakaan bukanlah bukti keunggulan. Itu adalah penyebut yang harus Anda bayar.
Menyatukannya
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 bukanlah hiasan. Menumpuk model dasar adalah prosedur pemilihan ukuran , dan artikel ansambel yang tidak mengempis tidak dapat dipertahankan.
Kesimpulan
- Perbedaan struktural mengalahkan jumlah model. Istilah kovarians tidak menyusut . Menambahkan pohon keenam yang berkorelasi bukanlah diversifikasi; menambahkan kelas model yang berbeda atau domain fitur yang terpisah.
- Laporkan efektif- pita, bukan satu poin. Lima penduga, lima jawaban, terkadang terpisah dua kali lipat.
- Jaga agar meta-pelajar tetap linier. Kompleksitas pada lapisan kombinasi hampir selalu overfitting, dan L1 melakukan pemilihan model otomatis yang berguna.
- Di luar lipatan atau tidak sama sekali. Pembelajar meta yang dilatih prediksi dasar dalam sampel mempelajari bobot yang salah dengan keyakinan tinggi.
- Kempiskan ansambel itu sendiri. Penumpukan adalah penelusuran. Beri harga seperti itu.
Bacaan lebih lanjut:
- Kakushadze, Z. (2016). 101 Formula Alfa
- Ensemble Learning in Investment — CFA Institute Research Foundation, 2025
- Prediksi Return Saham: Menumpuk Berbagai Model — Jurnal Ekonomi Keuangan
- Jansen, S. Pembelajaran Mesin untuk Perdagangan Algoritmik, edisi ke-2
Penulis
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.