sgkstudio.
엔지니어링

백테스트 과최적화 — 샤프 3.24 전략이 5년 검증에선 음수였다

백테스트 과최적화를 점검하려고 운영 중인 자동매매 전략 세 개를 5년 데이터로 다시 돌렸더니, 셋 다 전체 기간 샤프 지수가 음수였습니다. 라이브 11개월 동안 2.79~3.24를 기록하던 전략들이었고, 흑자를 낸 해는 2025년 한 해뿐이었습니다. 짧은 기간의 좋은 성적이 어디서 왔는지, 그리고 바로 끄지 않고 어떤 기준을 세웠는지 기록합니다.

2026-10-07측정 방법 — 기간 2021-01-01~2026-03-01(61개월), 일평균 거래대금 상위 50개, 최대 5포지션×20%, 자본 1억원, 슬리피지 0.1%·거래세 0.23%·T+1 체결처음 잰 숫자 — 라이브 11개월 단일 전략 샤프 지수 2.79~3.24반증 — 61개월 샤프 지수 −0.33·−0.48·−0.70, 세 전략 묶음 −1.09(개별 평균 −0.50), 묶음 MDD −84.5%원인 — 2022년 고변동성 구간에 맞춘 60일 기준 구간(2023년 KOSPI +36%에 샤프 −1.45), 묶음의 거래비용 증폭, 모멘텀 계열과 2021~2024년 한국 시장 불일치재측정 — 연도별 샤프: 2021~2024년 전 전략 음수, 2025년만 흑자(+2.23·+1.76·+0.62·묶음 +1.92)조치 — 즉시 중단 대신 60일 이동 샤프 0.5 미만 시 중단 검토, 학습·검증 구간 분리, 배포 전 최소 24개월 검증

무엇이 문제였나 — 11개월 성적만 믿고 돈을 굴리고 있었다

백테스트 과최적화를 점검하려고 실제 운영 중인 자동매매 전략 세 개를 5년 데이터로 다시 돌렸더니, 세 전략 모두 전체 기간 샤프 지수가 음수였습니다. 라이브 운영 11개월 동안 샤프 지수가 2.79~3.24로 나오던 전략들이었습니다. 흑자를 낸 해는 2025년 한 해뿐이었고, 2021년부터 2024년까지 네 해 동안은 세 전략 모두 손실 쪽이었습니다.

문제의 출발점은 판단 근거의 길이였습니다. 세 전략은 짧은 기간의 좋은 성적을 보고 실제 자금을 넣은 상태였습니다. 11개월이라는 기간은 사람 감각으로는 꽤 길게 느껴집니다. 한 해 가까이 매달 계좌가 불어나는 모습을 보면 전략에 실력이 있다고 믿게 마련입니다. 그런데 주식 시장은 몇 년 단위로 강세와 약세를 오가고, 11개월은 그 한 국면 안에 통째로 들어갈 수 있는 길이입니다.

비용 측면에서도 위험이 컸습니다. 자동매매는 사람이 매번 확인하지 않아도 규칙대로 사고팝니다. 만약 전략의 성적이 특정 장세에서만 나오는 성적이라면, 장세가 바뀌는 순간부터 규칙은 그대로 돌면서 손실을 쌓습니다. 이 위험은 수익이 나는 동안에는 보이지 않습니다. 그래서 수익이 나고 있는 지금, 일부러 더 긴 기간을 다시 재 보기로 했습니다.

여기서 쓰는 용어 몇 가지를 먼저 정리합니다. 백테스트는 과거 가격 데이터 위에서 전략을 그대로 모의 실행해 성과를 재는 작업입니다. 과최적화(오버피팅)는 전략의 설정값이 특정 기간 데이터에만 지나치게 맞춰져, 그 기간 밖에서는 성과가 무너지는 상태를 말합니다. 샤프 지수는 변동성 한 단위당 얻은 수익을 나타내며, 0보다 작으면 위험을 떠안고도 보상을 받지 못했다는 뜻입니다.

처음 잰 숫자 — 라이브 11개월 샤프 지수 2.79~3.24

