백테스트엔 없고 실전엔 있는 마찰 — 슬리피지와 거래비용

작성자

카테고리:

결론부터 말씀드리면, 백테스트와 모의투자에서 좋았던 성적이 실전에서 무너지는 가장 흔한 이유는 실력이 아니라 ‘마찰’입니다. 주문한 가격과 실제 체결된 가격의 차이(슬리피지), 사고팔 때마다 떼이는 호가 스프레드와 수수료 — 이 마찰은 백테스트 화면에는 잘 안 보이지만 실계좌에서는 매번 청구됩니다.

솔직히 고백하면, 저는 제 두 번째 봇의 모의투자 수익률이 한 달에 15.28%(키움 상시모의, 2026.7.20~8.20) 나온 걸 보고 잠깐 들떴습니다. 그런데 곧 불안해졌습니다. ‘이 숫자, 실전에서도 그대로 나올까?’ 모의 환경은 체결이 실전보다 관대할 때가 많다는 걸 앞선 검증 단계에서 이미 느꼈기 때문입니다. 오늘 글은 그 불안의 정체였던 ‘거래 마찰’을, 트레이딩 용어 사전에서 하나씩 찾아 배운 대로 정리하고, 제 봇이 헛디딘 자리에 겹쳐 풀어보는 이야기입니다.

슬리피지 — 주문한 가격과 체결된 가격은 다르다

제가 용어 사전에서 찾은 슬리피지(slippage)의 정의는 이렇습니다. ‘주문이 요청한 가격과 다른 가격에 체결되는 것, 즉 예상 체결가와 실제 체결가의 차이’입니다(트레이딩 교육 사이트 Babypips의 용어사전 정의). 같은 사전은 슬리피지가 꼭 나쁜 것만은 아니라고 설명합니다. 더 나쁜 가격에 체결되면 음(−)의 슬리피지, 더 좋은 가격이면 양(+)의 슬리피지, 그대로면 슬리피지 없음입니다. 문제는 이 슬리피지가 변동성이 크고 거래가 몰릴 때, 그리고 주문과 체결 사이에 지연이 있을 때 커진다는 점입니다. 하필 봇이 가장 바쁘게 움직이는 순간에 마찰도 가장 커진다는 뜻입니다.

여기에 하나 더 겹칩니다. 호가 스프레드(bid-ask spread)입니다. 재무 교육기관 CFI는 이것을 ‘사려는 최고가(매수호가)와 팔려는 최저가(매도호가)의 차이이며, 거래할 때마다 물게 되는 숨은 비용’으로 설명합니다. 즉 우리는 사는 순간 이미 스프레드만큼 불리한 자리에서 출발합니다. 여기에 증권사 수수료와 세금까지 더하면, 매매 한 번은 항상 ‘0보다 조금 마이너스’인 지점에서 시작합니다.

내 모의 성적이 실전에서 깎이는 이유

이 세 단어를 나란히 놓고 나서야 저는 제 불안의 정체를 알았습니다. 백테스트와 모의는 대체로 이 마찰을 ‘없거나 아주 작게’ 취급합니다. 그래서 화면 속 봇은 원하는 가격에 척척 사고팔지만, 실전의 봇은 그때그때 미끄러지고 떼입니다. 특히 제 첫 봇이 무너진 결정적 순간이 ‘거래가 몰리는 급락 구간의 통신 끊김’이었다는 걸 떠올리면, 그 순간이야말로 슬리피지가 가장 크게 벌어지는 자리였습니다. 저는 그때 ‘봇이 죽었다’는 것만 봤지, ‘살아 있었어도 원하는 가격엔 못 팔았을 것’이라는 사실은 나중에야 알았습니다.

한 가지는 분명히 해 두고 싶습니다. 이 글의 핵심은 ‘내가 얼마를 벌거나 잃었나’라는 금액이 아니라 ‘왜 모의와 실전이 벌어지는 구조인가’입니다. 실계좌에 넣은 투입 원금과 확정된 손익은 전혀 다른 개념이고, 모의 수익률을 실전 수익률인 것처럼 말하는 건 사실이 아닙니다. 저는 마찰이라는 구조를 이야기하는 것이지, 특정 수익 금액을 성과처럼 내세우려는 게 아닙니다.

거래 마찰은 세 조각으로 나뉜다

마찰을 뭉뚱그리면 대응할 수 없어서, 세 조각으로 갈라 정리했습니다. 아래 표는 각 조각이 무엇이고 언제 커지는지를 나눈 것입니다.

마찰의 조각무엇인가언제 커지나
호가 스프레드매수호가와 매도호가의 차이. 사는 순간 이미 지는 숨은 비용거래량이 적은 종목, 유동성이 얕을 때
슬리피지주문한 가격과 실제 체결가의 차이(미끄러짐)변동성이 큰 구간, 급락·급등, 주문·체결 지연
수수료·세금매매마다 붙는 증권사 수수료와 거래세 등 고정 비용매매 횟수가 많을수록(잦은 회전) 누적

