커브 피팅이 백테스트를 인샘플에서는 훌륭해 보이게 하면서 실거래에서 실패하게 만드는 원리, 주의해야 할 신호, 그리고 버전 추적성이 과최적화를 드러내는 방법.
Traseq··6분 읽기
이 글에서
백테스트는 깔끔한 자산 곡선, 높은 승률, 강한 수익률을 보여 주면서도 유용한 것을 거의 알려 주지 않을 수 있습니다. 그 원인이 과최적화입니다. 어떤 역사 구간의 무작위 노이즈에 맞을 때까지 전략을 조정하면, 그 데이터에서는 결과가 훌륭해 보이지만 조건이 바뀌는 순간 무너집니다. 좋은 전략과 운 좋은 전략을 구분하는 능력은 가장 중요한 리서치 기술이며, 그것이 바로 백테스트가 존재하는 이유입니다.
하나의 아이디어를 검증 가능한 버전으로 바꾸세요.
노코드 암호화폐 현물 전략으로 시작해 버전을 고정하고, 백테스트를 실행하고, 비교를 위해 결과를 추적 가능하게 유지하세요.
Traseq는 실거래나 거래소 체결 플랫폼이 아니라 리서치 워크스페이스입니다. 주문을 넣거나, 거래소 계정에 연결하거나, 성과를 보장하지 않습니다. 이 글의 목적은 보장과 정반대입니다. 지나치게 좋아 보이는 결과를 의심할 수 있게 돕는 것입니다.
과최적화(커브 피팅 또는 over-optimization)는 전략이 시장의 근본적인 동작이 아니라 특정 과거 데이터 자체를 묘사하게 되는 상태입니다. 모든 가격 시계열에는 두 가지가 들어 있습니다. 시그널(활용할 수 있을지 모르는 반복 가능한 구조)과 노이즈(반복되지 않는 무작위 흔들림)입니다. 돌리는 손잡이가 많고 단일 백테스트를 최대화하려 조정할수록, 규칙은 결국 노이즈를 설명하게 됩니다.
함정은 과최적화가 백테스트 수치를 개선한다는 점입니다. 필터를 추가하고, 임계값을 살짝 옮기고, 나쁜 달을 제외하면 거의 언제나 인샘플 수치가 올라갑니다. 바로 그래서 훌륭한 백테스트는 좋은 전략의 증거가 되지 못합니다. 그것은 단지 역사에 충분히 맞췄다는 증거일 수 있습니다.
견고한 전략은 그 반대입니다. 인샘플의 완벽함을 어느 정도 포기하는 대신, 한 번도 본 적 없는 데이터에서도 버티는 동작을 얻습니다.
과최적화는 수익률을 들여다본다고 알아챌 수 없습니다. 결과가 어떻게 만들어졌고 얼마나 취약한지를 봐야 비로소 알아챌 수 있습니다. 다음 신호에 주의하세요.
신호
왜 과최적화를 가리키는가
파라미터가 너무 많음
룩백, 임계값, 스톱, 필터는 모두 노이즈에 맞추는 자유도입니다. 조정된 숫자가 여덟 개면 거의 무엇이든 맞출 수 있습니다.
의심스러울 만큼 매끄러운 자산 곡선
진짜 전략에는 연속 손실이 있습니다. 노이즈가 많은 시장에서 드로다운이 거의 없는 곡선은 보통 특정 과거 손실을 피하도록 규칙을 빚었다는 표시입니다.
날짜나 수수료를 바꾸면 무너지는 결과
시작일을 몇 주 옮기거나 현실적인 수수료와 슬리피지를 더하기만 해도 승자가 패자가 된다면, 그 엣지는 애초에 견고하지 않았습니다.
극히 적은 거래 횟수
몇 건의 거래로는 실력과 운을 구분할 수 없습니다. 9건으로 만든 "훌륭한" 결과는 대부분 노이즈입니다.
하나의 수치를 좇아 수없이 손본 이력
규칙을 수십 번 수정하며 백테스트 수익률을 올린 것만 남겼다면, 최적화한 것은 시장이 아니라 워크스페이스입니다.
왜 적은 샘플이 과최적화를 부르는가
적은 거래 횟수는 가장 흔하면서도 가장 과소평가된 함정입니다. Traseq의 Learn 허브에 있는 인터랙티브 데모는 세 가지 교과서적 템플릿을 2024-11-03부터 2024-12-31까지의 실제 BTC/USDT1h 봉에서 돌립니다. RSI Mean Reversion 템플릿은 이 구간을 **+1.74%**로 마쳤지만, 그러기까지 거래는 단 9건뿐이었습니다.
9건은 신뢰하기에 부족합니다. 그중 한두 건의 순서를 바꾸거나 구간을 일주일 옮기기만 해도 수익률은 쉽게 마이너스로 뒤집힐 수 있습니다. 샘플이 이토록 적으면, RSI 임계값을 이 특정 구간에서 우연히 이긴 거래를 잡고 진 거래를 피할 때까지 조정해 결과를 "개선"할 수 있습니다. 그리고 그 규칙이 통하는지에 대해서는 아무것도 배우지 못합니다. 백테스트가 만들어 내는 거래가 적을수록 단일 결과는 우연에 지배되고, 노이즈에 맞추기는 쉬워집니다.
꾸미지 않은, 조정하지 않은 결과가 어떤 모습인지 보는 것은 도움이 됩니다. 같은 출렁이는 두 달 구간에서 세 데모 템플릿을 최적화 없이 그대로 돌렸습니다.
템플릿
수익률
승률
거래 횟수
손익비
SMA(200) Trend Filter
-6.89%
22.7%
22
0.36
RSI Mean Reversion
+1.74%
44.4%
9
1.12
Donchian Breakout
-10.27%
34.5%
29
0.66
이 구간은 랠리 후의 횡보에서 하락으로 이어지는 출렁임이었고, 결과에도 그것이 드러납니다. 추세/돌파 두 개는 차감 후 손실이었고, 평균회귀는 가까스로 손익분기에 닿았을 뿐입니다. 이는 데모의 실패가 아니라 정직한 모습입니다. 위험한 점은 선이 위를 향할 때까지 필터를 더해 이 중 무엇이든 "고칠" 수 있다는 것입니다. 그렇게 수정된 결과는 훌륭해 보이지만 아무 의미가 없습니다. 규율이란 규칙을 단순하게 유지하고, 정직한 수치를 받아들이며, 백테스트를 판결이 아니라 질문으로 다루는 것입니다.
과최적화는 버전 사이의 틈에 숨습니다. 수치를 좇아 더했다가 잊어버린 작은 수정들입니다. Traseq는 그 틈을 메우도록 만들어졌습니다.
버전 추적성. 모든 백테스트는 확정된 전략 버전에 연결되므로, v1, v2, v3 사이에서 어떤 손잡이를 돌렸는지 정확히 볼 수 있습니다. 필터 세 개를 더하고 한 달을 제외한 뒤에야 수익률이 올랐다면, 버전 이력이 그것을 보여 줍니다. 워크플로우는 리서치 추적성과 전략 버전 관리를 읽어 보세요.
비교 세트. 꾸며진 스크린샷 한 장을 믿는 대신, 버전을 나란히 놓고 수익률, 드로다운, 조건, 기간을 함께 비교합니다. 하나의 날짜 범위나 하나의 타임프레임에서만 이기는 결과는 곧바로 드러납니다. 백테스트 결과를 비교하는 방법을 참고하세요.
재현 가능한 실행. 확정된 버전은 정확한 규칙과 실행 설정을 잠그므로, 같은 로직을 새로운 날짜 범위에서 다시 테스트해 엣지가 진짜였는지 만들어진 것이었는지 확인할 수 있습니다.
수정의 전체 사슬을 볼 수 있다는 것이 "훌륭한 백테스트가 있다"를 "이 전략이 좋았는지 단지 운이 좋았는지 구분할 수 있다"로 바꿔 줍니다.
과최적화는 전략이 반복 가능한 시장 동작이 아니라 한 역사 구간의 무작위 노이즈에 맞춰 조정되는 상태입니다. 백테스트는 인샘플에서는 훌륭해 보이지만, 규칙이 반복되지 않을 세부 사항에 맞춰 빚어졌기 때문에 새로운 데이터에서는 전략이 실패합니다.
커브 피팅과 과최적화는 어떻게 다른가요?
둘은 같은 문제를 가리킵니다. "커브 피팅"은 특정 가격 경로를 따라가도록 규칙을 빚는 것을, "과최적화(over-optimization)"는 단일 백테스트를 최대화하려 파라미터를 지나치게 조정하는 것을 강조합니다. 둘 다 시장이 아니라 과거에 맞춘 전략을 낳습니다.
제 전략이 과최적화되었는지 어떻게 아나요?
눈에 띄는 수익률이 아니라 신호를 보세요. 조정된 파라미터가 너무 많거나, 의심스러울 만큼 매끄러운 자산 곡선, 극히 적은 거래 횟수, 그리고 날짜 범위를 바꾸거나 현실적인 수수료를 더하면 무너지는 결과입니다. 작은 변화로 깨진다면 과최적화일 가능성이 높습니다.
왜 적은 거래 횟수가 과최적화를 일으키나요?
거래가 몇 건뿐이면 운이 결과를 지배하므로 단일 수치는 신뢰할 수 없습니다. 9건으로 양의 수익률을 낸 전략도 두어 건의 순서만 바꾸면 쉽게 마이너스로 뒤집힐 수 있습니다. 거래가 적으면 임계값을 그 한 구간에서 이긴 거래를 잡을 때까지 조정하기도 쉬워집니다.
Traseq는 과최적화 탐지를 어떻게 돕나요?
Traseq는 모든 백테스트를 확정된 전략 버전에 연결하므로 각 실행 뒤의 정확한 파라미터가 기록되고, 비교 세트로 성과, 리스크, 조건, 기간에 걸쳐 버전을 나란히 놓을 수 있습니다. 손잡이를 더하거나 날짜 범위를 골라잡았기 때문에 결과가 개선되었다는 점이 드러납니다.