2026-08-30 · Kverse
데이터 청소가 수익률을 만든다 — 13F 백테스트에서 만난 두 가지 함정
#미국주식#13F#백테스트#교육
13F 백테스트(/13f/backtest)를 만들면서 가장 오래 붙잡고 있었던 것은 전략 아이디어가 아니라 데이터였습니다. 그럴듯한 수익률 곡선이 나왔다가, 뜯어보니 데이터 오염이 만든 신기루였던 적이 두 번 있었습니다. 오늘은 그 두 가지 함정을 기록해 둡니다.
먼저 배경입니다. 13F 공시는 분기말로부터 45일 안에 제출되고, 종목별 평가액과 주식 수가 실립니다. 평가액을 주식 수로 나누면 그 분기의 내재 단가가 나오고, 여러 기관의 보유 변화를 모으면 컨센서스 랭킹이나 자금 유입 같은 시그널을 만들 수 있습니다. 문제는 이 원천 데이터가 백테스트용으로 설계된 것이 아니라는 점입니다.
첫 번째 함정은 주식 클래스 이중계상입니다. 같은 회사가 복수의 주식 클래스로 상장돼 각각 별도 종목으로 공시되는 경우가 있습니다. 대표적으로 GOOG와 GOOGL이 그렇습니다. 클래스를 병합하지 않으면 컨센서스 랭킹에서 한 회사가 두 슬롯을 차지합니다. 상위 10개를 뽑는 전략이라면 실제로는 9개 회사에 분산한 셈이 되고, 그 회사의 비중은 의도치 않게 두 배가 됩니다. 매수 기관 수를 세는 유입 전략에서도 같은 왜곡이 생기므로, 기관 수는 반드시 클래스 병합 후의 명수로 세야 합니다. 해결의 열쇠는 CUSIP 코드에 있습니다. CUSIP 앞 6자리가 발행사 식별자이므로, 이 6자리가 같으면 같은 회사로 묶고 평가액이 가장 큰 클래스의 티커로 통일하면 됩니다.
두 번째 함정은 역분할 아티팩트입니다. 자금 유입 후보를 모멘텀으로 재정렬하는 전략에서, 13F의 내재 단가로 12개월(4분기) 모멘텀을 계산했더니 LITE라는 종목이 +63,000% 수익률로 최상위에 올라왔습니다. 실제 수익이 아닙니다. 역분할을 하면 주식 수가 줄고 내재 단가는 그 배수만큼 뛰는데, 분할 감지가 없으면 이 점프가 그대로 모멘텀으로 잡힙니다. 이런 가짜 수익률이 랭킹 상위를 도배하면 전략은 사실상 최근 역분할한 종목 모음이 됩니다.
해결은 주식 수의 정수배 감지입니다. 같은 기관이 연속 두 분기 보유한 종목이라면 주식 수의 비율을 볼 수 있습니다. 이 비율이 정수배에서 ±2% 이내면 분할이나 역분할로 판정하고 단가 비율을 그 배수로 보정합니다. 여기에 기관별로 계산한 값의 종목별 중앙값을 취해, 개별 기관의 보고 오류가 섞여 들어오는 것까지 걸러냅니다.
덧붙이면 같은 검증 과정에서 인덱스 상품도 정리했습니다. SPY 같은 ETF는 특정 종목을 골랐다는 시그널이 아니므로 시그널 유니버스에서 제외했습니다. 이것까지 포함하면 청소는 세 번이었던 셈입니다.
두 함정의 공통점은 백테스트 결과 화면만 봐서는 드러나지 않는다는 것입니다. 곡선은 매끈했고 수치는 그럴듯했습니다. 상위 종목 목록을 한 줄씩 열어 보고 나서야 이상함이 보였습니다. +63,000% 같은 극단값은 오히려 쉽게 들킵니다. 무서운 것은 클래스 이중계상처럼 조용히 비중을 왜곡하면서 눈에 띄는 극단값은 만들지 않는 오류입니다.
그래서 교훈은 하나입니다. 그럴듯한 백테스트 결과가 나왔을 때, 전략을 믿기 전에 먼저 데이터를 의심하십시오. 상위 종목을 직접 열어 보고, 극단값의 출처를 추적하고, 같은 회사가 두 번 세어지지 않았는지 확인하는 청소 작업이 수익률 숫자보다 먼저입니다. 13F 구루 추적(/13f)과 백테스트 탭(/13f/backtest)의 수치는 이 청소를 거친 뒤의 값입니다.
이 글은 정보 제공 목적이며 투자 조언이 아닙니다. 각 도구의 계산 방법과 한계는 이용 가이드에서 확인하세요.
