QuantLabNote

20일에 옳던 판단이 60일엔 틀렸다 — 채점 지평이 바꾼 평결 29건 검증

같은 매매 결정을 20일 뒤와 60일 뒤에 각각 채점했습니다. 두 채점이 모두 확정된 29건 중 12건에서 평결(잘한 결정/못한 결정)이 뒤집혔습니다 — 뒤집힘 비율 41.4%. 덤으로 비어 있는 채점 칸 30개를 '아직 안 지난 것·채점 창 안·창 밖·폐기된 체크포인트'로 분류해, 결측이 곧 버그는 아니라는 점을 기록으로 보였습니다.

최초 발행 2026-08-05 · 데이터 갱신 2026-08-10 · 데이터 2026-06-02 ~ 2026-08-03 · 자체 자동매매 시스템 decision_scores (읽기 전용) · 진입/청산가 대비 N일(캘린더) 후 수익률 − 같은 기간 버킷 벤치마크 수익률 (%p), 매도는 부호 반전. 20일·60일이 모두 확정된 결정만 짝지어 비교

매매일지채점백테스트함정성과측정AI자동매매

매매 일지를 채점해 본 사람은 곧 이상한 벽을 만납니다. “언제 채점할 것인가” 입니다. 산 지 20일 뒤에 재보면 실패한 매수인데, 60일 뒤에 재보면 성공한 매수입니다. 둘 다 같은 결정, 같은 가격, 같은 벤치마크인데 평결만 반대입니다. 이 글은 그 벽을 실제 기록으로 계량합니다. 운용 중인 봇이 자기 결정을 채점해 쌓아온 표(2026-06-02 ~ 2026-08-03 결정 45건 — 매수 진입 33건, 매도 청산 12건, 기준일 2026-08-10)가 재료입니다. 모든 수치는 코드가 계산했습니다(방법론).

채점 방식부터 (숫자를 믿으려면 규칙을 먼저 봐야 합니다)

봇은 체결된 결정마다 결정 시점 가격그 종목의 벤치마크 가격을 함께 스탬프해 둡니다. 그리고 20일·60일(캘린더 기준)이 지나면 이렇게 채점합니다.

  • 매수 진입: (종목 수익률 − 벤치마크 수익률). 양수면 산 게 벤치보다 나았다 = 잘한 결정.
  • 매도 청산: 부호를 뒤집습니다. 판 뒤 그 종목이 벤치보다 못 갔으면 양수 = 잘 판 것.
  • 벤치마크는 종목마다 다릅니다. 공격 자산(성장·에너지·프론티어)은 반도체 ETF, 금 성격 자산은 금 ETF, 현금성 단기채는 무위험 0%로 채점합니다. 방어 자산을 반도체 지수로 채점하면 “금을 샀는데 반도체를 못 이겼다”는 부당한 ❌ 가 찍히기 때문입니다(2026-06-23 변경). 이전 글들이 시장 지수 대비로 서술한 부분은 이 변경 이후 기준과 다르며, 순차적으로 갱신합니다.

여기서 이미 교훈 하나가 나옵니다 — 채점은 ‘가격을 다시 보는 일’이 아니라 ‘비교 대상을 정하는 일’ 입니다. 무엇과 비교할지 정하지 않은 성과 자랑은 채점이 아니라 감상입니다.

본론: 같은 결정, 두 지평 (짝지은 29건)

지평 비교는 반드시 짝을 지어야 합니다. “20일 채점 전체 평균”과 “60일 채점 전체 평균”을 그냥 비교하면, 60일이 지난 결정만 60일 표본에 들어오므로 구성이 다른 두 집단을 비교하게 됩니다. 그래서 아래 표는 20일과 60일이 둘 다 확정된 29건만 남겼습니다.

채점 지평표본승률평균 초과중앙값최악
20일 시점2937.9%-6.7-3.1-21.0
60일 시점2944.8%-4.9-0.3-27.8

