단타 봇 3개월 데이터로 확인한 것 — 조건을 바꿔도 안 되는 이유
3개월치 틱·호가 데이터를 전부 꺼내 단타 전략을 다시 검증했다. 결론부터 쓰면, 진입·청산 조건을 바꾸는 방식으로는 흑자가 나오지 않는다. 파라미터가 나빴던 게 아니라 넘어야 할 문턱이 얻을 수 있는 것보다 컸다.
왜 다시 봤나
운영 중인 자동매매 봇이 계속 손실이었다. 그동안은 "진입 조건이 덜 까다로워서"라고 보고 임계값을 조정해 왔다. 이번엔 가정을 버리고, 누적된 데이터로 가능한 조합을 전부 계산해 보기로 했다.
데이터와 방법
- 데이터: 32거래일(6/11~8/28)의 틱·호가 원본. 하루 19~38종목(테마·급등주 중심)
- 후보 생성: 실제 전략 클래스를 임계값을 모두 풀어 재생 → 진입 후보 10만 2천건과 각 후보의 이후 가격 경로를 캐시
- 평가: 익절·트레일링·손절·본전스톱·시간컷 조합을 격자로 훑고, 위탁수수료 0.03%(왕복) + 증권거래세 0.15%를 차감한 순손익으로 계산
- 체결 모델: 매수는 매도호가(시장가), 매도는 매수호가(시장가). 지정가 체결은 "관통 체결"만 인정 — 내 호가를 시장이 실제로 뚫고 지나갔을 때만
- 검증: 기간을 전·후반으로 갈라 양쪽 모두 플러스인지, 특정 종목·특정 날짜에 의존하는지 확인
결과 1 — 문턱이 얼마인가
현행 진입 신호(거래량 급증 + 3분 모멘텀 + 당일 고가 돌파)로 진입해 10분 보유했을 때:
| 항목 | 값 |
|---|---|
| 순수 가격 움직임 (중간가 기준) | -0.071%, 95% 구간 [-0.51%, +0.37%] |
| 손익분기에 필요한 상승폭 | +0.361% |
| └ 왕복 수수료·세금 | 0.180% |
| └ 호가 스프레드 | 0.181% |
가격이 어디로 갈지에 대한 기댓값이 통계적으로 0과 구분되지 않는다. 그런데 넘어야 할 문턱은 0.36%다. 필요한 값이 신뢰구간 상단에 겨우 걸치는 수준이라, 청산 규칙을 어떻게 조합해도 메울 수 있는 크기가 아니다.
왕복 비용 0.18% 가운데 0.15%가 증권거래세다. 즉 비용의 83%가 매매 횟수에 그대로 비례한다. 하루에 여러 번 돌리는 구조는 그만큼 세금을 여러 번 낸다.
결과 2 — 8만 조합을 전부 돌려봤다
| 실험 | 조합 수 | 전·후반 모두 플러스 |
|---|---|---|
| 시장가 진입 × 모든 청산 조합 | 47,250 | 815 — 전부 표본 56건에 1종목 의존 77~85% |
| 양방향 지정가 (매수·익절 모두 지정가) | 33,750 | 0 |
시장가 쪽에서 나온 815개는 전부 과최적화였다. 표본이 56건인데 이익의 8할이 한 종목에서 나왔다. 스프레드를 내지 않고 받는 구성(양방향 지정가)은 이론상 최선이지만, 실제로는 내 지정가가 체결되는 순간이 곧 불리한 순간이라(역선택) 단 하나도 살아남지 못했다.
결과 3 — 방향을 뒤집어도 안 된다
"돌파에서 사면 지니까 반대로 급락에서 사면 되지 않나"를 같은 잣대로 확인했다. 진입 계열 8종을 만들어 비교한 결과(10분 보유, 비용 차감 후):
| 진입 계열 | 건수 | 60초 | 180초 | 600초 | 1800초 |
|---|---|---|---|---|---|
| 급락 (아무 때나) | 5,770 | -0.404% | -0.395% | -0.367% | -0.610% |
| 돌파 (현행) | 288 | -0.232% | -0.397% | -0.432% | -0.312% |
| 급락 + 호가 매수우위 | 2,942 | -0.396% | -0.405% | -0.275% | -0.483% |
| 당일 저가권 반등 | 2,149 | -0.431% | -0.461% | -0.418% | -0.503% |
| 상승추세주 눌림목 | 2,212 | -0.468% | -0.519% | -0.595% | -0.988% |
전부 마이너스이고, 전·후반으로 갈라도 부호가 그대로였다.
결과 4 — 보유기간을 늘리면?
여기서 처음으로 플러스가 나왔다. 같은 돌파 신호로 진입하되 오전 제한을 풀고, 익절 3% / 손절 1.5%로 벌리고, 당일 장마감까지 들고 가는 구성이다.
| 항목 | 값 |
|---|---|
| 표본 | 551건 / 28거래일 |
| 건당 순손익 | +0.603% (95% 구간 +0.42% ~ +0.79%) |
| 승률 | 51.9% (익절 48% · 손절 48% · 장마감 4%) |
| 상위 1종목 제외 시 | +0.447% |
| 상위 3종목 제외 시 | +0.216% |
종목 분산은 통과했다. 앞선 과최적화 사례들과 달리 한두 종목을 빼도 부호가 유지된다. 그런데 날짜로 쪼개자 이야기가 달라졌다.
| 구분 | 건수 | 합계 | 건당 |
|---|---|---|---|
| 전체 28거래일 | 551 | +332.0% | +0.603% |
| 상위 3일 (6/17, 8/25, 8/27) | 176 | +303.9% | — |
| 그 3일을 뺀 나머지 25일 | 375 | +28.2% | +0.075% |
이익의 91.5%가 28일 중 단 3일에서 나왔다. 날짜를 동일 가중으로 평균 내면 +0.074%, 플러스로 끝난 날은 15/28일이다. 남은 +0.075%는 실제 슬리피지와 미체결을 감안하면 그냥 0이다.
그래서 무엇을 배웠나
세 가지로 정리된다.
- 단타의 적은 예측 실패가 아니라 고정비용이다. 왕복 0.36%(세금·수수료 + 스프레드)를 넘겨야 하는데, 수분 단위 가격 움직임의 기댓값은 0이다. 조건을 아무리 정교하게 다듬어도 이 뺄셈은 바뀌지 않는다.
- 보유기간을 늘리는 방향은 옳다. 마이너스가 0 근처까지 올라왔다. 같은 세금 한 번을 내고 0.3%가 아니라 3%를 노리는 구조가 산술적으로 유리하다.
- 그런데 그 이익도 평상시엔 없다. 시장 전체가 크게 움직인 소수의 날에만 몰려 있다. 이건 파라미터로 잡을 수 있는 게 아니라 국면의 문제다. 다음에 볼 것은 진입 조건이 아니라 "오늘이 그런 날인가"를 판별하는 쪽이다.
손실이 날 때 대부분은 조건을 더 조이는 쪽으로 손이 간다. 이번에 확인한 건, 조일수록 표본만 줄고 남은 것은 우연이라는 사실이었다. 8만 개를 전부 돌려보고 나서야 "이 방향엔 답이 없다"를 말할 수 있게 됐고, 그게 조건을 하나 더 바꿔보는 것보다 훨씬 쓸모 있었다.
검증에 쓴 스크립트와 중간 산출물은 전부 남겨뒀다. 다음 검증은 대형주(스프레드가 좁아 문턱이 0.23%로 내려간다) 유니버스와, 국면 판별 쪽으로 이어갈 예정이다.