← 기사 목록으로
July 30, 2026
5분 소요

시스템 트레이딩 파이프라인을 위한 AutoML

시스템 트레이딩 파이프라인을 위한 AutoML
#AutoML
#NAS
#feature-engineering
#automation
#quant

이 블로그는 검색 방법에 대해 오랜 시간 동안 연구했습니다. 어떤 샘플러를 사용할 것인지, 언제 사용할 것인지(크로스오버는 평가 비용), 실행한 검색 가격을 책정하는 방법(디플레이티드 샤프 비율), 선택 절차 자체의 점수를 매기는 방법 (PBO), 전체 장치가 정직하게 도달하는 위치(강력한 가장자리 없음).

그것이 결코 다루지 않은 것은 당신이 이상 검색한 것입니다. 해당 기사는 모두 기능 세트와 전략군을 주어진 것으로 받아들이고 그 안에 있는 매개변수를 최적화합니다. AutoML은 위 레이어를 공격하여 후보 자체의 구성을 자동화합니다. 그 중 세 부분은 이 블로그의 다른 곳에서는 나타나지 않습니다.

  1. 자동화된 특징 추출 — tsfresh는 하나의 가격 시리즈를 ~794개의 통계적으로 특성화된 특징으로 바꾸고, Featuretools는 심층 특징 합성을 통해 관련 시장 테이블 전체의 특징을 구성합니다.
  2. 예산 인식 AutoML — 비용에 관계없이 컴퓨팅 예산 내에서 최상의 모델을 찾는 FLAML의 비용 절약형 최적화입니다.
  3. 공식 알파 팩토리 — 기계가 열거할 수 있는 구성 가능한 연산자 문법인 WorldQuant의 101가지 공식 알파입니다.

그 밖의 모든 것(목적 함수, 검증 체계, 다중 테스트 수정)은 이미 여기 다른 곳에서 측정되었으므로 이 기사를 다시 가르치기보다는 링크로 연결합니다. AutoML이 시도 횟수를 폭발적으로 늘리고 시도 횟수가 나머지 부분의 핵심이기 때문에 이는 평소보다 더 중요합니다.

AutoML 체계적 거래 파이프라인

AutoML이 자동화하는 것

AutoML은 단일 알고리즘이 아닙니다. 이는 파이프라인의 다양한 단계를 자동화하는 기술 계열입니다.

무대 수동 접근 방식 AutoML 접근 방식
기능 엔지니어링 도메인 전문 공예 지표 자동 추출(tsfresh, Featuretools)
기능 선택 상관분석, 직관 통계적 가설 검정, SHAP
모델 선택 2~3개의 모델을 사용해 보세요 수십명의 학습자 검색
초매개변수 조정 그리드 검색, 수동 조정 베이지안/비용 절약형 검색(Optuna, FLAML)
건축 디자인 고정 신경망 토폴로지 신경망 아키텍처 검색(NAS)
앙상블 구성 수동 스태킹 자동화된 앙상블 선택

전제는 체계적 거래에서 후보 공간이 엄청나다는 것입니다. 단일 OHLCV 시리즈는 수백 가지 기술적 기능을 생성하고 여러 자산, 주문장 데이터 및 대체 소스를 조합하여 만듭니다. 전제는 위험이기도 합니다. 모든 후보자는 재판이고, 재판은 잘못된 발견을 만들어내는 것입니다.

목표에 대한 한 가지 AutoML 관련 요점은 검색이 최대화하는 측정항목이 재정적 측정항목이어야 한다는 것입니다. 왜냐하면 검색은 사용자가 기록한 내용과 의도한 내용을 정확히 최적화하기 때문입니다. 자동으로 선택하는 스칼라에 따라 전략이 선택됩니다. 목적 함수 설계를 참조하세요. 여기서 순진한 거래당 Sharpe는 600개 시드 중 56%에서 5% 미만 노출 복권을 획득하고 샘플 중 0.13으로 축소되는 샘플 내 Sharpe 21을 게시합니다. 처음부터 재무 지표를 AutoML 채점기에 연결합니다. 최적화하지 마세요 roc_auc 그리고 그것이 전달되기를 바랍니다.

자동화된 특성 엔지니어링

