백테스트 리얼리티 체크

리서치 노트

같은 데이터를 다섯 번 세면 t값이 두 배가 된다

사전등록한 기준을 통과한 신호가 두 개 나왔습니다. 통계를 제대로 다시 계산하니 하나는 t 2.54에서 0.49로 사라졌습니다.

작성
백테스트 리얼리티 체크
게시일
2026-08-25
검토일
2026-09-29

먼저 결론

  • "앞으로 5일 수익률"을 매일 계산하면 같은 5일을 다섯 번 세게 됩니다.
  • 표본이 부풀려지므로 t값도 부풀려집니다. 실측에서 1.4~2.6배였습니다.
  • 사전등록 기준을 통과했던 신호 하나가 제대로 계산하니 t 2.54에서 0.49로 사라졌습니다.

무엇을 하고 있었나

분 단위 시세로만 계산할 수 있는 지표 일곱 가지를 만들었습니다. 하루 종가만 봐서는 알 수 없고, 하루 안의 가격 움직임을 전부 봐야 나오는 것들입니다. 실현변동성, 실현왜도, 점프 비중 같은 것들입니다.

각 지표로 종목을 3분위로 나누고, 상위 그룹과 하위 그룹의 이후 5일 수익률 차이를 쟀습니다. 결과를 보기 전에 통과 기준 다섯 개를 미리 정해두고 기록했습니다.

일곱 개 중 두 개가 다섯 기준을 전부 통과했습니다. 그날 검증한 스물두 건 중 처음 있는 일이었습니다.

그런데 계산이 틀려 있었다

월요일에 "앞으로 5일"을 재면 월·화·수·목·금을 봅니다. 화요일에 다시 재면 화·수·목·금·월을 봅니다. 나흘이 겹칩니다.

이걸 매일 반복하면 관측 250개를 얻은 것처럼 보이지만, 실제로 독립적인 정보는 50개뿐입니다. 통계 검정은 관측이 서로 독립이라고 가정하고 계산하므로, 겹친 만큼 확신을 과장하게 됩니다.

겹침 정도를 재봤더니 결과 시계열의 자기상관이 0.40에서 0.77 사이였습니다. 상당히 심한 겹침입니다.

제대로 계산한 결과

두 가지 방법으로 다시 쟀습니다. 하나는 겹침을 흡수하는 표준오차를 쓰는 것이고, 다른 하나는 아예 5일에 한 번씩만 표본을 뽑는 것입니다.

원래 계산 겹침 보정 5일 간격
신호 A 2.54 1.78 0.49
신호 B -3.28 -2.01 -2.33

신호 A는 사라졌습니다. 원래 계산에서는 통과 기준을 넘겼지만, 그건 같은 데이터를 다섯 번 센 결과였습니다.

보정하지 않았으면 채택했을 것입니다.

살아남은 신호도 결국 기각했다

신호 B는 겹침 보정 후에도 남았습니다. 그래서 더 캐물었습니다.

  • 절반을 떼어 검증하니 통계적 유의성이 사라졌습니다.
  • 기간을 반으로 나누니 효과 전부가 후반부에 있었습니다. 전반부는 0에 가까웠습니다.
  • 249일 중 상위 10일을 빼니 효과가 절반 이하로 줄었습니다.
  • 실제로 실행 가능한 형태로 바꾸니 매매비용을 빼고 연 3% 남짓이었습니다. 그마저 통과 기준 미달이었습니다.

기각했습니다. 그날 스물두 건 중 스물두 건째 기각이었습니다.

배운 것 두 가지

첫째, 겹치는 기간을 쓰는 검정은 반드시 보정해야 합니다. "앞으로 N일 수익률"을 매일 계산하는 방식은 흔합니다. 편하고 표본이 많아 보이기 때문입니다. 그런데 그 늘어난 표본은 대부분 같은 정보의 복사본입니다. 보정하는 방법은 잘 알려져 있고 어렵지도 않습니다. 문제는 보정해야 한다는 사실 자체를 잊는 것입니다.

둘째, 기준을 통과했다는 것이 채택할 이유는 아닙니다. 미리 정한 기준은 잘못된 채택을 막는 하한선입니다. 통과했다고 해서 그 신호가 진짜라는 뜻은 아닙니다. 통과한 뒤에도 기간을 나눠보고, 극단적인 며칠을 빼보고, 떼어둔 데이터로 확인하고, 실제로 실행 가능한지 따져봐야 합니다.

