sgkstudio.
엔지니어링

백테스트 검증: 샤프 +2.36 전략의 수익은 강세장 베타였다

백테스트 검증을 전체 기간으로 넓히자, 거래당 +0.515%와 샤프 지수 +2.36을 냈던 주식 전략은 초과수익이 아니라 강세장을 따라간 수익으로 판명 났고 실거래 연결을 보류했습니다. 표본 밖 구간만 볼 때 평균의 95% 신뢰구간 하한은 +0.133%였지만, 2024년 5월 1일부터 2026년 6월 26일까지 1,941건을 합치자 구간이 −0.0994%에서 +0.3861%까지 벌어져 0을 품었습니다. 이 글은 좋아 보이던 숫자를 어떤 순서로 다시 쟀고, 어떤 가설이 틀렸고, 무엇이 아직 풀리지 않았는지 적은 기록입니다.

2026-11-02검증 대상: hero 전략 후보(climax 신호 · 비대칭 청산 · RS30 조합), 파라미터는 2026년 6월 29일 확정값 고정전체 기간 2024년 5월 1일 ~ 2026년 6월 26일, 1,941건분기별 워크포워드 9개 분기 + KOSPI 분기 수익 상관 + 부트스트랩 95% 신뢰구간비용 가정: 왕복 0.43%, 오버나잇 1박 0.15%데이터: 유동성 상위 50종목 분봉, 2024년 4월 18일 ~ 2026년 6월 30일반증된 가설: 표본 밖에서 유의하면 전략에 진짜 초과수익이 있다

실거래 직전의 매매 전략, 무엇이 문제였나?

이 전략 후보는 실거래 연결 바로 앞에 서 있었습니다. 2026년 6월 29일의 결론은 좋았습니다. climax 신호와 비대칭 청산, RS30을 묶은 조합이 표본 밖 구간에서 거래당 +0.515%를 냈고, 샤프 지수는 +2.36이었습니다. 샤프 지수는 수익을 변동성으로 나눈 값이라, 흔들림 한 단위마다 얼마를 벌었는지 보여 줍니다. 통계 검정도 통과했으니 숫자만 보면 돈을 넣어 볼 만한 후보였습니다.

걸리는 점이 하나 있었습니다. 표본 안 구간인 2024년에서는 모든 조합이 음수였습니다. 같은 규칙이 한 구간에서 전부 지고 다른 구간에서 이겼다면, 규칙보다 구간이 결과를 정했을 가능성이 있습니다. 표본 밖 구간이 강세장이었다면 전략이 무엇을 골랐든 올랐을 테니까요. 기록은 이 의심을 강세장 베타 의혹이라고 불렀고, 6월 29일 결론은 이 의혹을 풀지 못한 채 끝났습니다.

이 의혹을 안고 실거래로 넘어가면 비용은 숫자가 아니라 계좌에서 나갑니다. 수익의 원천이 시장 상승이라면 시장이 꺾이는 날 전략도 함께 꺾이고, 백테스트에서 본 낙폭은 그날의 손실을 설명하지 못합니다. 그래서 실거래 연결 전 필수 단계로 검증을 한 번 더 잡았습니다. 판단 기준은 하나였습니다. 이 수익이 전략의 실력인가, 시장을 따라간 결과인가.

처음 잰 숫자: 표본 밖 거래당 +0.515%, 샤프 +2.36

2026년 6월 29일 시점의 성적표
지표값읽는 법
거래당 평균 수익률 (표본 밖)+0.515%한 번 사고팔 때마다 평균으로 남긴 몫
샤프 지수 (기록의 eqSharpe)+2.36흔들림 대비 수익
평균의 신뢰구간 하한 (표본 밖)+0.133%하한이 0보다 위라 통계적으로 유의
최대 낙폭 MDD (표본 밖)−12.8%고점에서 저점까지 가장 크게 잃은 폭
표본 안 (2024년)전 조합 음수유일하게 걸리던 칸

표본 밖 구간의 숫자는 전부 좋았고, 표본 안 칸 하나만 반대 방향이었습니다.

이 표를 처음 읽을 때 눈은 위쪽 네 줄로 갑니다. 평균이 플러스이고, 샤프가 높고, 신뢰구간 하한이 0 위에 있고, 낙폭도 −12.8%로 얕습니다. 신뢰구간은 표본이 달랐다면 평균이 어디까지 움직일 수 있었는지 보여 주는 범위입니다. 하한이 0보다 위라면 우연으로 나온 플러스라고 보기 어렵습니다.