기능 엔지니어링은 대부분의 알파가 존재하는 곳입니다. 원시 가격 데이터는 모든 사람에게 동일합니다. 해당 데이터를 예측 신호로 변환하는 것이 수익성 있는 전략과 노이즈를 분리하는 요소입니다.

자동화된 기능 엔지니어링 팩토리

tsfresh: 단일 가격 시리즈부터 800개 이상의 기능까지

티프레시(확장 가능한 가설 테스트 기반 시계열 특징 추출)은 시계열 특징 추출을 위해 특별히 제작되었습니다. 다음을 포함하여 기본적으로 ~794개의 기능으로 확장되는 63개의 특성화 방법을 계산합니다.

  • 통계 적률(평균, 분산, 왜도, 첨도)
  • 여러 시차에서의 자기상관
  • 푸리에 계수 및 스펙트럼 에너지
  • 복잡성 측정(근사 엔트로피, 표본 엔트로피)
  • 비선형 특성(Friedrich 계수, 최대 Langevin 고정점)
  • 분위수 및 범위 개수 변경

재무 데이터의 경우 이는 단일 가격 시리즈가 수백 개의 후보 기능을 생성한다는 것을 의미합니다. 이는 수동 기능 엔지니어링이 놓칠 수 있는 많은 캡처 역학입니다. 이는 스프레드 모델링DeepLOB에 사용되는 손으로 제작한 도메인 파생 기능 세트와는 실질적으로 다른 접근 방식입니다. 주문서 불균형이 중요하다고 인간이 결정합니다. 여기서 라이브러리는 모든 것을 열거하고 가설 테스트를 통해 결정됩니다.

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]}")

그만큼 select_features 함수는 Benjamini-Yekutieli 절차를 적용하여 전체 기능 배터리에서 잘못된 발견 비율을 제어합니다. 이는 올바른 본능이며 Delated Sharpe 기사와 동일한 본능이 전략 검색에 적용됩니다. 수행하지 않는 점에 유의하십시오. 기능 선택 단계의 FDR 제어는 후속 모델 검색의 시험 비용에 대해 아무 것도 말하지 않습니다. 그것들은 두 개의 분리된 다중성이며 둘 다 지불되어야 합니다.

Featuretools: 심층 특징 합성

tsfresh가 시계열 특성화에 중점을 두는 반면, Featuretools는 관계형 특성 엔지니어링에 탁월합니다. 즉, 관련 테이블 전체에 기본 작업을 구성하여 특성을 구성합니다.

거래의 경우 거래 내역, 주문장 스냅샷, 자금 요율 및 온체인 지표 등 다중 테이블 데이터가 있을 때 이는 강력합니다. Featuretools는 변환 및 집계 기본 요소를 스택하는 DFS(심층 피처 합성)를 적용합니다.

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")

그만큼 time_index 선언은 로드 베어링입니다. 이를 통해 Featuretools는 컷오프 시점에 존재했던 행만 사용하여 집계를 계산할 수 있습니다. 잘못 생각하면 DFS는 기꺼이 미래의 기능, 즉 예측 편향 분류에 분류된 누출의 관계형 데이터 인스턴스를 구축할 것입니다.

tsfresh(시계열 특성화)와 Featuretools(관계형 합성)의 조합은 수동 지표 코딩 없이 원시 시장 데이터에서 수천 개의 후보 신호를 생성하는 기능 팩토리를 제공합니다.

예산을 고려한 AutoML: FLAML

Optuna 및 트리 구조의 Parzen Estimator를 배경으로 가정합니다. 파생, 샘플러 비교 및 벤치마크는 Coordinate Descent vs Bayesian Optimization에 있습니다. 도달할 어느 샘플러에서 이 블로그의 자체 측정은 참조이며 민속 답변이 아닙니다. 크로스오버는 알고리즘 영리함이 아닌 평가 비용에 의해 결정됩니다. 백테스트가 거의 무료일 때 스크램블된 Sobol은 처리량(TPE의 경우 ~154에 비해 ~2,830cfg/s)에서 승리하고 값비싼 평가만이 샘플 효율성을 보장합니다(랜덤 대 스마트 검색).

예산 인식 AutoML 검색