신호 B는 다섯 기준을 전부 통과하고도 이 네 가지 추가 검증에서 무너졌습니다. 기준만 믿었다면 실전에 넣었을 것입니다.

스스로 확인해볼 점

앞으로 N일 수익률로 신호를 검증하고 있다면:

  1. 관측을 매일 만들고 있습니까, N일에 한 번 만들고 있습니까?
  2. 매일이라면 결과 시계열의 자기상관을 재보셨습니까?
  3. 재보지 않았다면, 지금 보고 있는 t값은 실제보다 큽니다. 얼마나 큰지는 재봐야 압니다.

겹친 날을 직접 세는 합성 예시

아래 세기는 새로운 신호가 아닙니다. 본문의 "앞으로 5일을 매일 재면 나흘이 겹친다"를 달력 위에 다시 놓는 합성 예시입니다. 본문의 t값 2.54와 0.49는 이 세기와 다른 실험이니, 여기 날짜 수와 그 t값을 한 식으로 합치지 마십시오.

월요일에 앞으로 5일을 재면 월·화·수·목·금을 봅니다. 화요일에 재면 화·수·목·금과 그다음 월요일을 봅니다. 수·목·금도 같습니다. 다섯 번째 영업일이 되어야 앞의 다섯 날과 완전히 다른 창이 시작됩니다. 영업일 250개를 매일 표본으로 쓰면 표에는 250이 찍히지만, 서로 겹치지 않는 5일 창은 50개입니다. 나머지 200개는 앞뒤 창의 나흘을 다시 적은 복사입니다. 통계 검정이 관측을 독립으로 두면, 복사 200개를 새 정보로 셉니다. t값은 정보의 양이 아니라 행의 개수로 커집니다.

자기상관이 0.40에서 0.77이었다는 본문의 측정은 이 복사가 약하지 않았다는 기록입니다. 0에 가깝다면 매일 뽑은 창이 생각보다 독립에 가깝다는 뜻이고, 0.7 근처라면 인접 행이 거의 같은 구간을 보고 있다는 뜻입니다. 상관계수 하나를 모든 전략의 보정 계수로 재사용하지는 못합니다. 다만 "재보지 않았으면 지금 보는 t값은 실제보다 크다"는 방향은, 창이 겹치도록 설계된 이상 바뀌지 않습니다. 얼마나 큰지는 그 시계열에서 다시 재야 합니다.

보정도 두 가지를 섞지 않습니다. 겹침을 흡수하는 표준오차는 행의 개수는 유지한 채 오차 막대만 넓힙니다. 5일에 한 번만 뽑는 방법은 행의 개수 자체를 줄입니다. 본문에서 신호 A는 두 번째 방법에서 기준 아래로 내려갔고, 신호 B는 표준오차를 넓힌 뒤에도 한동안 남았습니다. 남은 신호를 바로 채택하지 않은 이유는 겹침이 유일한 문제가 아니었기 때문입니다. 절반을 떼면 사라지고, 기간을 나누면 한쪽에 몰리고, 극단적인 며칠을 빼면 줄고, 실행 가능한 비용으로 바꾸면 기준에 못 미쳤습니다. 겹침 보정은 첫 관문이지 마지막 관문이 아닙니다.

직접 확인할 때의 순서를 본문의 세 질문에 두 줄만 더합니다. 매일 만들고 있다면 인접 행이 공유하는 날이 며칠인지 적습니다. 그 일수가 0이 아닌데 자기상관을 비워 두었으면 t값을 인용하지 않습니다. 자기상관을 재서 표준오차를 넓힌 뒤에는, 창을 건너뛰어 다시 뽑은 값과 부호가 같은지 봅니다. 부호가 다르면 인용을 멈춥니다. 부호가 같아도 기간을 반으로 나누고, 극단일을 빼고, 실행 비용 이후의 크기를 기준과 비교합니다. 이 순서를 한 단계라도 건너뛴 채 "t가 2를 넘는다"고 적으면, 행의 개수를 확신으로 바꾼 문장이 됩니다.

표본이 상승 국면 한 구간뿐이라는 한계는 보정으로 해결되지 않습니다. 겹침을 바르게 세도 그 구간의 성격이 다른 국면에서 반복되는지는 알 수 없습니다. 그래서 이 글의 결론은 신호 B를 살리는 것이 아니라, 살릴 것처럼 보였던 계산이 어디서 부풀었는지 남기는 것입니다. 다음 검증이 같은 5일 창을 매일 만들고 있다면, 원장의 번호가 늘어나도 정보의 양은 창의 개수만큼만 늘어납니다.