지난 글에서 연 1억 퍼센트짜리 백테스트 결과를 보여드렸습니다. 그리고 그게 말이 안 된다는 것도 같이 적었습니다.
이번 글은 그게 왜 그랬는지, 그리고 알아내기까지 제가 무엇을 했는지에 대한 기록입니다.
결론부터 말씀드리면 이렇습니다. 제 AI는 시험을 잘 본 게 아니라, 답이 적힌 시험지를 받았습니다.
먼저, 실제 돈으로 돌렸습니다
백테스트가 저렇게 나오는데 안 돌려볼 사람은 없습니다. 저도 그랬습니다.
모델을 실거래 시스템에 연결했습니다. AI가 매긴 수익 확률이 일정 점수를 넘는 종목만 사도록 문턱을 걸었습니다. 매일 저녁 스캔 결과에 「AI 수익확률 0.93」 같은 숫자가 찍혀 나왔습니다. 그럴듯했습니다.
결과는 손실이었습니다.
그런데도 저는 모델이 잘못됐다고 생각하지 않았습니다. 표본이 적어서겠지, 시장이 안 좋아서겠지 하고 넘겼습니다. 이게 가장 뼈아픈 부분입니다.
그리고 몇 주 동안 「개선」을 했습니다
여기서부터가 진짜 처참한 대목입니다. 저는 그 모델을 더 좋게 만들려고 시간을 쏟았습니다.
| 한 일 | 결과 |
|---|---|
| 차트를 그림으로 학습시키는 방식과 비교 | 그림 0.631 vs 숫자 0.734 — 숫자 방식 승 |
| 다른 알고리즘 두 개를 더 붙여 3종 앙상블 | 0.7500 / 0.7505 / 0.7499 → 앙상블 0.7513 |
| 새 정보를 담은 피처를 추가 | 상위 20% 승률 85.5% → 86.8% |
| 여러 구간으로 나눠 재검증 | 5개 구간 전부 개선 확인 |
표를 보시면 꽤 성실해 보입니다. 비교군을 두고, 여러 구간에서 검증하고, 소수점 셋째 자리까지 따졌습니다.
그런데 저 숫자들이 전부 가짜였습니다. 저는 가짜 점수를 0.001씩 올리려고 몇 주를 쓴 겁니다. 열심히 했다는 게 오히려 더 아픕니다.
발견은 엉뚱한 질문에서 시작됐습니다
어느 날 결과를 들여다보다가 이상한 걸 느꼈습니다. AI가 높은 점수를 주는 종목들이 하나같이 그날 이미 많이 오른 종목이었습니다.
기술적인 질문이 아니었습니다. 그냥 납득이 안 돼서 물어본 겁니다. 저는 코드를 읽을 줄 모르니 이상하다는 느낌만 말할 수 있었습니다.
이 질문 하나가 두 달치 작업을 무너뜨렸습니다.
범인은 「얼마에 샀다고 칠 것인가」였습니다
백테스트를 하려면 매수 가격을 정해야 합니다. 과거 데이터에는 "그날 얼마에 샀다"가 없으니, 어딘가로 정해야 합니다.
처음에 저는 제가 정한 가격에 샀다고 쳤습니다. "여기까지 내려오면 산다"는 지정가 방식입니다. 평소 제가 실제로 매매하던 방식 그대로라 자연스러워 보였습니다.

