퀀트 / 트레이딩6 분 읽기

모델은 완벽하게 로드됐는데, 어제한테 졌습니다

핀 고정 커밋, 채널 인덱스, 룩어헤드까지 소스 레벨로 전부 검증했습니다. 다 맞았습니다. 그런데 네 종목 전부 '내일 종가 = 오늘 종가'를 못 이기고 있었습니다.

#quant#first-principles#reality-check#verification#methodology
Left panel: every integration check passing — pinned commit, quantile channel, no look-ahead. Right panel: model MAE divided by random-walk MAE at 1.05, 1.04, 1.05, 1.00 for four symbols — all losing.
통합은 전부 정상이었습니다. 신호가 없었을 뿐입니다.

시계열 파운데이션 모델(TimesFM 2.5)로 ETF 일봉 종가를 예측해 매매하는 페이퍼 실험이 역사 스크린에서 FAIL로 끝났습니다. -31.6%. 손절 규칙 문제인지, 비용 문제인지, 모델 문제인지 갈라야 했습니다.

그래서 통합부터 소스 레벨로 검증했습니다. 당신은 라이브러리 반환값의 의미를 독스트링으로 믿습니까, 소스로 확인합니까?

통합은 전부 맞았다

  • 핀 고정한 커밋이 원격 HEAD와 일치하는지 git ls-remote로 확인. 설치본 direct_url.json의 commit_id도 동일.
  • 모델이 반환하는 point가 뭔지 소스로 추적: return full_forecast[..., 5] — 분위수 채널이 [점추정, q0.1..q0.9] 10개라 채널 5는 정확히 q0.5(중위값). 제 코드의 median_return 라벨이 맞았습니다.
  • 룩어헤드 검사: 저장된 예측의 입력 해시를 DB에서 독립 재계산 — 일치. 미래 봉이 입력에 섞이지 않았습니다.

여기까지 하면 보통 "구현은 문제없음"으로 덮습니다. 저도 그럴 뻔했습니다.

신호 자체를 쟀다

68 신호일 × 4종목, 예측 수익률 vs 실현 수익률:

종목 corr(예측, 익일) 부호 적중 모델 MAE ÷ 랜덤워크 MAE
SPY +0.046 50.0% 1.05
QQQ -0.020 50.0% 1.04
TQQQ -0.025 52.9% 1.05
SOXL +0.191 45.6% 1.00

마지막 열이 전부입니다. 네 종목 전부, 모델의 예측 오차가 "내일 종가 = 오늘 종가"라는 나이브 예측보다 같거나 큽니다. 방향이 4/4로 일치하는 짝지은 비교라, 개별 상관계수의 유의성 논쟁 없이 결론이 섭니다.

함정 하나. 종목을 섞어 계산한 통합 상관은 +0.148이 나옵니다. 인용하고 싶어지는 숫자입니다. 그런데 이건 변동성 큰 종목이 예측도 크고 실현도 커서 스케일만으로 만들어지는 상관입니다. 종목별로 갈라야 0이 보입니다.

당신이라면 여기서 어느 숫자를 리포트에 실었겠습니까?

모델이 실제로 하던 일

예측과 전일 실현 수익률의 상관이 네 종목 모두 -0.41 ~ -0.53이었습니다. 즉 이 모델의 일봉 예측은 미래 정보가 아니라 어제 움직임의 되돌림 반향입니다. 그래서 전략은 늘 "어제 가장 빠진 것"을 샀고, 3배 ETF에 -3% 손절을 걸어놓으니 손절 11회 · 익절 0회가 나왔습니다. 실행 규칙의 결과처럼 보이지만 신호의 결과입니다.

하나 더: 모델은 종가→종가를 예측하는데 전략은 시가 진입이었습니다. 절대 가격 이동의 52.8%가 야간 갭에서 났고, 갭과 일중 이동의 상관은 +0.034 — 완벽한 종가 예측기가 있어도 절반은 거래 불가였습니다. 사전등록을 해도 예측 대상과 거래 대상이 다르면 소용없습니다.

자가진단 3개

  • 새 예측기를 쓰기 전에 나이브 랜덤워크 대비 MAE 비율을 계산했습니까? 1.0을 못 깨면 실행 계층은 지을 이유가 없습니다.
  • 상관을 종목별로 냈습니까, 풀에서 냈습니까? 풀 상관은 변동성 스케일이 만듭니다.
  • 모델이 예측하는 양과 전략이 거래하는 양이 같은 양입니까?

솔직한 부분

이 신호 검증은 반나절이면 됐습니다. 저는 실행 계층(체결 모형, 게이트, 분봉 검증)을 먼저 다 짓고 3개월 백테스트를 돌린 뒤에야 쟀습니다. 판정에 59년이 필요했던 게이트와 같은 병입니다 — 산수를 나중에 했습니다.

지금 딱 하나만 해보세요. 돌아가는 예측 모델이 있다면 mean(|pred - real|) / mean(|real|)을 종목별로 계산해 보시기 바랍니다. 1.0 밑이 하나도 없다면, 그 모델 위의 모든 것이 비용입니다.

관련 글