이러한 프레이밍은 FLAML을 경쟁 샘플러가 아닌 다른 축으로 만드는 것입니다. Optuna는 다음 샘플링 위치를 묻습니다. 불꽃 (Fast Lightweight AutoML)은 샘플링을 할 수 있는 여유가 무엇인지 묻습니다. CFO(비용 절약 최적화)를 사용하여 시간 또는 계산 예산 내에서 최상의 모델을 최적화합니다. CFO는 평가 비용이 저렴한 구성을 조기에 우선순위로 두고 예상 한계 이익이 지출을 정당화할 때만 확대합니다.

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을 초기에 탐색하고 한계 개선이 비용을 정당화한다고 추정할 때만 전환합니다. 이는 크로스오버 기사에서 일반화된 저렴한 정권 통찰력입니다. 처리량은 구현 세부 사항이 아니라 검색 예산에서 일류 용어입니다.

궤적 로그는 보관할 가치가 있는 부분입니다. get_output_from_log 시험 횟수인 전체 구성 내역을 제공하며 시험 횟수는 곧 받게 될 모든 디플레이션에 대한 입력입니다.

거래 모델을 위한 신경 아키텍처 검색

신경망 아키텍처 검색은 고정된 네트워크 토폴로지를 조정하는 대신 네트워크 토폴로지 설계를 자동화합니다. 금융 시리즈에 대한 아키텍처 선택은 실제로 명확하지 않습니다. 비정상성, 낮은 신호 대 잡음, 혼합 주파수 및 몇 분에서 몇 달에 걸친 종속성은 모두 다른 방향으로 진행됩니다. 그러나 그 동기는 이미 다른 곳에서 구체적으로 논의되었습니다. TFT가 LSTM을 이길 때 바닐라 트랜스포머를 이길 때 Temporal Fusion Transformer를 참조하세요. CNN+Inception+LSTM 절충에 대한 DeepLOB, 신중하게 직접 설계한 고정 아키텍처가 이미 달성한 것에 대한 것입니다. NAS는 이 선택 자체가 검색되어야 한다는 주장이다.

[주가수익률 예측을 위한 Neuroevolution NAS] 연구(https://arxiv.org/html/2410.17212v1)는 EXAMM(Evolutionary eXploration of Augmenting Memory Models)을 통해 진화한 RNN이 간단한 롱-숏 전략을 사용하여 하락장(2022년)과 상승장(2023년) 모두에서 DJI 및 S&P 500을 능가했다고 보고합니다. 여기에 재현된 결과가 아니라 제3자의 주장으로 간주하십시오. 이는 디플레이션이 보고되지 않은 최고의 검색 수치입니다.

거래를 위한 NAS 검색 공간

거래 모델을 위한 실용적인 NAS 검색 공간에는 다음이 포함됩니다.

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)를 사용하면 다음 공간을 정의하고 검색할 수 있습니다.

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 공장 접근 방식

알파 발견에 대한 WorldQuant의 접근 방식은 금융 분야에서 AutoML 원칙을 가장 산업 규모로 구현한 것입니다. Igor Tulchinsky가 설립한 WorldQuant는 수백만 개의 예측 신호를 생성, 테스트 및 결합하기 위한 체계적인 프로세스인 "알파 팩토리"를 운영합니다.

철학: 지수적 알파 생성과 그 수정

WorldQuant는 2010년 연간 알파 생산량이 수천 개에 불과했던 100만 알파에 도달하겠다는 목표를 세웠습니다. 그들은 2016년에 그 목표를 달성했습니다. 철학은 액티브 경영의 기본 법칙에 기초합니다.

IRICBRIR \approx IC \cdot \sqrt{BR}

어디 IRIR 정보 비율이고, ICIC 정보 계수, 및 BRBR 폭 — 독립 베팅 수. 각 개인 αi\alpha_i 약한 예측 변수입니다. 상관관계가 약한 IC를 충분히 결합하면 작은 IC가 의미 있는 위험 조정 수익을 얻을 수 있다는 주장입니다.

