본문 바로가기
경제 금융 포털사이트 경제 금융 포털사이트

금융 시계열 딥러닝에서 데이터 누출을 방지하기 위한 학습 검증 및 테스트 데이터 분할 방법

금알남 읽는 시간 약 16분
ai thumbnail typography 금융 시계열 딥러닝에서 데이터 누출을 방지하기 위한 학습·검증·테스트 데이터 분할 방법 1789194025

좋은 금융 딥러닝 모델의 출발점은 높은 백테스트 수치가 아니라, 예측 시점에서 실제로 알 수 있었던 정보만 사용했는지 검증하는 것입니다. 금융 시계열 딥러닝에서는 랜덤 분할보다 시간 순서를 유지한 학습·검증·테스트 분할이 중요하고, 스케일링, 결측치 처리, 특성 선택 같은 전처리 과정도 반드시 학습 데이터만 기준으로 학습해야 미래 정보 누출을 줄일 수 있습니다. LSTM·GRU처럼 과거 구간을 묶어 사용하는 모델은 입력 시퀀스와 예측 라벨이 학습·검증 구간에서 겹치는지도 확인해야하지만 단일 검증 구간만 보기보다 Walk-Forward Validation과 필요시 Gap을 활용하면 실제 투자 환경에 가까운 성능 평가가 가능합니다.

금융 시계열 데이터를 이용해 딥러닝 모델을 만들 때 모델 구조만큼 중요한 것이 데이터 분할 방법이다.

LSTM, GRU, Transformer처럼 복잡한 모델을 사용하고 높은 정확도를 얻었다고 하더라도 학습 과정에서 미래의 정보가 과거 데이터에 섞였다면 그 성능을 그대로 신뢰하기 어렵다.

이러한 문제를 일반적으로 데이터 누출(Data Leakage)이라고 한다.

특히 주가, 환율, 금리, 거래량처럼 시간 순서가 중요한 금융 데이터에서는 일반적인 머신러닝에서 사용하는 랜덤 데이터 분할을 그대로 적용하면 실제 투자 환경과 다른 평가 결과가 나타날 수 있다.

이번 글에서는 금융 시계열 딥러닝에서 학습 데이터, 검증 데이터, 테스트 데이터를 어떻게 분리해야 하는지와 함께 데이터 누출을 예방하기 위해 확인해야 할 핵심 사항을 정리한다.

image 5

금융 시계열에서 데이터 누출이 중요한 이유

데이터 누출은 모델을 학습하는 시점에는 알 수 없었던 정보가 학습 과정에 들어가는 현상을 의미한다.

예를 들어 과거 데이터를 이용해 미래 주가를 예측한다고 가정해 보자.

2024년 데이터를 예측하는 모델을 학습하면서 2025년 데이터의 통계적 특성이 전처리 과정에 반영되었다면 모델은 실제로는 알 수 없어야 하는 미래 정보를 간접적으로 이용한 셈이다.

이 경우 백테스트에서는 높은 성능이 나타날 수 있지만 실제 새로운 데이터를 예측하면 성능이 크게 낮아질 가능성이 있다.

scikit-learn 공식 문서 역시 테스트 데이터를 모델 선택이나 전처리 과정에 사용하면 실제 일반화 성능보다 지나치게 낙관적인 평가 결과가 나올 수 있다고 설명한다.

금융 모델에서는 이러한 문제가 더욱 중요하다. 실제 투자는 현재까지 공개된 정보만 가지고 미래를 판단해야 하기 때문이다.

따라서 모델 평가 환경도 이러한 현실을 최대한 비슷하게 재현해야 한다.

일반적인 랜덤 분할이 금융 데이터에 적합하지 않은 이유

일반적인 머신러닝에서는 데이터를 다음과 같이 무작위로 섞은 다음 학습 데이터와 테스트 데이터로 나누는 방법을 많이 사용한다.

