실전지식 백테스트와 실전 매매가 다른 이유
게시물 옵션
본문
매매 기술 노트 · 12 · 백테스트와 실전
백테스트에서 대박 난 전략이 실전에서 계좌를 녹이는 이유
백테스트 수익률 150%. 승률 70%, 최대 낙폭(MDD) 8%. 컴퓨터 모니터에 찍힌 숫자를 보면 당장이라도 실전 매매 버튼을 누르고 싶어진다. 하지만 가상 환경에서의 완벽한 성적표만 믿고 실전 거래소 API키를 연결하는 순간, 예상치 못한 손실과 마주하게 된다. 백테스트와 실전 사이에는 넘기 힘든 거대한 격차가 존재하기 때문이다.
- SLIPPAGE
- 슬리피지 발생
- OVERFITTING
- 과적합의 함정
- LATENCY
- 지연 시간
- EMOTION
- 심리적 개입
시뮬레이션은 이상적이지만, 실전은 지저분하다
백테스트(Backtesting)는 과거의 데이터를 바탕으로 "이 조건대로 매매했다면 얼마를 벌었을까?"를 계산하는 시뮬레이션이다. 문제는 백테스트 환경이 너무나 이상적이라는 점이다. 백테스트 엔진은 내가 지정한 정확한 가격에 주문이 즉시 체결되었다고 가정한다. 하지만 데이터 세상을 벗어난 실제 거래 환경은 수많은 변수와 오차로 가득 차 있다.
자동매매 시스템을 처음 구축하고 실전에 적용했을 때, 가장 먼저 경험했던 당황스러움은 "왜 백테스트와 체결 가격이 다른가?"였다. 지표상 정확히 매수 신호가 발생했고 코드는 정상 동작했지만, 계좌에 남아있는 실제 체결 단가는 백테스트 기록보다 매번 약간씩 불리하게 찍혀 있었다. 이 작은 차이가 수백 번, 수천 번 반복되자 백테스트상의 우상향 그래프는 실전에서 평탄하거나 오히려 우하향하는 그래프로 변해버렸다.
백테스트는 완벽한 조건에서 진행되지만, 실전은 슬리피지, 지연시간, 호가 얇음 등 끊임없는 손실 오차가 누적된다.1. 슬리피지(Slippage)와 수수료의 복리 착시
백테스트와 실전의 차이를 만드는 첫 번째 원인은 슬리피지다. 슬리피지란 내가 주문을 요청한 시점의 가격과 실제 체결된 가격 사이의 오차를 의미한다.
예를 들어 10,000원에 매수 신호가 발생하여 시장가 주문을 넣었더라도, 네트워크 전송 시간과 거래소 엔진 처리 시간 동안 가격이 변해 10,020원에 체결될 수 있다. 0.2%라는 차이는 작아 보이지만, 매매 빈도가 높은 단타(Scalping)나 분봉 기반 자동매매 시스템에서는 엄청난 파괴력을 가진다.
하루에 10번씩 한 달 동안 300번 거래하는 봇이 회당 0.1%의 슬리피지와 수수료 오차를 남긴다면, 한 달에 무려 30%의 수익률이 공중으로 사라지는 셈이다. 수수료를 감안하고도 백테스트가 우상향했더라도, 슬리피지를 반영하지 않았다면 실전에서는 무조건 패배한다.
2. 과적합(Overfitting)의 달콤한 함정
두 번째 원인은 개발자가 자신도 모르게 저지르는 '과적합'이다. 과적합이란 과거 데이터에 코드를 너무 딱 맞추어 조정(Tuning)한 결과, 과거에는 완벽하지만 미래의 데이터(실전)에서는 전혀 힘을 쓰지 못하는 상태를 말한다.
봇을 만들 때 이런 경험을 자주 하게 된다. "RSI 기간을 14에서 11로 바꾸니 수익률이 올라가네?" "이평선 골든크로스에 변동성 돌파 상수를 0.5에서 0.43으로 고치니 MDD가 줄어드네?"
파라미터를 계속 조정하여 과거 차트에 최적화된 복잡한 조건을 만들어낼수록 백테스트 그래프는 아름다워진다. 하지만 이는 과거의 특정한 소음(Noise)까지 암기한 것에 불과하다. 시장의 패턴은 매 순간 변하기 때문에, 과거에 완벽했던 파라미터는 실전 시장을 만나는 순간 무너진다.
3. 미래 참조(Look-Ahead Bias) 오류
백테스트 코드를 작성할 때 가장 흔하게 발생하는 논리적 오류 중 하나가 바로 '미래 참조'다. 현재 시점에서는 알 수 없는 미래의 데이터를 시뮬레이션 계산에 사용하는 실수를 말한다.
가장 대표적인 예가 완성되지 않은 캔들(현재 진행 중인 5분봉 등)의 종가(Close)를 기준으로 매수 판단을 내리는 것이다. 시뮬레이션상에서는 캔들이 끝난 시점의 최종 종가를 가져와서 "여기서 매수했음"으로 처리하지만, 실전에서는 캔들이 진행되는 동안 가격이 계속 변동하므로 그 종가는 캔들이 끝나기 전까지 알 수 없다.
4. 유동성과 체결 미흡 (Market Impact & Partial Fills)
내가 사려고 하는 수량이 시장의 호가창 깊이보다 크다면 어떤 일이 일어날까? 백테스트는 내가 1억 원어치를 사든 10억 원어치를 사든 현재가에 전량 체결되었다고 처리해 버린다.
그러나 실전에서는 매수 주문을 넣는 순간 호가창의 매물대가 먹혀 들어가며 매수 단가가 높아진다. 심지어 거래량이 적은 소형주나 알트코인의 경우, 나의 매수 주문 자체가 시장 가격을 올려버리는 현상(Market Impact)이 발생한다. 지정가 주문을 넣었을 때는 가격이 그냥 지나쳐버려 일부만 체결되거나(부분 체결), 아예 체결되지 않고 날아가는 경우도 빈번하다.
5. 시스템 지연과 예외적 네트워크 장애
백테스트는 내 PC의 메모리상에서 단 수 초 만에 몇 년 치 데이터 계산을 끝낸다. 지연 시간(Latency)이 '0'이다. 하지만 실전 매매는 물리적인 네트워크 망을 거쳐야 한다.
- 내 서버에서 거래소 서버로 주문 요청을 보낼 때의 네트워크 핑(Ping)
- 거래소 API 서버의 과부하로 인한 응답 지연 (특히 변동성이 폭발하는 순간)
- WebSocket 시세 데이터 수신이 수 초간 끊기는 현상
- REST API 호출 제한(Rate Limit) 걸림
아이러니하게도 매매 신호가 가장 강력하게 발생하는 시점은 시장 변동성이 극에 달할 때다. 그리고 이때 거래소 서버 역시 접속자 폭주로 가장 먹통이 되기 쉽다. 백테스트에서는 폭등 직전에 사서 폭등 직후에 파는 완벽한 타이밍이 계산되지만, 실전에서는 거래소 API 먹통으로 롱/숏 포지션이 청산될 때까지 손을 놓고 바라봐야 하는 상황이 벌어진다.
6. 인간의 심리적 개입 (Manual Intervention)
자동매매를 돌려놓으면 인간의 감정이 배제될 것 같지만 전혀 그렇지 않다. 오히려 봇이 연속으로 3~4번 손절을 내기 시작하면 개발자는 불안해진다.
"지금 장세가 안 좋은 것 같은데 일단 봇을 잠시 꺼둘까?" "이건 손절 신호지만 조금만 기다리면 반등할 것 같은데 개입해서 매도를 취소할까?"
백테스트는 10번 연속 손절이 나와도 시스템 규칙대로 기계처럼 11번째 매수를 실행한다. 그리고 그 11번째 매수에서 큰 수익을 내며 손실을 복구하도록 설계되어 있다. 그러나 실전에서 사람이 개입하여 봇을 껐다 켰다 하거나 손절 규칙을 수동으로 건드리는 순간, 백테스트의 확률적 우위는 완전히 파괴된다.
백테스트의 신뢰도를 극대화하는 실전 기법
그렇다면 백테스트는 아무런 소용이 없는 것일까? 그렇지 않다. 백테스트의 목적은 "미래 수익의 보장"이 아니라 "전략의 결함 파악과 위험 한도 측정"에 두어야 한다. 현실과 백테스트의 격차를 줄이기 위해 다음 원칙들을 코딩에 반영해야 한다.
백테스트 수치를 그대로 믿지 말고 보수적 가감과 포워드 테스트(Walk-Forward) 과정을 거쳐야 실전 실패 확률을 줄일 수 있다.- 보수적인 비용 반영: 실제 수수료의 2배 이상, 슬리피지를 최소 0.1~0.2% 이상 강제로 부여하고 테스트한다.
- In-Sample / Out-of-Sample 분리: 전체 데이터 중 70%로 전략을 만들고(In-Sample), 한 번도 사용하지 않은 나머지 30% 데이터(Out-of-Sample)에서 수익성이 유지되는지 확인한다.
- 전진 분석 (Walk-Forward Analysis): 시간의 흐름에 따라 최적화와 검증을 번갈아 가며 수행하여 변화하는 시장 적응력을 확인한다.
- 페이퍼 트레이딩 (Paper Trading): 실전에 가깝게 실시간 시세 데이터를 받아 가상 주문을 넣는 포워드 테스트를 최소 한 달 이상 수행한다.
- 소액 실전 투입: 모의 매매까지 통과했다면 전체 자산의 1~5% 수준의 최소 금액으로 실전 체결 오차와 슬리피지를 직접 측정한다.
요약
백테스트는 자동매매라는 긴 여정의 완성품이 아니라 단순한 '시작점'일 뿐이다. 백테스트에서 아무리 뛰어난 수익률이 나오더라도 슬리피지, 지연시간, 호가창 유동성, 과적합, 그리고 인간의 심리라는 5가지 높은 벽을 넘지 못하면 실전 계좌는 손실을 피할 수 없다.
진짜 훌륭한 엔지니어는 백테스트 그래프를 화려하게 만드는 사람이 아니라, 백테스트 환경에 혹독한 악조건을 부여하여 '가장 보수적인 성적표'를 만들어내는 사람이다. 가장 최악의 백테스트 조건을 견뎌낸 전략만이 지저분한 실전 시장에서 비로소 살아남아 계좌를 우상향시킬 수 있다.
- 11 · 자동매매 시스템은 어떻게 구성되는가
- 12 · 백테스트와 실전 매매가 다른 이유 — 지금 글
- 13 · 좋은 매매 신호를 만드는 방법
- 14 · 시장 상황을 구분해야 하는 이유
- 15 · 자동매매 봇을 실제로 운영할 때 생기는 문제
본 글은 백테스트와 실전 매매의 차이점 및 시스템 설계 원리를 설명하는 교육용 콘텐츠이며, 특정 종목이나 매매를 권유하는 내용이 아닙니다. 모든 투자 판단과 책임은 본인에게 있습니다.
댓글목록
등록된 댓글이 없습니다.