백테스트에서 샤프비율 2.1이 나왔던 전략이 실전 첫 주에 연속 손절을 기록했을 때, 저는 한동안 코드만 뚫어져라 들여다봤습니다. 로직은 멀쩡했습니다. 문제는 로직이 아니었습니다. 백테스트와 실전 사이에는 데이터, 실행 환경, 시장 마찰 이렇게 세 겹의 벽이 존재하고, 저는 그걸 하나씩 부딪혀 가며 확인했습니다. 지금도 완전히 좁혔다고 말할 수는 없지만, 괴리를 줄이는 방향은 꽤 뚜렷하게 보이기 시작했습니다. 이번 칼럼은 그 과정에서 제가 실제로 적용한 접근법을 솔직하게 정리한 기록입니다.
문제 정의 — 백테스트가 거짓말하는 세 가지 구조적 이유
처음에는 단순히 ‘슬리피지 설정이 낮았겠지’라고 생각했습니다. 맞는 말이지만, 그게 전부가 아니었습니다. 제가 Jesse 프레임워크로 BTC/USDT 4시간봉 전략을 백테스트할 때, 슬리피지를 0.05%로 설정해도 실전에서는 평균 0.12~0.18% 수준의 실제 체결 차이가 발생했습니다. 이유는 세 가지였습니다. 첫째, 데이터 품질 문제입니다. 백테스트에 사용한 과거 OHLCV 데이터는 실제 호가창 깊이를 반영하지 않습니다. 특히 변동성이 급등하는 캔들에서는 고가와 저가 사이 어디서 체결됐는지 알 수 없고, Jesse는 기본적으로 캔들 종가 기준으로 체결을 가정합니다. 둘째, 펀딩피 누적 효과입니다. 바이낸스 선물에서 8시간마다 부과되는 펀딩피는 롱 포지션이 우세한 강세장에서 하루 0.1~0.3%씩 누적됩니다. 30일 백테스트라면 최대 1~3%의 비용이 집계에서 빠집니다. 셋째, 캔들 경계에서의 착시입니다. 백테스트는 캔들이 완성된 뒤 신호를 판단하지만, 실전에서는 웹훅 지연과 API 레이턴시가 개입합니다. 제 환경(Cafe24 VPS Ubuntu + TradingView 웹훅)에서는 신호 발생부터 주문 체결까지 평균 1.2~2.4초가 소요되는데, 이 짧은 시간도 빠른 장에서는 체결가를 0.05~0.1% 이상 밀어낼 수 있습니다. 이 세 가지를 파악하지 못한 채 백테스트 결과만 보면, 실전은 늘 배신자처럼 느껴집니다.
해결 접근 — 괴리를 줄이는 설정과 습관
문제를 파악한 뒤 저는 몇 가지 설정과 운영 습관을 바꿨습니다. 첫 번째는 슬리피지 현실화입니다. Jesse의 config.py에서 슬리피지를 단순 고정값으로 두지 않고, 변동성 구간별로 다르게 적용하는 방식을 실험 중입니다. 구체적으로는 ATR 값이 캔들 종가 대비 0.8% 이상인 고변동성 구간에서는 슬리피지를 0.2%로 상향 설정하고, 저변동성 구간에서는 0.06%를 유지합니다. 아직 검증 중이지만 백테스트 결과가 실전과 더 비슷하게 수렴하는 경향이 보입니다. 두 번째는 펀딩피를 비용으로 명시적 반영하는 것입니다. Jesse 자체에는 펀딩피 시뮬레이션 기능이 없으므로, 백테스트 결과 PnL에서 보유 시간 × 예상 펀딩레이트(기본값 0.01%/8h)를 직접 차감하는 간단한 Python 스크립트를 만들어 사용하고 있습니다. 코드는 10줄 남짓이지만, 장기 보유 전략일수록 이 보정이 판단을 크게 바꿉니다. 세 번째는 웹훅 레이턴시 측정 자동화입니다. TradingView에서 웹훅이 트리거되는 시각과 Flask API 서버가 수신하는 시각의 차이를 로그로 기록하고, 주간 평균을 Notion 대시보드에 자동 업데이트하도록 Make.com 시나리오를 구성했습니다. 레이턴시가 3초를 초과하는 날에는 해당 신호의 체결 품질을 별도로 검토하는 루틴도 추가했습니다. 작은 습관처럼 보이지만, 데이터가 쌓이면 전략 조정의 근거가 됩니다.
실전 적용 — 워크포워드 테스트와 소규모 실전 병행 루틴
설정을 아무리 정교하게 해도 백테스트는 과거 데이터에 최적화될 위험이 있습니다. 그래서 저는 새 전략을 도입할 때 반드시 워크포워드(Walk-forward) 방식을 거칩니다. 방식은 단순합니다. 전체 데이터를 8:2로 나눠 앞 80% 구간(인-샘플)에서 최적화하고, 뒤 20% 구간(아웃-샘플)에서 성과를 검증합니다. 인-샘플 샤프비율이 1.5 이상이어도 아웃-샘플에서 0.8 미만이 나오면 그 전략은 과적합으로 판단하고 폐기합니다. 이 필터만으로도 실전 투입 후 초기 손실 폭이 체감상 절반 이하로 줄었습니다(정확한 수치는 계속 관찰 중입니다). 그 다음 단계는 소규모 실전 병행입니다. 백테스트와 워크포워드를 통과한 전략도 처음 4주는 실제 계좌에서 최소 레버리지(2x), 최소 증거금(전체의 5% 이하)으로만 운영합니다. 이 기간을 저는 ‘실전 마찰 수집 기간’이라고 부릅니다. 슬리피지, 레이턴시, 예상치 못한 API 오류, 바이낸스 유지증거금 경고 등 백테스트에서 나오지 않는 변수를 실제 돈으로 수집하는 과정입니다. 비용은 들지만, 이 단계를 건너뛰고 풀 사이즈로 진입했을 때의 손실보다는 훨씬 저렴합니다. 또한 이 기간 동안 실전 체결가와 백테스트 예상 체결가의 차이를 스프레드시트에 매일 기록합니다. 4주 후 평균 괴리가 0.15% 이하면 스케일업, 그 이상이면 슬리피지 설정을 재조정한 뒤 다시 4주를 반복합니다.
💬 운영자 한마디
솔직히 말하면 저는 아직도 백테스트 결과를 100% 믿지 않습니다. 믿는 건 프로세스입니다. 괴리를 완전히 없앨 수는 없지만, 측정하고 기록하면 줄일 수 있습니다. 그 차이가 장기 운영에서는 꽤 결정적으로 작용한다고 느끼고 있습니다.
— J_River · autoprofit 운영자
✅ 이번 주 체크리스트
- Jesse config.py에서 슬리피지를 고변동성 구간과 저변동성 구간으로 분리해 설정한다
- 백테스트 PnL에서 보유 시간 기반 펀딩피를 직접 차감하는 보정 스크립트를 만든다
- 웹훅 수신 시각과 TradingView 트리거 시각의 차이를 로그로 기록하는 루틴을 구성한다
- 새 전략은 반드시 8:2 워크포워드 방식으로 아웃-샘플 검증을 거친다
- 워크포워드 통과 전략도 첫 4주는 최소 레버리지와 최소 증거금으로만 운영한다
- 실전 체결가와 백테스트 예상 체결가의 차이를 매일 스프레드시트에 기록한다
- 4주 평균 괴리가 0.15% 초과 시 슬리피지 설정을 재조정하고 검증 기간을 재시작한다
백테스트는 지도이고 실전은 실제 지형입니다. 지도가 틀린 게 아니라 지형이 더 복잡한 것입니다. 측정하고 기록하고 조정하는 루틴이 결국 두 세계의 거리를 좁힙니다.
※ 본 콘텐츠는 운영자 개인의 경험과 연구를 바탕으로 한 정보 제공 목적이며, 특정 종목에 대한 투자 권유나 매매 시그널이 아닙니다. 암호화폐 및 자동매매는 원금 손실 가능성이 있는 고위험 활동이며, 모든 투자 판단과 그 결과에 대한 책임은 투자자 본인에게 있습니다.