예를 들면 전체 데이터 가운데 일부를 무작위로 선택하여 학습에 사용하고 나머지를 평가에 사용하는 방식이다.

독립적인 데이터에서는 합리적인 방법일 수 있다. 하지만 시계열 데이터에는 시간 순서가 존재한다.

주가 데이터를 무작위로 섞어 버리면 2025년 데이터가 학습 데이터에 포함되고 2023년 데이터가 테스트 데이터에 포함되는 상황도 발생할 수 있다.

그러면 모델은 미래 데이터를 학습한 뒤 과거 데이터를 맞히는 비현실적인 평가를 받게 된다.

scikit-learn 문서에서도 시계열 데이터는 가까운 시점의 관측값 사이에 상관관계가 있기 때문에 일반적인 K-Fold나 ShuffleSplit을 그대로 사용하면 적절하지 않은 일반화 성능 추정이 발생할 수 있다고 설명한다.

금융 시계열에서는 기본적으로 시간 순서를 유지한 데이터 분할이 필요하다.

가장 기본적인 학습·검증·테스트 분할 방법

가장 이해하기 쉬운 방식은 전체 데이터를 시간 순서대로 정렬한 다음 세 구간으로 분리하는 것이다.

예를 들어 데이터가 2015년부터 2025년까지 존재한다고 가정하면 다음과 같은 구조를 생각할 수 있다.

  1. 초기 기간: 학습 데이터
  2. 그다음 기간: 검증 데이터
  3. 가장 최근 기간: 테스트 데이터

중요한 것은 구체적인 비율보다 시간 순서다.

학습 데이터는 모델의 가중치를 학습하는 데 사용한다.

검증 데이터는 하이퍼파라미터 선택, 모델 구조 비교, 조기 종료(Early Stopping) 등의 판단에 사용한다.

테스트 데이터는 모델 개발 과정이 모두 끝난 다음 최종 성능을 확인하기 위한 데이터다.

즉 테스트 데이터는 모델을 개선하기 위한 참고 자료가 되어서는 안 된다.

테스트 성능을 확인한 뒤 결과가 마음에 들지 않는다는 이유로 모델을 계속 수정하면 사실상 테스트 데이터가 검증 데이터의 역할을 하게 된다.

그 순간부터 최종 평가의 독립성이 약해진다.

딥러닝에서는 시퀀스 생성 순서도 중요하다

LSTM이나 GRU 같은 시계열 모델에서는 일정 기간의 데이터를 하나의 입력 시퀀스로 만드는 경우가 많다.

예를 들어 과거 60거래일 데이터를 이용해 다음 거래일을 예측한다고 생각해 보자.

이때 실수하기 쉬운 방법이 있다. 전체 데이터에서 먼저 모든 60일 시퀀스를 생성하고 그 결과를 무작위로 학습 데이터와 테스트 데이터로 나누는 것이다.

이렇게 하면 서로 다른 시퀀스가 상당수의 동일한 날짜 데이터를 공유할 수 있다.

예를 들어 한 시퀀스가 1일부터 60일까지를 포함하고 다음 시퀀스가 2일부터 61일까지를 포함한다면 두 샘플은 대부분의 데이터를 공유한다.

이러한 샘플이 각각 학습 데이터와 테스트 데이터에 들어가면 독립적인 평가라고 보기 어려워질 수 있다.

따라서 금융 시계열에서는 먼저 시간 구간을 어떻게 나눌 것인지 결정하고, 각 구간의 경계와 예측 시점을 고려하여 시퀀스를 생성하는 것이 안전하다.

스케일링에서도 미래 정보가 누출될 수 있다

딥러닝에서는 StandardScaler나 MinMaxScaler를 이용해 입력 변수의 크기를 조정하는 경우가 많다.

여기서 매우 흔하게 발생하는 실수가 있다.

