OptiNod 아카데미
과최적화 — 최고점 주변이 평평한 설정만 실전에서 버팁니다
백테스트 최고 수익률을 낸 파라미터는 과거 노이즈에 맞춰진 곡선인 경우가 많습니다. 옆 설정값까지 같이 좋은 고원형 성과 곡선만 실전에서 버팁니다.
> 백테스트 최고점 옆의 *설정값들까지 같이 좋은* 고원형 곡선만 실전에서 무너지지 않습니다.
과최적화(Overfitting)는 전략의 규칙과 파라미터를 과거 데이터의 우연한 변동에 맞춰 깎아낸 상태를 말합니다. 같은 데이터로 조합을 충분히 많이 돌리면 어떤 전략이든 화려한 백테스트 곡선을 만들 수 있습니다. 그 곡선이 과거의 진짜 패턴을 포착한 것인지, 우연히 그 시기에만 들어맞은 노이즈를 외운 것인지를 백테스트 수익률만으로는 구분할 수 없다는 것이 과최적화의 핵심입니다.
대부분의 트레이더는 최적화를 이렇게 씁니다. 파라미터 범위를 넓게 잡고, 백테스트를 수백 번 돌린 다음, 수익률이 가장 높은 조합 하나를 골라 실전에 올립니다. RSI 기간 14가 좋은지 13이 좋은지, 손절을 2%로 둘지 2.3%로 둘지를 백테스트 수익률 소수점까지 비교해 최고점을 찾아냅니다. 이 과정에서 고른 최적값은 과거 구간에서 가장 높은 수익을 낸 설정이 맞습니다. 문제는 그 최고점이 실전에서 가장 먼저 무너지는 자리인 경우가 많다는 데 있습니다.
이 글이 말하려는 것은 단순합니다. 최적화에서 핵심은 최고점 주변이 어떤 모양인지입니다. RSI 기간을 14에서 13이나 15로 한 칸 옮겼을 때 성과가 절벽처럼 떨어진다면, 14라는 값은 과거의 특정 변동에 정확히 맞춰진 우연입니다. 반대로 12부터 18까지 비슷하게 좋은 성과가 이어진다면, 그 구간은 시장의 진짜 구조를 포착한 견고한 영역입니다. 같은 백테스트 수익률을 봐도, 옆을 같이 보았는지가 실전 성과를 갈라놓습니다.

