사전 등록은 연구 계획을 연구 전에 정해 등록기관에 제출하는 절차입니다. 제 경우에는 데이터를 보기 전에 합격 기준을 문서로 못박아 두는 것이고, 결과를 본 뒤에 기준을 결과에 맞춰 고치는 일을 막으려고 씁니다. 같은 데이터로 가설을 만들면서 그 가설을 검정할 수는 없다는 것이 근거입니다.
저는 기준 셋을 미리 적고 10년 이력으로 검정했습니다.
셋 다 통과했고, 그 결과를 채택하지 않았습니다. 사전 등록은 기준을 나중에 바꾸는 것은 막아주지만, 처음부터 느슨하게 적은 기준은 그대로 통과시킵니다.
무엇이 걸렸는지부터 적겠습니다.
한 해씩 빼고 통계량을 다시 계산해보니 값이 가장 많이 떨어지는 해가 하필 제가 이 가설을 떠올린 해였고, 그 해를 빼면 기준 미달이었습니다. 아래는 그 판정 과정과, 같은 함정을 다시 밟지 않으려고 등록 양식에 넣은 조항 하나입니다.
무엇을 검증했나?
제 포트폴리오 하나는 모멘텀과 역변동성으로 30종목을 골라 주기적으로 리밸런싱합니다. 정해진 주기에 비중을 다시 맞추는 것을 말합니다. 시장 대비 성과가 계속 나빴는데, 원인을 분해했더니 종목 선정 쪽이 아니었습니다. 전부 배분에서 나왔습니다. 코스피와 코스닥에 얼마씩 걸었느냐 하는 문제입니다. 두 시장이 몇 달 동안 크게 벌어졌고, 제 포트폴리오는 하필 뒤처진 쪽에 더 많이 실려 있었습니다.
그래서 가설이 나왔습니다. 두 시장의 상대 모멘텀, 즉 최근 수익률의 차이를 보고 비중을 옮기면 되지 않을까 하는 것입니다.
실운용 기록 위에서 반사실을 만들어 보고 바로 멈췄습니다.
반사실은 그때 다르게 했다면 어땠을지 되짚어 계산한 값입니다. 그 시점 실운용은 거래일 100일, 리밸런싱 22회뿐이었고, 규칙을 조금만 바꾸면 결과가 요동쳤습니다. 비중을 비례해서 옮기는 규칙은 −2.7%p, 이긴 쪽에 전부 싣는 규칙은 +10.8%p. 같은 아이디어인데 부호가 반대입니다.
단일 국면에서 뽑은 반사실은 결론이 아니라 그 국면의 그림자입니다.
그래서 표본을 바꿨습니다. 실운용 기록을 버리고 두 시장 지수 ETF의 10년치 이력으로 옮겼습니다. 제 포트폴리오와 독립인 표본입니다.
신호는 이 데이터로 만들지 않았습니다. 이미 운용 중인 엔진이 쓰는 모멘텀 공식을 그대로 가져왔습니다.
relmom(t) = mom_코스닥(t) − mom_코스피(t)
mom = 0.4 × (21거래일 수익률) + 0.6 × (63거래일 수익률)
가중치 0.4/0.6도, 기간 21/63도 이 검정에서 튜닝하지 않았습니다. 여기서 파라미터를 만졌다면 결과가 좋게 나와도 의미가 없습니다.
게이트는 셋이고 전부 충족해야 통과입니다. t 값은 관측된 평균이 우연만으로 설명되기 어려운 정도를 재는 값이고, 관례로 1.96을 넘으면 유의하다고 봅니다.
| 게이트 | 조건 |
|---|---|
| T1 예측력 | 주간 비중첩 관측에서 sign(relmom) × 다음주 상대수익의 평균이 0보다 크고, t ≥ 1.96 |
| T2 일관성 | 표본을 시간순 반으로 갈랐을 때 양쪽 부호가 같을 것 |
| T3 전략 가치 | 이긴 쪽에 전부 싣는 규칙이 50:50 고정 대비 초과 CAGR > 0, 양쪽 반분 모두, 전환비용 차감 후 |
주간 관측 553개, 2016년 1월부터 2026년 8월까지 10년 7개월입니다. 결과는 3/3 통과였습니다.
T1 예측력 (t≥1.96, mean>0): PASS (t=+2.02)
T2 반분 동부호: PASS (+0.338 / +0.206)
T3 WTA−50:50 초과 CAGR>0: PASS (+8.56%p / +4.14%p)
문면 종합: PASS (사전 등록 게이트 기준)
여기서 멈췄다면 10년 독립 표본으로 검증 통과라고 쓰고 설계에 들어갔을 겁니다. 문장으로는 흠잡을 데가 없습니다. 표본이 10년이고, 신호는 튜닝하지 않았고, 게이트는 데이터를 보기 전에 적었고, 셋 다 통과했습니다.
통과했는데 왜 안 썼을까?
게이트는 아니지만 판정 해석용으로 강건성 검사를 스크립트에 넣어뒀습니다. 표본을 조금 바꿔도 결론이 같은지 보는 검사이고, 여기서는 연도를 하나씩 빼가며 T1을 다시 계산했습니다.
11개 중 어느 해를 빼도 t는 1.63에서 2.84 사이입니다.
대체로 임계선 근처에서 흔들립니다. 그리고 최솟값이 하필 2026년이었습니다. 2026년은 표본의 6%(553주 중 33주)이고, 그 6%를 빼면 t가 2.02에서 1.63으로 떨어져 기준 미달이 됩니다.
2026년이 무슨 해일까요.
제 가설이 태어난 해입니다. 순서를 다시 보면 이렇습니다. 2026년에 제 포트폴리오가 시장에 뒤졌고, 원인을 분해했더니 배분이었고, 그래서 상대 모멘텀 가설이 나왔습니다.
그 가설을 검증하는 표본에 2026년이 들어가 있었습니다.
조금 이상한 종류의 오염입니다.
제가 2026년 데이터를 여러 번 들여다보고 신호를 맞춘 것도 아니고, 공식은 손도 안 댔습니다. 그런데도 오염입니다. 두 시장이 크게 벌어지는 국면이 있다는 관찰 자체가 2026년에서 나왔고, 그 관찰이 없었으면 이 가설을 세우지도 않았을 것이기 때문입니다. 가설이 태어난 창은 그 가설에 유리하게 되어 있습니다. 반드시 그렇습니다.
그 창에서 뭔가 보였기 때문에 가설이 생긴 것이니까요.
그래서 2026년을 빼고 다시 봤습니다.
=== 2026 제외 (발견 연도 제외, 2016~2025, n=520) ===
T1 상당: mean +0.178%/주, t=+1.63 → 미달
T3 상당 (전반 | 후반): +8.35%p | −0.37%p → 후반 음수
T1도 T3도 떨어집니다.
특히 T3 후반이 문제였습니다. 2021년부터 2025년까지 5년 동안 이 전략의 초과 가치는 0이고, 오히려 살짝 마이너스입니다. 전체 기간에서 T3가 통과한 이유가 여기서 드러납니다. 후반부 +4.14%p는 2026년 하나가 만든 숫자였고, 그 해를 빼면 −0.37%p입니다.
이 표본을 아웃오브샘플이라고 부르기에는 조건이 하나 빠져 있습니다.
아웃오브샘플은 가설을 세울 때 보지 않은 표본을 말합니다. 그러려면 가설을 세우기 전에 2016~2025년 데이터를 본 적이 없어야 하는데, 저는 그 기간의 가격을 다른 용도로 이미 봐 왔고 무엇을 언제 봤는지 기록이 없습니다. 그래서 정확한 이름은 발견 연도를 뺀 표본까지입니다.
빠지는 쪽의 오염은 확인했지만, 남는 쪽이 깨끗하다는 증명은 없습니다.
기각의 위치도 분명히 해두겠습니다.
제가 판정한 것은 이 신호가 쓸모없다는 쪽이 아니고 있다고 하기에 부족하다는 쪽입니다. 11년 중 10년이 양수였고, 방향은 일관됐고, 어느 해를 빼도 부호가 뒤집히지는 않았습니다. 없다고 단정하면 그것도 데이터가 지지하지 않는 주장이 됩니다.
그래서 결론은 배분 오버레이 설계에 착수하지 않는다로 적었습니다.
사전 등록은 무엇을 막고 무엇을 못 막나?
저는 게이트를 데이터 보기 전에 적었습니다. 신호도 튜닝하지 않았습니다. 절차상 흠이 없었습니다. 그런데 게이트가 통과했습니다.
문제는 등록 문서에 가설이 생성된 기간은 검증에서 제외한다는 조항이 없었다는 것입니다. 저는 표본을 늘리는 것만 생각했고, 그 표본 안에 가설의 출생지가 들어 있다는 걸 등록 시점에 못 봤습니다.
사전 등록은 기준을 고정할 뿐, 그 기준이 옳은지는 보장하지 않습니다.
미리 적어두면 결과를 보고 기준을 바꾸는 건 막을 수 있습니다. 처음부터 느슨하게 적은 기준은 미리 적어도 여전히 느슨합니다. 오히려 더 위험합니다. 사전 등록했다는 사실이 통과에 정당성을 덧입히기 때문입니다.
이 판정을 자의적이지 않게 만들어준 건 데이터가 내놓은 자기반증이었습니다. 전반부만 따로 보면 이렇습니다.
전반 (2016-01-08 ~ 2021-04-30, n=276): mean +0.338%/주, t=+2.12
t는 2.12, 임계값 1.96을 넘습니다.
2021년 4월에 제가 T1만 돌렸다면 그때도 넘었을 거라는 뜻입니다. 당시 존재하던 데이터로, 같은 신호로요. 그리고 그 후 5년이 실제로 배달한 것은 −0.37%p입니다. T1을 통과한다는 것이 앞으로의 가치를 보장하지 않는다는 걸 데이터가 자기 안에서 보여줍니다. 게이트 셋 전체가 아니고 조건 하나에 대한 시연이지만, 그 하나가 제가 가장 신뢰하던 조건이었습니다.
중간에 무슨 일이 있었는지도 보입니다.
2024: -1.021%/주 (t=-3.00, n=52)
2024년은 모멘텀 신호가 반대로 작동한 해였습니다. 한 해가 −3.00입니다. 이런 해가 언제 오는지 저는 모릅니다. 10년 중 10년이 양수라는 서술은 이 한 해를 평균 속에 녹여서 숨깁니다.
게이트가 못 잡은 게 하나 더 있었습니다.
T3는 50:50 고정 대비 초과 CAGR을 요구했는데, 아무것도 안 하고 코스피만 들고 있었으면 연 +17.9%입니다. 신호를 따라 10년 동안 69번 갈아탄 전략은 +17.1%였습니다. 가만히 있는 것보다 못했습니다. 게이트는 이걸 못 잡습니다. 비교 대상이 50:50이었고, 50:50은 제가 고른 것이니까요. 자가 아무리 정밀해도 대상이 틀리면 결론의 부호가 바뀝니다. 포트폴리오 벤치마크를 바꾸면 알파 부호가 뒤집힌다에서 성과 측정을 두고 쓴 이야기인데, 사전 등록한 게이트 안에서 같은 실수가 반복되고 있었습니다.
전체 표는 부록 2에 있습니다.
등록 양식을 어떻게 고쳤나?
이 판정 이후에 올린 사전 등록에는 요건이 하나 추가됐습니다.
③ 등록 이후에 새로 발생한 표본만으로도 같은 방향일 것
볼린저 밴드 스퀴즈는 정말 신호일까에서 다룬 밴드폭 가설에도, 그 뒤에 등록한 가설에도 이 조항이 들어 있습니다. 검정력이 부족하다는 것도 미리 적었습니다.
그래서 유의성 대신 부호만 요구합니다.
이 조항이 하는 일은 단순합니다. 가설의 출생지와 검증 표본을 시간으로 강제 분리하는 것입니다. 등록 이후에 발생한 사건은 제 가설에 영향을 줬을 수가 없습니다. 시간이 한 방향으로만 흐르니까요.
같은 이유로 판정 시점도 날짜 대신 표본 수로 정의합니다.
날짜로 정하면 결과가 마음에 안 들 때 조금 더 모아보자가 가능해집니다. 지금 대기 중인 등록이 하나 있습니다. 요건 ③의 카운터가 아직 목표에 도달하지 않았고, 그때까지 관련 조회를 하지 않기로 적어뒀습니다.
도달하면 그때 한 번 돌립니다.
그리고 이 판정으로 이 포트폴리오에서 제가 손댈 수 있는 항목이 전부 소진됐습니다. 종목 선정도, 가중 방식도, 배분도 전부 바꿀 근거 없음으로 닫혔습니다. 유쾌한 결론은 아니었습니다. 고칠 게 없다는 것과 잘 돌아간다는 것은 다릅니다.
재개 조건은 새로운 독립 가설이거나, 수년 뒤 자연히 쌓인 표본입니다.
자주 묻는 질문
기준을 셋 다 통과했는데 왜 안 썼나요
한 해씩 빼고 다시 계산해보니 값이 가장 많이 떨어지는 해가 하필 이 가설을 떠올린 해였고, 그 해를 빼면 기준 미달이었습니다.
그럼 사전 등록은 쓸모가 없나요
아닙니다. 기준을 나중에 바꾸는 것은 확실히 막습니다. 못 막는 것은 처음부터 느슨하게 적은 기준이에요. 그래서 등록 양식에 조항을 하나 더 넣었습니다.
강건성 검사를 등록 시점에 넣으면 되지 않나요
그래서 넣었습니다. 다만 그 조항도 무엇을 검사할지 미리 적어야 의미가 있습니다. 결과를 보고 검사를 고르면 같은 문제가 반복됩니다.
이 판정을 되돌릴 수 있나요
새 데이터가 쌓이면 다시 잽니다. 다만 그때도 기준을 먼저 적고 재야 하고, 지금 기각한 근거를 지우지 않습니다.
남는 것
사전 등록은 필요조건이고 충분조건이 못 됩니다. 기준을 미리 적으면 사후에 기준을 바꾸는 걸 막습니다. 처음부터 느슨한 기준을 적는 건 못 막습니다.
통과했을 때 등록했으니 괜찮다고 안심하는 순간이 가장 위험합니다.
가설이 태어난 창은 검증에서 빼세요. 그 창은 정의상 가설에 유리합니다. 거기서 뭔가 보였으니 가설이 생긴 것입니다. 데이터를 직접 만지지 않았어도 오염입니다. 관찰이 곧 접촉입니다.
표본을 잘라보세요. 연도 하나씩 빼는 데 몇 줄이면 됩니다. 최솟값이 어느 구간에서 나오는지가 가장 많은 걸 알려줍니다. 저는 하필 가설이 태어난 해에서 나왔고, 그게 전부였습니다.
과거의 나에게 같은 검정을 돌려보세요.
전반부만으로 T1이 t=2.12였고, 그다음 5년의 가치는 0이었습니다. 이 방법이 5년 전에도 통과했을까 하는 질문은, 게이트가 얼마나 헐거운지를 게이트 밖에서 물어보는 방법입니다.
기준을 통과했는데도 접는 건 기분이 좋지 않습니다.
잘 나온 결과를 스스로 무르는 일이니까요. 그런데 그게 아깝다고 느껴진다면, 그건 이 절차가 필요하다는 신호에 가깝습니다.
아깝지 않은 결과를 접는 건 누구나 할 수 있습니다.
부록 1. 게이트 판정 수치
연도를 하나씩 빼고 T1을 다시 계산한 값입니다.
2016 제외: t=+1.98 2021 제외: t=+1.98
2017 제외: t=+1.64 2022 제외: t=+1.96
2018 제외: t=+1.94 2023 제외: t=+1.84
2019 제외: t=+1.88 2024 제외: t=+2.84
2020 제외: t=+1.81 2025 제외: t=+1.65
2026 제외: t=+1.63 ← 최소
전환은 10년 7개월 동안 69회, 연평균 6.5회입니다.
거래가 드물어서 비용에도 둔감했고, 전환당 30bps를 물려도 게이트가 살아남았습니다. 실운용 반사실의 근거였던 관측 구간은 2026-03-27부터 2026-08-21까지 거래일 100일, 그 안의 리밸런싱 22회입니다.
부록 2. 게이트가 비교 대상을 잘못 잡았다
전략 전반 | 후반 | 전체 (연 CAGR, 전환비용 10bps)
WTA(이긴 쪽 전부) +18.8 |+15.4 |+17.1%
50:50 고정 +10.2 |+11.3 |+10.8%
코스피만 보유 +14.0 |+21.8 |+17.9%
T3가 요구한 50:50 고정 대비로는 +6.3%p 우위이고 넉넉히 통과입니다. 이 표를 등록 당시에는 적어두지 않았고, 이 글을 쓰면서 출력을 다시 보다가 발견했습니다.
부록 3. 6주 뒤에 다시 돌려봤다
이 글을 쓰면서 판정 스크립트를 처음부터 다시 실행했습니다. 판정 때보다 표본이 5주 늘었습니다.
| 판정 시점 (6주 전, 548주) | 재실행 (2026-08-23, 553주) | |
|---|---|---|
| 주간 관측 | 548 | 553 |
| T1 (전기간) | t +2.18 | t +2.02 |
| T1 (2026 제외) | t +1.63 | t +1.63 |
| T3 후반 (2026 제외) | −0.37%p | −0.37%p |
전체 기간 통계량은 2.18에서 2.02로 움직였고, 2026년을 뺀 통계량은 소수점 둘째 자리까지 그대로입니다. 새로 쌓인 5주가 전부 2026년이라 발견 연도를 뺀 표본은 한 주도 늘지 않았습니다(520주 그대로). 그대로인 쪽이 안 흔들리는 이유는 깨끗해서가 아니라 표본이 한 주도 늘지 않았기 때문입니다. 의도한 대조는 아니었는데, 오염된 표본과 그렇지 않은 표본이 시간이 지나며 어떻게 갈라지는지가 우연히 드러났습니다.
부록 4. 등록 문서를 스크립트 헤더에 적었다
이번에는 등록 문서를 따로 만들지 않고 검정 스크립트의 헤더 주석에 직접 적었습니다. 스크립트를 실행하려면 그 파일을 열어야 하고, 열면 게이트가 눈에 들어옵니다. 기준과 실행이 물리적으로 분리되지 않습니다.
이 글에서 고친 것 1개
- 2026-09-12 — 처음 발행본은 이 표본을 “엄밀 OOS”라 불렀고, 아래 전반부 검정을 “같은 게이트로 통과였을 것”이라고 썼습니다. 앞은 발견 연도를 뺐다는 사실이 나머지 기간을 미접촉 표본으로 만들어 주지 않는데 그렇게 적은 것이고, 뒤는 조건 셋 중 하나(T1)를 전체로 넘겨 적은 것입니다. 둘 다 줄였습니다. 기각 결정과 수치는 그대로입니다.
본문의 통계 수치는 발행 전 판정 스크립트를 재실행해 재현했고(2026-08-23, 표본 553주), 모집단·포트폴리오 수치는 원본 데이터베이스와 자동 대조했습니다. 판정 시점 수치는 당시 기록을 인용했습니다.
이 사이트의 수치는 주 1회 DB와 다시 대조하고, 판단이 바뀌면 지우지 않고 글 안에 덧붙입니다. 갱신은 RSS로 받을 수 있습니다.