실패한 머신러닝 실험: 150만 개 신호로 XGBoost 분류기 훈련

발행: (2026년 2월 9일 오전 04:15 GMT+9)
6 분 소요
원문: Dev.to

Source: Dev.to

Failed Machine Learning Experiment: 150만 신호로 XGBoost 분류기 훈련

2022년에 나는 파이썬으로 트레이딩 전략을 만들기 시작했으며, 제한된 지식에도 불구하고 강력한 머신러닝 기반 접근법을 목표로 삼았다. 나는 AI(Sonnet 4.5)에게 코드를 작성하고 모델 파라미터를 제안하도록(Grok Thinking을 통해) 했는다.

수많은 시장 가격 차트를 검토한 결과, 특정 패턴을 적절한 트레이딩 전략과 포지션 최적화와 결합하면 몇 퍼센트의 수익을 창출할 수 있을 것이라고 가설을 세웠다. 이 실험은 두 개의 Jupyter 노트북으로 구성되었다: 하나는 XGBoost 모델 훈련용, 다른 하나는 전략 백테스팅용이다.

데이터 수집 및 라벨링

  • 상위 30개 암호화 토큰에 대해 5년치 15분 가격 데이터를 다운로드하고 Parquet 파일로 저장했습니다.
  • 다음 10개의 15분 구간 내에 3 % 이상 하락하는 경우를 모두 찾아냈습니다.
  • 해당 하락 직전 10개의 가격 포인트와 기술적 분석 지표들을 특징으로 추출했습니다.
  • 500 k개의 “하락” 신호를 생성하고, 무작위 비하락 샘플 1 M개를 추가하여 총 1.5 M개의 학습 인스턴스를 만들었습니다 (20 %는 테스트용으로 보류).

자산 간 하락을 비교 가능하게 만들기 위해 Z‑score 방식을 사용해 정규화했습니다:

drop_zscore = drop_pct / volatility   # volatility = std deviation of returns
# Threshold: drop_zscore <= -2  (i.e., a drop twice the typical volatility)

특성 엔지니어링

특성은 모멘텀, 변동성 및 가격 차이 지표에서 파생되었습니다. 전처리 후, 데이터셋은 Grok이 권장하는 하이퍼파라미터와 함께 XGBoost에 입력되었습니다:

# Recommended hyperparameters
max_depth: 3-7          # prevents memorizing noise
learning_rate: 0.01-0.1  # smaller = better with more trees
n_estimators: 200-500   # use early stopping
subsample: 0.6-0.9
colsample_bytree: 0.6-0.9
scale_pos_weight: 3-10  # handles class imbalance

모델 성능

학습 데이터

ROC-AUC Score: 0.6899

Classification Report
----------------------
               precision    recall  f1-score   support
No Signal          0.93      0.62      0.74   3,149,036
Signal             0.19      0.66      0.29     426,220

accuracy                                 0.62   3,575,256
macro avg          0.56      0.64      0.52   3,575,256
weighted avg       0.84      0.62      0.69   3,575,256

Confusion Matrix
[[1,938,267 1,210,769]
 [  144,995   281,225]]

테스트 데이터 (보지 않은 데이터)

ROC-AUC Score: 0.6761

Classification Report
...
Train AUC: 0.6899
Test AUC:  0.6761
Difference: 0.0138
✓ 좋은 일반화 – 최소한의 과적합

특성 중요도

드롭을 예측하는 데 가장 영향력 있는 특성은 기본 수익률이었습니다. 그러나 모델은 많은 false positive를 생성했으며, 이는 포트폴리오에 해로울 수 있습니다.

Confusion Matrix by Feature Space

백테스팅

훈련된 모델을 백테스팅 시뮬레이션에 로드하고 TP, SL, 딜레이, 쿨다운과 같은 포지션 파라미터를 정의했습니다. 최적 구성을 찾기 위해 900개의 파라미터 조합(≈3 시간, 로컬 머신)으로 그리드 서치를 수행했습니다.

결과: 모든 시나리오가 100 % 손실로 끝났습니다. 백테스팅 과정이 완전히 실패했습니다.

성찰

Cursor + Sonnet 4.5를 단계별로 사용하면서 코드를 생성하는 과정이 매끄러웠으며, 어시스턴트가 최소한의 디버깅만으로도 작동 가능한 노트북을 만들어냈습니다. 하지만 Jupyter와의 통합은 번거로웠습니다—변경 사항마다 노트북을 직접 닫았다가 다시 열고 다시 실행해야 했습니다. 그래서 저는 Ask Mode로 전환하여 코드 블록을 수동으로 붙여넣었습니다.

이번 실험을 통해 AUC 점수는 괜찮았지만, 분류기의 false‑positive 비율과 예측을 수익성 있는 거래로 전환하지 못한다는 점 때문에 현재 형태에서는 접근 방식이 효과적이지 않다는 것이 드러났습니다. 향후 작업에서는 신호 정확도, 위험 관리, 그리고 보다 현실적인 시장 마찰을 해결해야 할 것입니다.

0 조회
Back to Blog

관련 글

더 보기 »

지난달에 배운 머신러닝 교훈

전년과 마찬가지로 전 세계에 불꽃놀이가 터졌다. 사람들은 새해를 새로운 결심과 목표로 맞이했다. 어딘가에 누군가가 분명히 이렇게 말했을 것이다: “2026은…​