최고점은 절벽 끝에 서 있을 때 위험합니다
같은 백테스트 수익률 200%를 낸 두 파라미터가 있다고 가정합니다. 하나는 양옆 값에서 수익률이 50%로 떨어지는 뾰족한 정점이고, 다른 하나는 양옆에서도 180%를 유지하는 완만한 고원의 한가운데입니다. 표준적인 최적화는 둘을 같은 값으로 취급합니다. 같은 200%이기 때문입니다. 그런데 실전에서 두 설정의 결과는 정반대로 갈립니다.
이유는 미래 데이터가 과거 데이터와 미세하게 다르기 때문입니다. 백테스트에서 RSI 기간 14가 정점이었더라도, 실전의 가격은 백테스트 구간과 똑같이 움직이지 않습니다. 변동성이 조금 커지거나 추세 속도가 달라지면, 과거의 최적값이 미래에는 옆으로 한 칸 밀린 자리가 됩니다. 절벽형 정점에 올라타 있었다면 한 칸 밀리는 순간 수익률 200%가 50%로 추락합니다. 고원의 한가운데 있었다면 한 칸 밀려도 여전히 고원 안이라 성과가 유지됩니다.
예시로 든 수치이지만, 절벽형과 고원형의 차이는 실전에서 이렇게 나타납니다. 2021년 한 해 동안 BTC는 약 29,000달러에서 시작해 11월 10일 약 69,000달러까지 올랐습니다. 강한 상승 추세에서 잘 맞도록 손절 폭을 좁게 깎고 추세 추종 파라미터를 최고점에 딱 맞게 조이면 그 구간 백테스트는 화려해집니다. 그러나 2022년 들어 시장은 6월 Luna·3AC 연쇄 청산으로 17,000달러대까지 무너졌고, 11월 FTX 붕괴로 약 15,500달러 저점을 만들었습니다. 추세의 방향과 변동성이 통째로 뒤집힌 이 국면에서, 2021년 정점에 맞춘 절벽형 설정은 첫 몇 주 만에 누적 손실을 키웁니다. 정점은 그 시장 상태에서만 정점이었기 때문입니다.
최고점의 높이만 보고 설정을 고르면 안 됩니다. 그 주변이 얼마나 평평한지를 함께 확인해야 합니다.
자유도가 늘수록 노이즈를 외웁니다
전략에 파라미터와 규칙을 하나씩 더할 때마다 자유도(Degrees of Freedom)가 늘어납니다. 자유도는 전략을 과거 데이터에 맞춰 끼울 수 있는 손잡이의 개수입니다. 손잡이가 많을수록 과거의 어떤 곡선에든 정확히 들어맞게 조일 수 있고, 그만큼 진짜 패턴과 우연한 노이즈를 구분하지 못한 채 둘 다 외워 버립니다.
원리는 통계의 기본과 같습니다. 점 두 개는 직선 하나로 정확히 잇고, 점 세 개는 2차 곡선으로 정확히 잇습니다. 파라미터를 충분히 늘리면 과거의 모든 거래를 통과하는 곡선을 그릴 수 있지만, 그 곡선은 미래에 새로 찍히는 점은 전혀 맞히지 못합니다. 전략에서 손절·익절·진입 필터·시간대 조건을 하나씩 더하는 행위가 곡선을 더 복잡하게 휘게 만드는 일과 같습니다. 규칙이 늘수록 과거 구간(인샘플) 성과는 대체로 좋아지지만, 그중 어느 부분이 진짜 패턴이고 어느 부분이 외운 노이즈인지는 인샘플 안에서 확인할 방법이 없습니다.
규칙 다섯 개짜리 전략과 열다섯 개짜리 전략이 같은 과거 구간에서 같은 수익률을 냈다면, 다섯 개짜리를 택해야 합니다. 같은 성과를 더 적은 자유도로 만들었다는 것은 그만큼 우연에 덜 의존했다는 뜻이기 때문입니다. 규칙 열다섯 개로 만든 성과는 그중 절반 이상이 과거 노이즈에 끼워 맞춘 군더더기일 가능성이 큽니다. 단순한 전략이 실전에서 더 오래 가는 이유가 여기에 있습니다.
추가하는 규칙 하나마다 인샘플 수익률이 얼마나 오르는지는 보지 않습니다. 그 규칙이 없으면 안 되는 이유를 먼저 묻습니다.

