백테스트 리얼리티 체크

가이드

과거 데이터에만 잘 맞는 규칙 — 새 데이터에서 무너지는 이유

숫자를 조금씩 고쳐 맞추다 보면 빠지는 네 가지 함정과, 그것을 알아채는 방법을 정리했습니다.

작성
백테스트 리얼리티 체크
게시일
2026-08-22
검토일
2026-09-29

먼저 결론

  • 백테스트(과거 데이터로 전략을 미리 돌려보는 것) 성적이 좋다고 전략이 좋은 것은 아닐 수 있습니다.
  • 결과가 좋아 보이도록 가정을 고른 탓일 수 있고, 이것을 과적합(과거 데이터에만 딱 맞게 규칙을 다듬어서, 새 데이터에서는 안 맞는 것)이라고 부릅니다.
  • 과적합은 시험 문제집의 답만 외운 것과 비슷해서, 새 시험지를 받으면 무너질 수 있습니다.

요약

  • 백테스트에서 좋은 결과가 나왔다고 해봅시다.
  • 전략이 좋아서가 아니라, 그 결과에 맞춰 가정을 골랐기 때문인 경우가 많습니다.
  • 이 글은 대표적인 네 가지 과적합 경로를 점검합니다.
  • 파라미터 튜닝, 시장 선택, 기간 선택, 자산 선택입니다.
  • 과적합의 신호는 결과가 예쁘게 나오는 것이 아닙니다.
  • 가정을 조금 바꿨을 때 결과가 크게 흔들리는지를 봅니다.

1. 네 가지 과적합 경로

(1) 파라미터 과적합

파라미터는 전략에서 내가 직접 정하는 숫자입니다. 예를 들어 "몇 개월치를 볼지" 같은 값입니다.

"12개월 모멘텀(최근에 많이 오른 쪽을 고르는 방식) + 1개월 무위험(원금 손실 위험이 거의 없는 자산)"을 돌려봅니다. 결과가 흡족하지 않으면 6개월, 9개월, 3개월로 바꿔 봅니다. 그리고 그중 가장 좋은 것을 고릅니다.

여기서 문제가 생깁니다. 표본 하나에 파라미터를 k개 시도했다고 해봅시다. 그러면 최고 성적은 운이 좋을 기회를 k번 얻은 것과 같습니다.

최적 파라미터 주변의 성적이 고르지 않고 뾰족하면 과적합 신호입니다.

(2) 시장 선택 과적합

"미국 주식에 적용하니 별로던데, 한국은?"이라고 생각합니다. 한국이 좋으면 한국을, 아니면 일본을 봅니다.

이렇게 전 세계 시장을 몇 개 돌리다 보면 하나는 좋게 나옵니다. 이것은 전략이 뛰어나서가 아닙니다. 시도를 여러 번 한 결과일 수 있습니다.

(3) 기간 선택 과적합

2000년대 데이터로 시작했다고 해봅시다. 그런데 "2008년을 포함하면 못 쓰겠다"며 시작점을 2009년으로 옮깁니다.

기간의 경계를 결과를 보고 정하는 순간, 그 결과는 이미 무효입니다.

(4) 자산 선택 과적합

글로벌 자산배분에서 쓸 자산 후보를 20개 놓았다고 해봅시다. 그중 성적이 좋았던 조합을 나중에 골라냅니다.

그 조합은 그 표본 안에서만 최적일 뿐입니다. 미래에 대한 우위는 없습니다.

2. 과적합 탐지 체크리스트

  • 파라미터를 ±20% 바꿨을 때 결과가 급격히 바뀌는가 (예: 12개월 모멘텀은 +8%인데 10개월은 -2%)
  • 전략 개발에 쓴 데이터 기간과 검증에 쓴 기간이 서로 분리되어 있는가
  • 시장·자산 후보를 결과를 보고 줄였는가
  • 시도한 파라미터·자산·기간 조합의 총 개수를 문서로 남겼는가
  • 무작위 데이터(순서를 섞은 수익률)에 같은 절차를 적용해도 비슷한 성적이 나오는가

마지막 항목이 핵심입니다. 순서를 섞은 데이터는 원래 아무 규칙도 없는 데이터입니다. 그런 데이터에서도 그 절차가 좋은 전략을 찾아낸다면, 절차 자체가 과적합 기계입니다.

3. 방어법: 겹쳐 보기

이 사이트의 접근은 단순합니다.

  1. 같은 전략을 여러 표본 길이로 겹쳐 그립니다.
  2. 비용 가정을 바꿔 곡선이 얼마나 움직이는지 봅니다.
  3. 승자를 고르지 않습니다. 어떤 가정에서 결과가 유지되고 어떤 가정에서 무너지는지 기록할 뿐입니다.

4. 후보를 늘리면 1등이 올라가는 합성 예시

아래 표는 시장의 성적이 아닙니다. 실력이 없는 후보를 많이 만들수록 가장 좋아 보이는 값이 왜 올라가는지 세는 합성 예시입니다. 특정 파라미터를 쓰라는 뜻이 아닙니다.

