주식 백테스트 과최적화 | 10년 검증으로 본 패턴 매매의 실패



안녕하세요, 육성라이프입니다 😊

1편에서 ‘거래량은 3배 터졌는데 주가는 ±3% 안에 머문 종목’을 찾는 흡수 거래량 스크리너를 만들었습니다. 매일 그럴듯한 종목이 수십 개씩 걸렸고, 차트를 열어 보면 오른 종목도 꽤 보였습니다.

그런데 투자에서 가장 위험한 말이 “차트 몇 개 보니까 되더라”입니다. 그래서 같은 규칙을 10년치 코스피·코스닥 실제 데이터 전체에 기계적으로 적용하는 백테스트를 돌렸습니다. 결과는 한마디로 불편했습니다. 이번 글에서는 패턴 매매가 왜 무너졌는지, 그리고 그 과정에서 배운 주식 백테스트 과최적화의 함정을 정리합니다.

✅ 이 글의 결론 먼저
가격·거래량 모양만으로 고른 종목은 10년 검증에서 무작위로 고른 종목과 통계적으로 구분되지 않았습니다. 한 기간에서 잘 맞던 패턴은 다른 기간에서 뒤집혔습니다.

1. 백테스트를 어떻게 설계했나

백테스트는 “과거에 이 규칙대로 매매했다면 어떻게 됐을까”를 계산하는 일입니다. 쉬워 보이지만 설계를 잘못하면 무엇이든 좋게 보이게 만들 수 있습니다. 그래서 처음부터 다음 기준을 정했습니다.

기준 내용
기간 최대 10년, 코스피·코스닥 전 종목
비용 매매 수수료, 거래세, 슬리피지 차감
현실 제약 100만 원 기준 1주 단위 매수, 최대 3종목 동시 보유
비교 대상 같은 날 무작위로 고른 종목의 성과
검증 방식 앞 기간에서 찾은 규칙을 뒤 기간에 그대로 적용(기간 분리)

마지막 두 줄이 핵심입니다. 상승장에서는 아무 종목이나 사도 돈을 법니다. 그래서 “벌었냐”가 아니라 “무작위보다 나았냐”를 봐야 합니다. 또 규칙을 만든 기간에서 성적이 좋은 건 당연하니, 규칙을 만들 때 쓰지 않은 기간에서도 통하는지 확인해야 합니다.

하락 추세를 보이는 캔들 차트
백테스트는 ‘좋아 보이는 차트’가 아니라 규칙에 걸린 모든 종목의 결과를 셉니다. 흘러내린 종목도 빠짐없이 들어갑니다.
사진: Alex Luna · Pexels (Pexels 라이선스)

2. 결과: 흡수 신호는 왜 실패했나

10년 실제 데이터에 돌려 본 결과는 이랬습니다.

  • 기본 조건, 강화 조건 모두 비용을 빼고 나면 수익이 마이너스이거나 무작위 종목 선택과 통계적으로 차이가 없었습니다.
  • 어떤 해에는 강화 조건이 좋았는데, 다른 해에는 오히려 기본 조건보다 나빴습니다.
  • 조건을 조금씩 바꿔 가며 다시 돌려도, 앞 기간에서 좋았던 조합이 뒤 기간에서는 뒤집히는 일이 반복됐습니다.

처음엔 조건이 부족해서라고 생각했습니다. 그래서 방향을 여러 번 바꿨습니다.

시도 아이디어 10년 검증 결과
흡수 스크리너 v2 강화 조건(종가 위치·바닥권·시장 추세) 추가 무작위와 구분 안 됨
상승주 패턴 추천 최근 3개월 상승주의 공통 가격·거래량 패턴 학습 검증 기간에서 패턴 성적 역전
캔들로 기관 매집 추정 캔들 모양으로 기관 매수 흔적 추정 효과 확인 안 됨
장기 매집 보유 전략 매집 흔적 종목을 길게 보유 무작위 대비 우위 없음
💡 공통점이 있었습니다. 전부 가격과 거래량의 ‘모양’만 봤다는 점입니다. 같은 모양이라도 누가, 왜 샀는지에 따라 의미는 정반대일 수 있는데, 모양만으로는 그걸 구분할 수 없었습니다.

3. 과최적화 — 백테스트가 거짓말을 하는 방식

이 과정에서 가장 크게 배운 건 과최적화(오버피팅)의 무서움입니다. 과최적화란 과거 데이터에 너무 잘 맞도록 규칙을 다듬다가, 실제로는 우연에 불과한 패턴까지 규칙에 넣어 버리는 현상입니다.

예를 들어 볼게요. 거래량 배수 2배·3배·4배, 등락률 ±2%·±3%·±5%, 보유 기간 10일·20일·40일을 조합하면 27가지입니다. 이 중 하나는 순전히 운으로도 좋은 성적이 나옵니다. 그 조합을 골라 “찾았다!”라고 외치는 순간, 실전에서는 무너질 규칙을 들고 시장에 들어가게 됩니다.