다만 이 네 줄은 모두 표본 밖 한 구간에서 나왔습니다. 낙폭 −12.8%도 그 구간의 낙폭이지 전략의 낙폭이 아닙니다. 당시에는 이 차이가 얼마나 큰지 몰랐습니다. 크기는 전체 기간을 다시 재고서야 나왔습니다.

위 표에는 한 가지가 더 빠져 있습니다. 지표는 전부 전략 혼자의 성적이고, 시장이 같은 기간에 무엇을 했는지 말해 주는 칸이 없습니다. 평균과 샤프는 전략이 얼마나 벌었는지 보여 줄 뿐, 그 돈이 어디서 왔는지는 보여 주지 않습니다. 이 빈칸을 채우는 일이 다음 검증의 출발점이었습니다.

세운 가설: 표본 밖에서 유의하면 진짜 초과수익이다

앞선 결론이 기대던 가설은 단순합니다. 연구에 쓰지 않은 구간에서 통계적으로 유의한 수익이 나왔으니 전략에 진짜 초과수익이 있다는 가설입니다. 표본 밖 검증은 과최적화를 거르는 표준 절차라서 이 추론은 자연스럽습니다. 반대편에는 전략 수익이 시장 방향에서 왔다는 가설이 있었습니다. 둘을 가르려면 전략은 그대로 두고 보는 구간과 비교 대상만 바꿔야 합니다.

그래서 새 검증 러너 backtest/hero_regime_robustness_runner.py를 만들되, 시뮬레이션 엔진은 기존 hero_asymmetric_exit_runner를 그대로 재사용했습니다. 파라미터도 6월 29일 확정값에서 한 칸도 옮기지 않았습니다. 검증 단계에서 조건을 고치면 그 순간 검증이 아니라 새 연구가 되기 때문입니다. 비용은 왕복 0.43%에 오버나잇 1박당 0.15%로 잡았고, 데이터는 유동성 상위 50종목의 분봉입니다. 작업은 PR #776으로 남겼습니다.

흐름도. 고정한 전략과 파라미터, 비용 왕복 0.43%를 입력으로 분기별 워크포워드 9개 분기, 전체 기간 합산 1,941건, KOSPI 대비 비교, KOSPI 20일 레짐 게이트 네 가지 시험을 돌려 실거래 연결 여부를 판정한다
전략은 고정하고 구간과 비교 대상만 바꾼 검증 구조
  • 분기별 워크포워드: 기간을 시간 순서로 잘라 구간마다 성적을 따로 보는 방법입니다. 9개 분기로 나눠 분기별 전략 수익과 KOSPI 분기 수익의 피어슨 상관을 쟀습니다.
  • 전체 기간 합산: 2024년 5월 1일부터 2026년 6월 26일까지 조건 없이 1,941건을 합쳐 평균과 부트스트랩 95% 신뢰구간, t검정 p값을 다시 구했습니다.
  • 시장 대비 진단: KOSPI를 그대로 들고 있는 경우(베타 1)와 비교해 초과수익과 초과 샤프를 쟀습니다.
  • 레짐 게이트: KOSPI 20일 수익이 플러스일 때만 매매했다면 성적이 어떻게 바뀌는지 따로 쟀습니다.

네 시험은 서로 다른 질문에 답합니다. 워크포워드는 수익이 어느 시기에 몰렸는지, 전체 합산은 시기를 가리지 않아도 평균이 남는지, 시장 대비 진단은 남은 수익이 단순 보유보다 나은지, 레짐 게이트는 시장 상태만 보고 손실 구간을 피할 수 있는지를 묻습니다. 전략 가설이 맞다면 네 시험을 모두 버텨야 하고, 베타 가설이 맞다면 앞의 세 시험이 같은 방향으로 어긋나야 합니다.

가설은 어디서 틀렸나: 전체 기간 1,941건 합산

가설은 구간을 합치는 순간 깨졌습니다. 1,941건의 거래당 평균은 +0.1338%였고, 부트스트랩 95% 신뢰구간은 −0.0994%에서 +0.3861%까지였습니다. 하한이 0 아래로 내려갔으니 이 평균은 0과 구별되지 않습니다. t검정 p값도 0.137로 5% 기준에 한참 못 미쳤습니다. 부트스트랩은 실제 거래 목록에서 표본을 반복해 다시 뽑아 평균의 흔들림을 재는 방법입니다.

표. 표본 밖 단독은 거래당 평균 +0.515%, 신뢰구간 하한 +0.133%, 최대 낙폭 −12.8%. 전체 기간 1,941건은 평균 +0.1338%, 신뢰구간 하한 −0.0994%, 최대 낙폭 −47.68%, p값 0.137
전략은 그대로인데 구간만 넓혀도 결론이 바뀌었습니다

