워크포워드 최적화는 전략을 정직하게 튜닝하는 방법이라는 평판을 갖고 있고, 그럴 자격도 있다 — 전체 데이터로 최적화해놓고 그 결과에 감탄하는 것과 비교하면 말이다. 하지만 이 기법에는 조용한 실패 방식들이 있고, 하나같이 똑같은 산출물을 만들어낸다. "견고함"이라고 적힌 검증 리포트가 전혀 견고하지 않은 전략에 스테이플러로 박혀 있는 것이다. 우리가 엔지니어링으로 막아내야 했던 세 가지를, 각각이 남기는 잔해를 기준으로 정리했다.
실패 1: 구간이 새어나간다
잘못된 방식은 이렇다. 1~6월로 튜닝하고 7월로 검증한 다음, 7월에서 나온 무언가가 두 번째 시도에 영향을 미치도록 놔두는 것이다 — 아웃오브샘플 수치를 본 뒤의 재실행, 파라미터 그리드에 대한 "사소한 조정", 전체 시계열로 정규화한 피처. 하나하나는 무해해 보인다. 하지만 이것들이 합쳐지면 아웃오브샘플 구간은 시차를 둔 인샘플 데이터로 바뀐다.
남는 잔해는 이렇다. 아웃오브샘플 Sharpe가 인샘플 Sharpe를 신기하게 따라간다. 진짜 아웃오브샘플 결과는 노이즈가 많고 실망스럽다. 수상할 정도로 매끄러운 IS/OOS 관계는 정보가 거꾸로 흐르고 있다는 뜻이다. 우리는 이 비율을 명시적으로 감시한다. 인샘플이 아웃오브샘플의 3배를 넘으면 해당 실행에 플래그가 붙고, 아웃오브샘플이 0 이하면 인샘플이 아무리 예뻐도 그 자리에서 폐기한다.
실패 2: 구간을 넘나드는 지표 쇼핑
워크포워드 구간 세 개를 돌리면 노이즈 섞인 결과가 세 개 나온다. 이제 요약할 차례다. 평균 Sharpe? 중앙값? "레짐이 바뀌었으니" 최악의 구간은 빼도 될까? 이런 선택 하나하나가 자유도이고, 집요한 최적화기(사람이든 베이지안이든)는 이 전략이 가장 좋아 보이는 요약 방식을 기어이 찾아낸다. 구간당 Optuna 75회 시행은 노이즈에 피팅할 기회가 75번 있다는 뜻이고, 여기에 당신이 기꺼이 검토해볼 요약 방식의 개수만큼 곱해진다.
남는 잔해는 이렇다. 검증은 통과했는데 실거래에서는 최악 구간의 성과를 그대로 내놓는 전략. 그 최악의 구간이 유일하게 정직했던 구간이었기 때문이다. 우리의 규칙은 이렇다. 집계 방식은 실행 전에 config에 고정하고, 시행 횟수도 고정하며, 애널리스트는 구간별 결과를 산포도와 함께 읽는다. 통과하려면 우호적인 요약 방식이 필요한 전략은 통과하지 못한다.
실패 3: 더 이상 홀드아웃이 아닌 홀드아웃
홀드아웃은 딱 한 번만 작동한다. 어떤 전략을 홀드아웃으로 두 번째 평가하는 순간 — 파라미터를 살짝 건드린 뒤, 시그널을 손본 뒤, "그냥 한번 확인해보자" 뒤 — 그건 더 이상 홀드아웃이 아니라 느리게 돌아가는 검증 세트다. 손대지 않은 15일을 지키는 게 별일 아닌 것처럼 들리다가, 반복 개선 압박이 밀려오면 재확인이 무해하게 느껴지기 시작한다.
잔해는 미묘하다. 같은 전략을 반복 개선할수록 홀드아웃 결과가 좋아진다. 신선한 아웃오브샘플 데이터가 1차 시도보다 3차 시도에 더 후한 점수를 줄 이유는 없다. 그런 일이 벌어졌다면 홀드아웃은 이미 채굴당한 것이다. 우리는 원샷 원칙을 기계적으로 강제한다. 홀드아웃은 파이프라인 실행당 한 번만 평가되고, 결과는 기록에 남으며, 한 번 더 시도해야 하는 전략은 새 구간까지 포함해 전체 관문을 처음부터 다시 통과해야 한다. 워크포워드 아웃오브샘플 Sharpe의 최소 70%는 유지해야 하고, 그 주사위를 두 번 굴릴 기회는 없다.
세 가지 모두를 살아남는 징후
이 모든 것에 앞서, 우리는 단순한 민감도 스윕을 돌린다. 각 파라미터를 ±20% 움직여보고 지표를 지켜보는 것이다. 진짜 엣지는 완만하게 나빠지고, 우연은 절벽에서 떨어진다. 파이프라인에서 가장 값싼 테스트이면서, 위의 모든 관문을 유유히 통과했을 전략에 거부권을 행사한다 — 파라미터 절벽이야말로 과최적화가 검증 장치 속으로 숨어들 기회를 얻기 전의 맨얼굴이기 때문이다.
이 중 어느 것도 최적화를 안전하게 만들어주지는 않는다. 다만 실패 방식이 시끄럽게 드러나도록 만들 뿐이다 — 그리고 그것이 검증 프로세스에 정직하게 기대할 수 있는 최대치다.
← 전체 글