AI와 함께 만드는 삶

PM으로 일하며 AI와 함께 무언가를 만들어가는 삶을 기록합니다.

AI/AI시스템 설계기

백테스트 수익이 가짜였다 — 호가 바운스 착시를 일봉으로 걸러낸 과정

makewithai 2026. 7. 23. 10:39

세 번 연속 실패한 뒤 겨우 찾은 두 개의 후보가 있었다. 하나는 대형주 중에서 장부가 대비 싼 종목만 골라 사는 전략(저PBR), 다른 하나는 소형주 중에서 최근 많이 떨어진 종목을 사는 전략(리버설)이었다.

월 단위로 계산한 첫 결과는 둘 다 인상적이었다. 저PBR은 샤프비율 0.63으로 지금까지 나온 모든 전략 중 최고였다. 그런데 리버설은 그보다 더 눈에 띄는 기록을 세웠다 — 상승장·하락장·최근 구간 세 개를 전부 플러스로 통과한 유일한 전략이었다. +59%, +23%, +37%. 지금까지 어떤 전략도 이렇게 전 구간에서 이긴 적이 없었다.

너무 좋아서 오히려 불안했다. 그리고 그 불안은 맞았다.

저PBR과 리버설 전략의 월간 백테스트 초기 결과 비교 표, 리버설이 세 구간 모두 플러스 수익률 기록


월말 종가라는 한 지점이 마음에 걸렸다

리버설 전략의 계산 방식은 이랬다.

  1. 매달 말일 종가를 기준으로 최근 한 달 수익률을 계산한다
  2. 가장 많이 떨어진 소형주 10개를 고른다
  3. 다음 달 한 달간 들고 있는다고 가정한다

문제는 1번의 "월말 종가"였다.

호가 바운스란 무엇인가

거래가 뜸한 소형주는 호가 사이의 간격(스프레드)이 넓다. 매수 호가 9,000원, 매도 호가 9,500원처럼 벌어져 있는 식이다. 이때 장 마감 직전에 누군가 급하게 팔면 9,000원(매수 호가)에 체결되고, 그 가격이 그날의 종가로 기록된다.

그런데 다음 거래일이 되면 다시 9,300원 근처의 정상 가격대로 돌아온다. 아무 일도 일어나지 않았는데 +3.3% 상승한 것처럼 보인다. 이걸 호가 바운스(bid-ask bounce)라고 부른다.

리버설 전략은 구조적으로 이 함정에 정확히 걸리게 되어 있었다. "가장 많이 떨어진 종목"을 고르는 기준 시점이 하필 일시적으로 눌린 매수 호가였다면, 그 다음 달의 반등처럼 보이는 수익은 전략의 힘이 아니라 그냥 가격이 제자리로 돌아온 것뿐이다.

월 단위 데이터로는 이 둘을 구분할 방법이 없었다. 확인하려면 하루 단위로 다시 계산해야 했다.


9년치 전 종목 일봉을 다시 모았다

데이터 수집

거래일 하루하루의 실제 가격이 필요했다. 코스피·코스닥 전 종목의 2018년부터 2026년까지 일봉 데이터, 총 2,334거래일을 KRX에서 하루씩 받았다.

문제는 안정성이었다. 2,300번이 넘는 요청을 한 번에 돌리면 중간에 세션이 끊긴다. 실제로 여러 번 끊겼다. 그래서 수집기를 이렇게 만들었다.

  • 하루치를 받을 때마다 즉시 파일로 저장
  • 시작할 때 이미 받은 날짜를 스캔해서 건너뜀
  • 실패한 날짜는 별도 목록에 쌓아두고 마지막에 재시도

덕분에 중단돼도 다시 실행하면 끊긴 지점부터 이어졌다. 전체 수집에 며칠이 걸렸지만, 이 구조가 아니었으면 훨씬 더 걸렸을 것이다.

체결 조건을 현실적으로 바꿨다

이번 재검증에서 핵심적으로 바꾼 건 이 한 줄이다.

신호 계산은 월말 종가로, 체결은 반드시 다음 거래일 시가로.

실제로 거래한다면 월말 종가를 보고 그 자리에서 살 수는 없다. 종가가 확정되는 순간은 이미 장이 끝난 뒤다. 그러니 아무리 빨라도 다음 거래일 시가에나 살 수 있다. 이게 가장 현실적인 조건이었다.

그리고 이 한 줄의 차이가 두 전략의 운명을 갈랐다.

백테스트 신호 계산은 월말 종가, 실제 체결은 다음 거래일 시가로 분리한 구조 다이어그램


결과가 완전히 갈렸다

전략월간 근사치일봉 재검증
저PBR (대형주) CAGR +13.2%, 샤프 0.63 CAGR +12.0%, 샤프 0.60
리버설 (소형주) CAGR +12.4%, 샤프 0.48 CAGR -15.2%, 최대낙폭 -80.2%

