고가에 팔 수 있었다는 착각
— MFE의 함정
MFE(최고점 도달)는 “그 가격을 찍긴 찍었는가”만 알려줄 뿐, 그 가격에 실제로 팔 수 있었다는 뜻은 아닙니다. 문제는 여기서 끝나지 않았습니다 — 저희가 이 숫자를 재는 과정에서 세 번 실제로 틀렸습니다. 얼버무리지 않고 그대로 공개합니다.
MFE는 “찍었다”일 뿐 “팔았다”가 아니다
MFE(Maximum Favorable Excursion)는 진입 후 일정 기간 안에 도달한 최고 수익률입니다. 신호가 “움직임을 예측했는가”를 보기엔 적합하지만, 그 최고가에 실제로 매도할 수 있었다는 보장은 어디에도 없습니다. 이 간극 자체는 이미 급등 후 되돌림 글에서 다뤘습니다.
이 글은 한 단계 더 들어갑니다. MFE라는 지표 자체가 아니라, MFE를 측정하는 저희 코드가 틀렸던 사례 세 가지입니다. 셋 다 겉보기 표본 수·행 수는 정상이었습니다 — 그래서 발견까지 오래 걸렸습니다.
사고 ① 측정 창 비대칭 — 픽에만 3배 긴 시간을 줬다
정정일 2026-08-13 · 성숙 픽 249건 재계산 · 출처: price_history 실측
유니버스 기준선(모집단 평균)은 20거래일 창으로 MFE를 쟀습니다. 그런데 스캐너가 고른 픽에는 추적 전체 기간(최대 60거래일)의 최고가를 썼습니다. 같은 이름의 두 숫자가 사실은 서로 다른 길이의 자로 잰 것이었습니다 — 픽에만 최대 3배 긴 시간을 준 비교였습니다.
| 구분 | 정정 전 | 정정 후(진짜 20일창) |
|---|---|---|
| 픽 평균 MFE | 19.43% | 14.84% |
| 최고점이 20일 이후인 픽 | 42.6% | |
| mfe_atr 리프트 | +12.8%p | −1.5%p |
정정 후 이 사이트에서 유일하게 살아남았던 양성 리프트가 사라졌습니다. “20일 안에 얼마나 오르나”를 재는 척했지만, 실제로는 픽 쪽만 20일이 지난 뒤에도 계속 최고가를 갱신할 기회를 준 셈이었습니다. 가장 뼈아픈 대목은 표본의 42.6%가 20일 이후에야 최고점을 찍었다는 사실입니다 — 20일 창으로 “최고점까지 얼마나 걸리나”를 물으면 절반 가까운 경우에서 아직 답이 안 나온 상태로 창이 닫힙니다.
사고 ② 불멸시간 편향 — MFE 리프트의 유의성까지 흔들렸다
정정일 2026-08-11 · 픽 440건 · 출처: track_service 분모 재계산
이 사고의 주 무대는 적중률 분모 자체(39.8%→30.7% 정정, 별도 글에서 자세히 다룹니다)지만, 같은 편향이 MFE 리프트의 통계적 유의성까지 건드렸다는 점은 이 글의 주제입니다.
아직 20거래일이 안 지난 픽 중 이미 목표를 적중한 것만 분모에 넣고, 같은 시기 아직 못 오른 나머지는 분모에서 빼는 규칙이 있었습니다. 진행 중이던 210건 중 조기적중 40건은 분모에 들어가고, 미적중 170건은 빠졌습니다 — 시간이 지나면 사라질 “아직 모르는 상태”를 “영원히 좋은 결과만 관측되는 상태”처럼 취급한 셈이라 immortal time bias라 부릅니다.
| 리프트 | 정정 전 | 정정 후 | 판정 |
|---|---|---|---|
| mfe15 | +11.1%p | +2.9%p | CI하한 24.1 < 기대 27.9 — 유의성 상실 |
| mfe_atr | +16.4%p | +12.6%p | CI하한 15.5 > 기대 8.6 — 유지 |
정정 전 저희가 “이 사이트 최초의 양성 결과”라고 불렀던 수치는 편향의 산물이었습니다. 살아남은 주장은 단 하나, 변동성 대비(MFE ≥ 6×ATR) 기준에서만 이긴다는 것뿐입니다. 더 관대한 고정 +15% 기준(mfe15)은 정정 후 유의하지 않다는 사실도 함께 남깁니다.
사고 ③ 결측을 “미달”로 집계 — 행 수 검사로는 못 잡는다
정정일 2026-08-05 · 대상 4,650행 · 출처: crypto_signal_stats 재구축
크립토 168시간 라벨(fwd_ret_168h)이 전부 NULL이었습니다. 원인은 두 개가 겹쳐 있었습니다.
- 창 경계 — 데이터 수집 API가 창 끝 시각을 배타적으로 처리해, 정확히 168시간 지점의 봉이 응답에 아예 없었습니다. 24h·72h는 창 내부라 무사했고 168h만 항상 비었습니다.
- 결측 처리 — 라벨 계산 함수가 값이 없을 때 “판정 불가”(None, 분모 제외)가 아니라 “미달”(False, 실패로 집계)을 반환했습니다.
이 조합이 특히 위험했던 이유는, 비어 보이지 않고 조용히 아래로 왜곡됐다는 점입니다. 표본 수(n_univ)는 다른 정상 라벨과 똑같이 2,568건이었습니다. 기저율만 0%로 나왔습니다 — 실제로는 19.2%였습니다.
세 사고의 공통점
셋 다 표본 크기·행 수는 정상이었고, 산술 자체도 틀리지 않았습니다. 문제는 언제나 “무엇을 재고 있는가”의 정의였습니다 — 측정 창이 한쪽만 길었거나(①), 분모 구성 규칙이 미래 정보를 몰래 새어들게 했거나(②), 결측을 실패로 오분류했거나(③). 산술 검산만으로는 셋 다 못 잡습니다.