이것을 만들거나 깨뜨리는 수정과 공식의 순진한 읽기가 숨겨지는 것: 폭은 시도 횟수가 아닙니다. BRBR 독립적인 베팅을 계산하고 생성된 알파는 독립적이지 않습니다. 즉, 동일한 가격 및 거래량 필드에 대해 동일한 연산자로 구성되므로 서로의 상관 구조를 상속합니다. 이 블로그는 신호 상관관계에서 직접 효과를 측정했습니다. 유효 폭은 Neff=N/CfN_{eff} = N / C_f, 그리고 일반적인 암호화 상관 계수를 사용하여 Cf3C_f \approx 3, 10개의 신호는 약 3.3개의 독립적인 신호의 가치가 있습니다. 그만큼 BR\sqrt{BR} 용어는 생성한 알파 수에 따라 증가하지 않습니다. 상관되지 않은 것들이 얼마나 많이 살아남았는지에 따라 증가합니다. 백만 개의 상관 알파는 공식이 광고하는 것보다 훨씬 적은 금액을 구매합니다.

이것이 바로 아래 3단계(기존 라이브러리에 대한 상관 관계 해제)가 알파 팩토리의 위생 단계가 아닌 이유입니다. 우선 폭을 만들어 내는 단계이다.

101가지 공식 알파

논문 "101 공식 알파" Kakushadze(WorldQuant 연구 관련)가 공식적인 알파 표현 세트(가격, 거래량 및 기본 데이터에 대한 수학적 표현)를 발표했습니다.

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에서 흥미로운 점은 문법이라는 것입니다. 알파는 작은 연산자 집합(rank, delta, ts_rank, stddev, correlation, signedpower)를 작은 필드 세트(close, volume, vwap, returns, adv20). 문법은 열거 가능합니다. 이는 검색 공간이 "좋은 기능을 생각하는 것"이 ​​아닌 방식으로 기계 생성 가능하다는 것을 의미합니다. AutoML 시스템은 다음을 수행할 수 있습니다.

  1. 데이터 필드에 대한 연산자를 구성하여 후보 표현식 생성
  2. 각 표현식의 IC, 회전율 및 하락폭을 평가합니다.
  3. 통계 테스트에서 살아남고 *기존 라이브러리와 충분히 상관되지 않는 표현식을 위한 필터
  4. 생존자를 포트폴리오로 결합

1단계와 2단계는 쉬운 단계이고 3단계는 값이 있는 곳입니다. 위의 너비 수정을 참조하세요.

LLM 강화 알파 검색

WorldQuant는 대규모 언어 모델을 알파 팩토리에 통합하기 시작했습니다. 금융 언론에 보도된 바와 같이, 회사는 LLM이 "다양한 영역에 걸쳐 알파를 변환하고 발견"할 수 있는 방법을 탐색하고 있습니다. 즉, 새로운 표현을 생성하고, 연구 논문을 테스트 가능한 가설로 번역하고, 순수 열거형 검색에서는 놓칠 수 있는 도메인 간 관계를 표면화하는 것입니다. 이는 이 블로그의 수익 호출에 대한 LLM 알파 마이닝에서 다루는 텍스트에서 신호를 추출하는 것과는 다른 메커니즘입니다. 여기서 LLM은 기능이 아닌 공식을 작성합니다.

나만의 미니 알파 공장 건설하기

다음은 연산자 문법에 대한 간결하지만 기능적인 알파 팩토리입니다:

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

5개 창에 대한 6개 템플릿은 30개 구성 스윕입니다. 생성된 보고서는 다음과 같은 도식적 형태를 갖습니다. 필드는 공장에서 방출하는 것이며 여기에서는 아무것도 측정되지 않았기 때문에 숫자가 채워지지 않습니다.

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>
  ...

30개 구성 스윕 중 상위 알파의 원시 Sharpe는 결과가 아닙니다 — 최대 30개의 무승부이며 1,000개의 제로 에지 전략에서 최고의 연간 Sharpe 평균은 1.63인 반면 순진한 테스트에서는 100% 발견을 선언합니다(수축된 샤프 비율). 그러므로 공장에서 정직하게 산출할 수 있는 것은 "알파를 찾았습니다"가 아니라 얼마나 많은 알파가 디플레이션에서 살아남았는가입니다. 즉, IC 배포, 시도 횟수, 해당 횟수에 대한 승자의 DSR, 선택의 PBO입니다. 이것이 바로 이 섹션이 아직 지불해야 할 측정값입니다.