공정한 동전을 열두 번 던져 앞면의 수를 한 후보의 점수라고 하겠습니다. 앞면이 많다고 그 동전이 뛰어난 것은 아닙니다. 후보를 하나만 던지면 앞면 8번 이상은 드뭅니다. 후보를 스무 개 던지고 가장 많은 앞면만 발표하면, 8번 이상이 뽑힐 기회는 스무 배가 아니라 "스무 번 중 한 번이라도"의 확률로 커집니다. 독자에게 보여 주는 문장이 "이 동전은 열두 번 중 열 번이 앞면이었다"이면, 스무 개를 던졌다는 사실은 문장 밖에 남습니다. 과적합의 발표 형식은 대개 이렇습니다. 1등만 있고 시도 횟수가 없습니다.

파라미터 과적합은 동전을 파라미터 값으로 바꾼 것입니다. 3개월, 6개월, 9개월, 12개월을 같은 표본에 넣고 가장 예쁜 곡선을 고르면, 그 곡선은 네 번의 기회 중 1등입니다. 주변 값이 비슷하게 좋으면 봉우리가 넓고, 그 값만 좋고 양옆이 무너지면 봉우리가 뾰족합니다. 뾰족한 봉우리는 표본의 잡음에 맞춘 자국일 가능성이 큽니다. 넓은 봉우리도 안전 보증은 아닙니다. 다만 뾰족한 쪽을 먼저 의심하는 이유는, 값을 조금만 바꿔도 규칙이 사라진다는 뜻이 그 자리에 있기 때문입니다.

시장 선택과 기간 선택은 같은 동전을 다른 주머니에서 꺼내는 일입니다. 시장을 다섯 곳 돌리고 한 곳만 보여 주면 시도는 다섯 번입니다. 시작 연도를 네 번 옮겨 가장 나은 창만 보여 주면 시도는 네 번입니다. 자산 후보 스무 개 중 조합을 나중에 고르면 시도는 조합의 수입니다. 네 경로가 따로 놀지 않고 한 프로젝트 안에서 겹치면 시도 횟수는 곱에 가깝게 늘어납니다. 네 값 곱하기 다섯 시장 곱하기 네 창이면 여든 번입니다. 여든 번의 1등을 "한 번의 검증"이라고 부르면 동전의 발표 형식과 같습니다.

방어는 거창한 통계 이름이 아니라 일지입니다. 시도한 값, 버린 시장, 옮긴 시작 연도, 빼 둔 자산을 결과와 같은 날에 적습니다. 적은 뒤에 1등을 골라도, 그 1등이 몇 번 만에 나왔는지는 남습니다. 적기 전에 1등만 남기면 복원할 수 없습니다. 이 사이트가 승자를 고르지 않고 가정이 바뀔 때 곡선이 얼마나 움직이는지만 적는 이유는, 1등의 발표 형식을 피하기 위해서입니다.

무작위 순서로 섞은 수익률에 같은 절차를 다시 돌리는 검사는 이 일지를 시험합니다. 순서를 섞으면 과거의 관계가 끊깁니다. 그런데도 절차가 예쁜 1등을 계속 찾아내면, 절차가 관계 없는 데이터에서도 관계를 만들어 낸 것입니다. 그때 원본 데이터의 예쁜 곡선은 절차의 산출물이지 시장의 패턴이 아닙니다. 이 검사는 프로그래밍이 필요할 수 있습니다. 검사가 어렵다면 최소한 일지의 시도 횟수라도 곡선 옆에 둡니다. 횟수가 없는 곡선보다 횟수가 있는 곡선이 덜 속습니다.

스스로 적용하는 순서는 짧습니다. 지금 보고 있는 곡선을 만들기까지 버린 후보가 몇 개인지 적습니다. 0개라고 적기 전에, 시작 연도와 자산을 한 번이라도 바꿨는지 다시 봅니다. 바꿨다면 0이 아닙니다. 그다음 남은 값의 양옆을 20%만 바꿔 곡선이 무너지는지 봅니다. 무너지면 그 값은 봉우리가 뾰족한 쪽입니다. 무너지지 않아도 시도 횟수가 많으면 1등의 해석을 낮춥니다. 새 데이터, 즉 규칙을 고칠 때 보지 않은 구간에 올리기 전에는 실전 성능이라는 말을 붙이지 않습니다.

walk-forward는 미래 구간을 학습에서 빼서 이 문제를 줄입니다. 빼더라도 학습 창 안에서 후보를 여든 번 돌렸다면, 검증 구간에 올라온 값은 여전히 그 여든 번의 1등입니다. 시간 순서를 지킨 것과 시도 횟수를 지운 것은 다른 문제입니다. 둘을 한 문장으로 합치면 과적합이 절차의 이름 뒤에 남습니다.

신뢰성 점검의 질문 가운데 "검증을 분리했는가"와 "민감도가 있는가"가 이 글의 일지와 만납니다. 분리는 새 데이터 칸이고, 민감도는 양옆을 흔든 칸입니다. 표를 채울 때 일지가 없으면 기억으로 채우게 됩니다. 기억은 버린 후보를 먼저 잊습니다. 잊힌 후보의 수만큼 1등은 더 특별해 보입니다.

함께 읽기