처음 손에 쥐고 있던 숫자는 라이브 운영 기록이었습니다. 운영 중인 단일 전략 세 개는 11개월 라이브 기간 동안 샤프 지수 2.79~3.24 구간에 있었습니다. 샤프 지수가 3 안팎이면 개인 자동매매에서는 드물게 높은 값으로 읽힙니다. 이 숫자를 근거로 세 전략을 계속 돌리고, 나아가 세 전략을 하나로 묶어 운영하는 구성도 함께 시험하고 있었습니다.

세 전략은 모두 같은 계열입니다. 첫째는 볼린저 밴드가 좁아졌다가 터지는 순간을 노리는 스퀴즈 스윙 전략, 둘째는 급등한 종목이 잠시 밀렸을 때 들어가는 눌림목 스윙 전략, 셋째는 이동평균선 교차를 신호로 쓰는 스윙 전략입니다. 셋 다 가격이 한 방향으로 움직이기 시작하면 따라 타는 추세 추종형, 그중에서도 모멘텀 돌파형에 속합니다.

라이브 11개월 샤프 지수 2.79~3.24와 61개월 백테스트 샤프 지수 −0.33~−0.70 비교
같은 전략, 다른 기간 — 11개월 라이브와 61개월 백테스트

이 단계에서 놓친 점은 비교 대상이 없었다는 사실입니다. 2.79라는 숫자가 좋은지 나쁜지는 같은 전략이 다른 장세에서 얼마를 냈는지와 나란히 놓아야 판단할 수 있습니다. 라이브 기록은 한 장세만 담고 있었고, 우리는 그 한 장세의 숫자를 전략의 실력으로 읽고 있었습니다.

어떤 가설을 세웠나?

검증 전에 세운 가설은 두 가지였습니다. 첫째, 세 전략에는 장세와 무관한 구조적 우위가 있어서 기간을 늘려도 샤프 지수가 양수로 남는다. 둘째, 세 전략을 묶으면 서로 다른 종목에서 수익을 내므로 분산 효과로 묶음의 성적이 개별 전략보다 낫다. 둘 다 그럴듯했고, 둘 다 반증 가능한 형태였습니다.

가설을 시험할 조건은 라이브 환경과 최대한 같게 맞췄습니다. 기간은 2021년 1월 1일부터 2026년 3월 1일까지 61개월로, 원 기록 기준 시장 사이클 3개 정도를 담는 길이입니다. 종목은 일평균 거래대금 상위 50개 안에서만 고르고, 동시에 최대 5포지션까지 각 20%씩 자금을 나눠 담았습니다. 시작 자본은 1억원으로 두었습니다.

비용도 넣었습니다. 체결 미끄러짐(슬리피지) 0.1%, 증권거래세 0.23%를 매 거래에 반영하고, 신호가 나온 다음 날 체결하는 T+1 방식으로 돌렸습니다. 신호가 나온 당일 종가에 바로 샀다고 가정하면 성적이 부풀기 쉽기 때문에, 실제로 주문을 넣을 수 있는 시점으로 늦춘 설정입니다.

측정 지표는 연평균 수익률(CAGR), 샤프 지수, 최대 낙폭(MDD), 거래수 네 가지였습니다. 최대 낙폭은 계좌가 직전 최고점에서 가장 깊이 떨어졌던 폭입니다. 여기에 전체 기간 값만 보지 않고 연도별로 샤프 지수를 쪼개 보기로 했습니다. 전체 평균이 한두 해의 큰 성적에 끌려가는 경우를 가려내기 위해서입니다.

가설이 틀린 지점 — 5년 전체 성적표

첫째 가설은 바로 무너졌습니다. 61개월 전체로 보면 단일 전략 세 개의 샤프 지수는 −0.33, −0.48, −0.70이었습니다. 연평균 수익률은 −5.8%, −8.3%, −9.4%였고, 최대 낙폭은 −57.8%, −58.4%, −48.0%였습니다. 시작 자본의 절반 이상이 한때 사라지는 구간을 지나온 셈입니다.