같은 29건인데 승률이 37.9% → 44.8% 로 움직였습니다. 평균 초과수익도 -6.7%p → -4.9%p 입니다. 그런데 진짜 중요한 건 평균이 아니라 개별 평결이 뒤집혔는가 입니다.

평결이 뒤집힌 결정 전수 공개 (12건 / 29건 = 41.4%)

종목결정일유형20일 채점60일 채점평결
IAU2026-06-02매수 진입+0.2-0.4✅ → ❌
GLD2026-06-02매수 진입+0.2-0.4✅ → ❌
TSM2026-06-02매수 진입-0.2+6.8❌ → ✅
NVDA2026-06-02매수 진입-12.5+3.4❌ → ✅
ETN2026-06-02매수 진입-1.9+16.8❌ → ✅
IAU2026-06-02매수 진입+0.2-0.3✅ → ❌
HPE2026-06-03매수 진입-17.4+1.9❌ → ✅
HPE2026-06-04매도 청산+7.4-3.6✅ → ❌
AVGO2026-06-04매도 청산+6.3-8.9✅ → ❌
NVDA2026-06-04매수 진입-6.2+7.1❌ → ✅
AMD2026-06-05매수 진입-3.1+1.8❌ → ✅
BAM2026-06-10매수 진입-6.0+12.1❌ → ✅

짝지은 29건 중 절반 가까이 뒤집혔습니다(12건). 방향을 보면 20일 ❌ → 60일 ✅ 가 7건, 20일 ✅ → 60일 ❌ 가 5건으로, 60일에서 더 좋아진 쪽이 많았습니다. 두 지평의 점수 차이는 평균 6.3%p, 최대 19.3%p였습니다.

이 표가 말하는 바는 간단하고 불편합니다. “내 전략은 승률 ○○%“라는 문장은, 채점 지평을 밝히지 않으면 아무 의미가 없습니다. 같은 계좌, 같은 결정에서 지평만 바꿔 승률 두 개를 동시에 만들 수 있다면, 지평 선택은 결과 보고가 아니라 결과 조작의 손잡이가 됩니다. 그래서 이 봇은 지평을 고르지 않고 둘 다 남기고, 뒤집힌 건수를 세어 공개합니다.

함정 하나 — 60일이 ‘더 진짜’인 것도 아니다

“그럼 길게 보면 되는 것 아닌가”라고 하기 쉽지만, 60일 채점에도 대가가 있습니다. 첫째, 표본이 늦게 도착합니다 — 오늘 내린 결정의 60일 평결은 두 달 뒤에나 나오므로, 60일 채점만 믿으면 전략 개선 주기가 두 달로 늘어집니다. 둘째, 60일이면 그 사이에 매도해 이미 청산한 종목의 가격까지 계속 따라다니게 됩니다(진입 채점은 ‘그때 샀다면’을 보는 지표이지 보유 손익이 아닙니다). 셋째, 지평이 길수록 개별 종목 요인보다 시장 국면이 점수를 지배합니다. 요컨대 20일은 노이즈가 많고 60일은 느리고 국면에 물듭니다. 정답은 ‘하나 고르기’가 아니라 둘 다 적고 갈라지는 지점을 세는 것입니다.

결측 해부 — 빈칸 30개는 전부 다른 이유다

채점표에는 결정 45행 × 체크포인트 3개 = 135칸이 있고, 그중 105칸이 채워져 있습니다. 남은 30칸을 그냥 “데이터 없음”으로 뭉뚱그리면 계측이 죽습니다. 코드로 분류하면 이렇게 갈립니다.

상태20일60일
채점 완료4429값이 있음
아직 미도래116결정일 + N일이 아직 안 지남 = 정상
채점 창 안00도래했고 유효창(+7일) 안 = 곧 채워짐
창 밖·미채점00창을 넘겼는데 비어 있음 = 조사 대상