기록은 표본 밖 단독의 유의성을 구간 선택 효과로 판정했습니다. 표본 밖 구간의 수익이 거짓이었다는 뜻은 아닙니다. 그 구간에서는 실제로 그렇게 벌었습니다. 틀린 부분은 그 구간의 성적을 전략의 성질로 옮겨 읽은 추론입니다. 표본 밖이라는 말은 연구에 쓰지 않았다는 뜻일 뿐, 시장의 모든 국면을 담았다는 뜻이 아니었습니다.

구간 선택 효과가 잡기 어려운 이유는 절차가 겉으로 멀쩡하기 때문입니다. 연구 구간과 시험 구간을 나눴고, 신뢰구간도 구했고, 검정도 통과했습니다. 어느 단계에서도 규칙을 어기지 않았습니다. 빠진 단계는 시험 구간이 어떤 시장이었는지 묻는 일 하나였습니다. 표본 밖 검증을 통과했다는 문장은 과최적화가 아닐 가능성을 높여 줄 뿐, 수익의 출처까지 보증하지 않습니다.

평균 자체는 여전히 플러스라서, 이 결과만으로 전략이 돈을 잃는다고 말할 수는 없습니다. 말할 수 있는 범위는 평균이 0과 다르다는 증거가 사라졌다는 데까지입니다. 그래서 다음 질문이 남았습니다. 그렇다면 플러스였던 구간의 수익은 어디서 왔는가.

진짜 원인은 무엇이었나: 강세장 베타와 구간 선택

답은 분기를 시장 수익과 나란히 놓자 나왔습니다. 9개 분기의 전략 수익과 KOSPI 분기 수익은 피어슨 상관 r=+0.686(거래당 평균 수익 기준), r=+0.700(총손익 기준)이었고, p값은 각각 0.041과 0.036으로 둘 다 5% 기준 안쪽이었습니다. 부호로 보면 더 선명합니다. 전략이 음수였던 4개 분기는 전부 KOSPI 약세이거나 횡보였고, 양수였던 5개 분기는 전부 KOSPI가 +10.8%에서 +57.6%까지 오른 극단적 강세 분기였습니다.

표. 9개 분기 중 전략 양수 5개 분기는 전부 KOSPI +10.8%에서 +57.6% 강세 분기, 전략 음수 4개 분기는 전부 KOSPI 약세 또는 횡보 분기. 상관 r +0.686과 +0.700
전략이 벌고 잃은 분기가 시장의 강세와 약세에 그대로 겹쳤습니다

상관계수보다 부호 일치를 더 무겁게 읽은 이유가 있습니다. 상관은 큰 값 몇 개에 끌려갈 수 있지만, 9개 분기 가운데 시장 방향과 어긋난 분기가 하나도 없다는 사실은 그런 왜곡을 받지 않습니다. 거래당 평균과 총손익이라는 두 기준에서 상관이 +0.686과 +0.700으로 비슷하게 나온 점도 계산 방식이 만든 착시가 아니라는 신호입니다. 양수 분기의 KOSPI 하단이 +10.8%이니, 전략이 번 분기 가운데 시장이 평범했던 분기는 없었습니다.

베타라면 적어도 시장만큼은 벌어야 합니다. 이 전략은 그마저 못 했습니다. KOSPI를 그대로 들고 있는 경우와 비교한 초과수익은 연 −37.39%p, 초과 샤프는 −0.84였습니다. 극단적 강세장을 지나는 동안 분봉으로 사고팔며 비용을 낸 결과가 단순 보유보다 나빴다는 뜻입니다. 전략이 시장에 무언가를 더한 흔적이 없었습니다.

낙폭도 같은 방향이었습니다. 전체 기간 최대 낙폭은 −47.68%로, 표본 밖 단독의 −12.8%는 위험을 크게 낮춰 보여 주고 있었습니다. 세 갈래 증거가 서로 다른 자료에서 나와 같은 결론으로 모였고, 기록은 이렇게 적었습니다.

판정 = bull-market beta (진짜 alpha 아님), 라이브 wiring No-Go.
통계 카드 세 장. 분기 상관 r +0.686, 전체 기간 95% 신뢰구간 −0.0994%에서 +0.3861%로 0 포함, KOSPI 대비 초과수익 연 −37.39%p
서로 다른 자료에서 같은 결론으로 모인 세 가지 증거

