전략에는 엣지가 있었다. 수수료가 그걸 전부 가져갔다
게시물 옵션
본문
매매일지 · 실거래 데이터 분석
전략에는 엣지가 있었다. 수수료가 그걸 전부 가져갔다
두 달치 실거래 87건을 수수료 빼기 전 가격으로 다시 계산해봤다. 합계는 플러스였다. 수수료를 반영하자 마이너스로 뒤집혔다. 그 차이가 정확히 거래 횟수 곱하기 왕복 수수료였다.
다시 계산해본 이유
봇이 계속 마이너스를 찍고 있었다. 그동안 원인을 찾겠다고 손절 폭을 바꿔보고, 트레일링 발동 조건을 조여보고, 진입 조건을 이렇게 저렇게 돌려봤다. 전부 전략 파라미터 얘기였다. 그런데 어느 순간 이런 의문이 들었다. 애초에 이 전략에 이길 구석이 있기는 한가?
이걸 확인하는 방법은 의외로 간단하다. 실제 거래 기록에서 매수가와 매도가만 꺼내서, 수수료를 아예 없다고 치고 다시 더해보면 된다. 그 합이 마이너스면 전략 자체가 진 것이고, 플러스면 전략은 이겼는데 비용에서 진 것이다. 완전히 다른 문제고, 처방도 완전히 다르다.
시뮬레이션은 일부러 쓰지 않았다. 이전에 돌린 백테스트와 실제 DB 사이에 설명 안 되는 차이가 있다는 걸 이미 알고 있었기 때문에, 이번만큼은 손대지 않은 실거래 기록만 썼다.
결과
수수료를 빼기 전 87건의 손익 합계는 +7.36%p였다. 건당 평균으로 환산하면 0.085%p. 대단한 숫자가 아니다. 하지만 방향은 분명히 플러스였다.
그리고 실제 기록된 손익 합계는 −1.34%p였다. 두 숫자의 차이는 8.70%p. 거래 87건에 왕복 수수료 0.1%를 곱하면 8.7%p다. 소수점까지 맞아떨어진다. 우연이 아니라 구조다.
- 수수료 전 합계
- +7.36%p (건당 평균 +0.085%p)
- 수수료 후 합계
- −1.34%p
- 수수료 드래그
- 8.70%p = 87건 × 왕복 0.1%
- 표본
- 2026년 7월 1일 ~ 8월 16일 실거래
코인별로 쪼개면 더 선명하다. 어떤 코인은 수수료를 빼기 전엔 플러스인데 수수료를 반영하면 마이너스로 뒤집혔다. 승패가 뒤바뀐 게 아니라, 이길 만큼은 이겼는데 그 폭이 통행료보다 작았다.
그 0.1%는 어디서 온 숫자인가
여기서 한 번 더 확인할 게 생겼다. 계산에 쓴 0.1%가 진짜 내가 낸 수수료인지 검증해야 했다. 코드를 뒤졌더니 이렇게 되어 있었다.
pct = (현재가 * 0.9995 - 매수가 * 1.0005) / (매수가 * 1.0005) * 100 # 0.9995 = 매도 시 0.05% 차감 # 1.0005 = 매수 시 0.05% 가산 # → 왕복 0.1% 고정 가정
같은 식이 코드 여섯 군데에 똑같이 박혀 있었다. 그리고 거래소에 실제 수수료율을 물어보는 코드는 어디에도 없었다. 계좌 등급이 바뀌든, 거래소가 요율을 조정하든, 이 봇은 영원히 0.05%라고 믿고 계산한다.
일반적으로 알려진 원화마켓 수수료율이 0.05%인 건 맞다. 문제는 이 봇이 시장가 주문만 쓴다는 점이다. 지정가와 시장가의 수수료를 다르게 매기는 정책이 적용됐다는 보도를 몇 건 발견했는데, 공식 안내 페이지는 자동화된 요청을 막아둬서 직접 확인하지 못했다. 이건 확정이 아니라 의심으로 남겨둔다. 다만 만약 사실이라면 실제 비용은 가정의 몇 배가 되고, 그러면 위의 "+7.36%p"라는 기준선 자체를 다시 계산해야 한다.
더 나빴던 것 — 응답을 버리고 있었다
수수료를 확인하려고 주문 코드를 따라가다가 이걸 발견했다. 봇은 거래소에 주문을 넣고 응답을 받은 다음, 성공 여부만 확인하고 나머지를 통째로 버리고 있었다.
그 버려진 응답 안에는 실제로 얼마가 수수료로 나갔는지, 그리고 진짜 몇 원에 체결됐는지가 들어 있다. 대신 봇은 주문을 넣기 직전에 조회한 시세를 매수가로 기록했다. 시장가 주문은 호가창을 위에서부터 먹으면서 체결되기 때문에, 주문 직전 시세와 실제 평균 체결가는 같을 수가 없다. 그 차이가 슬리피지다.
수수료는 실제 값이 아니라 고정된 가정으로 계산되고 있었고, 슬리피지는 아예 0이라고 암묵적으로 취급되고 있었다. 두 비용 모두 실제보다 낙관적인 방향으로만 잡혀 있었다는 뜻이다. 그동안 내가 봐온 모든 손익 숫자는, 최소한 실제보다 나쁘지는 않은 쪽으로 기울어 있었다.
이 사실이 특히 불편했던 이유가 있다. 나는 이 봇의 성적이 나쁘다는 걸 알고 있었고, 그래서 계속 전략을 손봤다. 그런데 내가 손보던 그 성적표 자체가 실제보다 관대하게 적혀 있었다. 잘못된 눈금자로 길이를 재면서 톱질을 다시 하고 있었던 셈이다.
숫자가 좋아지는 필터를 찾았지만, 쓰지 않았다
같은 데이터로 하나 더 해봤다. "어떤 조건의 거래를 걸러냈다면 결과가 나아졌을까"를 축별로 계산한 것이다. 결과는 놀라웠다. 특정 코인을 빼도, 특정 지표 구간을 빼도, 특정 시간대나 요일을 빼도 — 여섯 개 후보 전부에서 남은 거래의 합계가 흑자로 뒤집혔다. 어떤 건 +6%p가 넘었다.
그리고 하나도 적용하지 않았다. 이유는 네 가지다.
첫째, 표본이 작다. 87건 자체가 통계적으로 작은데, 제외 대상 그룹은 15~23건에 불과하다. 이 정도 크기에서 나온 판정은 다음 87건에서 뒤집혀도 이상하지 않다.
둘째, 후보들이 서로 겹친다. 독립적으로 보이는 여섯 개를 세어보니 상당수가 같은 거래를 여러 각도에서 다시 발견한 것이었다. 증거 여섯 개가 아니라 증거 하나를 여섯 번 본 것에 가깝다.
셋째, 이미 아는 손실을 다시 찾아낸 것이었다. 가장 효과가 커 보였던 후보 하나는, 알고 보니 별도 문서에서 이미 원인을 분석해둔 연속 손절 구간을 다른 이름으로 다시 잡아낸 것이었다. 새로운 발견이 아니라 같은 사건의 재발견이다.
넷째, 설명할 수 없는 후보가 있었다. 개선 폭이 가장 컸던 축 하나는 특정 요일이었다. 암호화폐 시장은 휴장이 없고 24시간 돌아간다. "그 요일이라서 나쁠" 구조적 이유를 나는 하나도 대지 못했다. 이유를 설명 못 하는데 숫자만 좋은 규칙은, 대체로 우연을 법칙으로 착각한 것이다.
과거 데이터를 이리저리 잘라보면 결과가 좋아지는 조합은 반드시 나온다. 데이터가 충분히 넓으면 그건 발견이 아니라 필연에 가깝다. 그래서 숫자가 좋아졌다는 사실만으로는 근거가 되지 않는다. 왜 그런지 설명할 수 있는지, 그리고 다른 기간에서도 같은 방향이 나오는지를 함께 봐야 한다. 이번엔 둘 다 만족하지 못했다.
그래서 실제로 한 일
파라미터는 하나도 건드리지 않았다. 대신 측정 장치를 붙였다.
주문이 성공하면 그 주문 번호로 거래소에 한 번 더 조회를 넣어서, 실제 체결가와 실제로 차감된 수수료를 받아오도록 했다. 그리고 거래 기록 테이블에 네 개 항목을 추가했다. 주문 번호, 평균 체결가, 실제 수수료, 그리고 신호 시점 가격과 체결가의 차이인 슬리피지.
설계할 때 지킨 원칙이 세 가지 있다.
- 매매 판단에 개입하지 않는다
- 기존 손익 계산식과 매수·매도 조건은 한 줄도 바꾸지 않음
- 실패해도 거래를 막지 않는다
- 체결 조회가 실패하면 그냥 빈 값으로 남기고 넘어감
- 과거를 고치지 않는다
- 기존 기록은 그대로 두고 새 항목만 옆에 나란히 쌓음
세 번째가 특히 중요했다. 기존 손익 컬럼을 실측 기준으로 갈아엎고 싶은 유혹이 있었는데, 그러면 지금까지 쓴 모든 분석 문서의 근거가 한꺼번에 무의미해진다. 과거 기록은 그 시점의 판단 근거로서 그대로 남겨두는 게 맞다고 봤다.
실시간 판단에는 이 실측값을 쓰지 않는다는 것도 못 박아뒀다. 보유 중인 포지션의 손익은 아직 팔지 않았으니 실제 체결가를 알 방법이 원리적으로 없다. 실측치는 어디까지나 거래가 끝난 뒤의 회계용이지, 의사결정용이 아니다.
지금 상태
측정 장치를 붙인 뒤로 약 3주가 지났고, 실제 수수료와 체결가가 기록된 거래가 139건 쌓였다. 아직 분석은 하지 않았다. 이 글에서 "그래서 실제 수수료는 얼마였다"까지 쓸 수 있으면 좋았겠지만, 없는 결론을 만들어 쓸 수는 없다.
다만 이제는 물어볼 수 있게 됐다. 3주 전까지 이 질문은 물어볼 방법 자체가 없는 질문이었다. 답을 모르는 것과, 답을 알아낼 방법이 없는 것은 전혀 다른 상태다.
남는 생각
이번 일에서 제일 오래 남은 건 8.70%p라는 숫자가 아니었다. 내가 몇 달 동안 잘못된 눈금자를 들고 있었다는 사실이었다.
자동매매를 만들면 대부분의 시간을 전략에 쓰게 된다. 어떤 조건에서 사고 언제 팔지, 손절을 얼마로 할지. 그게 재미있는 부분이니까. 반면 수수료와 슬리피지는 지루하고, 내가 통제할 수 없는 것처럼 느껴지고, 무엇보다 이미 안다고 착각하기 쉽다. 0.05%라는 숫자를 어디선가 보고 코드에 적어넣은 순간부터, 나는 그걸 다시 확인하지 않았다.
그런데 이 봇의 경우 전략이 만들어낸 우위보다 통행료가 더 컸다. 전략을 아무리 다듬어도, 그 우위가 통행료를 넘지 못하면 결과는 마이너스다. 순서가 틀렸던 것이다. 전략을 고치기 전에 비용부터 쟀어야 했다.
다음 글에서는 실제로 쌓인 실측 데이터를 열어볼 생각이다. 가정했던 0.05%와 실제로 낸 수수료가 얼마나 달랐는지, 슬리피지는 얼마였는지. 결과가 예상과 다르면 다른 대로 그대로 쓸 것이다.
이 글은 매매 시스템을 직접 설계하고 운영하면서 겪은 개인적인 경험과 학습을 기록한 것입니다. 특정 종목이나 전략에 대한 투자 권유가 아니며, 어떤 수익도 보장하지 않습니다. 본문의 모든 수치는 특정 기간의 제한된 표본에 대한 사후 분석이며 미래 성과를 예측하지 않습니다. 투자 판단과 그에 따른 책임은 전적으로 본인에게 있습니다.
댓글목록
등록된 댓글이 없습니다.