세 조각의 공통점은 ‘매매를 자주 할수록 커진다’는 것입니다. 회전이 빠른 봇일수록 이 마찰을 더 많이 뭅니다. 그래서 승률이나 손익비가 좋아 보여도, 마찰을 빼고 나면 기대값이 음(−)으로 뒤집히는 일이 실제로 벌어집니다.

같은 전략도, 마찰을 넣으면 결과가 뒤집힌다

말로만 들으면 잘 와닿지 않아서, 원리를 보여주는 예시를 하나 그려보겠습니다. 아래 숫자는 개념을 설명하기 위한 가정이지, 제 봇의 실제 체결 기록이나 비용 수치가 아닙니다. 매매 한 번당 마찰(스프레드+슬리피지+수수료)이 얼마냐에 따라, 같은 ‘마찰 이전 성적’이 어떻게 달라지는지를 보여줄 뿐입니다.

구분마찰 이전 성적(가정)회당 마찰(가정)마찰 반영 후(가정)
잦은 매매 봇+10 (100회 매매)0.15 × 100 = 15−5 (적자 전환)
가끔 매매 봇+10 (20회 매매)0.15 × 20 = 3+7 (수익 유지)

두 봇의 ‘마찰 이전 성적’은 +10으로 똑같습니다. 그런데 회전이 빠른 위쪽 봇은 마찰이 쌓여 적자로 뒤집히고, 매매가 뜸한 아래쪽 봇은 수익을 지킵니다. 백테스트가 마찰을 지워버리면 두 봇이 똑같이 좋아 보이지만, 실전에서는 완전히 다른 운명이 된다는 것 — 이 한 장의 표가 제가 모의 성적 앞에서 배운 경계심의 전부였습니다.

그래서 무엇을 바꿔야 했나

불안을 원칙으로 바꾸는 것이 검증 단계의 숙제였습니다. 아래 표는 마찰을 몰랐던 접근과, 마찰을 전제로 바꾼 원칙을 왼쪽·오른쪽으로 명확히 나눠 정리한 것입니다.

항목마찰을 몰랐던 접근마찰을 전제로 바꾼 원칙
백테스트마찰 0으로 가정, 성적 그대로 신뢰회당 비용을 보수적으로 얹어 다시 계산
매매 빈도신호만 뜨면 자주 사고팜마찰을 이길 만한 신호만, 회전을 줄임
종목 선택스프레드·유동성을 따지지 않음거래량 얕은 종목은 필터에서 걸러냄
성적 해석모의 수익률=실전 수익률로 착각모의는 ‘결함 필터’일 뿐, 실전은 소액부터

돌이켜보면 이 표는 새로 짠 전략 목록이 아니라, 제가 마찰을 몰라 헛디딘 자리의 목록이었습니다. 왼쪽 칸이 제가 넘어진 자리이고, 오른쪽 칸이 그 자리를 하나씩 뒤집은 원칙입니다.

코딩을 몰라도 내 봇의 마찰은 잴 수 있다

다행히 이 마찰을 직접 계산할 필요는 없습니다. 봇이 남기는 체결 알림 로그가 이미 재료이기 때문입니다. 주문할 때 의도했던 가격과 실제 체결된 가격이 로그에 남아 있다면, 그 둘의 차이가 곧 슬리피지입니다. 저는 이 집계를 AI에게 시킵니다. “이 체결 로그에서 주문 의도가와 실제 체결가의 차이(슬리피지)를 매매별로 세고, 평균과 최댓값을 알려줘”라고만 해도, 코딩을 몰라도 내 봇이 평균 얼마씩 미끄러지는지 확인할 수 있습니다.

그다음 할 일은 단순합니다. 그렇게 파악한 평균 마찰을 백테스트에 ‘비용’으로 얹어 다시 돌려보는 것입니다. 마찰을 넣고도 기대값이 양(+)이면 그 전략은 실전을 견딜 가능성이 있고, 마찰을 넣자마자 음(−)으로 뒤집히면 그 좋아 보이던 성적은 애초에 마찰이 지워준 착시였던 셈입니다.

여기서 정직하게 선을 하나 긋겠습니다. 제가 실제로 쓰는 회당 비용 버퍼의 구체적 수치나 유동성 필터의 임계값 같은 ‘작동하는 값’은 이 글에 적지 않습니다. 그건 각자의 자산 규모와 다루는 종목군, 매매 스타일에 따라 달라져야 하는 값이고, 남의 숫자를 그대로 베끼는 순간 그 사람의 시장까지 함께 베끼게 되기 때문입니다. 제가 나눌 수 있는 건 ‘무엇을 왜 재는가’라는 구조까지이고, 그 안을 채우는 숫자는 각자의 몫입니다.

