백테스트 슬리피지 모델링 — 체결 가격 가정 하나로 전략 성적이 뒤집히는 과정
백테스트 결과가 좋았는데 실제로 돌리면 성적이 안 나오는 가장 흔한 이유는 전략이 틀렸기 때문이 아닙니다. 체결 가격을 너무 좋게 가정했기 때문입니다. 대부분의 백테스트는 "신호가 뜬 봉의 종가에 그 가격 그대로 체결됐다"고 계산합니다. 실제 시장에서는 그 가격에 체결되지 않습니다. 이 차이를 숫자로 넣는 작업이 슬리피지 모델링이고, 아래에서 세 가지 모델을 직접 계산해 보겠습니다.
종가 체결 가정이 지우는 비용
백테스트 코드는 보통 이렇게 생겼습니다. 조건이 맞으면 그 봉의 종가를 진입가로 기록하고, 청산 조건이 맞으면 그 봉의 종가를 청산가로 기록합니다. 계산은 간단하고 재현도 됩니다. 문제는 이 계산에 실제 매매에서 반드시 빠져나가는 돈이 하나도 들어있지 않다는 점입니다.
실제로 시장가 주문을 내면 세 가지가 동시에 벌어집니다. 첫째, 매수는 호가창의 매도 1호가부터 먹어 올라가므로 중간값보다 비싸게 삽니다. 둘째, 주문 크기가 호가창 한 층을 다 먹으면 다음 층으로 넘어가 평균 체결가가 더 밀립니다. 셋째, 신호를 읽고 주문을 보내는 사이에 가격이 움직입니다. 이 세 가지를 합친 것이 슬리피지이고, 여기에 거래소 수수료가 별도로 붙습니다.
백테스트에 비용을 0으로 두면, 건당 평균 수익이 비용보다 작은 전략이 흑자로 보입니다. 거래 횟수가 많을수록 이 착시는 커집니다. 하루 10회 왕복하는 전략이라면 왕복 비용 0.15%가 하루 1.5%, 한 달 약 30%의 차이를 만듭니다. 전략 로직을 아무리 다듬어도 메울 수 없는 크기입니다.
슬리피지의 세 출처를 분리한다
모델을 만들려면 먼저 비용을 출처별로 쪼개야 합니다. 뭉뚱그려 "0.1% 정도 잡자"로 하면 종목이 바뀔 때 숫자가 맞지 않습니다.
- 스프레드 절반 — 중간값 기준으로 보면 매수는 스프레드의 절반만큼 비싸게, 매도는 절반만큼 싸게 체결됩니다. 호가 스프레드가 0.02%라면 편도 0.01%, 왕복 0.02%입니다. 주문 크기와 무관하게 항상 붙는 바닥 비용입니다.
- 시장 충격 — 주문이 호가창 한 층보다 크면 평균 체결가가 더 밀립니다. 이 부분만 주문 크기에 따라 커지고, 유동성이 얇은 종목에서 급격히 커집니다.
- 신호 지연 — 봉이 마감되고 지표를 계산해 주문을 보내는 사이의 가격 변화입니다. 변동성이 높은 구간에서만 커지고, 방향은 불리한 쪽으로 치우치는 경향이 있습니다(움직이는 중에 신호가 나기 때문).
여기에 거래소 수수료를 더하면 왕복 비용이 완성됩니다. 수수료는 슬리피지가 아니지만 백테스트에서 같이 빠뜨리기 쉬우므로 항상 한 덩어리로 계산하는 편이 안전합니다.
모델 1 — 고정 bps
가장 단순한 방식은 체결가를 일정 비율만큼 불리하게 미는 것입니다. 매수는 +x%, 매도는 −x%로 체결했다고 기록합니다.
신호 봉 종가 $60,000
슬리피지 0.03% (편도)
매수 체결가
= 60,000 × (1 + 0.0003) = $60,018
매도 체결가 (목표 $60,600에서)
= 60,600 × (1 − 0.0003) = $60,581.8
─────────────
가정 없는 수익 600 ÷ 60,000 = 1.000%
슬리피지 반영 563.8 ÷ 60,018 = 0.939%
차이 0.061%p = 왕복 0.06%
장점은 구현이 한 줄이고 전 구간에 일관되게 적용된다는 점입니다. 단점은 종목·시간대·주문 크기를 전혀 구분하지 못한다는 점입니다. BTC와 거래량이 1/100인 알트코인에 같은 0.03%를 쓰면 한쪽은 과대, 한쪽은 과소 추정이 됩니다. 종목이 하나이고 주문 크기가 일정한 전략에서는 충분하지만, 여러 종목을 돌리는 전략에서는 다음 모델이 필요합니다.
모델 2 — 스프레드 비례
바닥 비용은 스프레드에서 나오므로, 슬리피지를 스프레드의 배수로 쓰면 종목별 차이가 자동으로 반영됩니다. 편도 슬리피지 = 스프레드 × k, k는 보통 0.5(스프레드 절반만 지불) 이상으로 잡습니다.
종목 A (유동성 큼)
스프레드 0.02%
편도 슬리피지 0.02%
왕복 0.04%
종목 B (유동성 작음)
스프레드 0.18%
편도 슬리피지 0.18%
왕복 0.36%
─────────────
같은 신호라도 비용이 9배 차이난다
이 모델을 쓰려면 스프레드 데이터가 필요합니다. 그런데 보통 백테스트가 쓰는 1분봉·시간봉 OHLCV 데이터에는 호가 정보가 들어있지 않습니다. 이것이 실무에서 가장 많이 막히는 지점입니다. 해결책은 두 가지입니다. 하나는 거래소에서 호가 스냅샷을 따로 수집해 종목별 평균 스프레드를 만들어 두는 것, 다른 하나는 거래량·변동성으로 스프레드를 대리 추정하는 것입니다. 어느 쪽이든 백테스트 데이터 품질을 먼저 확인해야 합니다. 비용 추정이 데이터보다 정밀할 수는 없습니다.
모델 3 — 거래량 참여율
주문이 커지면 시장 충격이 커집니다. 이 관계는 선형이 아니라 제곱근에 가깝다는 것이 널리 쓰이는 근사입니다. 주문 크기를 해당 구간 거래대금으로 나눈 참여율의 제곱근에 비례한다고 봅니다.
BTC · 1분봉 거래대금 $2,000,000
주문 $8,000
참여율 = 8,000 ÷ 2,000,000 = 0.004
√0.004 = 0.0632
충격 = 10 × 0.0632 = 0.63bp = 0.0063%
알트 · 1분봉 거래대금 $20,000
주문 $8,000
참여율 = 8,000 ÷ 20,000 = 0.4
√0.4 = 0.6325
충격 = 10 × 0.6325 = 6.3bp = 0.063%
─────────────
거래대금이 1/100이면 충격은 10배
(제곱근이라 100배가 아니다)
제곱근 관계라는 점이 중요합니다. 주문을 절반으로 쪼개면 비용이 절반이 아니라 약 0.71배로 줄고, 두 번 내야 하므로 합계는 약 1.41배가 아니라 0.71 × 2 ÷ 2 = 0.71배입니다. 즉 같은 총량을 작게 나눠 내면 충격 비용이 줄어듭니다. 이것이 분할 집행의 수학적 근거입니다. 다만 나누는 동안 가격이 움직이는 위험이 새로 생기므로, 백테스트에서는 분할 집행을 가정했다면 그 체결 과정도 같이 재생해야 합니다.
세 출처를 합쳐 왕복 비용을 만든다
실제로 쓰는 숫자는 수수료 + 스프레드 + 충격을 왕복으로 합친 하나의 값입니다.
BTC 알트
수수료 편도 0.050% 0.050%
스프레드 절반 0.010% 0.050%
시장 충격 0.0063% 0.063%
─────────────
편도 합계 0.0663% 0.163%
왕복 합계 0.133% 0.326%
─────────────
전략 건당 평균 gross +0.25% 일 때
BTC +0.25 − 0.133 = +0.117% (흑자)
알트 +0.25 − 0.326 = −0.076% (적자)
같은 전략, 같은 신호, 같은 승률입니다. 비용 가정만 종목에 맞게 바꿨을 뿐인데 부호가 뒤집혔습니다. 비용을 0으로 둔 백테스트는 두 경우 모두 건당 +0.25%로 똑같이 좋게 보고합니다. 전략 성적을 가르는 것이 로직이 아니라 비용인 구간이 실제로 존재하고, 거래 횟수가 많은 전략은 거의 항상 그 구간에 들어갑니다. 수수료만 따로 계산해 보려면 수수료 계산기로 왕복 금액을 먼저 확인해 보는 것도 방법입니다.
비용 민감도 표를 만든다
비용을 정확히 맞출 방법은 없습니다. 실제 체결 데이터를 쌓기 전에는 추정값일 뿐입니다. 그래서 하나의 숫자를 고르는 대신 비용을 바꿔가며 결과가 어디서 무너지는지를 봅니다.
왕복 0.05% → +0.200%
왕복 0.10% → +0.150%
왕복 0.15% → +0.100%
왕복 0.20% → +0.050%
왕복 0.25% → 0.000% ← 손익분기
왕복 0.30% → −0.050%
─────────────
손익분기 왕복 비용 = gross 평균 = 0.25%
안전 여유 = 추정 비용이 이 값의 절반 이하인가
읽는 방법은 이렇습니다. 추정 왕복 비용이 손익분기값에 가까우면, 그 전략은 비용 추정이 조금만 틀려도 적자가 됩니다. 반대로 추정 비용이 손익분기의 절반 이하라면 비용 오차에 대한 여유가 있습니다. 건당 평균 수익이 왕복 비용의 3배 이상은 되어야 운용할 만하다는 기준을 쓰는 경우가 많은데, 그 근거가 이 표입니다. 기대값을 계산할 때 비용을 먼저 차감하고 계산해야 하는 이유도 같습니다.
체결 가정 자체가 낙관적인 경우
슬리피지 숫자를 넣어도, 체결 여부 판단이 낙관적이면 성적은 여전히 부풀려집니다. 백테스트에서 자주 나오는 낙관 가정 네 가지입니다.
- 봉의 고가·저가에 지정가가 체결됐다고 본다. 그 가격을 한 번 터치했다고 반드시 내 주문이 체결되는 것은 아닙니다. 앞선 주문들이 먼저 채워지고 가격이 돌아서면 체결되지 않습니다. 특히 꼬리 끝에서는 거의 체결되지 않습니다.
- 신호 봉의 종가에 체결됐다고 본다. 봉 종가는 그 봉이 끝난 뒤에 확정됩니다. 그 가격으로 주문을 넣을 수 있는 시점은 이미 다음 봉입니다. 이것은 작지만 분명한 룩어헤드 편향입니다. 다음 봉 시가 체결로 바꾸면 보통 성적이 내려갑니다.
- 같은 봉에서 목표가와 손절가를 둘 다 터치했을 때 유리한 쪽을 택한다. 1분봉 안의 순서는 OHLCV만으로는 알 수 없습니다. 모르는 경우는 불리한 쪽(손절 먼저)으로 처리하는 것이 안전합니다.
- 급락·급등 구간에도 평상시 비용을 쓴다. 비용이 가장 커지는 순간이 바로 신호가 많이 나오는 순간입니다. 변동성이 높은 구간에는 배수를 붙이는 보정이 필요합니다.
네 가지를 전부 불리한 쪽으로 바꿔 돌린 결과가 "최악 가정 성적"입니다. 그 성적이 여전히 양수라면 비용·체결 가정에 대한 내구성이 확인된 것이고, 음수라면 백테스트가 보여준 수익은 가정에서 나온 것입니다. 과최적화를 피하려고 파라미터만 점검하는 경우가 많지만, 비용 가정도 똑같이 점검 대상입니다.
추정을 실측으로 바꾸는 순서
결국 가장 정확한 비용은 내 주문의 실제 체결 기록입니다. 순서는 이렇습니다. 먼저 보수적 추정으로 백테스트를 돌려 살아남는지 본다. 살아남으면 모의매매나 아주 작은 크기로 실제 주문을 내 체결가를 기록한다. 기록이 쌓이면 "주문 직전 중간값 대비 실제 체결가 차이"를 집계해 실측 슬리피지 분포를 만든다. 그 분포를 백테스트에 다시 넣는다.
기록 항목 (주문 1건마다)
· 주문 직전 중간값
· 실제 평균 체결가
· 주문 금액 · 방향 · 시각
집계 결과
· 중앙값 0.012%
· 평균 0.021%
· 90분위 0.058%
─────────────
백테스트에는 평균이 아니라
90분위에 가까운 값을 넣는다
평균이 아니라 상위 분위를 쓰는 이유는 분포가 한쪽으로 치우쳐 있기 때문입니다. 대부분의 주문은 작게 밀리고 일부가 크게 밀립니다. 평균을 쓰면 그 일부가 희석되고, 실제 운용에서는 그 일부가 손실의 큰 부분을 차지합니다. 슬리피지가 커지는 구간이 언제인지 따로 파악해 두면 그 구간을 피하는 필터를 넣는 선택도 가능합니다.
실무 체크리스트
- 비용을 0으로 둔 백테스트 결과는 보고하지 않는다. 숫자를 적을 때 어떤 비용 가정을 썼는지 항상 같이 적습니다.
- 수수료와 슬리피지를 왕복 하나의 값으로 합쳐 둔다. 따로 관리하면 한쪽을 빠뜨립니다.
- 종목별로 다른 값을 쓴다. 거래대금이 100배 차이나는 종목에 같은 비용을 쓰면 추정이 아니라 가짜 숫자입니다.
- 신호 봉 종가 체결이 아니라 다음 봉 시가 체결로 바꿔 한 번 더 돌린다. 차이가 크면 그 전략은 체결 타이밍에 의존하고 있습니다.
- 손익분기 왕복 비용을 계산해 둔다. 건당 평균 수익이 그 값이고, 추정 비용이 그 절반을 넘으면 여유가 없습니다.
- 최악 가정으로 한 번 돌려본다. 지정가 미체결·손절 우선·변동성 구간 비용 배수를 전부 불리하게.
- 실측 체결 기록을 쌓아 추정을 교체한다. 평균이 아니라 90분위 같은 보수적 분위를 씁니다.
마지막 항목이 가장 확실한 방법입니다. 추정 모델은 실측 기록이 쌓이기 전까지의 임시 장치이고, 기록이 생기면 즉시 교체해야 합니다. 백테스트 기본기와 함께 보면 전체 검증 순서가 잡힙니다.
정리
② 슬리피지 = 스프레드 절반 + 시장 충격 + 신호 지연 (수수료는 별도)
③ 고정 bps = 구현 쉬움, 종목 구분 못 함
④ 스프레드 비례 = 종목 차이 반영, 호가 데이터 필요
⑤ 충격 = c × √(주문 ÷ 거래대금) — 거래대금 1/100이면 충격 10배
⑥ 예시 왕복 비용 BTC 0.133% vs 알트 0.326% — gross +0.25%면 부호가 갈린다
⑦ 손익분기 왕복 비용 = 건당 gross 평균 — 추정 비용은 그 절반 이하가 안전
⑧ 체결 가정(고저가 지정가·같은 봉 TP/SL 순서)도 불리한 쪽으로
⑨ 실측 체결 기록의 90분위로 추정을 교체한다
한 줄로 줄이면 이렇습니다. 백테스트가 좋아진 이유가 로직이 나아진 것인지 비용 가정이 느슨해진 것인지 구분하지 못하면, 그 결과는 전략 성적이 아니라 가정의 성적입니다.
주의
본문의 스프레드 0.02%·0.18%, 수수료 편도 0.05%, 충격 계수 c = 10bp, 1분봉 거래대금 $2,000,000·$20,000, 주문 $8,000, 왕복 비용 0.133%·0.326%, 건당 gross +0.25%, 실측 집계 수치(중앙값 0.012%·평균 0.021%·90분위 0.058%) 등 모든 숫자는 계산 과정을 설명하기 위한 가정 예시이며 특정 거래소·특정 종목·특정 시점의 실제 측정값이 아닙니다. 실제 수수료는 거래소·등급·주문 유형에 따라 다르고, 스프레드와 시장 충격은 종목·시간대·시장 상황에 따라 크게 변합니다. 제곱근 충격 모델은 널리 쓰이는 근사이며 모든 종목·주문 크기에서 성립한다는 보장은 없습니다. 비용을 반영한 백테스트 결과도 과거 데이터에 대한 재생일 뿐 미래 성과를 예측하거나 보장하지 않습니다. 이 글은 백테스트 비용 모델링 방법을 설명하는 교육 정보이며 특정 종목의 매수·매도 권유나 특정 수익을 보장하는 내용이 아닙니다. 레버리지 거래는 원금 손실 위험이 있고, 매매 판단과 그 결과는 본인 책임입니다.
NOONOO TRADING 무료 채팅방에서 실시간 트레이딩을 같이 보세요.
봇에서 시작하기📈 OKX 신규 가입 시 거래 수수료 할인
OKX 수수료 할인 가입 →