공중에서 굴러가는 빨간 주사위
여러 조합을 시험하면 그중 몇 개는 운만으로도 좋은 숫자가 나옵니다. 주사위를 많이 던질수록 6이 나오는 건 당연합니다.
사진: Vanderlei Longo · Pexels (Pexels 라이선스)

과최적화를 피하려고 제가 지킨 원칙은 세 가지입니다.

  1. 기간 분리: 규칙은 앞 기간에서만 고르고, 뒤 기간은 채점용으로만 씁니다. 뒤 기간을 보고 규칙을 다시 고치면 그 순간 뒤 기간도 오염됩니다.
  2. 유형을 잘게 쪼개지 않기: 분류를 너무 세분하면 한 칸에 들어가는 사례가 몇 개 안 되고, 그 몇 개가 우연히 좋으면 패턴처럼 보입니다.
  3. 엔진부터 검증: 일부러 효과를 심은 가짜 데이터에서는 그 효과를 찾아내야 하고, 완전히 무작위인 데이터에서는 ‘효과 없음’이 나와야 합니다. 이걸 통과하지 못하면 실제 데이터 결과도 믿을 수 없습니다.

4. 숫자가 좋아 보일 때 의심해야 할 신호

백테스트 결과를 볼 때 아래 중 하나라도 해당되면 의심부터 하는 습관이 생겼습니다.

의심 신호 왜 위험한가
수익률이 지나치게 높다 대부분 미래 정보가 섞였거나, 비용을 빠뜨렸거나, 운 좋은 조합을 고른 경우입니다.
특정 1~2년이 성과를 다 만든다 그 시기의 시장 분위기 덕일 가능성이 큽니다. 연도별로 플러스인 해가 얼마나 되는지 봐야 합니다.
사례 수가 적다 수십 건짜리 결과는 몇 건의 대박이 평균을 끌어올릴 수 있습니다.
조건을 바꿀 때마다 결과가 크게 출렁인다 규칙이 구조가 아니라 우연에 기대고 있다는 뜻입니다.
‘승률’만 보여준다 +10% 목표 같은 터치 기준은 변동성이 큰 종목을 좋아 보이게 만듭니다.
여러 모니터의 차트를 보며 머리를 감싼 사람
그럴듯한 결과가 실전에서 무너지면 돈과 시간을 함께 잃습니다. 백테스트 단계에서 실패하는 편이 훨씬 싸게 먹힙니다.
사진: AlphaTradeZone · Pexels (Pexels 라이선스)

5. 실패에서 얻은 것

몇 주 동안 만든 프로그램들이 연달아 ‘효과 없음’을 받았을 때는 허탈했습니다. 그래도 돌아보면 이 결과는 실패가 아니라 진단이었습니다.

  • 누구나 보는 가격·거래량 데이터로 ‘오를 종목’을 맞히는 건, 같은 데이터를 보는 수많은 펀드와 경쟁하는 일입니다. 신호가 있어도 이미 가격에 반영돼 있을 가능성이 큽니다.
  • 그렇다면 모양이 아니라 다른 종류의 정보를 더해야 합니다. 그 첫 후보가 “누가 샀는가”, 즉 기관·외국인 수급이었습니다.
  • 무엇보다 돈을 넣기 전에 이걸 알게 됐다는 게 가장 큰 수확입니다.
노트북 화면에 띄운 여러 개의 주가 그래프
검증 기준을 먼저 정해 두면, 결과가 마음에 들지 않아도 숫자를 받아들일 수 있습니다.
사진: Alesia Kozik · Pexels (Pexels 라이선스)

정리 — 10년 백테스트가 알려준 것

  • 흡수 거래량 신호는 10년 실제 데이터에서 무작위 종목 선택보다 낫다는 근거가 없었습니다.
  • 상승주 패턴, 캔들 기반 매집 추정 등 모양 기반 전략은 모두 기간을 바꾸면 성적이 뒤집혔습니다.
  • 백테스트는 무작위 대비 초과수익, 비용 차감, 기간 분리 세 가지가 없으면 믿기 어렵습니다.
  • 다음 편에서는 ‘누가 샀는가’ — 기관·외국인 순매수를 더하면 달라지는지 검증합니다.

자주 묻는 질문

Q. 백테스트에서 수익이 났는데 왜 무작위와 비교해야 하나요?
10년 중 상당 기간은 시장 전체가 올랐습니다. 그 기간에는 아무 종목이나 사도 수익이 납니다. 내 규칙이 시장 덕을 본 건지, 실제로 더 나은 종목을 고른 건지는 무작위와 비교해야만 알 수 있습니다.

Q. 그럼 기술적 분석은 다 쓸모없나요?
제 데이터와 제 규칙에서는 우위가 확인되지 않았다는 뜻입니다. 다만 “효과가 있다”는 주장을 들으면 같은 방식으로 검증해 볼 것을 권합니다.

⚠️ 투자 유의 — 이 글은 개인적으로 진행한 프로그램 개발·검증 기록이며 특정 종목의 매수·매도 권유가 아닙니다. 과거 백테스트 결과는 미래 수익을 보장하지 않으며, 투자 판단과 그 결과의 책임은 투자자 본인에게 있습니다.