61개월 백테스트 결과표. 스퀴즈 스윙 CAGR −5.8% 샤프 −0.33 MDD −57.8% 485건, 눌림목 스윙 −8.3% −0.48 −58.4% 176건, 이동평균 교차 −9.4% −0.70 −48.0% 192건, 세 전략 묶음 −20.3% −1.09 −84.5% 647건
5년 전체 결과 — 네 구성 모두 샤프 지수 음수

둘째 가설은 더 크게 틀렸습니다. 세 전략을 묶은 구성은 연평균 수익률 −20.3%, 샤프 지수 −1.09, 최대 낙폭 −84.5%를 기록했습니다. 거래수는 647건이었습니다. 개별 전략 세 개의 샤프 지수 평균이 −0.50인데 묶음은 −1.09로, 분산 효과를 기대한 구성이 오히려 가장 나쁜 성적을 냈습니다.

연도별로 쪼개자 모양이 더 분명해졌습니다. 2021년부터 2024년까지 4년 연속, 모든 전략의 샤프 지수가 음수였습니다. 그리고 2025년 한 해에만 모든 전략이 흑자로 돌아섰습니다. 2025년 샤프 지수는 스퀴즈 스윙 +2.23, 눌림목 스윙 +1.76, 이동평균 교차 +0.62, 세 전략 묶음 +1.92였습니다.

2025년 한 해 샤프 지수. 스퀴즈 스윙 +2.23, 세 전략 묶음 +1.92, 눌림목 스윙 +1.76, 이동평균 교차 +0.62
2025년만 흑자 — 같은 전략의 2025년 샤프 지수

최대 낙폭 숫자도 따로 짚어 둡니다. 묶음 구성의 −84.5%는 계좌가 최고점에서 대부분을 잃은 구간이 있었다는 뜻입니다. 이 정도 낙폭에서는 이후 수익률이 좋아져도 원금을 회복하기가 매우 어렵습니다. 샤프 지수가 음수라는 사실보다, 실제 운영이었다면 중간에 버티지 못하고 멈췄을 가능성이 높다는 점이 더 현실적인 위험입니다.

이 결과를 라이브 숫자 옆에 놓으면 해석이 달라집니다. 라이브 11개월이 거둔 샤프 지수 2.79~3.24는 2025년 강세장 구간과 겹쳐 있었습니다. 원 기록은 이를 "2025 강세장 편향, 구조적 성능이 아님"이라고 정리했습니다. 우리가 실력으로 읽은 숫자는 장세가 준 숫자였습니다.

진짜 원인은 무엇이었나?

원인은 하나가 아니라 세 갈래였습니다. 설정값이 한 장세에 맞춰져 있었고, 전략을 묶는 방식이 비용을 키웠고, 전략 계열 자체가 한국 시장의 해당 기간과 맞지 않았습니다. 각각을 나눠 적습니다.

첫째는 스퀴즈 스윙 전략의 설정값입니다. 이 전략은 볼린저 밴드가 평소보다 좁아졌는지를 판단할 때 직전 60일을 기준 구간으로 씁니다(설정 이름 squeeze_lookback=60). 문제는 이 값을 2022년 고변동성 시장에서 맞췄다는 점입니다. 변동성이 컸던 시기를 기준으로 "좁다"를 정의해 두니, 2023년 이후 변동성이 정상으로 돌아오자 대부분의 구간을 "스퀴즈 아님"으로 판정했습니다. 진입 신호 자체가 막힌 셈입니다.

그 결과가 2023년 숫자에 그대로 찍혀 있습니다. 2023년 KOSPI는 +36% 올랐는데, 같은 해 스퀴즈 스윙 전략의 샤프 지수는 −1.45였습니다. 시장 전체가 크게 오른 해에 오르는 흐름을 타지 못하고 손실을 낸 이유가, 전략의 논리가 아니라 기준 구간 설정에 있었습니다. 과최적화가 가장 선명하게 드러난 지점입니다.

