Ансамбльдік әдістер: Әлсіз оқушыларды сенімді альфа үшін біріктіру
Сауда ансамбльдері туралы жазбалардың көпшілігі көбірек модельдердің жақсырақ екенін айтады. Бұл дұрыс емес ось. Ансамбльдің қателігі үш шартқа ыдырайды және саудада олардың тек біреуі ғана міндетті шектеу болып табылады.
Бұл мақала осы бір термин туралы және оның осы блогтың қалған бөлігін қамтымайтын екі салдары туралы: айқын сигналды біріктіру қабаты ретінде стектеу және көптеген сигналдарды біріктіру сауда-саттық нарыққа жеткенге дейін айналымды азайтады ма.
Іс жүзінде байланыстыратын термин: қиғаштық-дисперсиялық-ковариация
регрессиялық ансамблі үшін модельдер, орташа болжамның күтілетін квадрат қатесі былай ыдырайды:
Үш термин, үш тұтқа:
- Bagging жүктеу үлгілерінен орташалау арқылы дисперсия терминіне шабуыл жасайды.
- Boosting қалдықтарды итеративті түзету арқылы қиғаш терминге шабуыл жасайды.
- Стекинг тең мәндерді қабылдаудың орнына біріктірілген салмақтарды үйрену арқылы коварианттық терминге шабуыл жасайды.
- Арту тек дисперсия үлесін қысқартады. Ол коварианттылыққа мүлдем ештеңе жасамайды — the коэффициент қазірдің өзінде 0,99 болды .
Бұл соңғы нүкте - бүкіл аргумент. Сауда-саттықта модельдер бірдей құралдарда, бір тарихта, өздері бірдей бағалар қатарының бірдей трансформациялары болып табылатын мақсаттарға қарсы оқытылады. Олардың қателіктері тәуелсіздікке жақын емес. Сонымен, ковариация термині үлкен және дисперсия термині таусылған, яғни модельдер саны сізге ештеңе дерлік сатып алмайды, ал құрылымдық айырмашылық бәрін сатып алады.
Шағымның нақты, бұрмаланатын түрі: 101-ші градиентті күшейтілген ағашты қосу құрылымдық жағынан басқа модельді қосқаннан гөрі ансамбль метрикасын азырақ жылжытуы керек — LSTM, ажыратылған мүмкіндік доменіндегі сызықтық модель, басқа индуктивті қиғаштығы бар кез келген нәрсе. Шекті ағаш кітаптағы ағаштармен дерлік сәйкес келеді; құрылымдық жағынан басқа модель емес.
Модельдер саны емес, корреляция ансамбльдің тиімді кеңдігін белгілейді — туынды, актив класы бойынша крипто-өлшенген корреляция факторлары және нақты жұп деректеріне қарсы модельдеу Сигнал корреляциясы: Қанша жұп бақылауға болады бөлімінде.
Ансамбльдің әртүрлілігін бір санға дейін азайтпаңыз. Дефлятталған Sharpe Ratio бес тиімді- нақты 640 ұяшықты тордағы бағалаушылар (орташа корреляция, қатысу коэффициенті, PCA-95%, Kaiser, Cheverud-Nyholt) олардың аралығын көрсетеді 1,6-дан 370-ке дейін және жолақ - кез келген бір нүктелік бағалау емес - жеткізілетінін дәлелдейді. Топқа есеп беру.
Сигнал-комбинация қабаты ретінде жинақтау
Қаптау және күшейту басқа жерде жақсы қамтылған. Machine Learning көмегімен таралатын модельдеу градиентті күшейтетін орнатуды, қиғаш мақсаттар үшін жоғалтуды таңдауды, 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)
Бұл жерде бөлу тәртібі міндетті емес және жаңа емес — тазартылған, эмбарго қойылған алға жүруді пайдаланыңыз және осы сандардың кез келгеніне сенбес бұрын шарпты Шарпта ағып кетудің әрбір класы қаншалықты маңызды екенін түсініңіз. Екеуі де қазірдің өзінде өлшенген: алға қарай қарау таксономиясы бақыланатын тренажерде орындауды, индикаторды және қалыпқа келтірудің ағып кетуін және алға қарай жүруді оңтайландыру және CV, CV, CV, және WFER деградация диагностикасы.
Үш жобалық шешім жинақтауға тән және атап өтуге тұрарлық.
Мета-оқушының қарапайымдылығы. Сызықтық үлгіні қолданыңыз — жота, лассо, логистикалық регрессия. Базалық оқушылар сызықты еместікті өңдейді; мета-оқушы тек комбинацияны өңдейді. Күрделі базалық үйренушілердің үстіндегі күрделі мета-оқушы екінші ретті шамадан тыс орнату болып табылады және аралас қабаттағы 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))
Әрбір базалық модель домен сарапшысы болады: импульс моделі көлемді шудың кедергісіз импульс үлгілерін үйренеді және мета-үйренуші қай жағдайда қандай сарапшыға сену керектігін үйренеді.
Осы соңғы тармаққа екі ескерту. Біріншіден, режимді шартты салмақтау шешілген және жарияланған мәселе болып табылады — HMMs көмегімен режимді анықтау режимдерді Forward/Viterbi/Baum-Welch арқылы дұрыс шығарады және оларды төменгі ағындық ансамбльге мүмкіндіктер ретінде береді және динамикалық түрде біріктіру және strategies режим бойынша өлшенген орташа кері қайтаруды және хабарланған нәтижелермен импульсті қамтиды. Олардың екеуіне де арнайы импульстік белгі проксиін ауыстырмаңыз. Екіншіден, үлгідегі өнімділік бойынша таңдау өмір сүрмейтін жеңімпаздарды шығарады; жалпы механизм және CSCV қорғанысы [backtest overfitting ықтималдығы] (/en/blog/post/probability-backtest-overfitting-pbo) арқылы өлшенеді. Стек - дәл осы мәселенің тар данасы.
Үлгі болжамдарынан гөрі қайтару ағындарын салмақтау үшін орташа дисперсияны қайта шығармаңыз. 12 Портфолионы оңтайландыру алгоритмдері, салыстырмалы жарыстар HRP, HERC, GHRP, MHRP, Black-Litterman, NCO, MVO, тәуекел паритеті және өлшенген нәтижелер мен ашық бастапқы кодпен тең салмақ; Крипто үшін Марковиц портфолио теориясы SLSQP орташа дисперсияны іске асыруға ие; және 1/N-жұмылуы қиын нәтиже HRP/CVaR портфолио құбырында HRP және CVaR-ге қатысты сыналған.
Тауар айналымы: тексеруге тұрарлық шағым
Бұл блогтың орындау құны кластері қазіргі уақытта қамтымайтын альфа-кітапхана аргументінің бөлігі.
Альфа №4,721 «MSFT сатып алу» және Альфа №8,392 бірдей қайта теңгерімде «MSFT сату» деп айтқан кезде, бұл сауда-саттықтар іштей қиылысады. Тек таза позиция нарыққа жетеді. Талап мынада: жеткілікті сигналдармен жалпы жоспарланған айналымның үлкен бөлігі спрэд, алымдар немесе нарыққа әсер етпей тұрып тоқтатылады - бұл ансамбльдің жұмысы оның тұрақты емес, оның құрамдас бөліктерінің қосындысынан гөрі арзанырақ екенін білдіреді.
Бұл каскадтық стратегия оркестрі басқаратын механизмнен ерекше механизм. Каскад слот деңгейіндегі қақтығыстарды шешеді: бірдей жұп, қарама-қарсы бағыт тыйым салынады және ұпай бойынша реттеледі, жұптар арасындағы көшіру басымдылық кезектер арқылы өтеді және мақала уақыттың қабаттасуы мен капитал шектеулеріне байланысты әр стратегияны PnL жай ғана қорытындылауға болмайтынын эмпирикалық түрде дәлелдейді. Неттинг - бұл брутто-нетто позиция арифметикасы саудаланған мөлшердің өзін азайту.
Бұны бұрмалау да арзан: құрамдас сигналдар біріктірілген кезде нақты толтырулар бойынша жалпы және таза айналымды есептеңіз, содан кейін бар шығындар механизмі арқылы бағалаңыз — мейкер-такердің алымдары мен жеңілдіктері, іске асыру тапшылығы және TCA және slippage cost models.
Альфа-кітапхана жақтауы оны шақыратындықтан, масштабтағы ескертпе. WorldQuant өте үлкен альфа кітапханасын шығарғанын хабарлайды және Какушадзенің 101 формулалық альфасы жеке сигналдардың пішінін құжаттайды. Бірақ өнеркәсіптік масштабтағы тау-кен альфалары - бұл елестетуге болатын ең үлкен бірнеше сынақ машинасы және бұл блогтың позициясы бекітілген: өлшемді іздеу сол өлшемдегі іздеудің күтілетін сәттілігіне қарсы дефляциялануы керек. Deflated Sharpe Ratio 640-ұяшықтан тұратын торды көрсетеді және қазірдің өзінде аңғал маңыздылық сынамасын бұзады, ал [The Honest Negative](/en/blog/post/honest-negative-no-robust-edge, іздеу) a00-37 деңгейін көрсетеді. +16,35% үлгіден тыс жеңімпаз, ол DSR 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
Соңғы қорап безендіру емес. Үстінде жинақтау базалық модельдер - өлшемді таңдау процедурасы , және дефляцияланбайтын ансамбльдік мақаланы қорғауға болмайды.
Алып кетулер
- Құрылымдық айырмашылық үлгілер санынан асып түседі. Коварианс термині кішіреймейді. . Алтыншы корреляциялық ағашты қосу әртараптандыру емес; басқа үлгі класын немесе бөлек функция доменін қосу болып табылады.
- Тиімділігін хабарлау- жолақ, нүкте емес. Бес бағалаушы, бес жауап, кейде бір-бірінен екі рет.
- Мета-оқушыны сызықтық ұстаңыз. Біріктірілген қабаттағы күрделілік әрқашан дерлік шамадан тыс болады, ал L1 мұнда пайдалы автоматты үлгіні таңдауға мүмкіндік береді.
- Бүктемеден тыс немесе ештеңе жоқ. Үлгідегі базалық болжамдар бойынша дайындалған мета-оқушы қате салмақтарды жоғары сенімділікпен үйренеді.
- Ансамбльдің өзін өшіріңіз. Стектеу - бұл іздеу. Бірдей бағалаңыз.
- Қосымша оқу:*
- Какушадзе, З. (2016). 101 формулалық альфалар
- Инвестициядағы ансамбльді оқыту — CFA институтының зерттеу қоры, 2025 ж.
- Акциялардың кірістілігін болжау: әртүрлі үлгілерді жинақтау — Қаржылық экономика журналы
- Янсен, С. Алгоритмдік саудаға арналған машинаны үйрену, 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.