
과적합은 '특징량을 줄이면 해결된다'——그것은 거짓말이었습니다
요약
시계열 트레이딩 모델 검증 시 특징량을 줄이는 것만으로는 과적합을 해결할 수 없음을 지적합니다. 과적합의 진정한 원인은 모델의 용량이 아니라, 수많은 파라미터를 탐색하며 최적의 값을 선택하는 과정에서 발생하는 다중 검정 및 선택 편향에 있음을 설명합니다.
핵심 포인트
- 특징량 감소는 과적합 해결의 근본적인 대책이 아님
- 과적합의 주범은 모델 용량이 아닌 탐색 및 평가 구조에 있음
- 다중 검정(Multiple Testing)으로 인한 선택 편향 주의
- 검증 스코어의 낙관적 편향을 방지하는 메커니즘 필요
이 기사는 Zenn에 게시한 내용을 재게재한 것입니다. 초출: 과적합은 '특징량을 줄이면 해결된다'——그것은 거짓말이었습니다
시계열 트레이딩 검증에서 빠지기 쉬운 함정을 다루는 연재의 제4회(절정)입니다. 제1회(미래 참조 버그)・제2회(특징량 누수)・제3회(라이브/BT 괴리)의 연속입니다.
지난 3회까지의 과정을 통해, 검증은 신뢰할 수 있는 것이 되었습니다. 시간의 누락(제1회・미래 참조)도 정보의 누락(제2회・특징량 누수)도 없으며, 라이브와의 차이도 설명할 수 있습니다(제3회). 무기는 갖춰졌습니다.
그 올바른 검증 하네스(Harness)를 가지고, 드디어 파라미터 탐색(Parameter Search)을 돌립니다. 그리고——그럼에도 과적합(Overfitting)합니다.
여기서부터가 본론입니다. 적은 이제 데이터 속에도, 코드 속에도 없습니다. 탐색 방법과 평가 구조 안에 있습니다. 이 시리즈의 절정, 과적합과의 싸움입니다.
먼저, 시장의 ML(Machine Learning)이 구조적으로 과적합되기 쉬운 이유 3가지입니다.
낮은 신호 대 잡음비 (Signal-to-Noise Ratio). 가격 움직임은 대부분 노이즈입니다. 유연한 모델은 미세한 신호가 아니라 대량의 노이즈를 학습합니다 -
비정상성 (Regime Change). 과거에 효과가 있었던 관계가 미래에도 유효하다는 보장이 없습니다. 학습한 상관관계가 유통기한이 지나버립니다 -
탐색에 의한 다중 검정 (Multiple Testing). 이것이 가장 결정적입니다. 수많은 설정을 시도하여 '검증에서 가장 좋았던 것'을 선택하면, 그 '최고'에는 반드시 운이 섞입니다
3번째가 본 기사의 핵심입니다. 하지만 그 전에, 많은 사람(저를 포함하여)이 처음에 시도했다가 배신당하는 대책에 대해 이야기하겠습니다.
직관은 이렇습니다. "특징량이 많다 $\rightarrow$ 모델의 자유도가 높다 $\rightarrow$ 과적합한다. 그러므로 특징량을 줄이면 된다."
저도 그렇게 생각하여 특징량을 대폭 줄였습니다 (가령 40개에서 15개로). 과적합은 이것으로 확실히 줄어들어야 했습니다.
결과는——거의 줄어들지 않았습니다.
이것은 당시 가장 중요한 발견이었습니다. 만약 모델의 용량(자유도)이 과적합의 주범이라면, 용량을 줄이면 효과가 있어야 합니다. 효과가 없었다는 것은, 주범은 특징량의 개수가 아니라는 뜻입니다.
과적합의 근원은 모델의 용량보다, 평가의 구조와 탐색 프로세스 쪽에 있었습니다. 이것을 이해하면, "정규화(Regularization)를 강화한다", "특징을 줄인다", "트리 깊이를 얕게 한다"와 같은 용량 조절이 왜 제한적인 효과밖에 없는지 납득할 수 있습니다. 모두 대증요법이기 때문입니다. 진범은 따로 있습니다.
수많은 설정을 검증에서 평가하고 최선을 선택한다. 이 "선택하는" 행위 자체가 과적합을 낳습니다.
동전을 100명에게 던지게 하면, 10번 연속으로 앞면이 나오는 사람이 반드시 나타납니다. 그 사람을 "앞면을 내는 재능이 있다"며 채용하는 것이 소박한 파라미터 탐색입니다. 선택된 설정의 검증 스코어는 실제 실력보다 낙관적으로 편향됩니다. 시행 횟수가 늘어날수록 우연한 승자가 태어나기 쉬워집니다. 이것이 다중 검정・선택 편향(Selection Bias)입니다.
따라서 다음과 같이 인식을 고쳐야 합니다.
검증 스코어가 좋다는 사실 자체는 더 이상 증거가 되지 않습니다.
필요한 것은 "그 좋음이 운이 아니다"라는 것을 보여주는 메커니즘입니다. 이하, 그 메커니즘을 장치로서 겹쳐 나가겠습니다.
제2회의 연속입니다. 시계열을 존중한 분할로, 학습과 검증이 미래를 가로지르지 않도록 합니다. 겹치는 라벨은 퍼지(Purge)하고, 경계에 엠바고(Embargo)를 둡니다. 이 부분이 무너져 있으면 이후의 장치들은 전부 무의미해집니다. 토대입니다.
탐색에도 튜닝에도 단 한 번도 사용하지 않는 최종 구간을 확보합니다. 모든 탐색이 끝난 후, 그 구간에서 처음으로 "본방(Live)에 상당하는" 수치를 측정합니다.
# 탐색・튜닝 중에는 절대로 참조하지 않음
holdout = data[data.index >= HOLDOUT_START]
search_pool = data[data.index < HOLDOUT_START]
...
철칙은, 탐색 중에 단 한 번이라도 들여다본다면 그것은 더 이상 홀드아웃(Holdout)이 아니다라는 것입니다. "조금만 보고 조정하자"를 허용하는 순간, 홀드아웃은 오염됩니다.
단일 수치로 합격 여부를 결정하지 않습니다. 이것이 효과적입니다. 예를 들어 "정규화된 PnL"과 "순수 PnL" 둘 다 동시에 조건을 만족할 것을 요구합니다.
# 한쪽 지표만으로 합격시키지 않는다. 여러 독립적인 지표의 동시 통과를 요구한다
passed = (holdout["pnl_normalized"] >= 0) and (holdout["pnl_raw"] >= 0)
한쪽 지표만으로 좋아 보이는 설정은, 그 지표에 과적합되어 있을 뿐인 경우가 많습니다. 독립적인 여러 척도를 동시에 만족하는 설정은 운만으로 그곳에 도달하기 어려워집니다. 게이트를 늘릴수록 우연한 통과는 어려워집니다.
「프로핏 팩터 (Profit Factor)가 비정상적으로 높음 × 거래 횟수가 극단적으로 적음」은 승리가 아니라 **노이즈 (Noise)**입니다. 이를 채용 후보에서 적극적으로 제외합니다.
def score_stats(stats):
# 거래 횟수가 너무 적은 결과는 통계적으로 무의미하므로 무효화
if stats["trades"] < MIN_TRADES:
...
좋은 성적을 「무효화하는」 로직을 일부러 작성한다는 발상이 핵심입니다. 탐색(Exploration)은 내버려 두면 반드시 이런 우연한 히트를 잡아내기 때문에, 이쪽에서 선제적으로 차단해야 합니다.
위의 내용과 중복되지만 독립적으로 중요합니다. 단 몇 건의 거래로 나온 좋은 성적은 통계적으로 아무것도 말해주지 않습니다. 최소 시도 횟수를 충족하지 못하는 설정은 애초에 평가의 대상에 올리지 않습니다.
특정 시간대나 레짐 (Regime)에만 과적합(Overfitting)되어 이기고 있는 경우, 해당 영역의 샘플 가중치 (Sample weight)를 단계적으로 조정하여 일부 국면에 의존한 승리를 억제합니다. 「전체적으로 얇게 이기는」 방향으로 유도함으로써 특정 국면에 대한 의존도를 줄일 수 있습니다.
이 부분이 이 시리즈 전체를 통해 가장 전달하고 싶은 내용입니다. 과적합 대책의 본질은 테크닉의 모음이 아닙니다. **목적의 재정의 (Redefinition of purpose)**입니다.
최상의 파라미터(Parameter)를 찾는 것을 그만두십시오. 강건성 (Robustness)을 증명하는 작업으로 전환하십시오. 탐색은 「가장 좋은 것이 무엇인가」를 찾는 행위가 아니라, 「운에 의존하지 않고 안정적으로 조건을 만족하는 것이 무엇인가」를 찾는 행위가 됩니다.
합격 기준은 고정하십시오. 움직이지 마십시오. 성적이 기준에 미치지 못할 때, 기준을 낮추어 통과시키는 것은 자신을 속이는 행위입니다. 높여야 할 것은 기준이 아니라 트레이드의 질입니다.
대증요법보다 근본 원인입니다. 「정규화 (Regularization)를 높였더니 과적합이 줄었다」에서 만족하지 마십시오. 왜 과적합이 발생했는지(다중 검정(Multiple testing)인가, 데이터 누수(Leakage)인가, 레짐 의존성인가)를 규명하십시오. 특징량(Feature) 축소가 효과가 없었던 이야기는 바로 이러한 자세에서 비롯되었습니다.
결론을 내리기 전에 정량적인 증거를 확보하십시오. 「아마 효과가 있을 것 같다」는 이유로 채용하지 마십시오. 홀드아웃 (Hold-out) 수치와 복수 지표에서의 일치를 요구하십시오.
이 4가지는 제가 개발 초기부터 일관되게 지켜온 원칙입니다. 화려한 모델보다 이러한 규율이 시스템의 생사를 갈랐습니다.
- 시장 ML이 과적합되는 구조적 이유:
낮은 S/N비 · 비정상성 (Non-stationarity) · 다중 검정 — 「특징량을 줄이면 해결된다」는 제한적으로만 효과가 있습니다. 주범은
모델의 용량(Capacity)이 아니라, 평가 구조와 탐색 — 진짜 적은 탐색의
선택 편향 (Selection bias). 검증 스코어가 좋다는 사실 자체는 더 이상 증거가 되지 않습니다. - 대책은 장치를 겹겹이 쌓는 것입니다: 올바른 시간 평가 / 건드리지 않는 홀드아웃 / 복수 지표 게이트 / 이상치 무효화 / 거래 횟수 하한선 / 샘플 가중치
- 핵심은
목적의 재정의 —— 최상을 찾는 것을 그만두고, 강건성을 증명할 것
지금까지 총 4회에 걸쳐 검증이 거짓말을 하는 주요 패턴(시간의 누수, 정보의 누수, 라이브 괴리, 과적합)을 차단해 왔습니다. 시리즈의 뼈대는 이것으로 완성되었습니다.
다음 회차는 머리 식힐 겸, 지금까지 여러 번 등장했던 「타임스탬프와 타임존 (Timezone)」 —— 지루하지만 며칠을 허비하게 만드는 그 함정을 단독으로 깊이 파헤쳐 보겠습니다.
질문이나 「우리 팀은 이 장치로 과적합을 막았다」는 이야기가 있다면 댓글로 남겨주세요. 연재로서 검증이 거짓말을 하는 패턴을 순차적으로 격파해 왔습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Qiita AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기