맺으며

봇을 검증하던 시간을 돌아보면, 제가 진짜로 배운 건 화려한 전략이 아니라 이 담담한 사실 하나였습니다. 백테스트와 모의는 마찰이 지워진 세계이고, 실전은 매 순간 마찰을 청구하는 세계라는 것. 모의 15.28%라는 숫자에 들뜨는 대신, 저는 이제 ‘이 성적에서 마찰을 빼면 얼마가 남는가’를 먼저 묻습니다.

당장 오늘 할 수 있는 일은 세 가지입니다. 체결 로그에서 주문 의도가와 실제 체결가의 차이를 뽑아 내 봇의 평균 슬리피지부터 확인하는 것, 그 마찰을 비용으로 얹어 백테스트를 다시 돌려 기대값이 그래도 양인지 보는 것, 그리고 거래량이 얕은 종목은 필터에서 걸러 스프레드가 큰 자리를 애초에 피하는 것. 어느 것 하나 대단한 기술이 아닙니다. 그런데도 이 셋이, 모의와 실전의 간극에 놀라 계좌를 잃는 초보의 흔한 실수를 막아줍니다.

그러니 모의 성적이 좋다고 너무 기뻐하지 마십시오. 그 성적에서 마찰을 빼지 않았다면, 그건 실력이 아니라 아직 청구되지 않은 비용일 뿐입니다. 자동매매에서 오래 살아남는 사람은 백테스트가 예쁜 사람이 아니라, 백테스트가 지운 마찰을 정직하게 도로 얹어보는 사람이었습니다. 저는 그것을 모의 성적에 한 번 들떴다가, 슬리피지라는 단어를 찾아보고 나서야 알았습니다.


본 글은 코딩을 모르는 개인이 AI를 도구로 자동매매 봇을 만들며 겪은 실전 기록과 원리를 정리한 것으로, 투자 자문이나 수익 보장이 아닙니다. 모의투자 수익률 15.28%(키움 상시모의, 2026.7.20~8.20)는 모의 환경의 기록이며 실전 성적이 아니고, 체결·슬리피지·유동성 제약이 완전히 반영되지 않습니다. 예시 표의 수치는 원리를 설명하기 위한 가정치입니다. 실계좌 투입 원금과 확정 손익은 다른 개념이고, 본 글은 특정 종목을 추천하지 않습니다. 모든 매매의 책임은 본인에게 있습니다.

참고 — 이 글의 개념 정의를 확인한 자료
슬리피지(slippage)의 정의·발생 조건: Babypips Forexpedia 트레이딩 용어사전 — Slippage (https://www.babypips.com/forexpedia/slippage)
호가 스프레드(bid-ask spread)와 거래의 숨은 비용: Corporate Finance Institute — Bid and Ask (https://corporatefinanceinstitute.com/resources/equities/bid-and-ask/)

자주 묻는 질문

슬리피지가 뭔가요?

주문한 가격과 실제 체결된 가격의 차이를 말합니다. 더 나쁜 가격에 체결되면 음(−)의 슬리피지, 더 좋은 가격이면 양(+)의 슬리피지입니다. 변동성이 크거나 주문·체결에 지연이 있을 때 커집니다.

백테스트 성적이 좋은데 왜 실전에서는 안 되나요?

백테스트와 모의는 대개 거래 마찰(호가 스프레드·슬리피지·수수료)을 없거나 아주 작게 취급하기 때문입니다. 실전에서는 이 마찰이 매매마다 청구되므로, 마찰을 빼고 본 성적은 실제보다 부풀려져 있습니다.

모의투자 수익률을 실전 수익률로 믿어도 되나요?

안 됩니다. 모의 환경은 체결이 실전보다 관대할 때가 많아, 실제로는 못 살 가격에 샀다고 처리되기도 합니다. 모의는 치명적 결함을 걸러내는 필터이지, 실전 수익을 보장하는 증명서가 아닙니다.

코딩을 몰라도 내 봇의 슬리피지를 확인할 수 있나요?

네. 체결 로그에 주문 의도가와 실제 체결가가 남아 있다면, AI에게 “매매별로 두 가격의 차이를 세어 평균과 최댓값을 알려줘”라고 요청하면 됩니다. 그 평균을 백테스트에 비용으로 얹어 다시 돌려보는 것이 핵심입니다.

거래 마찰을 줄이려면 어떻게 해야 하나요?

매매 회전을 줄여 마찰이 쌓이는 횟수를 낮추고, 거래량이 얕아 스프레드가 큰 종목은 필터에서 걸러내며, 급락·급등처럼 슬리피지가 커지는 구간의 주문 방식을 점검하는 것이 기본입니다. 마찰을 이길 만한 신호만 남기는 쪽으로 전략을 좁히는 것도 방법입니다.

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다