여기에 폐기된 5일 체크포인트가 따로 있습니다. 5일 채점은 32건까지 기록된 뒤 중단됐고(2026-06-18 결정이 마지막), 이후 13건은 전부 비어 있습니다 (2026-06-24 결정부터). 다개월 추세를 노리는 전략에서 5일은 노이즈라 의도적으로 버린 지표이고, 소급해서 채우지도 않았습니다. 기록상 경계가 깨끗합니다 — 중간에 섞인 구멍이 없어 ‘폐기’라는 설명이 데이터와 일치합니다.

즉 같은 NULL이라도 ① 시간이 안 지난 것 ② 곧 채워질 것 ③ 버려진 지표 ④ 진짜 구멍은 완전히 다른 사건입니다. 지금 ④에 해당하는 칸은 0개입니다. 하나도 없다는 뜻이고, 그래서 위 승률표의 표본을 그대로 신뢰할 수 있습니다.

이 분류가 필요했던 이유 — 스캔 조건 한 줄이 만든 영구 결측

이 봇에서 실제로 있었던 일입니다. 채점 잡은 “아직 안 채워진 행”을 골라오는데, 그 조건이 한동안 폐기된 5일 컬럼을 포함하고 있었습니다. 그러자 5일·20일이 이미 채워진 행은 조건에 걸리지 않아 통째로 스캔에서 빠졌고, 60일 채점은 도래해도 영원히 채워지지 않았습니다. 경보는 울리지 않았습니다. 값이 비어 있는 건 “아직 안 지나서”와 똑같이 생겼으니까요.

고친 뒤에도 문제가 남습니다 — 이미 놓친 창을 어떻게 메우나. 오늘 가격으로 메우면 안 됩니다. 60일 시점의 평결에 오늘 가격을 넣으면 지평이 90일, 100일로 제멋대로 늘어난 라벨이 됩니다. 그래서 소급 채점은 저장된 일봉에서 ‘그때 그 날의 종가’ 를 찾아 쓰고, 그 근처에 봉이 없으면 (상장폐지·유니버스 이탈로 수집이 끊긴 경우) 억지로 채우지 않고 건너뜁니다. 되살리는 기능에는 끄고 켜는 스위치를 달아 두었습니다 — 과거를 다시 쓰는 코드는 언제든 멈출 수 있어야 합니다.

무엇을 배웠나

  • 지평을 밝히지 않은 승률은 숫자가 아니라 수사(修辭)다. 같은 29건에서 12건의 평결이 지평만 바꿔 뒤집혔다.
  • 평균 비교는 짝을 지어야 한다. 지평별 전체 평균 비교는 구성이 다른 집단을 겹쳐 놓고 차이를 ‘성과 변화’로 오독하게 만든다.
  • 결측은 분류해야 정보가 된다. ‘미도래·창 안·폐기·진짜 구멍’을 한 칸에 담아두면, 계측 장치가 고장 나도 화면은 평소와 똑같아 보인다.
  • 소급 채점은 그 시점 가격으로만. 오늘 가격으로 과거를 메우는 순간 라벨이 오염되고, 그 라벨로 학습·판단하면 오염이 전략으로 옮아간다.

표본 한계는 분명합니다 — 짝지은 29건은 통계적 결론을 낼 크기가 아니고, 기간도 2026-06-02 ~ 2026-08-03로 특정 국면에 몰려 있습니다. 이 글은 “이 전략이 좋다/나쁘다”가 아니라 “채점 장치를 어떻게 만들어야 나중에 스스로를 속이지 않는가” 에 대한 기록입니다. 결정별 성적 자체는 연구 0001· 연구 0004에, 채점 파이프라인 만드는 법은 연구 0010에 있습니다.

다음 연구 예고: 채점 이전 단계인 주문 로그를 열어, 브로커가 되돌려준 거절 코드와 ‘하루 만에 로그의 대부분을 차지한’ 운영 사고를 전수 해부합니다.

※ 본 글은 정보·교육 목적이며 특정 종목의 매수·매도 권유가 아닙니다. 모든 수치는 위에 명시된 데이터·기간 기준으로 코드로 계산한 값이며, 과거 성과는 미래 수익을 보장하지 않습니다.

📘 이 글, 책으로도 있어요 — 무료 샘플 읽기 · 전자책 보기