2023년 KOSPI +36% 상승, 같은 해 스퀴즈 스윙 전략 샤프 지수 −1.45, 기준 구간 60일
시장은 +36%, 전략은 샤프 −1.45 — 2022년에 맞춘 60일 기준 구간

둘째는 전략을 묶는 방식에서 생긴 비용 증폭입니다. 묶음 구성은 봉마다 실행하는 처리 단계에서 같은 종목이 겹치면 하나로 합쳤습니다. 그런데 세 전략은 대개 서로 다른 종목을 골랐기 때문에, 합칠 겹침이 거의 없었습니다. 원 기록은 실질 거래수가 단순 합산에 가깝다고 보고 거래비용이 3배로 늘었다고 적었습니다.

수익 쪽에서는 그만큼 이득이 없었습니다. 세 전략의 수익 기여가 서로 상관이 낮아 분산 효과가 날 거라고 기대했지만, 세 전략이 모두 손실 쪽인 기간에는 서로 다른 종목에서 각자 손실을 내는 구성이 될 뿐입니다. 비용은 더하기로 쌓이고 분산 효과는 제한적이었으니, 묶음의 샤프 지수 −1.09가 개별 평균 −0.50보다 나쁘게 나왔습니다.

샤프 지수 음수 폭 비교. 세 전략 묶음 −1.09이고 개별 전략 평균 −0.50, 이동평균 교차 −0.70, 눌림목 스윙 −0.48, 스퀴즈 스윙 −0.33
묶으면 나아질 줄 알았던 구성 — 샤프 지수 음수 폭

셋째는 시장 체제와 전략 계열의 불일치입니다. 세 전략은 모두 추세 추종 모멘텀 돌파형입니다. 원 기록에 따르면 한국 주식은 2021년부터 2024년까지 미국 대비 큰 폭의 상대 약세였고, 이 기간은 모멘텀 전략에 구조적인 역풍이었습니다. 세 전략이 제대로 작동한 구간은 2025년 AI·반도체 랠리뿐이었습니다. 같은 계열 셋을 묶었으니 역풍도 셋이 함께 맞았습니다.

돌이켜 보면 세 원인 모두 라이브 11개월 숫자만으로는 드러날 수 없는 원인이었습니다. 설정값이 한 장세에 맞춰져 있다는 사실은 장세가 바뀌어야 보이고, 묶음의 비용 증폭은 묶음이 손실을 내는 기간이 있어야 보이고, 전략 계열과 시장의 불일치는 그 시장이 약세인 기간을 지나 봐야 보입니다. 짧은 강세 구간 안에서는 세 문제가 모두 수익에 가려져 있었습니다.

세 원인을 겹쳐 보면 앞의 가설이 왜 틀렸는지가 맞아떨어집니다. 첫째 가설의 "구조적 우위"는 실제로는 2025년 장세에 기대고 있었습니다. 둘째 가설의 "분산"은 같은 계열 전략 사이에서는 기대만큼 나오지 않았고, 대신 거래비용만 늘렸습니다.

조치 — 바로 끄지 않고, 끌 기준을 숫자로 정했다

가장 먼저 내린 판단은 즉시 중단하지 않는다는 것이었습니다. 5년 성적이 음수라고 해서 지금 당장 끌 근거가 생기지는 않았습니다. 2025년 모멘텀 장세가 아직 이어지는 중이었고, 세 전략은 바로 그 장세에서 수익을 내고 있었기 때문입니다. 다만 약세장으로 넘어가면 2021~2024년의 모습이 반복될 가능성이 높다고 기록했습니다.

그래서 끄는 기준을 감이 아니라 숫자로 먼저 정해 두었습니다. 60일 이동 구간 샤프 지수가 0.5 아래로 내려가면 즉시 운영 중단을 검토합니다. 장세가 바뀌는 시점을 미리 맞힐 수는 없으니, 바뀐 뒤 최대한 빨리 알아차리는 장치를 둔 셈입니다. 수익이 나는 동안 이 기준을 정해 두는 편이, 손실이 쌓인 뒤 결정하는 편보다 판단이 덜 흔들립니다.

