AI 주식 봇 62건 매매 기록으로 수익화 계획을 짰다 — 그 기록엔 계좌가 두 개 섞여 있었다
AI 주식 봇 62건 매매 기록으로 수익화 계획을 짰다 — 그 기록엔 계좌가 두 개 섞여 있었다
결과부터 — 62건 기록으로 짠 수익화 계획이 같은 날 저녁에 무효가 됐다
2026년 9월 2일 아침, AI 주식 봇이 쌓아 둔 매매 기록 62건을 근거로 수익화 계획서를 썼습니다. 같은 날 저녁, 그 문서 맨 위에 "이 수치는 오염된 표본이었다"는 정정 블록이 올라갔어요. 하루도 안 돼 계획의 통계 전제가 무너진 겁니다.
무너진 이유는 세 겹이었습니다.
매매 기록 한 테이블에 서로 다른 계좌 두 개가 섞여 있었다
기록에서 빠진 9건 중 8건이 수익 거래였다
정본과 맞춰 볼 수 있던 48건 중 47건은 손익 계산 자체가 틀렸다
그 기록 위에서 검색식(어떤 종목을 살지 고르는 조건식)을 자동 평가하던 학습 루프도 같이 흔들렸습니다. 평가 결과의 67%가 남의 성적표였어요.
계획서는 지우지 않고 정정 블록을 위에 얹어 남겼습니다. 무엇을 어떻게 틀렸는지 추적하려면 틀린 문서도 기록이니까요.
아침 — 기록을 의심하지 않은 채 계획을 짰다
이 봇은 한국투자증권 API로 돌아가는 자동매매 프로그램입니다. 9월 2일 아침 AI(Claude Code)에게 시킨 일은 지금까지의 매매 기록으로 수익화 가능성을 분석해 계획을 짜라는 것이었습니다.
AI는 closed_trades 테이블을 전수 분석했습니다. 매수부터 매도까지 한 번 끝난 거래를 한 줄씩 적어 둔 원장(모든 매매를 적어 두는 장부)이고, 62건이 있었어요. 결과물은 그럴듯했습니다. "6월 한 달이 전체 손실의 85%다. 8월은 승률 40.7%, 손익비(이긴 거래의 평균 이익 ÷ 진 거래의 평균 손실) 1.28:1 로 거의 본전이고, 수수료·세금 같은 비용에서 진다. 그러니 손절폭(손실이 얼마가 되면 파는지 정한 폭)을 조이는 백테스트(과거 데이터로 전략을 돌려 보는 것)부터 돌리자." Phase 0부터 3까지 실행 계획이 붙어 있었어요.
숫자가 많고 표가 정연하면 믿게 됩니다. 저도 믿었어요. 그런데 이 분석에서 아무도 안 물은 질문이 하나 있었습니다. "그 62건이 정말 같은 계좌의 기록이 맞나?"
"매매 경험이 너를 전혀 발전시키지 못한 거야?" — 순서를 바꾸자 결함이 줄줄이 나왔다
세션 후반, AI가 확인 없이 결론부터 말하는 일이 이어져서 제가 물었습니다. "매매 경험이 너를 전혀 발전시키지 못한 거야?" "내 토큰만 낭비했다는 말인가?"
AI는 이 지적을 받아들이고 작업 순서를 바꿨어요. 분석부터 하는 게 아니라, ① 기존 시스템이 이미 만들어 둔 산출물을 먼저 조회하고 ② 원장이 다른 기록과 맞는지 실제로 대조한 뒤 ③ 그다음에야 분석하고 보고하는 순서로요.
이 순서를 적용해 원장을 대조하자마자 결함이 나왔습니다.
첫째, 계좌가 두 개였습니다. 6월 18일 이전 기록은 한국투자증권 모의계좌(증권사가 주는 가상 돈 계좌, 5억 원 규모)의 것이고, 6월 19일 이후는 직접 만든 페이퍼 브로커(실제 돈 없이 체결만 흉내 내는 자체 프로그램, 1천만 원 규모)의 것이었어요. 규모가 50배 다른 두 계좌가 한 테이블에 섞여 있었고, 아침 계획의 "6월이 손실의 85%"는 대부분 모의계좌 시대의 손실이었습니다. 페이퍼 계좌와 무관한 손실을 페이퍼 성과로 읽은 거예요.
둘째, 누락이 한쪽으로 치우쳐 있었습니다. 페이퍼 계좌의 정본 파일(paper_account.json)에 있는 57건과 대조하니 양쪽에 다 있는 게 48건, 기록에서 빠진 거래가 9건이었고, 그 9건 중 8건이 수익 거래였어요. 진 거래는 남고 이긴 거래가 빠지는 승자 편향 누락입니다. 합계 +242,690원어치가 장부에서 사라져 있었어요. 부분 청산(보유 수량의 일부만 파는 것)이 closed_trades 행을 만들지 않는 게 유력한 원인이었습니다.
셋째, 기록된 것도 틀려 있었습니다. 양쪽에 다 있어 맞춰 볼 수 있던 48건 중 47건의 손익이 실제 체결가가 아닌 다른 가격으로 계산됐고, 수수료·세금도 빠져 있었어요.
이게 얼마나 큰 차이인지 보여 주는 사례가 하나 있습니다. 검색식 하나가 전날 closed_trades 기준으로 −182,084원 손실로 보고됐는데, 정본 기준으로는 +104,898원 이익이었어요. 부호가 뒤집혀 있었던 겁니다.
정정 후 페이퍼 계좌 정본으로 다시 계산하니 결론이 바뀌었습니다.
아침 계획 | 정정 후 | |
|---|---|---|
표본 |
| 페이퍼 계좌 정본 |
승률 | 8월 40.7% | 8월 41% · 6~9월 전체 29.8% |
손익비 | 1.28:1 | 1.03:1 |
판단 | "거의 본전, 비용에서 진다" | "구조적으로 진다" |
Phase 1 | 손절폭 백테스트 | 원장 정합성 확립 |
8월만 놓고 보면 승률은 거의 그대로예요. 바뀐 건 손익비입니다. 이긴 거래에서 버는 돈과 진 거래에서 잃는 돈이 1.03:1 로 거의 같은데 6월 이후 전체 승률이 29.8%면, 계산상 계속 지는 구조예요. 그래서 손절폭 백테스트를 먼저 돌리자던 Phase 1은 "원장 정합성 확립이 먼저"로 바뀌었습니다.
기록만이 아니라 그 위의 학습 루프도 — 67%가 남의 성적표였다
이 봇에는 검색식마다 매주 백테스트를 돌려 등급을 매기고, 등급이 계속 나쁘면 "이 검색식을 꺼라"고 텔레그램으로 제안하는 학습 루프가 있습니다. 원장을 대조한 김에 이 루프도 실측했어요.
제안은 총 42건이 만들어졌고 전부 텔레그램으로 발송됐습니다. 그중 "검색식을 꺼라"는 21건이 최장 68일째 승인 대기 상태였어요. 7월 11일에는 당시 켜져 있던 검색식 6개 전부를 끄라는 제안도 있었습니다. 제안은 도달했는데 결정이 없었고, 그 사이 검색식들은 계속 매매를 했습니다.
그러면 이 21건을 지금이라도 승인하면 되나? 근거를 확인하러 검색식별 백테스트 결과를 열었더니 더 이상한 게 나왔어요. 8월 29일 주차 66건 중 44건(67%)이 서로 다른 검색식인데 승률·수익률·최대 낙폭(고점에서 가장 많이 떨어졌을 때의 하락 폭)·거래 수가 소수점 15자리까지 완전히 같았습니다. 백테스트가 검색식별로 돌지 않고 있었던 거예요. A 검색식의 등급이 실제로는 B 검색식의 성과로 매겨지고 있었고, "4주 연속 F등급이니 끄자"는 논리는 성립하지 않았습니다.
그래서 21건을 일괄 승인하는 대신 결정표를 만들었어요. 근거가 백테스트가 아니라 실거래 40건인 검색식 1건만 끄기 승인 권고, 표본이 부족한 5건은 보류(끄면 표본이 영영 안 쌓여 판정 불가가 굳어지니까), 대상이 이미 꺼져 있는 15건은 정리. 최종 승인은 다음 세션으로 남겼고, 살아 있는 근거와 무효인 근거를 가르는 게 이 표의 본체였습니다.
순서를 고쳤다 — 조회 → 대조 → 분석
이날 고친 것과 안 고친 것을 나눠 적어 둡니다.
고친 것. 계획서 맨 위에 정정 블록을 넣어 어느 수치가 왜 무효인지 남겼고, Phase 1을 "원장 정합성 확립"으로 바꿨습니다. 판정도 안 된 검색식에 큰돈이 걸려 있던 문제(전날 확인한, 켜진 검색식 6개 중 5개가 최소 표본을 못 채운 채 매매 중)에 대한 1차 대응으로 총 노출 한도(봇이 한 번에 걸 수 있는 돈의 상한)를 2,550만 원에서 1,300만 원으로 줄였어요. 줄이는 스크립트는 축소 전용·미리보기(dry-run) 기본·되돌리기 SQL 동봉으로 만들었습니다.
안 고친 것. 원장 재정비(누락분 반영, 47건 손익 재계산)와 백테스트 지표가 뒤섞이는 결함의 근본 수정은 다음 과제로 남겼습니다. 그래서 지금 이 봇의 수익률 통계는 전부 잠정입니다. 손실이 났다는 방향은 맞지만, 얼마나·어디서인지는 원장을 고치기 전엔 답할 수 없어요.
돌아보면 AI가 틀린 게 아니라 제가 순서를 잘못 시킨 겁니다. 데이터를 보고 계획을 짜라고는 했지, 그 데이터가 맞는지 먼저 보라고는 안 했으니까요. 확인을 건너뛰라고 시킨 적은 없지만, 확인하라고 시키지도 않았습니다.
AI에게 "데이터 보고 판단해"라고 시키기 전에, 그 데이터가 어디서 왔고 다른 기록과 맞는지부터 대조하세요. 기존 산출물 조회 → 원장 정합성 대조 → 그다음 분석. 확인을 건너뛴 자리마다 결함이 있었습니다.
댓글
아직 댓글이 없습니다. 첫 번째 댓글을 남겨보세요.