표본이 적으면 손잡이 몇 개만 만져도 과최적입니다
자유도의 절대 개수만으로는 과최적 여부를 판단할 수 없습니다. 거래 표본 수 대비 파라미터 수의 비율을 함께 봐야 합니다. 같은 다섯 개 파라미터라도 거래가 1,000번 일어난 전략에서는 견딜 만하지만, 거래가 30번뿐인 전략에서는 다섯 개만 만져도 곧장 과최적으로 빠집니다. 표본이 작을수록 우연한 변동이 전체 성과에서 차지하는 비중이 커지고, 그 우연을 진짜 신호로 착각하기 쉽기 때문입니다.
거래 수가 적은 전략은 통계적으로 신뢰하기 어렵습니다. 동전을 열 번 던져 일곱 번 앞면이 나왔다고 그 동전이 앞면에 치우쳤다고 단정할 수 없는 것과 같습니다. 거래 30번에서 승률 60%가 나왔다면, 그 60%의 신뢰 구간은 대략 40%대 초반에서 70%대 후반까지 넓게 벌어집니다. 이렇게 넓은 구간 안에서는 파라미터를 조금만 바꿔도 승률이 크게 출렁이고, 그 출렁임을 따라 최적값을 고르면 다음 30번의 거래에서는 전혀 재현되지 않습니다.
BTC 일봉으로 한 해를 백테스트하면 봉은 약 365개밖에 안 됩니다. 평균 보유 기간이 2주인 스윙 전략이라면 한 해에 거래는 스무 번 안팎입니다. 이 표본으로 파라미터 다섯 개를 동시에 최적화하면, 사실상 거래 네 번마다 손잡이 하나를 끼워 맞추는 셈이라 과거에 정확히 들어맞는 설정이 우연히 나오는 것이 당연합니다. 표본을 늘리려면 더 긴 과거 구간을 쓰거나, 같은 전략을 여러 자산에 동시에 적용해 거래 수를 합산해야 합니다. 거래 표본이 파라미터 수의 수십 배에 못 미치면 최적화 결과 자체를 믿지 않습니다.
최적화를 돌리기 전에 거래가 몇 번 일어났는지부터 셉니다.
인샘플이 화려할수록 더 의심합니다
직관과 반대로, 백테스트 곡선이 매끄럽고 낙폭 한 번 없이 우상향할수록 그 전략은 더 의심해야 합니다. 실제 시장에는 항상 견디기 힘든 낙폭 구간이 있습니다. 백테스트가 그 낙폭마저 매끄럽게 넘겼다면, 전략이 과거의 모든 하락 구간을 피하도록 규칙이 맞춰졌다는 신호입니다. 미래의 하락은 과거와 다른 모양으로 오기 때문에, 과거 하락을 모두 피한 설정은 미래의 첫 하락에 그대로 노출됩니다.
이 함정은 손절·익절·필터를 계속 추가하면서 과거의 손실 거래만 골라 없애는 과정에서 생깁니다. 백테스트를 돌려 보니 특정 손실 거래가 거슬려서 그 거래를 피하는 필터를 하나 추가하고, 다시 돌려 또 다른 손실을 피하는 조건을 더하는 식입니다. 한 번 더 돌릴 때마다 곡선은 매끄러워지지만, 추가된 필터 대부분은 그 한 번의 과거 거래를 피하려는 목적 외에 아무 근거가 없습니다. 결과적으로 전략은 과거에 일어난 특정 손실들의 목록을 외웠을 뿐, 손실을 만드는 구조는 이해하지 못합니다.
같은 데이터로 수백 번 조합을 돌려 최고점을 고르는 방식이 같은 결과를 만듭니다. 조합을 1,000개 시험하면 그중 몇 개는 순전히 우연으로 과거 구간을 거의 완벽하게 통과합니다. 그 몇 개 중 최고점을 고르면 우연히 가장 운이 좋았던 설정을 고르는 셈입니다. 같은 데이터를 반복해서 들여다보며 최고점을 추리는 작업을 흔히 데이터 스누핑(Data Snooping)이라 부르며, 시험한 조합 수가 많을수록 우연한 최고점이 나올 확률이 커집니다. 곡선이 비현실적으로 완벽하다면, 그것은 데이터를 너무 여러 번 들여다본 결과입니다.
낙폭 없는 백테스트는 자랑할 일이 못 됩니다. 가장 먼저 의심할 점검 대상입니다.

