CHAPTER 05 / SECTION 01
5.1 미래를 보지 않고 입력 정리하기
학습 구간 안에서 전처리 기준을 정하고 극단값, 표현과 결측을 다룹니다.
평가 기간을 열기 전에 기준 고정하기
연구자가 1~3월의 일별 거래대금으로 학습하고 4월에 평가한다고 하자. 4월에 거래가 갑자기 늘어난 날이 많으면 1~4월 평균은 1~3월 평균보다 높아진다. 이 평균으로 1월 입력을 바꾸면 1월에는 알 수 없던 4월 상황이 이미 학습값에 반영된다. 이것이 Look-ahead Bias(미래 정보 편향)가 생기는 한 경로다.
가령 과거 평균은 100억 원, 전체 평균은 120억 원이다. 110억 원에서 기준 평균을 빼면 각각 10억 원과 −10억 원이다. 같은 거래일이 기준을 어디서 얻었는지에 따라 평균 이상에서 평균 이하로 바뀐다.
이런 변환은 Split-aware Preprocessing(분할별 전처리)으로 처리한다. 평균, 표준편차, 절단점, 결측 대체값처럼 자료에서 구하는 값은 각 학습 구간에서만 정한다. 이후 구간과 실전에서는 그때 저장한 변환기를 그대로 쓴다. 같은 변환기를 쓰면 실전에서 표준화를 빠뜨리거나 두 번 적용하는 문제도 줄어든다. 원을 억 원으로 바꾸기, 달력으로 휴장일 표시하기, 불가능한 값에 고정 규칙 적용하기는 자료에서 배울 기준이 없다.
- 학습 구간
유효 범위, 중앙값, 절단점 중 자료로 정하는 값을 계산한다. - 평가 구간
저장한 기준으로 입력을 바꾸고 성능을 계산한다. - 다음 분할
새 학습 구간에서 기준을 다시 계산한다.
분할이 바뀔 때 재계산하며, 한 분할의 평가 구간은 기준을 갱신하는 데 쓰지 않는다.
오류와 드물지만 실제인 움직임 구분하기
거래량이 음수이거나 날짜가 불가능하면 단위나 수집 오류를 조사한다. 매수호가가 매도호가보다 높은 경우에는 거래소와 기록의 시각이 일치하는지도 확인한다. 값 하나가 크게 튀었다가 바로 돌아오면 평소 변화폭과 되돌림을 살피고, 다른 공급처나 체결 기록과 대조한다. 실적 발표 뒤 실제 급등이 있었다면 시장의 움직임으로 보존한다. 이런 큰 움직임이 정규분포의 예상보다 자주 나오는 자료에는 Heavy Tails(두꺼운 꼬리)가 있다고 한다.
실제 극단값이 입력의 스케일을 지배한다면 Winsorization(극단값 경계 대체)으로 학습 구간에서 정한 경계를 넘는 값을 경계값으로 바꿀 수 있다. 예를 들어 상한이 150억 원이라면 200억 원과 1,000억 원은 모두 150억 원이 된다. 행은 남지만 두 날의 차이는 사라진다. 급등이나 장벽 도달을 정답으로 삼는 경우에는 라벨 계산에 쓰는 가격 경로와 수익률의 꼬리를 보존한다.
Robust Scaling(강건 스케일링)은 중앙값을 빼고 가운데 50%의 폭인 Interquartile Range(사분위 범위)로 나눈다. 중앙값이 100억 원, 가운데 구간이 80억~120억 원일 때 120억 원은 중심보다 그 폭의 절반만큼 높다. 소수의 큰 값이 있어도 평균과 표준편차에 의존할 때보다 기준이 덜 움직인다. 가운데 구간의 폭이 0인 열에는 별도 처리 규칙이 필요하다.
입력의 표현이 비교 기준을 정한다
주가가 1만 원에서 1만 100원으로 오른 종목과 10만 원에서 10만 100원으로 오른 종목은 둘 다 100원 올랐다. 투입금 대비 움직임은 각각 1%와 0.1%다. 가격 수준이 아니라 움직임을 비교하려면 수익률을, 금리나 스프레드의 절대 변화가 중요하면 같은 단위의 차분을 쓴다. 변화량을 사용해도 분포가 시간에 따라 달라지는지는 따로 확인한다.
Risk Scaling(위험 조정 스케일링)은 움직임을 과거 변동성으로 나눠 평소 흔들림에 비해 얼마나 큰지 나타낸다. 같은 1% 상승도 평소 하루 0.5% 움직인 자산에는 2배, 2% 움직인 자산에는 절반이다. 변동성 계산에 쓴 기간과 추정법은 특성 정의에 남기고 0에 가까운 분모도 처리한다.
Cross-sectional Rank(횡단면 순위)는 같은 날 종목끼리 비교한다. Time-series Percentile(시계열 백분위)은 한 종목을 자기 과거와 비교한다. A의 거래대금이 오늘 전체 1위여도 A 자체의 평소 거래대금보다는 적을 수 있다. 당일 순위를 계산할 때도 그 시각에 관측 가능한 종목과 거래 자격을 사용한다.
거래소처럼 이름만 다른 범주가 몇 개라면 One-hot Encoding(원-핫 인코딩)으로 거래소마다 해당 여부 열을 만든다. 신용등급처럼 순서가 있는 범주에는 Ordinal Encoding(순서 인코딩)을 고려한다. 숫자를 붙인 뒤 등급 사이 간격까지 같다고 모델이 가정하는지 확인한다. 종목 식별자처럼 범주가 많다면 Feature Hashing(특성 해싱)으로 일정 수의 칸에 배정하거나 Embedding(임베딩)으로 범주별 수치 표현을 학습할 수 있다. 해싱에는 충돌이 있고, 학습하는 사전이나 표현에는 평가 구간의 범주와 정답을 사용하지 않는다. 처음 등장한 범주의 처리도 미리 정한다.
값이 없는 이유에 따라 처리하기
- 우연한 누락은 수집 장애가 종목이나 수치와 관계없이 발생한 경우다. 완전한 입력이 필요한 모델에는 허용된 학습 기준이나 해당 시각의 관측 가능한 종목 중앙값을 쓸 수 있다. 결측을 직접 처리하는 모델이라면 비워 둘 수 있다.
- 관측 범위에 따른 누락은 작은 종목에만 공급처 기록이 없는 경우처럼 이미 아는 변수로 설명된다. 규모와 거래소가 비슷한 관측값으로 대체할 수 있지만, 원래 비어 있었다는 표시를 별도 열에 남겨 대체한 값과 구별한다.
- 결측 자체에 정보가 있는 경우에는 실적이 나쁜 기업이 지표를 공개하지 않거나 유동성이 낮을 때 체결 기록이 사라진다. 미보고 범주나 결측 표시를 유지한다. 중앙값으로 채우면 좋지 않은 상태를 평범한 상태로 바꾸는 가정이 들어간다. 공급처가 바뀌면 결측의 의미도 달라질 수 있다.
시장에 맞춰 확인할 항목
| 자료 | 점검 내용 |
|---|---|
| 상장지수펀드 | 가격 조정, 종목 코드 변경과 보유 기간 중 자료 공백을 확인한다. |
| 가상자산 무기한 계약 | 펀딩 시각과 거래소 시계를 맞추고, 강제청산 급변과 중간 상장폐지를 확인한다. |
| CME 선물 | 근월물 교체 시 가격 단절과 휴장일 차이를 확인한다. |
| 외환 | 주말 공백과 일일 결제 전후의 얇은 유동성을 시간대와 함께 확인한다. |
| 미국 주식 | 상장폐지 누락, 분할·배당 조정과 초저가주 거래 자격을 확인한다. |
| 기업 특성 패널 | 정제된 자료여도 결측 비율과 산출 기준이 갑자기 바뀌는 구간을 찾는다. |
| 나스닥 100 장중 기록 | 공급처가 정제한 자료에도 장 시작·종료와 경매 체결 처리 기준을 확인한다. |
| S&P 500 장중 기록 | 지수 편입 변경이 반영되는 시각과 상장지수펀드 자료의 일관성을 확인한다. |
| S&P 500 옵션 | 행사가와 기초자산 가격의 관계, 만기, 가격 민감도와 기초자산 관측 시각을 맞춘다. |
매 실행에는 입력 공개 지연, 학습 구간에서 적합한 변환, 라벨 중첩 처리, 특성·라벨 정의의 버전, Eligibility Mask(거래 자격 표시)의 생성 규칙을 남긴다. 거래 가능하다고 표시된 행과 실제로 값이 남은 행을 구분하고, 분할과 자산군별 커버리지와 유효 표본을 비교한다. 분포 진단에서 꼬리를 확인하고, 전처리 뒤에는 열·종목·기간별로 사라진 기록과 자료 간 시각 정렬을 다시 확인한다.