조치: 실거래 연결을 멈추고 재평가 조건을 적었다

조치는 코드를 고치는 일이 아니라 결정을 바꾸는 일이었습니다. hero 전략은 실거래 연결 후보에서 내렸고 전략화 작업은 보류했습니다. 다만 선택지는 하나가 아니었습니다. 기록에는 세 가지가 남아 있습니다.

결론이 나온 뒤 검토한 세 가지 길
선택지판단이유
레짐 게이트를 조건으로 바로 실거래 연결거부p=0.059로 유의 미달, 최대 낙폭 −47.7%, 초과수익 음수
보류하고 재평가 조건을 적어 둠채택게이트의 개선 방향은 확인했고 판단할 데이터가 모자람
전략 연구를 완전히 종결거부2022~2023년 데이터 공백이 남아 단정할 수 없음

완전 종결을 고르지 않은 이유가 이 표의 핵심입니다. 지금 데이터로 내릴 수 있는 결론은 이 구간에서 알파를 찾지 못했다는 데까지이고, 어떤 시장에서도 안 통한다는 결론은 시험한 적이 없습니다. 그래서 다시 판단할 조건을 문장으로 적었습니다. 2022년과 2023년 국면을 덮는 데이터로 추가 검증하거나, 완전한 약세·횡보 주기를 하나 이상 지나며 표본 밖 재확인을 하는 경우입니다.

보류에 조건을 붙인 데에도 이유가 있습니다. 조건 없이 보류만 남기면 다음에 이 기록을 여는 사람은 왜 멈췄는지 모른 채 좋았던 +0.515%만 보고 같은 검토를 처음부터 시작합니다. 조건을 문장으로 남겨 두면 어떤 데이터가 생겨야 다시 열지가 분명해집니다.

재측정 결과: 시장 필터를 켜도 5% 기준을 못 넘었다

강세장에서만 번다면 강세장에서만 매매하면 된다는 생각이 곧바로 따라옵니다. 그래서 KOSPI 20일 수익이 플러스인 때만 매매하는 레짐 게이트를 같은 엔진으로 다시 쟀습니다. 결과는 개선이었지만 충분하지 않았습니다.

조건 없는 전체 기간과 레짐 게이트 조건부의 전후 비교
지표조건 없음레짐 게이트 조건부
거래 수1,941건1,169건
거래당 평균 수익률+0.1338%+0.2714%
p값0.1370.059
95% 신뢰구간−0.0994% ~ +0.3861%−0.0439% ~ +0.6275%
샤프 지수기록에 없음+1.15

평균은 올랐지만 신뢰구간 하한은 여전히 0 아래입니다.

표. 평균의 신뢰구간. 표본 밖 단독 하한 +0.133%. 전체 기간 −0.0994%에서 +0.3861%. 레짐 게이트 조건부 −0.0439%에서 +0.6275%. 표본 밖 단독만 하한이 0 위에 있다
세 번 재서 하한이 0 위에 남은 경우는 표본 밖 단독뿐이었습니다

거래당 평균은 +0.1338%에서 +0.2714%로 올랐고 p값도 0.137에서 0.059로 내려왔습니다. 방향은 분명히 나아졌습니다. 그래도 p=0.059는 5% 기준을 넘지 못했고 신뢰구간도 0을 품고 있습니다. 기록은 이 상태를 게이트 조건부 실거래 후보로도 부족하다고 판정했습니다. 샤프 +1.15도 처음 본 +2.36에 미치지 못합니다.

한 가지 주의할 점이 있습니다. 이 게이트는 전략의 약점을 본 뒤에 붙인 조건입니다. 결과를 보고 만든 필터는 같은 데이터에서 좋아 보이기 쉽습니다. 그러니 p=0.059를 조금만 더하면 통과할 값으로 읽으면 안 됩니다.

5% 기준을 그대로 둔 이유도 적어 둡니다. 유의 기준은 결과를 보기 전에 정해 두어야 의미가 있습니다. p=0.059를 보고 이 정도면 됐다고 기준을 옮기면, 앞에서 좋은 구간만 골라 읽은 실수를 판정 단계에서 되풀이합니다. 이 전략은 최대 낙폭 −47.68%와 음수 초과수익이라는 문제도 함께 안고 있어서, 경계선에 걸린 p값 하나로 실거래를 결정할 근거가 없었습니다.

막대 그래프. 최대 낙폭. 표본 밖 단독 −12.8%, 전체 기간 −47.68%
같은 전략의 낙폭인데 재는 구간에 따라 크기가 이만큼 달랐습니다