저PBR은 살아남았다. 숫자가 살짝 줄었을 뿐 성격은 그대로였다. CAGR 1.2%p, 샤프 0.03 하락은 체결 시점을 하루 미룬 것에 대한 정상적인 비용으로 볼 수 있는 수준이다. 이 전략은 지금 실제로 페이퍼 트레이딩에 넣고 돌리고 있다.

리버설은 완전히 무너졌다. 세 구간 전부 플러스였던 성적이 통째로 사라졌고, 수익률은 플러스에서 마이너스로 부호가 뒤집혔다. 최대낙폭은 -44%에서 -80%로 뛰었다. 실제 돈이었다면 원금의 5분의 1만 남았다는 뜻이다.

의심했던 그대로였다. 수익의 정체는 호가 바운스 착시였다.


검증 자체가 틀린 건 아니었을까

여기서 한 번 더 의심해야 했다. 재검증 로직에 버그가 있어서 리버설만 억울하게 죽은 건 아닐까?

두 가지 근거로 아니라고 판단했다.

1. 같은 방법론에서 결과가 갈렸다

저PBR과 리버설에 완전히 동일한 코드를 적용했다. 데이터도 같고, 체결 규칙도 같고, 수수료·세금 가정도 같았다. 검증 방식 자체에 문제가 있었다면 둘 다 무너지거나 둘 다 버텼어야 한다. 한쪽만 통과하고 한쪽만 무너졌다는 건, 검증이 전략의 차이를 제대로 잡아냈다는 뜻이다.

2. 원인이 논리적으로 설명된다

  • 대형주(저PBR): 거래가 활발하니 호가 간격이 좁다 → 월말 종가가 왜곡될 여지가 적다 → 영향 적음
  • 소형주(리버설): 거래가 뜸하니 호가 간격이 넓다 → 월말 종가가 쉽게 눌린다 → 착시를 그대로 흡수

결과와 메커니즘이 서로 맞아떨어졌다. 우연히 나온 숫자가 아니라는 확인이었다.


최근에 다시 한번 들여다봤다

얼마 전에 이 리버설 전략을 다른 방식으로 다시 검토해볼 일이 있었다. AI 개발 도구 하나를 시험 삼아 써보면서 "이 죽은 전략을 되살릴 방법이 있을까"를 다시 물어본 거였다.

결론은 크게 다르지 않았다. 이미 근거를 갖고 내린 판단은 도구를 바꾼다고 쉽게 뒤집히지 않았다. 오히려 그게 안심이 됐다 — 판단의 근거가 도구가 아니라 데이터에 있었다는 뜻이니까. (이 과정 자체는 도구 사용기라 별도 글로 정리했다.)


이 실패에서 남은 규칙

월 단위 근사치는 계산이 빠르고 편하다. 전 종목 9년치를 월봉으로 돌리면 몇 초면 끝난다. 일봉으로 돌리면 데이터 수집에만 며칠, 백테스트에도 수십 배의 시간이 든다.

그래서 유혹이 생긴다. "월간으로도 충분히 좋아 보이는데 그냥 넘어갈까?"

그 유혹에 넘어갔다면 리버설을 실전에 넣었을 것이다. 그리고 -80% 낙폭을 실제로 겪었을 것이다.

이후로 세운 규칙은 이렇다.

  • 신규 전략은 월간 근사치로 1차 스크리닝만 한다
  • 후보로 인정하려면 일봉 + 익일 시가 체결 검증을 반드시 통과해야 한다
  • 소형주·저유동성 종목을 다루는 전략은 이 검증을 더 엄격하게 본다
  • 월간과 일봉의 결과 격차가 크면, 그 격차의 원인을 설명할 수 있어야 한다
  • 설명이 안 되면 전략을 버린다

마지막 항목이 제일 중요했다. 숫자가 좋으면 이유를 못 찾아도 그냥 쓰고 싶어진다. 그 지점에서 멈추는 게 이 시스템의 안전장치다.

월간 근사치와 일봉 재검증 결과 격차 그래프, 리버설 전략만 CAGR이 플러스에서 마이너스로 역전


다음 편 예고

저PBR 전략은 최근 2년 동안 유독 성적이 좋았다. 그런데 우연히 이런 질문을 받았다.

"그거 혹시 정부 정책 특수 아니야?"

밸류업 정책이 저PBR 종목을 밀어올린 구간에 백테스트가 겹친 거 아니냐는 지적이었다. 타당한 의심이었고, 확인이 필요했다. 그런데 확인해보니 걱정한 것과는 완전히 다른 답이 나왔다.


이 글은 투자 권유가 아니며, 개인적인 AI·자동매매 시스템 개발 과정의 기록입니다. 백테스트 결과는 과거 데이터에 대한 시뮬레이션이며 미래 수익을 보장하지 않습니다.