전체 데이터에 스케일러를 먼저 학습시킨 다음 데이터를 학습·검증·테스트 세트로 나누는 것이다.

예를 들어 전체 데이터의 평균과 표준편차를 계산해서 표준화를 진행한다면 테스트 기간의 정보까지 평균과 표준편차 계산에 반영된다.

모델이 테스트 데이터의 정답을 직접 본 것은 아니지만 미래 데이터의 분포 정보를 미리 사용한 것이다.

올바른 기본 원칙은 다음과 같다.

  1. 시간 순서에 따라 데이터를 분할한다.
  2. 학습 데이터만 사용하여 스케일러를 학습한다.
  3. 학습된 동일한 스케일러로 검증 데이터를 변환한다.
  4. 같은 스케일러로 테스트 데이터를 변환한다.

scikit-learn도 정규화, 결측치 처리, 특성 선택, PCA 등의 변환 과정에서 fit은 학습 데이터에만 적용하고 검증·테스트 데이터에는 학습된 변환기의 transform만 적용하는 방식을 권장한다.

이 원칙은 딥러닝에서도 동일하게 적용된다.

검증 데이터는 한 번만 나누는 것이 항상 최선일까

고정된 하나의 검증 기간만 사용하는 방법은 간단하지만 금융 시장의 여러 상황을 충분히 반영하지 못할 수도 있다.

금융시장은 상승장, 하락장, 높은 변동성 구간, 낮은 변동성 구간 등 시간에 따라 환경이 달라질 수 있기 때문이다.

이러한 문제를 보완하는 대표적인 방법이 Walk-Forward Validation이다.

Walk-Forward Validation이란

Walk-Forward Validation은 실제 시간이 흘러가는 방식과 비슷하게 학습 기간과 검증 기간을 이동시키면서 모델을 반복 평가하는 방법이다.

예를 들어 다음과 같은 구조를 생각할 수 있다.

첫 번째 평가에서는 초기 데이터를 학습하고 바로 다음 기간을 검증한다.

두 번째 평가에서는 학습 데이터를 더 최근 시점까지 확장하고 그 이후 기간을 다시 검증한다.

세 번째 평가에서도 같은 과정을 반복한다.

이 방식의 장점은 특정 시기의 우연한 결과만 평가하는 것이 아니라 여러 시장 환경에서 모델이 어떻게 작동하는지 살펴볼 수 있다는 점이다.

scikit-learn의 TimeSeriesSplit 역시 이와 유사한 방식으로 과거 데이터를 이용해 이후 시점을 평가하며, 일반적인 교차검증과 달리 앞선 학습 데이터를 유지하면서 학습 구간을 확장할 수 있도록 설계되어 있다.

image 6

Expanding Window와 Rolling Window

Walk-Forward 방식에는 대표적으로 두 가지 접근법이 있다.

첫 번째는 Expanding Window다.

새로운 데이터가 생길 때마다 기존 학습 데이터에 추가하는 방식이다.

예를 들어 처음에는 2015~2019년 데이터를 학습하고 2020년을 평가한다면, 다음에는 2015~2020년을 학습하고 2021년을 평가하는 형태다.

시간이 지날수록 학습 데이터가 계속 늘어난다.

두 번째는 Rolling Window다.

학습 기간의 길이를 일정하게 유지하면서 오래된 데이터를 제거하고 새로운 데이터를 추가하는 방식이다.

예를 들어 항상 최근 일정 기간만 학습에 사용하는 방식이다.

금융시장처럼 오래된 패턴보다 최근 시장 구조가 더 중요할 가능성이 있는 문제에서는 Rolling Window가 도움이 될 수 있다.

반대로 장기간의 다양한 시장 데이터를 충분히 학습시키고 싶다면 Expanding Window를 고려할 수 있다.

어떤 방법이 항상 더 우수한 것은 아니다. 예측 대상과 데이터 특성에 따라 비교가 필요하다.

