자동매매 봇을 만들며 저지른 실수들 — 백테스트는 죄가 없다
트레이딩 봇을 직접 만들어 실계좌로 돌리면서 배운 것들. 백테스트 과최적화, 수수료 무시, 거래소 API의 함정, 그리고 킬 스위치 이야기.
2026-08-01
이 사이트의 모든 거래는 제가 만든 봇이 실행합니다. 지금은 그럭저럭 안정적으로 돌아가지만, 여기까지 오는 동안 저지른 실수들이 꽤 있습니다. 자동매매를 시작하려는 분들이 같은 비용을 지불하지 않도록 기록으로 남깁니다.
실수 1: 백테스트를 믿은 게 아니라, 백테스트에 맞춘 것
첫 번째 봇의 백테스트 수익률은 화려했습니다. 그런데 실계좌에 올리자마자 백테스트와 전혀 다른 성적이 나왔습니다.
원인을 찾는 데 한참 걸렸는데, 결론은 단순했습니다. 저는 전략을 검증한 게 아니라, 과거 데이터에 맞을 때까지 파라미터를 조정한 것이었습니다. RSI 기준을 30에서 28로, 이동평균을 20에서 21로… 이런 식으로 만지다 보면 어떤 전략이든 과거 구간에서는 돈을 법니다. 과거에 맞춘 정밀도가 높을수록 미래에는 안 맞습니다. 과최적화(overfitting)라는 걸 머리로는 알았는데, 내가 하고 있다는 건 몰랐습니다.
지금은 규칙을 이렇게 바꿨습니다:
- 파라미터는 딱 떨어지는 둔한 값만 씁니다. 28.5 같은 정밀한 값이 필요한 전략은 그 자체로 의심 신호입니다.
- 백테스트 구간과 검증 구간을 분리하고, 검증 구간은 파라미터를 확정한 뒤 한 번만 봅니다.
- 백테스트에서 조금 아쉬운 성적 + 어느 구간에서나 비슷한 성적 > 특정 구간에서만 화려한 성적.
실수 2: 수수료와 슬리피지를 "나중에 반영"
백테스트 코드를 처음 짤 때 수수료를 뺐습니다. "어차피 작으니까 나중에." 그 나중에 반영해보니 연 수익률이 통째로 사라졌습니다.
거래 빈도가 높은 전략일수록 이 함정이 깊습니다. 왕복 0.12%의 수수료는 하루 5회 거래하는 전략에서 연간 원금의 수십 퍼센트가 됩니다(자세한 계산은 수수료 글에 있습니다). 슬리피지도 마찬가지입니다. 백테스트는 "그 가격에 원하는 만큼 체결됐다"고 가정하지만, 실제 시장은 얇은 호가창에서 내 주문이 가격을 밀어냅니다.
교훈: 수수료·슬리피지는 백테스트 1일차부터 최악의 가정으로 넣으세요. 그 조건에서도 살아남는 전략만 실계좌에 갈 자격이 있습니다.
실수 3: 거래소 API 문서를 믿은 것
문서에 적힌 것과 실제 동작이 다른 경우가 생각보다 많습니다. 이 사이트를 만들면서 실제로 부딪힌 것들입니다.
- 페이지 크기 제한: 거래 내역 API에 100건을 요청해도 실제로는 최대 20건만 반환됩니다. 문서만 믿고 짠 코드는 조용히 데이터의 80%를 놓치고 있었습니다. 에러도 안 납니다. 이게 최악입니다.
- 페이지네이션 방식: ID 기반 페이지네이션이 있길래 썼는데 누락이 생겼습니다. 결국 시간 기반(마지막 거래의 타임스탬프 - 1ms)으로 바꾸고서야 전체 데이터가 정확히 모였습니다.
- 마켓 타입 분리: USDT 선물만 조회하면 되는 줄 알았는데, USDC 선물과 코인 마진 선물이 별도 엔드포인트였습니다. "내 거래가 다 안 보이는" 버그의 정체였습니다.
교훈: API는 문서가 아니라 실제 응답을 기준으로 검증하세요. 특히 "조용히 덜 주는" 실패는 에러 로그에 안 남습니다. 받아온 데이터의 총합(거래 수, 손익 합계)을 거래소 화면과 대조하는 검증 단계를 반드시 넣어야 합니다.
실수 4: 킬 스위치 없이 자동화부터 한 것
봇을 처음 24시간 돌린 날, 저는 잠을 거의 못 잤습니다. "지금 뭘 하고 있을까"를 확인할 방법이 마땅치 않았기 때문입니다. 자동화의 역설입니다 — 손은 자유로워졌는데 불안은 커졌습니다.
지금은 순서를 이렇게 권합니다:
- 모니터링 먼저, 자동화는 나중 — 봇이 뭘 하는지 실시간으로 보이는 대시보드가 매매 로직보다 먼저 있어야 합니다. (사실 이 사이트 자체가 그렇게 시작됐습니다. 제가 보려고 만든 모니터링을 공개한 것뿐입니다.)
- 킬 스위치 — 일일 손실 한도를 넘으면 신규 진입을 멈추는 회로 차단기. 봇은 지치지 않기 때문에, 잘못된 로직도 지치지 않고 반복합니다. 사람의 뇌절은 하룻밤이면 끝나지만 봇의 뇌절은 코드를 멈출 때까지 계속됩니다.
- 소액으로 한 달 — 백테스트를 아무리 통과해도 실계좌 최소 단위로 한 달을 돌려보기 전까지는 "검증됐다"고 말하지 않기로 했습니다.
실수 5: 승률을 성적표로 착각한 것
봇을 돌리면 승률이 매일 보입니다. 그리고 작은 이익을 자주 실현하는 전략은 승률이 아주 높게 나옵니다. 한동안 그 숫자를 성적표로 여겼습니다.
지금은 다르게 봅니다. 승률은 전략의 "성격"이지 "품질"이 아닙니다. 95%를 이기면서 5%에서 크게 잃으면 마이너스입니다. 봐야 할 건 평균 손익비, Profit Factor, 최대 낙폭(MDD)이고, 이 숫자들은 통계 페이지에 전부 공개해뒀습니다. 제 봇의 승률이 이상하리만치 높아 보인다면 — 맞습니다, 이상해 보여야 정상이고, 그래서 승률 말고 다른 지표를 같이 공개하는 겁니다.
정리
- 백테스트는 "맞을 때까지 조정"하는 순간 검증이 아니라 창작이 됩니다
- 수수료·슬리피지는 1일차부터 최악 가정으로
- API는 문서 말고 실제 응답으로 검증 — 조용한 실패가 가장 비쌉니다
- 모니터링과 킬 스위치가 매매 로직보다 먼저
- 승률은 성격이지 품질이 아닙니다
자동매매의 장점은 감정이 없다는 것이고, 단점도 감정이 없다는 것입니다. 멈춰야 할 때 무서워하지 않으니까요. 그 무서움은 결국 사람 몫이고, 그래서 봇을 돌려도 트레이딩 공부는 끝나지 않습니다.
이 글은 정보 제공 목적이며 투자 권유가 아닙니다. 자동매매는 코드 오류·API 장애·시장 급변으로 예상치 못한 손실이 발생할 수 있으며, 과거 성과는 미래 수익을 보장하지 않습니다.
More posts on MyTradeLog