이번 검증으로 전략의 수익은 한 푼도 늘지 않았습니다. 바뀐 숫자는 판단에 쓰는 숫자입니다. 실거래를 앞두고 머릿속에 있던 낙폭이 −12.8%에서 −47.68%로, 수익의 근거가 전략에서 시장으로 옮겨 갔습니다.

남는 한계: 2022년 약세장과 2023년 횡보장이 없다

이번 검증에도 빈틈이 있습니다. 가장 큰 한계는 데이터입니다. 분봉 자료가 2024년 4월 18일부터 2026년 6월 30일까지만 있어서 2022년 약세와 2023년 횡보를 덮지 못했습니다. 이 전략이 약세장에서 어떻게 움직이는지 결정적인 표본이 없는 셈입니다. 일봉으로 진입을 근사하는 대리 지표를 쓰는 길이 재평가 조건에 들어 있습니다.

  • 분기 상관은 9개 점으로 구했습니다. p값이 5% 안쪽이어도 점 하나의 무게가 큰 표본입니다.
  • 레짐 게이트의 개선도 2024~2026년 안에서 나왔습니다. 2022년 같은 약세장에서 게이트가 손실을 막는지는 재지 못했습니다.
  • 조건부 구간의 최대 낙폭과 조건 없는 구간의 샤프 지수는 기록에 없어 전후를 비교하지 못했습니다.
  • 같은 저장소에서는 이 검증 뒤에 백테스트 비용 상수의 세율을 0.18%에서 0.20%로 고쳤습니다(PR #785). 왕복 0.43% 가정이 여기에 영향을 받았는지는 기록에 없습니다.
  • 더 뒤에 hero 3층 정책 러너를 GO 후보 검증 완료로 남긴 커밋(PR #809)이 있지만, 수치가 이 글의 자료에 없어 다루지 않았습니다.

비용 가정의 무게도 남습니다. 왕복 0.43%는 처음 본 거래당 평균 +0.515%와 같은 자릿수입니다. 수익 크기가 비용과 나란한 전략에서는 세율 같은 상수 하나가 결론 쪽으로 미치는 힘이 작지 않습니다. 재평가를 열게 되면 비용 상수부터 다시 맞춰야 합니다.

백테스트 검증에서 무엇을 먼저 확인해야 하나?

이번 사례에서 단서는 처음부터 표에 있었습니다. 표본 안 전 조합이 음수였고 표본 밖만 좋았습니다. 그 칸 하나를 끝까지 따라간 결과가 실거래 보류입니다. 전략을 실거래에 올리기 전에 저희가 이제 확인하는 항목은 아래와 같습니다.

  • 표본 안과 표본 밖의 부호가 갈리면, 구간을 합쳐 신뢰구간을 다시 구한다
  • 전략 수익을 시장 수익과 같은 구간 단위로 나란히 놓고 상관과 부호 일치를 본다
  • 절대 수익이 아니라 시장을 그대로 들고 있을 때 대비 초과수익으로 판정한다
  • 최대 낙폭은 좋았던 구간이 아니라 가진 데이터 전체로 잰다
  • 검증 단계에서는 파라미터를 옮기지 않고, 필터를 붙였다면 새 가설로 따로 다룬다
  • 다루지 못한 시장 국면을 글로 적고, 다시 판단할 조건을 함께 남긴다

매매 전략만의 이야기도 아닙니다. 성수기에 집행한 광고의 매출 증가, 시장이 커지던 해의 영업 성과처럼 바깥 흐름과 함께 오른 숫자는 어디에나 있습니다. 좋은 결과가 나온 기간만 떼어 보면 잘한 일처럼 보이지만, 같은 기간 시장 전체가 얼마나 움직였는지 옆에 놓으면 다르게 읽힙니다. 비교 기준을 같은 표에 붙이는 습관이 같은 오해를 막아 줍니다.

숫자가 좋을수록 어느 구간의 숫자인지 먼저 물어야 합니다. 같은 저장소에서 실거래 성적이 좋던 전략을 더 긴 기간으로 다시 돌린 사례는 백테스트 과최적화 점검 기록에, 표본 하나로 시장 필터를 세웠다가 다시 본 사례는 약세장 표본 하나로 만든 필터 이야기에 정리했습니다. 사내 데이터로 이런 검증 절차를 만들고 싶다면 상담으로 문의해 주세요.

작성: SGK Studio 엔지니어링. 이 글의 수치는 전부 2026년 7월 2일 검증 기록과 같은 저장소의 커밋 기록에서 그대로 옮겼습니다.

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

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

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

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