앙상블 방법: 강력한 알파를 위한 약한 학습기 결합
거래 앙상블에 관한 대부분의 글은 더 많은 모델이 더 낫다고 주장합니다. 그것은 잘못된 축입니다. 앙상블의 오류는 세 가지 항으로 분해되며 거래에서는 그 중 하나만 구속력 있는 제약 조건이 됩니다.
이 기사는 해당 용어에 관한 것이며 이 블로그의 나머지 부분에서는 다루지 않는 두 가지 결과에 대한 것입니다. 즉, 명시적인 신호 조합 레이어로 스택을 쌓는 것과 많은 신호를 결합하면 실제로 거래가 시장에 도달하기 전에 매출이 감소하는지 여부입니다.
실제로 결합하는 용어: 편향-분산-공분산
회귀 앙상블의 경우 모델, 평균 예측의 예상 제곱 오차 다음과 같이 분해됩니다.
세 가지 용어, 세 가지 레버:
- 배깅은 부트스트랩 샘플에 대한 평균을 구하여 분산 항을 공격합니다.
- 부스팅은 잔차를 반복적으로 수정하여 편향 항을 공격합니다.
- 스태킹은 동일한 가중치를 가정하는 대신 조합 가중치를 학습하여 공분산 항을 공격합니다.
- 증가 분산 기여만 축소합니다. 공분산에는 전혀 영향을 미치지 않습니다. 계수는 이미 0.99입니다. .
마지막 요점이 전체 주장입니다. 거래에서 모델은 동일한 가격 시리즈의 거의 동일한 변환인 목표에 대해 동일한 기록에 걸쳐 동일한 상품에 대해 훈련됩니다. 그들의 오류는 독립적이지 않습니다. 따라서 공분산 항은 크고 분산 항은 이미 소진되었습니다. 즉, 모델 수는 거의 아무것도 사지 않으며 구조적 차이는 모든 것을 사게 됩니다.
주장의 구체적이고 위조 가능한 형태: 101번째 그래디언트 부스팅 트리를 추가하면 구조적으로 다른 하나의 모델을 추가하는 것보다 앙상블 메트릭이 덜 이동해야 합니다 — LSTM, 서로 다른 특징 도메인의 선형 모델, 다른 귀납적 편향이 있는 모든 것. 한계 나무는 이미 책에 있는 나무와 거의 동일 선상에 있습니다. 구조적으로 다른 모델은 그렇지 않습니다.
모델 수가 아닌 상관 관계가 앙상블의 유효 폭을 설정합니다. 파생, 자산 클래스별 암호화 측정 상관 계수 및 실제 쌍 데이터에 대한 시뮬레이션은 신호 상관 관계: 모니터링할 쌍 수에 있습니다.
앙상블 다양성을 단일 숫자로 줄이지 마십시오. 수축된 샤프 비율은 5개의 유효- 실제 640셀 그리드의 추정기(평균 상관 관계, 참여 비율, PCA-95%, Kaiser, Cheverud-Nyholt)는 범위가 다양함을 보여줍니다. 1.6에서 370까지이며 단일 지점 추정치가 아닌 대역이 결과물이라고 주장합니다. 밴드를 신고하세요.
신호 조합 레이어로 스태킹
배깅과 부스팅은 다른 곳에서도 잘 다루고 있습니다. 기계 학습을 통한 확산 모델링은 경사 부스팅 설정, 편향된 대상에 대한 손실 선택, SHAP 중요도 조사 결과, 기능 분류 및 격차를 유발하는 정방향 창 중첩이 있는 제거된 Walk-forward 분할을 제공합니다. 거기에서 시작하세요. 이 섹션에서는 이를 가정합니다.
다루지 않는 것은 위 수준입니다. 기본 모델 예측을 입력 기능으로 사용하고 이를 결합하는 방법을 배우는 메타 학습자입니다.
- 레벨 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)
여기서 분할 규율은 선택 사항도 아니고 새로운 것도 아닙니다. 제거되고 금지된 워크포워드를 사용하고 이러한 숫자를 신뢰하기 전에 부풀려진 Sharpe에서 각 누출 클래스의 가치를 이해하십시오. 둘 다 이미 측정되었습니다. 예측 편향 분류는 제어된 시뮬레이터에서 실행, 표시기 및 정규화 누출을 정량화하고 walk-forward 최적화는 고정 창과 롤링 창, CPCV, 제거 및 WFER 저하 진단을 다룹니다.
세 가지 디자인 결정은 스태킹과 관련이 있으며 언급할 가치가 있습니다.
메타 학습기 단순성. 선형 모델(능선, 올가미, 로지스틱 회귀)을 사용합니다. 기본 학습자는 비선형성을 처리합니다. 메타 학습자는 조합만 처리합니다. 복잡한 기본 학습기 위에 있는 복잡한 메타 학습기는 2차 과적합이며, 조합 레이어의 L1 정규화는 노이즈만 기여하는 기본 모델을 0으로 만드는 유용한 부작용이 있습니다.
하드 라벨에 대한 확률 출력. 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))
각 기본 모델은 도메인 전문가가 됩니다. 운동량 모델은 볼륨 노이즈의 간섭 없이 운동량 패턴을 학습하고, 메타 학습자는 어떤 조건에서 어떤 전문가를 신뢰할지 학습합니다.
마지막 조항에 대한 두 가지 경고 사항. 첫째, 정권 조건부 가중치는 해결되어 발표된 문제입니다. HMM을 사용한 정권 감지는 Forward/Viterbi/Baum-Welch를 통해 정권을 적절하게 도출하여 이를 다운스트림 앙상블에 기능으로 제공하고 동적 결합 전략은 정권 가중 평균 회귀 대 모멘텀을 다룹니다. 보고된 결과와 함께. 둘 중 하나를 임시 모멘텀 서명 프록시로 대체하지 마십시오. 둘째, 표본 내 성과에 대한 선택은 살아남지 못하는 승자를 만들어냅니다. 일반 메커니즘과 CSCV 방어는 백테스트 과적합 확률에서 측정됩니다. 스태킹은 바로 그 문제의 더 좁은 예입니다.
모델 예측이 아닌 반환 스트림에 가중치를 부여하는 경우 평균 분산을 다시 도출하지 마세요. 12가지 포트폴리오 최적화 알고리즘 비교 HRP, HERC, GHRP, MHRP, Black-Litterman, NCO, MVO, 위험 패리티 및 측정된 결과와 오픈 소스 코드를 통한 균등 가중치 경쟁; 암호화폐에 대한 Markowitz 포트폴리오 이론에는 SLSQP 평균 분산 구현이 있습니다. 1/N은 이기기 어렵다는 결과는 이미 HRP/CVaR 포트폴리오 파이프라인에서 HRP 및 CVaR에 대해 테스트되었습니다.
매출 상계: 테스트할 가치가 있는 주장
다음은 이 블로그의 실행 비용 클러스터에서 현재 다루지 않는 알파 라이브러리 주장의 일부입니다.
동일한 재조정에서 Alpha #4,721이 "MSFT 구매"라고 말하고 Alpha #8,392가 "MSFT 매도"라고 하면 해당 거래는 내부적으로 교차됩니다. 순 포지션만 시장에 도달합니다. 주장은 충분한 신호를 통해 총 의도된 매출의 상당 부분이 스프레드, 수수료 또는 시장 영향이 발생하기 전에 취소된다는 것입니다. 이는 앙상블이 단순히 더 안정적일 뿐만 아니라 구성 요소의 합보다 운영 비용이 더 저렴하다는 것을 의미합니다.
이는 계단식 전략 조정에서 이미 처리하고 있는 것과는 별개의 메커니즘입니다. 캐스케이드는 슬롯 수준에서 충돌을 해결합니다. 동일한 쌍, 반대 방향은 점수로 금지 및 해결되고, 교차 쌍 퇴거는 우선 순위 대기열을 통해 실행되며, 기사는 시간 중복과 자본 제약으로 인해 전략별 손익을 단순히 합산할 수 없다는 것을 경험적으로 증명합니다. 네팅은 거래량 자체를 줄이는 총 순 포지션 산술에 관한 것입니다.
위조하는 것도 저렴합니다. 구성 요소 신호가 결합될 때 실제 채우기에 대한 총 매출액과 순 매출액을 계산한 다음 기존 비용 시스템을 통해 가격을 책정합니다. — 메이커 테이커 수수료 및 리베이트, 구현 부족분 및 TCA 및 슬리피지 비용 모델.
알파 라이브러리 프레임이 이를 초대하므로 규모에 대한 메모입니다. WorldQuant는 매우 큰 알파 라이브러리와 Kakushadze의 101 Formulaic Alphas는 개별 신호의 모양을 문서화합니다. 그러나 산업 규모의 알파 채굴은 상상할 수 있는 가장 큰 다중 테스트 기계이기도 하며 이에 대한 이 블로그의 입장은 정해져 있습니다. 해당 규모의 검색에서 예상되는 행운에 비해 수축되어야 합니다. The Deflated Sharpe Ratio는 이미 순진한 유의성 테스트를 깨뜨린 640셀 그리드를 보여 주며, The Honest Negative는 ~37,000회 시도 검색을 통해 DSR로 축소되는 +16.35% 샘플 외 승자를 생성하는 것을 보여줍니다. 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
마지막 상자는 장식이 아닙니다. 쌓아올려 기본 모델은 크기 선택 절차입니다. , 수축되지 않는 앙상블 기사는 방어할 수 없습니다.
테이크아웃
- 구조적 차이가 모델 수를 능가합니다. 공분산 항은 다음과 같이 줄어들지 않습니다. . 여섯 번째 상관 트리를 추가하는 것은 다양화가 아닙니다. 다른 모델 클래스를 추가하거나 분리된 기능 도메인을 추가하는 것입니다.
- 효과적인 보고- 밴드, 포인트가 아님. 5개의 추정값, 5개의 답변, 때로는 2자리 크기의 차이가 있습니다.
- 메타 학습자를 선형으로 유지합니다. 조합 레이어의 복잡성은 거의 항상 과적합되며 L1은 유용한 자동 모델 선택을 수행합니다.
- Out-of-fold 또는 없음. 샘플 내 기본 예측에 대해 훈련된 메타 학습자는 높은 신뢰도로 잘못된 가중치를 학습합니다.
- 앙상블 자체를 수축시킵니다. 스태킹은 검색입니다. 가격을 하나처럼 책정하세요.
추가 자료:
- Kakushadze, Z. (2016). 101 공식 알파
- 투자 앙상블 학습 — CFA 연구소 연구 재단, 2025
- 주가수익률 예측: 다양한 모델의 스택 — Journal of Financial Economics
- 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.