가드레일: 이미 빚진 것

AutoML은 발견과 과적합을 동일하게 증폭하며, 차이가 미묘하지 않은 시도 횟수에서 이를 수행합니다. 이들 각각은 다른 곳에서 자세히 다루고 있습니다. 여기서 중요한 점은 AutoML이 모든 항목을 권장 사항이 아닌 필수 사항으로 만든다는 것입니다.

검색 가격을 책정하고 단순히 수정하지 마세요. 기능-모델-초매개변수 스윕은 시행 횟수이며 시행 횟수에 따라 막대가 이동합니다. 수축된 샤프 비율을 참조하세요.

퍼징 및 엠바고를 통해 일시적으로 유효성을 검사합니다. 순진한 시간 분할에서 살아남는 누수에 대해서는 Walk-Forward 최적화Look-Ahead Bias Taxonomy를 참조하세요.

승자뿐만 아니라 절차에 점수를 매기세요. 백테스트 과적합 확률을 참조하고 부하 보정을 수행하십시오. PBO의 null은 1이 아니라 0.5입니다 — 절반은 "절반 과적합"이 아니고 완전히 과적합입니다. 동전 뒤집기입니다.

그곳에 없는 피크를 살펴보세요. 노이즈가 많은 표면을 효율적으로 검색하면 더 선명한 환상을 더 빠르게 찾을 수 있습니다(고원 분석). 이는 전략 매개변수에 가장 큰 영향을 미치고 FLAML과 Optuna가 실제로 구축된 경우인 ML 하이퍼 매개변수에 대해서는 가장 적습니다.

검색 공간을 제한하세요. 최소 리프 샘플, 제한된 깊이 및 추정기 수, 기능 예산, 회전율 페널티 — 검색을 정규화하는 것이 나중에 축소하는 것보다 저렴합니다.

결론

AutoML은 자동화를 고정된 후보 내부의 매개변수 조정부터 후보 자체 생성까지 한 단계 더 발전시킵니다. 기능 생성을 위한 tsfresh 및 Featuretools, 예산 인식 모델 선택을 위한 FLAML의 비용 절약형 검색, 열거 가능한 알파 구성을 위한 공식 연산자 문법 등 세 가지 구성 요소는 노력할 가치가 있습니다. NAS는 신호 대 잡음 비율이 정당화될 때만 계산할 가치가 있으며 샘플 효율성이 최종적으로 지불되는 평가 비용 축의 값비싼 끝 부분에 있습니다.

WorldQuant 폭 인수는 수정된 형식으로만 이 블로그의 자체 측정과의 접촉에서 살아남습니다. IRICBRIR \approx IC\sqrt{BR} 어디 BRBR 독립적인 베팅을 계산하며, 공장의 생산량은 거의 독립적이지 않습니다. 백만 개의 알파를 생성하는 것이 쉬운 절반입니다. 폭으로 계산할 수 있을 만큼 상관관계가 없다는 사실을 입증하는 것이 공식이 의미하는 바를 결정하는 절반입니다.

그리고 정직한 경고는 도덕적인 것이 아니라 측정된 결과입니다. 이 블로그는 The Honest Negative에서 결론에 이르기까지 검색 및 과적합 호를 실행했습니다. 5개 주요 분야에 걸쳐 수만 번의 백테스트, ~37,000회 시도에서 DSR = 0.00, PBO 0.264 및 0.327, 강력한 에지는 없습니다. AutoML은 시도 횟수를 몇 배나 늘립니다. 무엇을 발견하든 그에 따라 더 큰 디플레이션을 겪게 될 것입니다. 그리고 알파 팩토리의 유용한 생산량은 디플레이션 이전의 최고 수준이 아니라 디플레이션 이후의 생존율입니다.

blog.disclaimer

Authors

Eugen Soloviov
Eugen Soloviov

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.

Newsletter

시장에서 앞서 나가세요

뉴스레터를 구독하여 독점적인 AI 트레이딩 통찰력, 시장 분석 및 플랫폼 업데이트를 받아보세요.

귀하의 개인정보를 존중합니다. 언제든지 구독을 취소할 수 있습니다.