アンサンブル手法: 弱い学習器を組み合わせて堅牢なアルファを実現する
アンサンブル取引に関する記事のほとんどは、モデルが多いほど優れていると主張しています。それは間違った軸です。アンサンブルの誤差は 3 つの項に分解され、トレードではそのうちの 1 つだけが拘束制約となります。
この記事では、その 1 つの用語と、このブログの残りの部分では取り上げていない 2 つの用語について説明します。それは、明示的なシグナル組み合わせレイヤーとしてスタッキングすることと、多くのシグナルを組み合わせることで実際に取引が市場に到達する前に売上高を削減できるかどうかです。
実際に関係する用語: バイアス-分散-共分散
の回帰アンサンブルの場合 モデル、平均予測の期待二乗誤差 次のように分解されます。
3 つの用語、3 つのレバー:
- バギング は、ブートストラップ サンプルを平均することによって分散項を攻撃します。
- ブースティングは、残差を反復的に修正することでバイアス項を攻撃します。
- スタッキングは、等しい重みを仮定するのではなく、組み合わせの重みを学習することで共分散項を攻撃します。
- 増加中 は分散の寄与のみを縮小します。共分散にはまったく影響しません。 係数はすでに 0.99 です 。
この最後の点が議論の全体です。取引では、モデルは、同じ価格系列のほぼ同一の変換であるターゲットに対して、同じ銘柄、同じ履歴にわたってトレーニングされます。それらのエラーは独立に近いものではありません。つまり、共分散項は大きく、分散項はすでに使い果たされています。つまり、モデル数ではほとんど何も得られず、構造の違いですべてが得られることになります。
主張の具体的で反証可能な形式: 101 番目の勾配ブースト ツリーを追加すると、構造的に異なるモデルを 1 つ追加するよりもアンサンブル メトリックの移動が少なくなるはずです - LSTM、素な特徴領域上の線形モデル、異なる帰納的バイアスを持つもの。辺縁の木は、すでに本の中にある木とほぼ同一線上にあります。構造的に異なるモデルはそうではありません。
モデル数ではなく相関によって、アンサンブルの有効範囲が設定されます。導出、資産クラスごとの暗号で測定された相関係数、および実際のペア データに対するシミュレーションは、信号相関: 監視するペアの数 にあります。
アンサンブルの多様性を単一の数値に減らさないでください。 デフレートされたシャープレシオ は、5 つの有効値を計算します。 実際の 640 セル グリッド上の推定値 (平均相関、参加率、PCA-95%、Kaiser、Cheverud-Nyholt) は、それらの範囲が示されています。 1.6 から 370 までの範囲であり、単一点推定ではなくバンドが成果物であると主張しています。バンドを報告します。
信号結合レイヤーとしてスタッキング
バギングとブースティングについては、別の場所で詳しく説明されています。 機械学習によるスプレッド モデリング には、勾配ブースティング設定、歪んだターゲットの損失選択、SHAP 重要度の結果、特徴分類、およびギャップを引き起こすフォワード ウィンドウのオーバーラップを伴うパージされたウォークフォワード スプリットが同梱されています。そこから始めてください。このセクションではそれを前提としています。
取り上げられていないのは、その上のレベル、つまり基本モデルの予測を入力特徴として受け取り、それらを組み合わせる方法を学習するメタ学習器です。
- レベル 0 (基本学習者): 生の特徴から予測を生成する多様なモデル。
- レベル 1 (メタ学習者): どの基本学習者をいつ信頼すべきかを学習するモデル。
これを安全にするメカニズムは、アウトオブフォールドのメタ機能です。メタ学習者は、基本モデルがトレーニングされたデータに基づいて行われた基本モデルの予測を決して見てはなりません。これらの予測は、実際の取引には耐えられない形で楽観的に偏っており、メタ学習者はそれに応じて重み付けを行います。
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)
ここでの分割規律はオプションではなく、目新しいものでもありません。これらの数字を信頼する前に、パージされ禁輸されたウォークフォワードを使用し、水増しされたシャープで各クラスの漏洩の価値を理解してください。両方ともすでに測定されています。先読みバイアス分類法 は、制御されたシミュレーターでの実行、インジケーター、および正規化リークを定量化します。また、ウォークフォワード最適化 は、アンカー対ローリング ウィンドウ、CPCV、パージ、および WFER 劣化診断をカバーします。
スタッキングに特有の 3 つの設計上の決定は、言及する価値があります。
メタ学習者のシンプルさ 線形モデル (リッジ、なげなわ、ロジスティック回帰) を使用します。基本学習器は非線形性を処理します。メタ学習者は組み合わせのみを処理します。複雑な基本学習器の上にある複雑なメタ学習器は二次過学習であり、結合層での L1 正則化には、ノイズのみに寄与する基本モデルをゼロにするという有益な副作用があります。
ハードラベルを介した確率出力。 predict_proba クラスラベルが破棄する信頼性情報を伝達し、メタ学習者が信頼性の高いベース予測をより重く重み付けできるようにします。
特徴ドメインの分割。 これは最も利用率の高い多様性レバーであり、共分散引数から直接導き出されます。つまり、同じ特徴を認識するモデルは、アルゴリズムに関係なく相関誤差を生成します。
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))
各ベース モデルはドメイン エキスパートになります。運動量モデルはボリューム ノイズの影響を受けることなく運動量パターンを学習し、メタ学習者はどの条件下でどのエキスパートを信頼すべきかを学習します。
最後の条項については 2 つの注意点があります。まず、レジーム条件付き重み付けは解決済みで公開されている問題です。HMM によるレジーム検出 は、Forward/Viterbi/Baum-Welch を介してレジームを適切に導出し、それらを特徴として下流のアンサンブルにフィードし、戦略を動的に組み合わせる は次のことをカバーします。レジーム加重平均回帰対モメンタムと報告された結果。どちらも、アドホックなモメンタムサインプロキシで置き換えないでください。第二に、サンプル内のパフォーマンスに基づいて選択すると、生き残れない勝者が生まれます。一般的なメカニズムと CSCV 防御は、バックテストの過学習の確率 で測定されます。スタッキングは、まさにその問題のより狭い例です。
モデル予測ではなく 戻りストリーム を重み付けする場合は、平均分散を再導出しないでください。 12 のポートフォリオ最適化アルゴリズム、比較 レース HRP、HERC、GHRP、MHRP、Black-Litterman、NCO、MVO、リスク パリティ、および測定結果とオープンソース コードによる同等の重み。 [暗号通貨のマルコウィッツ ポートフォリオ理論](/en/blog/post/markowitz-portfolio- Theory-crypto) には、SLSQP 平均分散が実装されています。そして、1/N-is-hard-to-beat の結果は、HRP/CVaR ポートフォリオ パイプライン で HRP と CVaR に対してすでにテストされています。
売上高ネッティング: 検証する価値のある主張
以下は、このブログの実行コスト クラスターで現在カバーされていないアルファ ライブラリの議論の一部です。
同じリバランスでアルファ #4,721 が「MSFT を買う」と言い、アルファ #8,392 が「MSFT を売る」と言った場合、これらの取引は内部でクロスします。ネットポジションのみが市場に到達します。その主張は、十分なシグナルがあれば、スプレッド、手数料、または市場への影響が生じる前に、意図された総売上高の大部分がキャンセルされるということです。つまり、アンサンブルは、単に安定性が高いだけでなく、そのコンポーネントの合計よりも運用コストが安くなるということになります。
これは、カスケード戦略オーケストレーション がすでに処理しているものとは異なるメカニズムです。カスケードは スロット レベルで競合を解決します。同じペア、逆方向は禁止され、スコアによって解決されます。ペア間のエビクションは優先キューを通じて実行されます。この記事は、時間の重複と資本の制約により、戦略ごとの損益を単純に合計できないことを経験的に証明しています。ネッティングとは、グロスからネットへのポジションの計算により、取引数量そのものを減らすことです。
また、改ざんも安価です。コンポーネントシグナルを組み合わせた場合の実際の約定の総売上高と純売上高を計算し、既存の原価計算機構を通じて両方の価格を計算します。つまり、メーカーテイカー手数料とリベート、実装不足と TCA、および [スリッページコスト]モデル](/en/blog/post/slippage-cost-models-backtest)。
アルファ ライブラリの枠組みがそれを誘うため、スケールに関する注意事項が記載されています。 WorldQuant は、非常に大規模なアルファ ライブラリと、Kakushadze の 101 Formulaic Alphas を作成したと報告しています。https://arxiv.org/pdf/1601.00991) は、個々の信号の形状を文書化しています。しかし、産業規模でのアルファのマイニングは、想像できる最大の複数のテストマシンでもあり、それに関するこのブログの立場は決定されています。サイズの探索 そのサイズの検索で予想される幸運を考慮して圧縮する必要があります。 The Defrated Sharpe Ratio は、640 セルのグリッドが単純有意性テストをすでに破っていることを示し、The Honest Negative は、DSR まで収縮する +16.35% のサンプル外勝者を生成する約 37,000 の試行検索を示しています。 0.00。ライブラリのサイズはエッジの証拠ではありません。それはあなたが支払わなければならない分母です。
まとめる
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
最後の箱は飾りではありません。積み重ねる ベースモデルのサイズ選定手順 、そしてしぼまないアンサンブル記事は弁護の余地がありません。
テイクアウト
- 構造の違いがモデル数を上回ります。 共分散項は、 。 6 番目の相関ツリーを追加することは多様化ではありません。別のモデルクラスまたは互いに素な機能ドメインを追加することです。
- **有効な結果を報告します- ** 5 つの推定量、5 つの答え、場合によっては 2 桁異なることもあります。
- メタ学習器を線形に保ちます。 結合層の複雑さはほとんどの場合過学習であり、そこでの L1 は有用な自動モデル選択を行います。
- アウトオブフォールドか何もなし。 サンプル内ベース予測で訓練されたメタ学習者は、高い自信を持って間違った重みを学習します。
- アンサンブル自体を収縮させます。 スタッキングは検索です。 1つ分の価格を設定します。
さらに読む:
- カクシャゼ、Z. (2016)。 101 の公式アルファ
- 投資におけるアンサンブル学習 — CFA Institute Research Foundation、2025
- 株価収益率予測: さまざまなモデルの積み重ね — Journal of Financial Economy
- Jansen, S. アルゴリズム取引のための機械学習、第 2 版
Authors
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.