백테스트가 거짓말을 하는 순간 — 미래 정보 누수와 순환논리

작성자

카테고리:

결론부터 말씀드리면, 백테스트 성적이 비현실적으로 좋다면 기뻐하기 전에 ‘미래 정보 누수’부터 의심해야 합니다. 백테스트가 그 시점엔 알 수 없었던 미래를 몰래 훔쳐보면, 어떤 엉터리 전략도 화려한 수익 곡선을 그려냅니다.

저는 두 번째 봇을 만들며 신호 하나를 검증하다 이상한 지점에 걸렸습니다. AI가 “이 상태의 종목은 앞으로 저조하다”는 신호를 제안했는데, 가만 보니 원인과 결과가 뒤바뀐 것 같았습니다. “기관이 들어와 고점까지 갔으니 그 뒤에 빠진다”는 논리였는데, 그렇다면 고점을 대체 어떻게 미리 안다는 말인가 하는 의문이었습니다. 이 의문을 파고든 과정이 오늘 이야기의 핵심입니다.

미래 정보 누수란 무엇인가

미래 정보 누수(lookahead bias)는 백테스트가 ‘그 순간에는 알 수 없었던 정보’를 계산에 몰래 끌어다 쓰는 오류입니다. 몇 가지 흔한 형태가 있습니다. 장이 끝나야 확정되는 종가를, 장중 판단에 미리 쓰는 경우가 대표적입니다. 나중에 정정되는 데이터, 예를 들어 며칠 뒤 수정 공시되는 재무 수치를 그 이전 시점의 판단에 쓰는 것도 누수입니다.

이런 누수가 무서운 이유는, 백테스트에서는 성적을 극적으로 좋게 만들면서 실전에서는 전혀 재현되지 않기 때문입니다. 백테스트의 봇은 미래를 봤지만, 실전의 봇은 못 보니까요. 그래서 ‘너무 좋은’ 백테스트 결과일수록, 실력의 증거가 아니라 누수의 신호일 가능성이 높습니다.

시점을 그림으로 못박아라

누수를 잡는 가장 확실한 방법은, 각 정보가 ‘결정 시점에 이미 알려진 것’인지를 시점 축에 놓고 확인하는 것입니다. 제 경우를 시간 순서로 그리면 이렇게 됩니다.

과거에 일어난 매수 흐름이 있고(결정 시점엔 이미 지나간 정보), 오늘 관측되는 현재 상태가 있으며(지금 볼 수 있는 정보), 우리가 예측하려는 것은 앞으로 며칠간의 수익(아직 모르는 미래)입니다. 순서로 보면 ‘과거 정보 + 현재 관측’으로 ‘미래’를 예측하는 구조입니다. 미래 정보를 쓰지 않았으니 이 구조 자체는 정당합니다.

여기서 핵심 장치가 하나 있습니다. 과거 정보를 쓸 때 반드시 시차(lag)를 강제로 두는 것입니다. 예를 들어 어떤 데이터가 실제로는 며칠 뒤에야 확정된다면, 그 며칠을 건너뛴 뒤에야 판단에 넣도록 코드가 강제해야 합니다. 이 시차 강제가 없으면, 나도 모르게 미래를 당겨 쓰게 됩니다.

순환논리의 함정 — 원인과 결과가 뒤바뀔 때

제가 걸렸던 진짜 의문은 조금 다른 결이었습니다. “기관이 들어와 고점을 찍었으니 이후 하락한다”는 설명은, 결과(하락)를 보고 원인(고점)을 끼워 맞추는 순환논리처럼 들렸습니다. 고점이 어디인지는 지나고 나서야 알 수 있는데, 그걸 미리 안다고 전제하면 그건 예측이 아니라 사후판단이니까요.

이 의문을 풀어준 것은 관점의 교정이었습니다. 우리는 ‘바로 그 고점’을 찍어내려는 게 아닙니다. 개별 종목의 정확한 천장은 아무도 모릅니다. 다만 ‘어떤 관측 가능한 상태에 있는 종목들이 평균적으로 이후 저조하더라’는 통계를 이용할 뿐입니다. 정확한 꼭대기를 맞히는 게 아니라, 기대수익이 낮은 상태를 피하는 것. 이건 사후판단이 아니라 엄연한 예측입니다.

이 구분이 중요한 이유는, 둘을 헷갈리면 백테스트를 자기 자신에게 속이는 방향으로 설계하게 되기 때문입니다. “결과가 나쁜 종목을 골라서, 그 종목들이 나빴다”는 식의 순환은 화려한 숫자를 주지만 미래엔 아무 쓸모가 없습니다. 반면 “관측된 상태로 미래를 예측한다”는 구조는 초라해 보여도 실전에서 살아남습니다.

코딩을 몰라도 누수를 잡는 법

다행히 이런 점검은 코딩 지식 없이도 AI에게 시켜서 할 수 있습니다. 제가 실제로 쓰는 방식은 이렇습니다.

  • 시점 감사 요청: “이 로직이 그 판단 시점에 아직 알 수 없는 미래 정보를 쓰고 있지는 않은지 점검해줘”라고 명시적으로 시킵니다.
  • 시차 강제 확인: 나중에 확정·정정되는 데이터에는 며칠의 지연을 강제로 뒀는지 확인합니다.
  • 피처와 라벨 분리: 예측에 쓰는 재료(현재·과거)와 맞히려는 정답(미래 수익)이 절대 섞이지 않았는지 봅니다. 이 둘이 섞이면 그 순간 백테스트는 거짓말을 시작합니다.
  • 대조군으로 확인: 신호가 정말 정보를 더하는지, 아니면 아무 종목이나 골라도 나오는 착시인지를 비교 실험으로 갈라봅니다.

정리하면, 백테스트가 너무 좋을 때 가장 먼저 할 일은 자축이 아니라 자문입니다. “혹시 내 봇이 미래를 훔쳐본 건 아닐까?” 화려한 수익 곡선의 절반은 대개 이 누수에서 나옵니다. 실전과 백테스트의 간극을 줄이는 첫걸음은, 그 시점에 알 수 없는 정보를 단 한 조각도 쓰지 않았는지 스스로에게 정직하게 묻는 것입니다. 이 질문을 습관으로 만든 사람만이, 백테스트를 신뢰할 자격을 얻습니다.

덧붙이면, 이 점검을 귀찮아하는 마음이 가장 위험합니다. 좋은 백테스트 결과를 손에 쥐면 누구나 빨리 실전으로 넘어가고 싶어지고, 그때 “혹시 누수 아닐까”라는 질문은 초를 치는 것처럼 느껴집니다. 하지만 그 질문을 건너뛴 대가는 반드시 실계좌에서 청구됩니다. 코딩을 모르는 초보일수록, 화려한 숫자 앞에서 한 번 더 의심하는 이 습관이 유일하고도 가장 강력한 방어선입니다.

코멘트

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다