설정값을 맞추는 방식도 바꿨습니다. squeeze_lookback처럼 시장 체제에 따라 의미가 달라지는 설정값은 단일 고변동성 구간 하나에서 맞추지 않습니다. 대신 워크포워드 방식으로 학습 구간(IS)과 검증 구간(OOS)을 나눠 맞추는 절차를 필수로 정했습니다. 학습 구간에서 고른 값이 그 뒤 검증 구간에서도 버티는지를 봐야 한 장세에 갇힌 값을 걸러 낼 수 있습니다.

워크포워드 방식을 조금 더 풀어 쓰면 이렇습니다. 과거 데이터를 시간 순서대로 여러 덩어리로 나눈 뒤, 앞 덩어리에서 설정값을 고르고 바로 뒤 덩어리에서 그 값을 그대로 써서 성과를 잽니다. 이 작업을 기간을 한 칸씩 밀면서 반복합니다. 이렇게 하면 설정값이 미래 데이터를 미리 본 상태로 고르는 일을 막을 수 있고, 장세가 바뀐 구간에서 값이 버티는지도 함께 드러납니다.

전략을 묶을 때의 원칙도 적었습니다. 여러 전략을 묶으면 실질 비용은 개별 비용의 합이라고 보고 계산합니다. 묶어서 샤프 지수가 오르는 폭이 늘어난 비용을 정당화하는지 반드시 확인한 다음에만 묶음 구성을 씁니다.

배포 판단 기준도 하나 더했습니다. 11개월처럼 짧은 강세장 백테스트 결과로 실제 운영 여부를 정하지 않습니다. 실제 운영 전에는 최소 24개월, 시장 사이클 두 개 이상을 담은 장기 검증을 거칩니다. 이번 61개월 검증이 바로 그 기준이 생긴 계기였습니다.

조치 4가지. 60일 이동 샤프 0.5 미만 시 중단 검토, 체제 의존 설정값은 학습·검증 구간 분리 후 결정, 묶음은 비용 합산 기준으로 판단, 배포 전 최소 24개월·사이클 2개 이상 검증
조치 — 감 대신 숫자로 정한 네 가지 기준

재측정 결과 — 연도별로 다시 잰 숫자는 무엇을 말했나

이번 글의 재측정은 같은 전략을 긴 기간으로 다시 잰 작업 자체입니다. 처음 숫자(라이브 11개월 샤프 지수 2.79~3.24)를 61개월 조건으로 다시 재니, 단일 전략 세 개는 −0.33~−0.70, 묶음은 −1.09가 나왔습니다. 절대값으로 나란히 적으면 전후가 이렇습니다.

  • **전**: 라이브 11개월, 단일 전략 샤프 지수 2.79~3.24
  • **후**: 61개월 백테스트, 스퀴즈 스윙 −0.33 · 눌림목 스윙 −0.48 · 이동평균 교차 −0.70 · 세 전략 묶음 −1.09
  • **연평균 수익률**: −5.8% · −8.3% · −9.4% · 묶음 −20.3%
  • **최대 낙폭**: −57.8% · −58.4% · −48.0% · 묶음 −84.5%
  • **연도별**: 2021~2024년 4년 연속 전 전략 음수, 2025년만 전 전략 흑자(+2.23 · +1.76 · +0.62 · 묶음 +1.92)

연도별 재측정이 가장 많은 정보를 줬습니다. 전체 기간 값만 봤다면 "이 전략들은 나쁘다"로 끝났을 겁니다. 연도별로 쪼개니 "이 전략들은 한 장세에서만 작동한다"는 더 쓸모 있는 결론이 나왔고, 그래서 즉시 중단 대신 장세 전환을 감지하는 기준을 두는 조치로 이어졌습니다.

전후 숫자를 읽을 때 주의할 점도 있습니다. 라이브 숫자는 실제 체결 기록이고 61개월 숫자는 모의 실행 결과라서, 두 값을 같은 저울에 올린 비교는 아닙니다. 그래도 방향은 분명합니다. 기간을 늘리자 부호가 바뀌었고, 기간을 연도로 쪼개자 양수가 한 해에 몰려 있다는 사실이 드러났습니다. 과최적화 점검에서 가장 먼저 볼 신호가 바로 이 부호의 변화입니다.

