Жүйелі сауда құбырларына арналған 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 жоғарыдағы қабатқа шабуыл жасайды — ол үміткерлердің өзін құрастыруды автоматтандырады. Оның үш бөлігі осы блогта басқа еш жерде жоқ:
- Автоматтандырылған мүмкіндіктерді шығару — бір баға қатарын ~794 статистикалық сипатталған мүмкіндікке айналдыратын tsfresh және Deep Feature Synthesis арқылы қатысты нарық кестелеріндегі мүмкіндіктерді құрайтын Featuretools.
- Бюджетті ескеретін AutoML — FLAML-тің шығындарды үнемдейтін оңтайландыруы, ол құнына қарамастан емес, есептеу бюджеті ішінде ең жақсы үлгіні табады.
- Формулалық альфа зауыты — WorldQuant 101 формулалық альфасы құрастырылатын оператор грамматикасы ретінде машина санай алады.
Қалғанының бәрі - мақсат функциясы, валидация схемасы, бірнеше тестілеуді түзету - бұл жерде басқа жерде өлшенген, сондықтан бұл мақала қайта оқытудың орнына сілтеме жасайды. Бұл әдеттегіден маңыздырақ, өйткені AutoML сынақ санын жарып жібереді және сынақ саны доғаның қалған бөлігі туралы дәл болып табылады.
! ZXQKEEP0QXZ
AutoML нені автоматтандырады
AutoML жалғыз алгоритм емес. Бұл құбырдың әртүрлі кезеңдерін автоматтандыратын әдістер тобы:
| Кезең | Қолмен тәсіл | AutoML тәсілі |
|---|---|---|
| Функциялық инженерия | Домендік сарапшылық қолөнер көрсеткіштері | Автоматтандырылған экстракция (tsfresh, Featuretools) |
| Мүмкіндік таңдау | Корреляциялық талдау, интуиция | Статистикалық гипотезаны тексеру, SHAP |
| Үлгі таңдау | 2-3 үлгіні қолданып көріңіз | Ондаған оқушыларды іздеу |
| Гиперпараметрлерді баптау | Торды іздеу, қолмен реттеу | Bayesian / үнемді іздеу (Optuna, FLAML) |
| Архитектуралық дизайн | Тұрақты нейрондық желі топологиясы | Нейрондық архитектураны іздеу (NAS) |
| Ансамбль құрылысы | Қолмен жинақтау | Автоматтандырылған ансамбльді таңдау |
Алғышарт жүйелі сауда-саттықта кандидат кеңістігі өте үлкен - бір 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.
Функция құралдары: терең мүмкіндіктер синтезі
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 сауда үшін іздеу кеңістігі
Сауда үлгілері үшін практикалық 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}
Microsoft корпорациясының 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 әлсіз болжаушы болып табылады; талап жеткілікті әлсіз корреляцияланғандарды біріктіру кішкентай IC-терді маңызды тәуекелге байланысты түзетілген кіріске біріктіреді.
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 үшін мұны қызықты ететін нәрсе - бұл грамматика. Альфалар кішігірім өрістер жиыны ( ZXQKEEP6QKEEP , Z7QXZ , Z8XXZ , ZXQKEEP0QXZ , ZXQKEEP1QXZ , ZXQKEEP2QXZ , ZXQKEEP3QXZ , ZXQKEEP4QXZ , ZXQKEEP5QXZ ) шағын операторлар жиынының композициялары болып табылады. , ZXQKEEP9QXZ , ZXQKEEP10QXZ ). Грамматика санаулы болып табылады, яғни іздеу кеңістігі «жақсы мүмкіндік туралы ойланыңыз» емес, машинада жасалатын болады. AutoML жүйесі:
- Деректер өрістерінде операторларды құрастыру арқылы Үміткер өрнектерді жасаңыз
- Бағалаңыз әрбір өрнектің IC, айналымы және кемуі
- Статистикалық тестілеуден өткен және бар кітапханамен жеткілікті түрде байланысы жоқ өрнектерге арналған сүзгі
- Тірі қалғандарды портфолиоға біріктіріңіз
1 және 2-қадамдар оңай және 3-қадам мән болатынын ескеріңіз — жоғарыдағы кеңдік түзетуін қараңыз.
LLM-жақсартылған альфа ашу
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.
Қорғаулар: сізде қарыздар бар
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.