요약
- 연도별 재현: 2019년 데이터로 2020년 검증, 2020년 데이터로 2021년 검증… 이렇게 해마다 따로 돌리는 방식. 간단하지만 시간 순서를 어긴다.
- 진짜 walk-forward: 2019년까지 학습 → 2020년 검증, 2019~2020년 학습 → 2021년 검증… 학습 데이터가 누적되며 미래 데이터가 절대 학습에 섞이지 않는다.
- 연도별 재현으로 "좋은 결과"가 나와도 walk-forward에서 무너지면 과적합 신호다.
1. 무엇이 다른가
| 구분 | 연도별 재현 (Annual Replay) | Walk-Forward (진짜) |
|---|---|---|
| 학습 데이터 | 해당 연도 직전 1년만 | 시작부터 현재까지 누적 |
| 시간 순서 | 어김 (미래 데이터가 과거 검증에 쓰일 수 있음) | 지킴 (미래가 과거에 절대 안 섞임) |
| 파라미터 고정 | 연도마다 따로 최적화 → 파라미터가 매번 바뀜 | 누적 학습으로 파라미터가 안정적으로 수렴 |
| 과적합 위험 | 높음 — 매년 파라미터를 다시 맞추므로 | 낮음 — 단일 파라미터 경로로 검증 |
2. 왜 연도별 재현이 위험한가
예: 12개월 모멘텀 전략
- 2019년 데이터로 최적 파라미터를 10개월로 찾음
- 2020년 데이터로 최적 파라미터를 6개월로 찾음
- 2021년 데이터로 최적 파라미터를 12개월로 찾음
각 해마다 "가장 좋았던" 파라미터를 골랐으므로, 전략이 좋아서가 아니라 연도마다 파라미터를 바꿔 맞췄기 때문에 결과가 좋은 것처럼 보인다. 이걸 실전에 쓰면 매년 파라미터를 다시 정해야 하는데, 그건 전략이 아니라 매년 새로운 전략을 만드는 것이다.
3. Walk-Forward가 답인 이유
진짜 walk-forward는 파라미터를 한 번만 결정하거나, 누적 데이터로 천천히 업데이트한다.
[2019] 학습 → [2020] 검증
[2019-2020] 학습 → [2021] 검증
[2019-2021] 학습 → [2022] 검증
...
이렇게 하면:
- 파라미터가 매년 춤추지 않는다
- 미래 데이터가 과거 검증에 절대 섞이지 않는다
- 실전과 같은 조건(점점 늘어나는 데이터)에서 검증한다
4. 이 사이트의 접근
이 사이트의 전략 상태보드는 **겹침 구간(overlap)**을 기준으로 한다. 백테스트와 실전이 같은 기간에 있을 때만 비교하고, 그 구간의 시작을 100으로 맞춰 겹쳐 그린다.
이게 walk-forward와 정확히 일치하진 않지만, 시간 순서를 지키고 미래 데이터를 쓰지 않는다는 원칙은 같다.
5. 직접 확인해보기
자신만의 백테스트가 있다면 다음을 해보세요:
- 전체 기간으로 한 번 최적화 → 전체 기간 검증 (이건 과적합)
- 연도별 재현 → 각 연도 다른 파라미터 (위험)
- Walk-forward → 누적 학습 + 순차 검증 (원칙)
3번 결과가 1, 2번과 크게 다르다면 과적합이 심하다는 뜻입니다.
6. 세 절차를 같은 질문에 얹는 합성 예시
아래는 어떤 규칙의 성적표가 아닙니다. 검증 절차가 파라미터를 어떻게 고르는지만 떼어 본 합성 예시입니다. 숫자 자체에 시장을 읽을 정보는 없습니다.
질문은 하나로 고정합니다. "과거 몇 개월의 수익률을 볼 때 다음 구간의 순위가 가장 안정적이었나." 후보 파라미터는 3개월, 6개월, 9개월, 12개월 네 개뿐입니다. 데이터는 2016년부터 2023년까지 여덟 해라고 가정합니다. 이 연도는 설명을 위한 칸이고, 이 사이트의 공개 기록과 무관합니다.
연도별 재현은 각 해를 검증하기 직전에 직전 한 해만 보고 네 개 중 승자를 고릅니다. 2017년 검증에는 2016년의 승자, 2018년 검증에는 2017년의 승자를 씁니다. 겉으로는 미래를 안 본 것 같습니다. 문제는 승자가 해마다 바뀌어도 그 사실을 성적에 남기지 않는다는 점입니다. 예를 들어 고른 값이 12, 6, 3, 9, 12, 6, 9, 3개월로 춤을 춰도, 발표되는 표는 "각 해의 검증 수익을 이어 붙인 곡선" 하나입니다. 독자는 하나의 규칙이 여덟 해 동안 살아남은 것처럼 읽습니다. 실제로는 여덟 개의 짧은 규칙이 릴레이를 한 것입니다.
여기서 시간 순서가 깨지는 지점은 따로 있습니다. 2019년 검증에 쓴 파라미터가 2021년 데이터를 보고 다시 좋아 보여서, 발표용 표를 만들 때 2019년 칸을 그 나중 값으로 갈아끼우는 경우입니다. 연도별 재현이라는 이름만 있고 절차는 "전 구간에서 가장 예쁜 해를 다시 고른 것"이 됩니다. 이름과 절차가 다를 때 과적합은 표의 문장으로는 드러나지 않고, 파라미터 열을 숨기는 방식으로 남습니다.
진짜 walk-forward는 고르는 창을 누적합니다. 2016년만 보고 하나를 고른 뒤 2017년을 검증합니다. 다음에는 2016~2017년을 보고 하나를 고른 뒤 2018년을 검증합니다. 이미 검증에 쓴 해를 학습 창에 넣는 것은 허용됩니다. 아직 오지 않은 해를 학습 창에 넣는 것은 허용되지 않습니다. 파라미터가 바뀌면 바뀐 시점과 바뀐 값을 표에 남깁니다. 바뀌지 않고 12개월에 머물렀다면, 그 안정 자체가 결과입니다. 자주 바뀌었다면, 누적 창으로도 승자가 고정되지 않았다는 결과입니다. 어느 쪽이든 하나의 규칙이 처음부터 정해져 있었던 것처럼 합쳐 그리지 않습니다.
두 절차를 나란히 두면 읽을 칸이 세 개입니다.
- 검증 구간에 들어간 파라미터는 그 구간이 시작되기 전에 고정됐는가.
- 고정된 값이 해마다 바뀌었다면, 바뀐 목록이 성적표 옆에 있는가.
- 목록을 숨긴 채 이은 곡선만 있으면, 그 곡선은 한 규칙의 성적이 아니라 사후 선택된 규칙들의 합이다.
이 사이트의 상태보드가 하는 일은 파라미터 최적화 대회가 아닙니다. 이미 적힌 규칙의 백테스트와 그 뒤의 기록을, 겹치는 기간의 시작을 100으로 맞춰 겹칩니다. 미래 구간을 보고 규칙을 다시 고르지 않는다는 점에서 walk-forward와 원칙은 같습니다. 다만 상태보드는 "다음에 쓸 파라미터를 학습하는 장치"가 아닙니다. 이미 공개된 규칙이 비용과 실행 때문에 어디서 갈라졌는지를 남길 뿐입니다. 최적 파라미터를 찾아 준다고 읽으면 이 사이트의 범위를 넘어섭니다.
스스로 적용할 때는 곡선보다 먼저 파라미터 일지를 만듭니다. 칸은 검증 시작일, 그날 이전에 확정한 값, 그 값을 고를 때 쓴 마지막 날짜, 세 개면 됩니다. 일지의 확정일이 검증 시작일보다 나중이면 그 해의 성적은 폐기합니다. 확정값이 해마다 달라지는데 독자에게는 하나의 이름만 보여 주면, 연도별 재현을 walk-forward라고 부른 경우입니다.
짧은 표본에서는 이 절차도 과적합을 막지 못합니다. 누적 창이 두세 해뿐이면 네 개의 후보 중 승자는 여전히 운으로 정해질 수 있습니다. walk-forward는 미래 정보를 섞지 않게 하는 장치이지, 후보가 많을 때 우연의 1등을 지워 주는 장치는 아닙니다. 후보의 개수를 일지에 함께 적어야 그 한계가 보입니다.
다음으로 볼 글은 시점 일치입니다. 파라미터를 제때 고정해도, 그 파라미터에 넣은 재무 수치가 당시에는 공시되지 않은 값이면 같은 종류의 새기입니다. 순서의 문제와 데이터의 문제는 둘 다 막아야 곡선이 "그때 할 수 있었던 일"에 가까워집니다.