전체 글 목록
ML 모델2026-03-1615분 읽기

AI 주식 예측 모델, 12번의 실험 이야기

v1(ROC-AUC 0.585)에서 v7.2(KR 0.676, US 0.631)까지. "피처를 추가하면 성능이 오를 줄 알았는데, 현실은 달랐습니다."

한줄 요약

버전핵심 시도ROC-AUC결과
v1첫 모델 (가격+기술지표)0.585출발점
v2+ 뉴스 감성분석0.645+10%
v3b라벨 변경 실험0.560실패
v3c데이터 4.5배 확대0.680최고 성능
v3d데이터 8배 확대0.664MVP 채택
v3e+ 16개 피처 추가0.648오히려 하락
v4뉴스 있는 종목만 집중0.747큰 점프
v5+ 수급/시장 피처0.773롤백 (버그)
v6+ 전략 피처 12개0.746효과 없음
v6.1+ 백테스트 피처 7개0.746효과 없음
v7.2한국/미국 모델 분리KR 0.676 / US 0.631프로덕션

0장. 왜 만들었나

뉴스가 나오면 주가가 움직입니다. 하지만 사람이 모든 뉴스를 다 읽을 수는 없습니다.

"AI가 뉴스를 읽고, 기술적 지표를 분석하고, 매수 시그널을 보내주면?"

이 질문에서 출발했습니다.

타겟: 뉴스 발행 후 7일 이내 +3% 상승 여부 (이진 분류)


1장. 첫 번째 모델 — "일단 돌려보자" (v1)

가격 데이터 530만행, 기술적 지표 500만행. 187개 종목, 약 20만행의 훈련 데이터. 47개 피처: RSI, MACD, 볼린저밴드, 이동평균선, 거래량 등.

첫 결과는 처참했습니다: - 3클래스 분류 F1: 0.36 - 2클래스 분류 F1: 0.51 - 회귀 모델 R²: -69.3 (그냥 평균값을 찍는 게 더 나음)

Optuna로 100회 × 3개 모델을 자동 탐색했더니 2클래스 F1이 0.59까지 올랐습니다. 하지만 0.59로는 실전 투입이 불가능했죠.

교훈: 하이퍼파라미터 튜닝만으로도 성능이 크게 오른다. 하지만 기본 데이터가 부족하면 한계가 있다.


2장. 뉴스의 힘 (v2)

Gemini AI로 뉴스 감성분석을 돌려서 13개 뉴스 피처 추가. F1이 0.586 → 0.645로 10% 향상.

하지만 4,717개 종목 중 대부분은 뉴스가 거의 없었습니다. 뉴스 피처가 대부분 NULL이었던 겁니다.

"뉴스 있는 종목만 따로 학습시키면 어떨까?" — 이 아이디어는 v4에서 실현됩니다.


3장. 데이터 vs 피처 — 가장 큰 교훈 (v3 시리즈)

앙상블 도입

XGBoost + LightGBM + CatBoost 3개 모델을 Stacking으로 결합.

시계열 데이터 누수 방지

Purged K-Fold: 5-Fold + 7일 엠바고로 미래 데이터 학습 차단.

v3b: 라벨 변경 → 실패

기존 +3%/7일 → +5%/-3%/10일로 변경. ROC-AUC 0.680 → 0.560. 단순한 타겟이 더 좋다.

v3c: 데이터 4.5배 확대 → 대성공

피처를 하나도 안 바꾸고 데이터만 늘렸는데 ROC-AUC 0.585 → 0.680. +16%.

"데이터 > 피처" — 이 한 줄이 전체 여정의 핵심 교훈입니다.

v3e: 피처 16개 추가 → 오히려 하락

모멘텀, 변동성, 시장지표 등 추가. ROC-AUC 0.664 → 0.648. 성능이 떨어졌습니다. 소형주에서 추가 피처가 노이즈로 작용.


4장. 집중 전략 — "뉴스 있는 종목만" (v4)

전체 4,700종목 중 뉴스 커버리지 3% 이상인 247종목만 학습.

ROC-AUC: 0.664 → 0.747 (+12.5%). 역대 최대 점프!

교훈: 많은 데이터보다 좋은 데이터가 중요할 때가 있다.


5장. 허상의 성능 개선 (v5)

수급 데이터 등 8개 피처 추가. ROC-AUC 0.773 (+3.5%). 하지만 새 피처 중요도 전부 0%.

원인: 성능 향상이 Stacking 설정 변경 덕분이었고, 프로덕션에선 다른 방식 사용 중. v5 롤백.

교훈: 오프라인 지표 개선이 실전 성능 개선을 보장하지 않는다.


6장. 피처의 무덤 (v6, v6.1)

v6: 전략 피처 12개 추가 → ROC-AUC 0.746 (효과 없음). v6.1: 백테스트 타이밍 피처 7개 추가 → ROC-AUC 0.746 (여전히 동일).

교훈: 좋은 피처라도 데이터 커버리지가 50% 미만이면 효과 없음.


7장. 시장별 모델 분리 (v7.2)

한국과 미국은 공시 시스템, 수급 구조, 뉴스 생태계가 다릅니다.

통합 모델 ROC-AUC 0.664 → KR 전용 0.676, US 전용 0.631.

이 과정에서 조건문 버그 하나가 일주일간 전체 시그널을 차단하는 사태도 발생했습니다.


핵심 교훈 7가지

1. 데이터가 왕이다 — 피처 추가 6전 전패, 데이터 확충 3전 3승 2. 피처를 추가하면 항상 좋아지진 않는다 — 커버리지 50% 미만은 노이즈 3. 오프라인 지표를 맹신하지 마라 — 훈련 = 프로덕션 일치가 핵심 4. 시장마다 모델을 분리하라 — 한국과 미국은 구조가 다르다 5. 과적합은 데이터 부족 신호 — CV-Holdout 갭 5% 이상이면 데이터 부족 6. 작은 버그가 서비스를 죽인다 — 프로덕션 모니터링이 생명 7. 비용 효율을 항상 따져라 — API 피처보다 무료 데이터가 나을 수 있다


성능 변화 그래프

ROC-AUC
0.80 ┤                                              ····· (천장)
0.75 ┤                          ★v4 (0.747)
0.70 ┤                        ╱
0.68 ┤             ★v3c     ╱
     │            ╱ 0.680 ─╳─ v6, v6.1 (0.746)
0.66 ┤       ★v3d╱
     │       0.664                     ★v7.2 KR (0.676)
0.64 ┤                                ★v7.2 US (0.631)
0.60 ┤  ╱
0.58 ★v1 (0.585)
0.56 ┤     ★v3b (0.560)
     ┼─────────────────────────────────────────────
     v1   v2   v3b  v3c  v3d  v3e  v4   v6  v7.2

이 기술을 직접 경험해보세요

무료로 시작하기
개미날다 — AI 알파 & 종목 리포트