학습 데이터와 검증 데이터 사이에 Gap이 필요한 경우

학습 구간이 끝나자마자 바로 다음 데이터를 검증 데이터로 사용하는 것도 경우에 따라 문제가 될 수 있다.

특히 이동평균, 수익률, 변동성 지표, 미래 일정 기간의 수익률을 이용한 라벨처럼 여러 시점의 정보가 하나의 샘플에 포함되는 경우다.

학습 데이터 마지막 샘플과 검증 데이터 첫 번째 샘플이 실제 원본 데이터를 일부 공유할 수 있기 때문이다.

이럴 때는 학습 구간과 검증 구간 사이에 일정한 Gap을 두는 방법을 고려할 수 있다.

scikit-learn의 TimeSeriesSplit에도 학습 세트 끝부분과 테스트 세트 사이에서 일정 수의 샘플을 제외할 수 있는 gap 옵션이 제공된다.

다만 Gap을 무조건 크게 설정한다고 좋은 것은 아니다.

Lookback 길이, 예측 Horizon, 라벨 계산 방식, 지표 계산 기간 등을 확인하여 데이터가 서로 겹칠 가능성이 있는 정도를 기준으로 결정하는 것이 합리적이다.

금융 데이터에서는 라벨 생성 방식도 점검해야 한다

데이터를 시간 순서대로 분할했다고 해서 모든 데이터 누출 문제가 해결되는 것은 아니다.

예를 들어 현재 시점으로부터 향후 일정 기간의 수익률을 계산하여 상승과 하락을 분류하는 모델을 만든다고 생각해 보자.

현재 시점의 라벨을 계산하기 위해 미래 여러 거래일의 가격이 필요하다.

따라서 학습 구간 끝부분의 라벨 계산 기간이 검증 구간까지 침범하면 학습과 검증의 경계가 생각보다 명확하지 않을 수 있다.

이런 문제는 단순한 데이터 행의 날짜가 아니라 다음 세 가지를 함께 확인해야 발견할 수 있다.

  1. 입력 데이터가 참조하는 과거 기간
  2. 예측 대상이 참조하는 미래 기간
  3. 학습·검증 데이터 사이에서 실제로 공유되는 원본 데이터

금융 머신러닝에서 데이터 분할이 까다로운 이유가 바로 여기에 있다.

거시경제 데이터는 발표 시점도 확인해야 한다

또 하나 놓치기 쉬운 부분이 경제지표의 발표 시점이다.

예를 들어 특정 월의 경제지표라고 해서 해당 월 초부터 시장 참여자들이 그 값을 알고 있었던 것은 아니다.

실업률, 물가, GDP 등 상당수의 경제지표는 일정 시간이 지난 후 발표된다.

게다가 일부 지표는 이후 수정되기도 한다.

따라서 현재 확보한 최종 데이터베이스의 날짜만 보고 과거 모델에 넣으면 당시에는 공개되지 않았던 정보를 모델이 사용하는 문제가 생길 수 있다.

가능하다면 데이터의 기준 시점뿐 아니라 실제 공개 시점과 데이터 수정 여부까지 고려한 Point-in-Time 데이터 구조를 사용하는 것이 좋다.

이는 금융 시계열 모델에서 흔히 말하는 Look-Ahead Bias를 줄이는 데 중요한 과정이다.

테스트 데이터는 가장 최근 기간에 남겨두는 것이 좋다

검증 과정에서 Walk-Forward 방식을 사용하더라도 최종 테스트 데이터는 따로 남겨두는 것이 좋다.

전체 개발 과정을 다음과 같이 생각하면 이해하기 쉽다.

학습 데이터는 모델이 공부하는 문제집이다.

검증 데이터는 어떤 모델과 학습 방법이 적절한지 판단하는 모의고사다.

테스트 데이터는 모든 선택이 끝난 후 한 번 확인하는 최종 시험에 가깝다.