문제는 일봉 데이터에 「체결됐는지」가 없다는 것입니다.
하루치 데이터는 시가·고가·저가·종가 네 개가 전부입니다. 그날 제가 걸어둔 가격에 실제로 거래가 붙었는지는 이 안에 없습니다. 그래서 백테스트는 그날 저가가 제 지정가보다 낮으면 「샀다」고 처리했습니다.
그런데 저가는 장이 끝나야 아는 값입니다.
결과가 어떻게 됐냐면, 그날 잘 풀린 종목만 매수로 잡혔습니다. 제가 종목을 고른 게 아니라 결과가 종목을 골라준 겁니다.
근사치로 바꿨지만, 다 없애지는 못했습니다
이걸 알고 나서 체결가를 근사치로 바꿨습니다. 그날 가격 범위의 일정 지점에서 샀다고 치는 방식입니다.
저가 + 0.4 × ( 고가 − 저가 )
지정가 방식보다는 나았습니다. 적어도 "오른 종목만 골라 담기"는 줄었습니다.
그런데 이것도 당일 저가와 고가를 씁니다. 누수를 줄였을 뿐 없애지는 못한 겁니다. 그리고 이 값이 AI의 입력으로 들어가면서, 문제가 AI까지 번졌습니다.
그래서 AI가 배운 것
이게 왜 AI까지 망가뜨렸는지가 핵심입니다.
AI가 보는 정보 중에 「지금 가격이 최근 평균에서 얼마나 위에 있나」가 있었습니다. 그런데 그 「지금 가격」이 방금 말한 근사 매수가였습니다.
그러면 이렇게 됩니다.
- 그날 많이 오른 종목 → 고가가 높음 → 매수가가 높게 잡힘
- 매수가가 높음 → 「평균에서 위에 떠 있다」는 값이 커짐
- AI: "이 값이 크면 오르더라"
당연히 맞습니다. 이미 오른 날이니까요.
실제로 그 하나의 정보가 AI 점수의 절반 이상(중요도 57.7%)을 차지했고, 점수와의 상관관계는 +0.94였습니다. 거의 그 값 하나로 점수가 결정된 겁니다.
정직하게 다시 학습시켰습니다
답을 지우고 다시 시험을 보게 했습니다. 매수하는 시점에 실제로 알 수 있는 정보만으로 5만 7천여 건을 다시 학습시켰습니다.

