Системалык соода түтүктөрү үчүн AutoML
Системалык соода түтүктөрү үчүн # AutoML
This blog has spent a long arc on how to search: which sampler to use and when (the crossover is eval cost), how to price the search you ran (the Deflated Sharpe Ratio), how to score the selection procedure itself (PBO), and where that whole apparatus honestly lands (no robust edge).
Ал эч качан камтылбаган нерсе - сиз издеген нерсе. Бул макалалардын бардыгы функциялар топтомун жана стратегия үй-бүлөсүн берилгендей кабыл алып, анын ичиндеги параметрлерди оптималдаштырат. AutoML жогорудагы катмарга чабуул жасайт — ал талапкерлердин өздөрүн курууну автоматташтырат. Анын үч бөлүгү бул блогдун башка эч жеринде жок:
- Автоматташтырылган функцияларды чыгаруу — tsfresh бир баа сериясын ~794 статистикалык мүнөздөмө өзгөчөлүккө айландырат жана Deep Feature Synthesis аркылуу тиешелүү базар таблицаларында функцияларды түзгөн Featuretools.
- Бюджетти түшүнгөн AutoML — FLAMLдин чыгашаны үнөмдүү оптималдаштыруусу, ал баасына карабастан эмес, эсептөө бюджетинин ичинде мыкты моделди табат.
- Формулалык альфа фабрикасы — WorldQuant's 101 Formulaic Alphas түзүүчү оператордун грамматикасы катары машина санай алат.
Калганынын баары - максаттуу функция, валидация схемасы, бир нече тестирлөө тууралоо - бул жерде башка жерде өлчөнөт, андыктан бул макала кайра окутпайт. Бул адаттагыдан маанилүүрөөк, анткени AutoML сыноонун санын жардырууга мажбурлайт жана сыноонун саны дал жаанын калган бөлүгү жөнүндө болуп саналат.
! ZXQKEEP0QXZ
AutoML эмнени автоматташтырат
AutoML бир алгоритм эмес. Бул түтүктүн ар кандай этаптарын автоматташтыруучу техникалардын үй-бүлөсү:
| Этап | Manual Approach | AutoML Approach |
|---|---|---|
| Өзгөчөлүк инженериясы | Домен эксперттик кол өнөрчүлүк көрсөткүчтөрү | Автоматташтырылган казып алуу (tsfresh, Featuretools) |
| Функция тандоо | Корреляциялык анализ, интуиция | Статистикалык гипотезаны текшерүү, SHAP |
| моделди тандоо | 2-3 моделди байкап көрүңүз | ондогон окуучуларды издөө |
| Hyperparameter тюнинг | Тор издөө, кол менен өзгөртүү | Bayesian / үнөмдүү издөө (Optuna, FLAML) |
| Архитектура дизайн | Туруктуу нейрондук тармак топологиясы | Нейрондук Архитектура Издөө (УИА) |
| Ансамблди куруу | Кол менен тизүү | Автоматташтырылган ансамблди тандоо |
Системалуу соодада талапкер мейкиндиги эбегейсиз зор — бир OHLCV сериясы жүздөгөн техникалык функцияларды жаратат, ал эми бир нече активдер, заказдар китебинин маалыматтары жана альтернативалуу булактар аны комбинатордук кылат. Алдын ала коркунуч дагы: ар бир талапкер – бул сыноо, ал эми сыноолор жалган ачылыштарды жаратат.
One AutoML-specific point on the objective: the metric the search maximizes must be the financial one, because the search will optimize exactly what you wrote down and nothing you meant. Which scalar you pick silently selects your strategy — see Objective-Function Design, where a naive per-trade Sharpe crowns a sub-5%-exposure lottery in 56% of 600 seeds and posts an in-sample Sharpe of 21 that collapses to 0.13 out of sample. Wire the financial metric into the AutoML scorer from the start; do not optimize roc_auc and hope it transfers.
Автоматташтырылган өзгөчөлүк инженериясы
Функция инженериясы альфалардын көбү жашайт. Чийки баа маалыматтары бардыгы үчүн бирдей. Бул маалыматтарды болжолдоочу сигналдарга айландыруу кирешелүү стратегияларды ызы-чуудан бөлүп турат.
! ZXQKEEP0QXZ
tsfresh: Бир баа сериясынан 800+ өзгөчөлүккө чейин
tsfresh (Time Series Feature Extraction based on Scalable Hypothesis Tests) is purpose-built for time series feature extraction. It computes 63 characterization methods that expand into ~794 features by default, including:
- Статистикалык учурлар (орто, дисперсия, кыйшаюу, куртозис)
- Көптөгөн артта калуулардагы автокорреляция
- Фурье коэффициенттери жана спектрдик энергия
- Татаалдуулук чаралары (болжолдуу энтропия, үлгү энтропиясы)
- Сызыктуу эмес өзгөчөлүктөр (Фридрих коэффициенттери, max Langevin туруктуу чекити)
- Квантилдерди жана диапазондорду өзгөртүү
For financial data, this means a single price series produces hundreds of candidate features — many capturing dynamics that manual feature engineering would miss. This is a materially different approach from the hand-crafted, domain-derived feature sets used in spread modeling and DeepLOB: there a human decides that order-book imbalance matters; here a library enumerates everything and lets a hypothesis test decide. For financial data, this means a single price series produces hundreds of candidate features — many capturing dynamics that manual feature engineering would miss. This is a materially different approach from the hand-crafted, domain-derived feature sets used in spread modeling and DeepLOB : there a human decides that order-book imbalance matters; here a library enumerates everything and lets a hypothesis test decide.
import pandas as pd
import numpy as np
from tsfresh import extract_features, select_features
from tsfresh.utilities.dataframe_functions import impute
def prepare_rolling_windows(df: pd.DataFrame, window_size: int = 20) -> pd.DataFrame:
"""Convert OHLCV DataFrame into rolling windows for tsfresh."""
records = []
for i in range(window_size, len(df)):
window = df.iloc[i - window_size:i].copy()
window["id"] = i # window identifier
window["time"] = range(window_size)
records.append(window[["id", "time", "close", "volume", "high", "low"]])
return pd.concat(records, ignore_index=True)
df_ohlcv = pd.read_csv("btc_1h.csv", parse_dates=["timestamp"])
df_rolled = prepare_rolling_windows(df_ohlcv, window_size=24)
features = extract_features(
df_rolled,
column_id="id",
column_sort="time",
n_jobs=8, # parallel extraction
disable_progressbar=False,
)
impute(features)
y = df_ohlcv["close"].pct_change(4).shift(-4).iloc[24:].reset_index(drop=True)
y_binary = (y > 0).astype(int)
features_selected = select_features(features, y_binary, fdr_level=0.05)
print(f"Selected {features_selected.shape[1]} features from {features.shape[1]}")
The select_features function applies a Benjamini-Yekutieli procedure to control the false discovery rate across the whole feature battery — which is the right instinct, and the same instinct the Deflated Sharpe article applies to strategy searches. Note what it does not do: FDR control on the feature-selection step says nothing about the trial cost of the model search that follows it. Those are two separate multiplicities and both have to be paid.
Featuretools: Deep Feature Synthesis
While tsfresh focuses on time series characterization, Featuretools excels at relational feature engineering — constructing features by composing primitive operations across related tables.
Соода үчүн, бул сизде көп таблицалуу маалыматтарга ээ болгондо күчтүү: соода тарыхы, буйрутма китебинин сүрөттөрү, каржылоо тарифтери жана чынжырдагы көрсөткүчтөр. Featuretools трансформация жана бириктирүү примитивдерин топтогон Deep Feature Synthesis (DFS) колдонот: For trading, this is powerful when you have multi-table data: trade history, order book snapshots, funding rates, and on-chain metrics. Featuretools applies Deep Feature Synthesis (DFS), which stacks transformation and aggregation primitives:
import featuretools as ft
es = ft.EntitySet(id="crypto_trading")
es = es.add_dataframe(
dataframe_name="candles",
dataframe=df_candles,
index="candle_id",
time_index="timestamp",
)
es = es.add_dataframe(
dataframe_name="orderbook",
dataframe=df_orderbook,
index="snapshot_id",
time_index="timestamp",
)
es = es.add_dataframe(
dataframe_name="funding",
dataframe=df_funding,
index="funding_id",
time_index="timestamp",
)
feature_matrix, feature_defs = ft.dfs(
entityset=es,
target_dataframe_name="candles",
agg_primitives=["mean", "std", "max", "min", "skew", "trend"],
trans_primitives=["percentile", "diff", "cum_mean"],
max_depth=2, # compose up to 2 primitives deep
features_only=False,
)
print(f"Generated {len(feature_defs)} features via DFS")
The time_index declaration is load-bearing: it is what lets Featuretools compute aggregations using only rows that existed at the cutoff. Get it wrong and DFS will happily build a feature out of the future — the relational-data instance of the leaks catalogued in the look-ahead bias taxonomy.
Tsfresh (убакыт серияларынын мүнөздөмөлөрү) жана Featuretools (реляциялык синтез) айкалышы сизге индикатордун кол менен коддолбогон чийки базар маалыматтарынан миңдеген талапкер сигналдарын чыгарган өзгөчөлүктөр фабрикасын берет.
Бюджетти түшүнгөн AutoML: FLAML
We assume Optuna and Tree-structured Parzen Estimators as background — the derivation, sampler comparison and benchmark are in Coordinate Descent vs Bayesian Optimization. On which sampler to reach for, this blog's own measurement is the reference and it is not the folklore answer: the crossover is governed by evaluation cost, not algorithm cleverness — when a backtest is nearly free, scrambled Sobol wins on throughput (~2,830 cfg/s against ~154 for TPE), and only expensive evaluations make sample efficiency pay (Random vs Smart Search).
! ZXQKEEP0QXZ
That framing is what makes FLAML a different axis rather than a competing sampler. Optuna asks where to sample next; FLAML (Fast Lightweight AutoML) asks what can I afford to sample at all. It optimizes for the best model within a time or compute budget using CFO (Cost-Frugal Optimization), which prioritizes cheap-to-evaluate configurations early and escalates only when the estimated marginal gain justifies the spend. That framing is what makes FLAML a different axis rather than a competing sampler. Optuna asks where to sample next; FLAML (Fast Lightweight AutoML) asks what can I afford to sample at all. It optimizes for the best model within a time or compute budget using CFO (Cost-Frugal Optimization), which prioritizes cheap-to-evaluate configurations early and escalates only when the estimated marginal gain justifies the spend.
from flaml import AutoML
from sklearn.metrics import make_scorer
import numpy as np
def sharpe_score(y_true, y_pred):
"""Custom scorer: Sharpe ratio of predicted signals."""
signal = np.sign(y_pred - 0.5)
returns = signal * y_true # y_true contains forward returns
if returns.std() == 0:
return 0.0
return np.sqrt(252) * returns.mean() / returns.std()
sharpe_scorer = make_scorer(sharpe_score, greater_is_better=True)
automl = AutoML()
automl_settings = {
"time_budget": 300, # 5 minutes
"metric": sharpe_scorer, # optimize the financial objective, not accuracy
"task": "classification",
"estimator_list": [
"lgbm", "xgboost", "rf", "extra_tree", "catboost",
],
"eval_method": "cv",
"split_type": "time", # time series split (no future leakage)
"n_splits": 5,
"log_file_name": "flaml_trading.log",
"seed": 42,
}
automl.fit(
X_train=X_train,
y_train=y_train,
**automl_settings,
)
print(f"Best model: {automl.best_estimator}")
print(f"Best config: {automl.best_config}")
from flaml.data import get_output_from_log
time_history, best_valid_loss_history, valid_loss_history, config_history, metric_history = \
get_output_from_log(filename="flaml_trading.log", time_budget=300)
соода үчүн FLAML артыкчылыгы гетерогендүү моделдердин түрлөрү боюнча эсептөө бөлүштүрүү болуп саналат. Эгерде LightGBM конфигурациялары CatBoostка караганда 10 эсе тезирээк баа берсе, FLAML LightGBM'ди эрте изилдеп чыгат жана азыраак жакшыруу баасын актаганда гана которулат. Бул жалпыланган кроссовер макаласынан алынган арзан режимдин түшүнүгү: өткөрүү жөндөмдүүлүгү издөө бюджетиндеги биринчи класстагы термин, ишке ашыруу деталдары эмес.
Траектория журналы сактоого арзырлык бөлүгү болуп саналат. ZXQKEEP0QXZ сизге толук конфигурация таржымалын берет, бул сиздин сынамык саныңыз — жана сыноо эсеби сиз карыз боло турган ар бир дефляцияга кириш болуп саналат.
Нейрондук архитектура соода моделдерин издөө
Neural Architecture Search automates the design of network topologies rather than the tuning of a fixed one. Architecture choice for financial series is genuinely non-obvious — non-stationarity, low signal-to-noise, mixed frequencies and dependencies spanning minutes to months all pull in different directions — but that motivation is already argued concretely elsewhere: see Temporal Fusion Transformer on when TFT beats LSTM beats vanilla Transformer, and DeepLOB on the CNN+Inception+LSTM tradeoff, for what carefully hand-designed fixed architectures already achieve. NAS is the argument that this choice should itself be searched.
Research on Neuroevolution NAS for Stock Return Prediction reports that RNNs evolved via EXAMM (Evolutionary eXploration of Augmenting Memory Models) outperformed the DJI and S&P 500 in both bear (2022) and bull (2023) markets using simple long-short strategies. Treat that as a third-party claim, not as a result reproduced here — it is a best-of-search figure with no deflation reported.
УИАнын соода мейкиндигин издөө
Соода моделдери үчүн практикалык NAS издөө мейкиндиги төмөнкүлөрдү камтыйт: A practical NAS search space for trading models includes:
Search Space:
- Cell types: {LSTM, GRU, Temporal Conv, Transformer block, Linear}
- Number of layers: [1, 8]
- Hidden dimensions: {32, 64, 128, 256}
- Attention heads (if Transformer): {2, 4, 8}
- Dropout rate: [0.0, 0.5]
- Skip connections: {True, False}
- Normalization: {BatchNorm, LayerNorm, None}
- Activation: {ReLU, GELU, SiLU, Mish}
- Lookback window: {20, 60, 120, 252}
Майкрософттун NNI (Neural Network Intelligence) менен сиз бул мейкиндикти аныктап, издей аласыз: With NNI (Neural Network Intelligence) from Microsoft, you can define and search this space:
import nni
from nni.nas.nn.pytorch import LayerChoice, InputChoice
import torch
import torch.nn as nn
class TradingNASModel(nn.Module):
"""NAS-searchable model for financial time series."""
def __init__(self, input_dim: int, seq_len: int):
super().__init__()
self.input_proj = nn.Linear(input_dim, 128)
self.temporal_block = LayerChoice([
nn.LSTM(128, 128, num_layers=2, batch_first=True, dropout=0.1),
nn.GRU(128, 128, num_layers=2, batch_first=True, dropout=0.1),
nn.TransformerEncoder(
nn.TransformerEncoderLayer(d_model=128, nhead=4, batch_first=True),
num_layers=2,
),
], label="temporal_cell")
self.head = LayerChoice([
nn.Sequential(nn.Linear(128, 64), nn.ReLU(), nn.Linear(64, 1)),
nn.Sequential(nn.Linear(128, 32), nn.GELU(), nn.Linear(32, 1)),
nn.Linear(128, 1),
], label="prediction_head")
self.skip = InputChoice(n_candidates=2, n_chosen=1, label="skip_conn")
self.skip_proj = nn.Linear(input_dim, 128)
def forward(self, x: torch.Tensor) -> torch.Tensor:
h = self.input_proj(x)
out = self.temporal_block(h)
if isinstance(out, tuple):
out = out[0]
last = out[:, -1, :]
skip_val = self.skip_proj(x[:, -1, :])
last = self.skip([last, last + skip_val])
return self.head(last).squeeze(-1)
Издөө алгоритми (ENAS, DARTS же эволюциялык) талапкер архитектураларын каржылык максатты колдонуу менен валидация топтомун баалайт, андан кийин акырындык менен жогорку натыйжалуу топологияларга карай тарыйт. Бул макаладагы бардык башка нерселерге каршы нарк асимметриясына көңүл буруңуз: NAS баалоо огунун эң кымбат четинде отурат, бул үлгү эффективдүү үлгү алгычтар жана көп кырдуу кесүү чындап өзүн актай турган бир режим.
WorldQuant Alpha Factory мамилеси
WorldQuantтын альфаны ачууга болгон мамилеси каржыдагы AutoML принциптеринин эң өнөр жайлык масштабдуу ишке ашырылышы болуп саналат. Игорь Тулчинский тарабынан негизделген WorldQuant алар "альфа-фабрика" деп атаган нерсени башкарат — бул миллиондогон болжолдоочу сигналдарды түзүү, сыноо жана бириктирүү үчүн системалуу процесс.
Философия: экспоненциалдык альфа мууну жана аны оңдоо
WorldQuant 2010-жылы бир миллион альфага жетүүнү максат кылып койгон, ошол учурда алар жылына бир нече миң гана өндүрүлгөн. Алар бул максатка 2016-жылы жетишти. Философия активдүү башкаруунун негизги мыйзамына таянат:
ZXQKEEP0QXZ
мында ZXQKEEP0QXZ маалымат катышы, ZXQKEEP1QXZ маалымат коэффициенти жана ZXQKEEP2QXZ кеңдиги — көз карандысыз коюмдардын саны. Ар бир жеке ZXQKEEP3QXZ алсыз божомолдоочу болуп саналат; талап жетишерлик начар корреляциялангандарды айкалыштыруу кичинекей ИКтерди олуттуу тобокелдикке ылайыкташтырылган кирешеге бириктирет.
The correction that makes or breaks this, and that the naive reading of the formula hides: breadth is not trial count. counts independent bets, and generated alphas are not independent — they are composed from the same operators over the same price and volume fields, so they inherit each other's correlation structure. This blog measured the effect directly in Signal Correlation: effective breadth is , and with a typical crypto correlation factor , ten signals are worth about 3.3 independent ones. The term does not grow with how many alphas you generated; it grows with how many uncorrelated ones survived. A million correlated alphas buy you far less than the formula advertises.
Мына ушундан улам төмөндөгү 3-кадам – учурдагы китепканага каршы декорреляция – альфа фабрикасында гигиеналык кадам эмес. Бул биринчи кезекте кеңдикти чыгарган кадам.
101 формулалык альфа
The paper "101 Formulaic Alphas" by Kakushadze (associated with WorldQuant research) published a set of formulaic alpha expressions — mathematical expressions over price, volume and fundamental data: The paper "101 Formulaic Alphas" by Kakushadze (associated with WorldQuant research) published a set of formulaic alpha expressions — mathematical expressions over price, volume and fundamental data:
Alpha#1: (rank(Ts_ArgMax(SignedPower(((returns < 0) ? stddev(returns, 20)
: close), 2.), 5)) - 0.5)
Alpha#7: ((adv20 < volume) ? ((-1 * ts_rank(abs(delta(close, 7)), 60))
* sign(delta(close, 7))) : (-1 * 1))
Alpha#42: (rank(vwap - close) / rank(vwap + close))
Муну AutoML үчүн кызыктуу кылган нерсе - бул * грамматика*. Альфалар кичинекей талаа топтомундагы (ZXQKEEP6QKEEP5QXZ, Z7QXZ, Z8QXZ, ZXQKEEP0QXZ , ZXQKEEP1QXZ , ZXQKEEP2QXZ , ZXQKEEP3QXZ , ZXQKEEP4QXZ , ZXQKEEP5QXZ ) кичинекей операторлор топтомунун курамы. , ZXQKEEP9QXZ , ZXQKEEP10QXZ ). Грамматика санап чыгууга болот, бул издөө мейкиндиги "жакшы функция жөнүндө ойлонуу" болбогон жол менен машина тарабынан түзүлөт дегенди билдирет. AutoML системасы:
- Берилиш талааларынын үстүнөн операторлорду түзүү менен **Талапкердин туюнтмаларын түзүңүз
- Баалаңыз ар бир туюнтумдун IC, жүгүртүүсү жана азайышы
- Статистикалык тестирлөөдөн өткөн жана учурдагы китепкана менен жетиштүү түрдө байланышы жок туюнтмалар үчүн Чыпкалоо
- Тирүү калгандарды портфолиого бириктириңиз
Көңүл буруңуз, 1 жана 2-кадамдар оңой, ал эми 3-кадам бул мааниде — жогорудагы тууралоону караңыз.
LLM-жакшыртылган Alpha ачылышы
WorldQuant has begun integrating large language models into the alpha factory. As reported in financial press, the firm is exploring how LLMs can "transform and discover alphas across different domains" — generating novel expressions, translating research papers into testable hypotheses, and surfacing cross-domain relationships that a pure enumerative search would miss. This is a different mechanism from extracting signals from text, which this blog covers in LLM Alpha Mining on Earnings Calls; here the LLM writes the formula, not the feature.
Өзүңүздүн Мини Альфа Фабрикаңызды куруу
Бул жерде оператордун грамматикасы боюнча компакттуу, бирок функционалдык альфа фабрикасы бар: Here is a compact but functional alpha factory over the operator grammar:
import itertools
from dataclasses import dataclass
from typing import Callable, List
import pandas as pd
import numpy as np
from scipy.stats import spearmanr
@dataclass
class Alpha:
name: str
expression: Callable[[pd.DataFrame], pd.Series]
ic: float = 0.0
turnover: float = 0.0
sharpe: float = 0.0
def ts_rank(series: pd.Series, window: int) -> pd.Series:
return series.rolling(window).apply(lambda x: pd.Series(x).rank().iloc[-1] / len(x))
def ts_delta(series: pd.Series, period: int) -> pd.Series:
return series.diff(period)
def ts_std(series: pd.Series, window: int) -> pd.Series:
return series.rolling(window).std()
def cs_rank(series: pd.Series) -> pd.Series:
return series.rank(pct=True)
def ts_mean(series: pd.Series, window: int) -> pd.Series:
return series.rolling(window).mean()
ALPHA_TEMPLATES = [
("momentum_{w}",
lambda df, w: cs_rank(ts_delta(df["close"], w))),
("mean_reversion_{w}",
lambda df, w: -cs_rank(df["close"] / ts_mean(df["close"], w) - 1)),
("vol_surprise_{w}",
lambda df, w: cs_rank(df["volume"] / ts_mean(df["volume"], w))),
("price_vol_divergence_{w}",
lambda df, w: cs_rank(ts_delta(df["close"], w)) * -cs_rank(ts_delta(df["volume"], w))),
("volatility_rank_{w}",
lambda df, w: -cs_rank(ts_std(df["close"].pct_change(), w))),
("high_low_range_{w}",
lambda df, w: cs_rank(ts_mean(df["high"] - df["low"], w) / df["close"])),
]
WINDOWS = [5, 10, 20, 60, 120]
def generate_alphas(df: pd.DataFrame, forward_returns: pd.Series) -> List[Alpha]:
"""Generate and evaluate all alpha candidates."""
alphas = []
for (name_tpl, expr_fn), window in itertools.product(ALPHA_TEMPLATES, WINDOWS):
name = name_tpl.format(w=window)
try:
signal = expr_fn(df, window)
signal = signal.replace([np.inf, -np.inf], np.nan)
valid = signal.notna() & forward_returns.notna()
if valid.sum() < 100:
continue
ic, _ = spearmanr(signal[valid], forward_returns[valid])
turnover = signal.diff().abs().mean()
ret = (signal * forward_returns).dropna()
sharpe = np.sqrt(252) * ret.mean() / (ret.std() + 1e-9)
alphas.append(Alpha(
name=name,
expression=lambda df, fn=expr_fn, w=window: fn(df, w),
ic=ic,
turnover=turnover,
sharpe=sharpe,
))
except Exception:
continue
alphas.sort(key=lambda a: abs(a.ic), reverse=True)
return alphas
Беш терезеден ашык алты шаблон - бул 30 конфигурацияны тазалоо. Ал чыгарган отчёттун схематикалык формасы бар — талаалар фабрика чыгарган нерсе жана эч кандай сандар толтурулбайт, анткени бул жерде эч бири өлчөнгөн эмес: Six templates over five windows is a 30-configuration sweep. The report it produces has this schematic shape — the fields are what the factory emits, and no numbers are filled in because none have been measured here:
SCHEMATIC — illustrative format only, not a measurement
Generated <N> alphas from <N> candidate configurations
Top by |IC|:
<alpha_name> IC=<±0.0xxx> Sharpe=<±x.xxx> Turnover=<0.0xxx>
...
The raw Sharpe of the top alpha out of a 30-configuration sweep is not a result — it is the maximum of 30 draws, and on 1,000 zero-edge strategies the best annualized Sharpe averages 1.63 while the naive test declares a discovery 100% of the time (Deflated Sharpe Ratio). The honest deliverable from a factory is therefore not "we found an alpha" but how many alphas survived deflation: the IC distribution, the trial count, the winner's DSR against that count, and the PBO of the selection. That is the measurement this section still owes.
Guardrails: Сиз буга чейин карызсыз
AutoML ачылышты жана ашыкча тууралоону бирдей өлчөмдө күчөтөт жана муну айырма байкалбай калганда, сыноолордо кылат. Булардын ар бири башка жерде тереңирээк камтылган; Бул жерде AutoML алардын бардыгын сунушталганга караганда милдеттүү кылат.
Price the search, do not merely correct it. A feature-model-hyperparameter sweep is a trial count and the trial count moves the bar — see The Deflated Sharpe Ratio.
Validate temporally, with purging and embargo. See Walk-Forward Optimization and the Look-Ahead Bias Taxonomy for the leaks that survive a naive temporal split.
Score the procedure, not just the winner. See Probability of Backtest Overfitting, and carry its load-bearing correction: PBO's null is 0.5, not 1 — half is not "half overfit," it is fully overfit, a coin flip.
Watch for peaks that are not there. Searching a noise-dominated surface efficiently just finds sharper illusions faster (Plateau Analysis); this bites hardest on strategy parameters and least on ML hyperparameters, which is the case FLAML and Optuna are actually built for.
Издөө мейкиндигин чектеңиз. Жалбырактардын минималдуу үлгүлөрү, чектүү тереңдик жана баалоочу эсептер, функциянын бюджети, жүгүртүү штрафы — издөөнү иретке келтирүү аны кийинчерээк өчүрүүгө караганда арзаныраак.
Корутунду
AutoML автоматташтырууну бир деңгээлге көтөрөт: туруктуу талапкердин ичиндеги параметрлерди жөндөөдөн талапкерлердин өздөрүн түзүүгө чейин. Үч компонент күч-аракет жумшоого арзыйт — өзгөчөлүктөрдү түзүү үчүн tsfresh жана Featuretools, бюджетти эске алган моделди тандоо үчүн FLAMLдин үнөмдүү издөөсү жана санап чыгуучу альфа куруу үчүн формулалык оператор грамматикасы. NAS сиздин сигналдын ызы-чуу катышы аны актаганда гана анын эсептөөсүнө арзыйт жана ал баалоо огунун кымбат аягында жашайт, анда үлгүнүн натыйжалуулугу акыры төлөйт.
WorldQuant кеңдик аргументи бул блогдун өз өлчөөлөрү менен байланышта анын оңдолгон түрүндө гана сакталып калат: ZXQKEEP0QXZ мында ZXQKEEP1QXZ көз карандысыз коюмдарды эсептейт, ал эми фабриканын өндүрүмдүүлүгү көз каранды эмес. Миллион альфаны түзүү оңой жарым. Алардын кенендик катары санаш үчүн байланышы жок экендигин аныктоо формуланын кандайдыр бир мааниге ээ экендигин аныктоочу жарым болуп саналат.
And the honest caveat is not a moral, it is a measured result. This blog ran the search-and-overfit arc to its conclusion in The Honest Negative: tens of thousands of backtests across five majors, DSR = 0.00 at ~37,000 trials, PBO 0.264 and 0.327, and no robust edge. AutoML raises the trial count by orders of magnitude. Whatever it finds, it will owe a correspondingly larger deflation — and the useful output of an alpha factory is the survival rate after that deflation, not the top line before it. And the honest caveat is not a moral, it is a measured result. This blog ran the search-and-overfit arc to its conclusion in The Honest Negative : tens of thousands of backtests across five majors, DSR = 0.00 at ~37,000 trials, PBO 0.264 and 0.327, and no robust edge. AutoML raises the trial count by orders of magnitude. Whatever it finds, it will owe a correspondingly larger deflation — and the useful output of an alpha factory is the survival rate after that deflation, not the top line before it.
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.