모델 구조, 입력 변수, Lookback 길이, 학습률, 손실함수 등 여러 조건을 검증 데이터를 통해 결정한 다음 마지막으로 독립된 테스트 구간에서 성능을 확인한다.

이 과정을 지켜야 실제 미래 데이터에서도 모델이 어느 정도 일반화될 수 있는지를 보다 현실적으로 평가할 수 있다.

금융 시계열 데이터 분할 체크리스트

딥러닝 학습을 시작하기 전 다음 사항을 점검하면 데이터 누출 가능성을 크게 줄이는 데 도움이 된다.

  1. 데이터를 날짜 순서대로 정렬했는가
  2. 학습·검증·테스트 데이터를 무작위로 섞지 않았는가
  3. 테스트 데이터가 모델 선택 과정에서 사용되지 않았는가
  4. 스케일러는 학습 데이터에만 Fit했는가
  5. PCA, 특성 선택, 결측치 처리 역시 학습 데이터만으로 학습했는가
  6. 입력 시퀀스가 학습과 검증 구간에서 과도하게 겹치지 않는가
  7. 예측 Horizon 때문에 라벨이 다음 데이터 구간과 겹치지 않는가
  8. 필요한 경우 학습과 검증 사이에 Gap을 두었는가
  9. 여러 시장 환경에서 Walk-Forward Validation을 실시했는가
  10. 경제지표나 기업 데이터의 실제 발표 시점을 반영했는가
  11. 최종 테스트 기간을 모델 개발 과정과 독립적으로 유지했는가

특히 백테스트 성과가 지나치게 좋게 나온다면 모델 구조보다 먼저 데이터가 어떻게 생성되고 분리됐는지를 확인할 필요가 있다.

데이터 분할이 모델 구조보다 먼저다

금융 시계열 딥러닝에서는 LSTM을 사용할지 Transformer를 사용할지 고민하기 전에 평가 환경이 현실적으로 설계되어 있는지를 먼저 확인하는 것이 중요하다.

잘못된 데이터 분할에서 만들어진 높은 정확도는 실제 투자 환경의 성능을 보장하지 않는다.

반대로 시간 순서를 유지하고, 전처리를 학습 데이터에만 맞추고, 시퀀스와 라벨의 중첩을 확인하고, Walk-Forward 방식으로 여러 기간을 평가하면 모델 성능을 훨씬 현실적으로 판단할 수 있다.

핵심 원칙은 단순하다.

모델이 특정 시점을 예측할 때 그 시점에서 실제로 알 수 있었던 정보만 사용해야 한다.

이 원칙을 학습·검증·테스트 데이터 분할뿐 아니라 스케일링, 특성 생성, 라벨 생성, 경제 데이터 결합 과정까지 일관되게 적용해야 한다.

금융 딥러닝에서는 높은 백테스트 수치보다 그 수치가 어떤 데이터 분할과 검증 과정을 거쳐 만들어졌는지를 설명할 수 있는지가 더 중요하다.

참고 자료

scikit-learn 공식 문서, Common pitfalls and recommended practices: 데이터 누출과 전처리 단계에서 학습 데이터와 테스트 데이터를 분리해야 하는 이유를 설명한다.

scikit-learn 공식 문서, TimeSeriesSplit: 시계열 데이터에서 시간 순서를 유지하는 교차검증 방식과 gap, test_size, max_train_size 등의 개념을 확인할 수 있다.

scikit-learn 공식 문서, Cross-validation: 일반적인 K-Fold와 시계열 교차검증의 차이를 설명한다.

금알남

금알남
함께 보면 좋은 글

댓글 0

첫 댓글을 남겨보세요.

광고 차단 알림

광고 클릭 제한을 초과하여 광고가 차단되었습니다.

단시간에 반복적인 광고 클릭은 시스템에 의해 감지되며, IP가 수집되어 사이트 관리자가 확인 가능합니다.