AI 성능은 보통 AUC라는 숫자로 잽니다. 0.5가 동전던지기이고, 1.0이 완벽입니다.
| 모델 | AUC | 뜻 |
|---|---|---|
| 누수가 있던 모델 | 0.745 | 착시 |
| 정직하게 재학습 | 0.527 | 사실상 동전던지기 |
| 따로 만든 매도 전용 모델 | 0.517 | 실패 |
0.527입니다. 동전을 던지는 것과 구별이 안 됩니다.
정직하게 학습시켰더니 가장 중요한 정보로 꼽힌 게 「전날 지수가 올랐나 내렸나」였습니다. 종목 자체를 보는 예측력은 거의 0이었습니다.
더 나빴던 것 — 방향이 거꾸로였습니다
"쓸모없다"에서 끝나지 않았습니다.
정직한 점수에 아주 작게 남은 신호가 있었는데, 방향이 반대였습니다. 점수가 낮은 쪽이 오히려 승률이 조금 더 높았습니다.
즉 "점수 높은 걸 사라"는 제 로직은 무신호일 뿐 아니라 거꾸로였습니다.
그리고 비용은 실제로 냈습니다. AI 점수가 문턱을 넘을 때까지 기다렸다 사는 구조라, 남들보다 늦게 진입하게 됩니다. 재보니 평균 2.5% 정도 비싸게 사고 있었습니다.
같은 병이 다른 모델에도 있었습니다
하나를 찾고 나니 나머지도 봐야 했습니다. 결과는 참담했습니다.
- 다른 전략용 AI — 가장 중요한 정보 1위가 「당일 거래량」이었습니다. 장이 끝나야 아는 값입니다. 승률 59~75%가 전부 착시였습니다.
- 매도 시점 AI — AUC 0.517. 애초에 아무것도 못 배웠습니다.
그래서 AI 계열은 전부 걷어냈습니다. 두 달 가까이 붙잡고 있던 게 한 줄로 정리됐습니다.
서로 다른 두 프로젝트에서 똑같은 형태로 나왔습니다. 이제는 모델을 만들면 성능부터 보지 않고 1위 정보가 무엇인지부터 봅니다.
그럼 승률은 어디서 나온 건가
여기서 한 가지는 건졌습니다.
AI를 전부 걷어내고 다시 재보니, 성적이 0이 되지는 않았습니다. 화려한 숫자는 사라졌지만 남는 게 있었습니다.
| 진짜였던 것 | 가짜였던 것 |
|---|---|
| 어떤 자리에서 사는가 (신호 정의) | AI 점수 |
| 얼마나 눌린 자리에서 받는가 | AI 확신도로 금액 키우기 |
| 언제 파는가 (청산 규칙) | AI 매도 판단 |
왼쪽은 전부 제가 손으로 정한 규칙이고, 오른쪽은 전부 AI입니다. 정직하게 다시 재보니 성과는 왼쪽에서 나오고 있었고, AI는 그 위에 얹혀서 공을 가로채고 있었을 뿐이었습니다.
AI가 골라줘서 이긴 게 아니라, 규칙이 이기고 있는데 AI가 옆에 서 있었던 겁니다.
배운 것
① 결과가 너무 좋으면 그게 경고입니다
연 1억 퍼센트가 나왔을 때 저는 기뻐했습니다. 그때 의심했어야 합니다.
지금은 기준을 정해뒀습니다. 말이 안 되게 좋은 숫자가 나오면 먼저 버그를 찾습니다. 그게 맞는 순서였습니다.
② 모든 값에 「그때 알 수 있었나」를 묻습니다
이게 유일한 방어입니다. 백테스트에 쓰이는 값 하나하나에 이렇게 묻습니다.
저가·고가·종가·거래량은 전부 장이 끝나야 아는 값입니다. 당일 것을 쓰면 그 순간 백테스트는 거짓말이 됩니다.
③ AI는 모르는 걸 모른다고 하지 않습니다
답이 적힌 시험지를 주면 AI는 "이거 답이 적혀 있는데요"라고 말하지 않습니다. 그냥 답을 베끼고 만점을 받아옵니다.
사람이 확인해줄 때까지 아무도 이상하다고 하지 않습니다. 검증은 사람 몫입니다.
④ 코드를 몰라도 이상한 건 알아챌 수 있습니다
이 모든 게 "왜 이미 오른 종목에 후한 점수를 주지?"라는 질문 하나에서 시작됐습니다.
저는 코드를 못 읽습니다. 누수라는 말도 그때 처음 들었습니다. 그런데 결과가 이상하다는 건 알 수 있었습니다.
코드를 못 읽는 게 검증을 못 한다는 뜻은 아니었습니다. 납득이 안 되면 물어보는 것, 그거면 됐습니다.
계좌는 어떻게 됐나
숫자로 말씀드리는 게 정직할 것 같습니다. 원금 500만 원으로 시작했습니다.
| 시점 | 잔고 | 원금 대비 |
|---|---|---|
| 시작 | 5,000,000원 | — |
| AI를 붙인 모델로 돌리던 때 | 4,690,000원 | −6.2% |
| 오늘 (새로 만든 시스템) | 5,626,597원 | +12.5% |
연 1억 퍼센트짜리 백테스트를 들고 있던 시절의 실제 성적이 −6.2%입니다. 백테스트와 현실의 거리가 이만큼입니다.
AI를 걷어내고 규칙만 남겨서 새로 만든 뒤로는 저점에서 +20% 올라왔습니다. 앞에서 "진짜였던 것은 규칙이었다"고 쓴 게 말뿐이 아니라는 정도의 근거는 됩니다.
마무리
두 달 남짓을 날렸습니다. 실거래에서 돈도 잃었습니다. 만들었던 AI 모델은 전부 버렸습니다.
그래도 하나는 확실히 얻었습니다. 이제 백테스트 결과를 믿지 않습니다. 좋은 숫자가 나오면 기뻐하기 전에 어디서 새는지부터 봅니다.
백테스팅을 시작하시는 분이라면 이 함정은 거의 반드시 밟습니다. 저처럼 두 달을 쓰지 마시라고 적어둡니다.
다음 글에서는 그럼 무엇을 믿을 수 있는가를 다뤄보겠습니다. 백테스트를 속이는 함정이 이것 말고 하나 더 있는데, 이건 더 조용하고 더 흔합니다.
· 첫 자동매매 모델을 만들었더니 연 1억% 수익이 나왔습니다
· 한국투자증권 KIS API를 고른 이유 — HTS를 켜지 않아도 되는 자동매매
· 클로드 코드가 멋대로 코드를 고칠 때 — CLAUDE.md 설정법
'자동매매 일지 > 개발 이야기' 카테고리의 다른 글
| 첫 자동매매 모델을 만들었더니 연 1억% 수익이 나왔습니다 (0) | 2026.08.20 |
|---|---|
| 코딩의 '코'도 모르던 직장인의 자동매매 개발 첫걸음 (0) | 2026.08.19 |