2025년 안에서도 전략마다 차이가 컸습니다. 스퀴즈 스윙이 +2.23으로 가장 높았고 이동평균 교차는 +0.62에 그쳤습니다. 같은 강세장에서도 이 정도 폭이 벌어진다는 점은, 라이브 숫자 하나로 전략 간 우열을 정하는 판단 역시 위험하다는 뜻입니다.

비슷한 방식으로 운영 중인 전략의 백테스트 가정을 다시 들여다본 기록으로는 백테스트 갭 반영 누락 점검이 있습니다. 거기서는 손절 가정 하나가 결과를 얼마나 바꾸는지 다뤘고, 이 글은 기간 하나가 결론을 얼마나 바꾸는지를 다룹니다.

남는 한계 — 무엇이 아직 확인되지 않았나?

첫째, 조치의 효과는 아직 재지 못했습니다. 60일 이동 샤프 지수 0.5 기준은 제안 단계에서 정한 값이고, 이 기준이 실제 장세 전환을 얼마나 빨리 잡는지는 장세가 바뀐 뒤에야 확인할 수 있습니다. 0.5라는 값 자체도 이번 검증에서 따로 최적화한 값이 아닙니다.

둘째, 묶음 구성의 거래수 기록에 빈틈이 있습니다. 개별 전략 거래수 485건, 176건, 192건을 더하면 묶음 거래수 647건보다 큽니다. 원 기록은 중복을 제거한 뒤 647건이라고만 적었고, 제거 전후의 숫자나 거래비용이 정확히 몇 배인지 계산한 근거는 남기지 않았습니다. "거래비용 3배"는 원 기록의 판단을 그대로 옮긴 값입니다.

셋째, 시장 체제 설명은 해석입니다. 한국 시장의 2021~2024년 상대 약세가 모멘텀 전략의 역풍이었다는 설명은 결과와 잘 맞지만, 이번 검증이 그 인과를 따로 시험하지는 않았습니다. 같은 기간 다른 계열 전략과 비교한 기록도 없습니다.

넷째, 61개월도 충분히 길다고 단정할 수 없습니다. 원 기록은 이 기간을 시장 사이클 3개 정도로 봤지만, 사이클을 어떻게 셌는지는 적혀 있지 않습니다. 새로 정한 최소 24개월 기준 역시 시작점일 뿐, 더 긴 기간에서 결론이 또 바뀔 여지는 남아 있습니다.

다섯째, 이번 검증은 과거 데이터 한 벌 위에서 돌린 결과입니다. 슬리피지 0.1%와 거래세 0.23%는 가정값이고, 실제 체결에서 미끄러짐이 더 컸던 날이 있다면 5년 성적은 이보다 나쁠 수 있습니다. 반대로 라이브 11개월 기록과 백테스트의 2025년 구간이 정확히 같은 거래를 냈는지는 이번 기록에서 대조하지 않았습니다.

짧은 기간의 좋은 성적으로 자동화 시스템을 운영하고 있다면, 같은 시스템을 더 긴 기간과 연도별로 다시 재 보는 작업부터 권합니다. 자동매매가 아니더라도 광고 성과나 업무 자동화 효과를 몇 달 숫자로 판단하고 있다면 같은 함정이 있습니다. 측정 기간과 기준을 함께 설계하고 싶다면 상담으로 문의해 주세요.

같은 방식으로 우리 업무를 재보고 싶다면

이 글에 쓴 계측·판정·자동화는 저희가 실제로 매일 돌리는 방식 그대로입니다. 어떤 작업을 자동화할 수 있고 어디를 사람이 잡아야 하는지, 현재 업무 흐름을 놓고 같이 짚어 드립니다.

새 글이 올라오면 알려 드립니다

이런 계측 기록을 새로 쓰면 메일로 한 통 보냅니다. 광고나 판촉은 보내지 않습니다.