AI로 만든 백테스트, 어떻게 검증할까?
AI에게 백테스트를 만들어 달라고 하면 코드는 금방 나온다.
수익률, MDD, 승률까지 표로 예쁘게 보여준다.
그런데 그 숫자가 맞는지는 어떻게 알까?
코드가 실행됐다는 것과 전략이 정확히 구현됐다는 것은 완전히 다른 얘기다.
서로 다른 AI 두 개에게 같은 전략을 줬다.
백테스트 엔진은 각각 따로 만들게 했다.
결과를 대조하자 혼자서는 찾기 어려웠던 버그가 3개 나왔다.
AI 두 개를 이렇게 사용했다
- 진입, 손절, 사이징, 비중 한도를 문장으로 먼저 확정한다.
- 서로 다른 AI에게 같은 문장만 준다.
- 서로의 코드는 보여주지 않고 각자 엔진을 만들게 한다.
- 같은 데이터로 실행한다.
- 최종 수익률이 아니라 중간 결과를 비교한다.
핵심은 마지막이다.
수익률만 비교하면 “조금 다르지만 비슷하네” 하고 넘어가기 쉽다.
대신 날짜별 후보 종목, 조건별 신호 수, 실제 체결 수처럼 수익률이 만들어지기 전 단계부터 비교해야 한다.
실제로 발견한 버그 3개
1. 거래대금 기준의 모집단이 달랐다
거래대금 상위 3분의 1을 고르는 단계에서 신규 상장주를 미리 빼고 있었다.
하지만 실제 매매 봇은 신규 상장주를 포함해 기준선을 계산했다.
몇 종목의 차이처럼 보일 수 있다.
하지만 모집단이 달라지면 상위 3분의 1을 나누는 기준도 달라진다.
2. 작은 소수점 차이가 종목을 바꿨다
백분위 기준을 66.667로 하드코딩했는데 실제 봇은 정확한 2/3을 사용했다.
차이는 아주 작다. 하지만 경계에 걸린 종목은 매일 몇 개씩 달라졌다.
작은 오차도 매일 반복되면 전혀 다른 매매 기록을 만든다.
3. break 하나가 조건을 끝냈다
조건을 거르는 반복문 안에 break가 들어가 있었다.
조건에 맞는 날마다 신호를 막아야 하는데 첫날 하루만 막고 끝났다.
세 가지 모두 문법 오류는 아니었다. 코드는 멀쩡히 돌아갔고 결과도 그럴듯했다.
99.5%가 같아도 수익률은 달랐다
버그를 고친 뒤 두 엔진의 후보 종목은 99.50% 일치했다.
- 공통 후보: 3,617개
- 내 엔진: 3,629개
- 상대 엔진: 3,635개
그런데도 연복리는 2.5%p 차이가 났다.
같은 날 여러 신호가 뜰 수 있다.
이때 무엇을 먼저 사느냐에 따라 결과가 달라진다.
슬리피지를 얼마나 적용하는지도 영향을 준다.
이 정도는 코딩 오류라기보다 실제 운용에서 생길 수 있는 불확실성에 가깝다.
그래서 백테스트 결과는 점 하나가 아니라 분포로 보는 게 맞다.
AI 백테스트를 받으면 이렇게 확인하면 된다
AI가 백테스트 결과를 내놓으면 아래 순서대로 요청하면 된다.
- 날짜별 후보 종목을 파일로 뽑아줘
- 각 조건을 통과한 종목 수를 단계별로 보여줘
- 실제 체결 목록과 탈락 이유를 기록해줘
- 임의의 종목 10개를 손으로 검산할 수 있게 계산 과정을 보여줘
- 매수 우선순위와 슬리피지를 바꿔 여러 번 다시 돌려줘
AI로 코드를 만드는 속도는 빨라졌다.
그만큼 틀린 결과를 빨리 얻는 일도 쉬워졌다.
백테스트에서 먼저 검증할 것은 수익률이 아니라, 그 수익률이 만들어진 과정이다.