절벽형과 고원형은 이웃 성과로 갈립니다
견고한 설정인지 과최적된 설정인지를 가르는 가장 직접적인 방법은 최적값 주변의 이웃을 같이 보는 것입니다. 최적값 하나의 수익률만 기록하지 말고, 그 양옆 값들의 수익률을 함께 표로 만들어 모양을 확인합니다. 모양이 뾰족한 봉우리이면 절벽형, 넓은 언덕이면 고원형입니다. 같은 절차를 모든 핵심 파라미터에 대해 반복합니다.
이웃 성과를 보는 것이 효과적인 이유는, 미래의 시장 상태 변화를 파라미터를 옆으로 옮겨 보는 것으로 미리 흉내 내 보기 때문입니다. 변동성이 커져서 RSI 신호가 한 박자 늦게 도착하는 미래는, 백테스트로 보면 최적값이 기간 14에서 16 쪽으로 밀리는 것과 비슷한 효과를 냅니다. 기간 16에서도 성과가 유지되는 고원형 설정은 그 미래를 견디지만, 기간 16에서 성과가 절반 아래로 떨어지는 절벽형 설정은 그 미래에 무너집니다. 이웃 성과를 보면 미래 데이터가 없어도 그 설정이 얼마나 잘 버틸지 미리 가늠할 수 있습니다.
다음 점검을 모든 핵심 파라미터에 적용합니다.
- [ ] 이웃 범위 설정: 최적값을 중심으로 양옆 각 3칸씩, 총 7개 값의 백테스트 성과를 같은 기간에 대해 기록합니다. 예를 들어 최적값이 RSI 기간 14라면 11, 12, 13, 14, 15, 16, 17의 성과를 모두 봅니다.
- [ ] 고원 판정: 7개 값 중 최적값과 가까운 가운데 5개(12~16)의 성과가 모두 최고값의 70% 이상을 유지하면 고원형으로 보고 채택합니다.
- [ ] 절벽 기각: 최적값에서 한 칸만 옮겨도 성과가 최고값의 절반 아래로 떨어지면 그 최적값은 과최적으로 보고 버립니다. 고원 한가운데에 있는 다른 값을 대신 택합니다.
- [ ] 다중 파라미터 동시 확인: 파라미터가 둘 이상이면 한 파라미터만 흔들지 말고, 두 파라미터를 동시에 옮긴 격자에서도 고원이 유지되는지 봅니다. 한 방향으로만 평평한 줄기는 절벽과 다를 바 없습니다.
7개 값 중 최고점만 적어 두는 습관을 버리고, 7개를 모두 적어 모양을 봐야 합니다.
기간을 나눠 보면 외운 곡선이 걸러집니다
이웃 성과가 파라미터 공간을 흔드는 점검이라면, 기간 분할은 시간 축을 흔드는 점검입니다. 전체 과거 구간을 한 번에 최적화하지 말고, 앞부분에서 파라미터를 고른 다음 뒷부분에서 그 파라미터를 검증합니다. 앞부분을 인샘플, 뒷부분을 아웃오브샘플(Out-of-sample)이라 부릅니다. 인샘플에서 화려했던 설정이 아웃오브샘플에서 무너진다면, 그 설정은 앞부분 데이터를 외운 것입니다.
이 분할이 과최적을 잡아내는 이유는 검증 구간이 최적화 과정에서 완전히 격리되기 때문입니다. 파라미터를 고를 때 뒷부분 데이터를 한 번도 보지 않았다면, 뒷부분 성과는 그 파라미터가 처음 보는 데이터에서 어떻게 작동하는지를 정직하게 보여줍니다. 한 번 분할로 부족하면, 인샘플 창과 아웃오브샘플 창을 시간 축을 따라 굴려 가며 여러 번 검증하는 워크포워드 분석(Walk-forward Analysis)으로 확장합니다. 매 구간마다 앞에서 고른 파라미터가 다음 구간에서 통하는지를 누적해서 보면, 우연히 한 번 통한 설정과 일관되게 통하는 설정이 구분됩니다.
여기에 몬테카를로(Monte Carlo) 점검을 더하면 강건함을 한 단계 더 검증할 수 있습니다. 백테스트에서 나온 거래들의 순서를 무작위로 수천 번 섞거나, 진입 시점을 며칠씩 무작위로 흔들어 본 다음 결과의 분포를 봅니다. 거래 순서를 바꿨을 뿐인데 일부 시뮬레이션에서 계좌가 견디기 힘든 낙폭에 빠진다면, 원래 백테스트의 매끈한 곡선은 거래가 마침 유리한 순서로 일어난 우연에 기댄 것입니다. 진입 시점을 며칠 흔들었을 때 성과가 급변한다면, 그 전략은 특정 봉의 특정 가격에 과도하게 의존하고 있습니다. 강건한 전략은 이 무작위 교란들에도 결과의 평균이 크게 흔들리지 않습니다.
세 가지 점검을 순서대로 적용합니다.
- [ ] 기간 분할 비율: 전체 과거 구간의 앞 70%를 인샘플로 파라미터를 고르고, 뒤 30%를 아웃오브샘플로 검증합니다. 아웃오브샘플 성과가 인샘플의 절반 아래로 떨어지면 과최적으로 보고 파라미터를 다시 잡습니다.
- [ ] 워크포워드 반복: 인샘플과 아웃오브샘플 창을 시간 축을 따라 최소 5회 이상 굴리며, 5개 구간 중 4개에서 아웃오브샘플이 손실을 면하는지 확인합니다.
- [ ] 몬테카를로 분포: 거래 순서를 1,000회 이상 무작위로 섞은 분포에서, 최악 5% 지점의 낙폭이 실제 계좌가 감당할 수 있는 한계 안에 들어오는지 봅니다.
기간을 나누지 않고 전체를 한 번에 최적화한 결과는 검증이라 부를 수 없습니다. 제 답을 제가 채점하는 것에 가깝습니다. 인샘플이 화려할수록 아웃오브샘플로 한 번 더 통과시키고, 그 둘이 함께 견디는 설정만 실전에 올려야 합니다.
