실험 0001 · 3년 국채선물 · 2026-09-09 종료

3년 국채선물 종가 방향 예측:
1분봉 회귀 모형과 기준시점 격차 보정의 유효성 검증

제출 시각 이후에 확정되는 채점 기준가를, 사후에 관측되는 값으로 보정할 수 있는가.

폐기 · 가설 기각 1분봉 2016-12-14 ~ 2026-09-07 평가 1,175일 · 2020–2025

이 실험은 채점 기준 시점과 제출 시점의 격차를 사후 관측값으로 보정하면 방향 적중률이 오르는지를 검증했다. 결과는 가설과 반대였고, 검증 과정에서 학습하지 않은 상수 예측이 학습한 모형을 앞선다는 사실이 함께 드러났다.

가설과 결론

가설
채점 기준가 P_ref 는 제출 시각(15:34) 이후에 확정되지만 사후에는 정확히 관측된다. 따라서 모델 예측에서 그 관측값 (드리프트 d)을 차감하면 제출 시점과 채점 기준 시점의 격차가 제거되어 방향 적중률이 상승한다.
결론
기각. 보정한 예측의 적중률은 56.51% 로, 보정하지 않은 예측(56.77%)에도 학습이 없는 규칙(58.61%)에도 미치지 못했다. 원인은 모델 예측오차의 표준편차(2.99틱)가 차감 대상인 드리프트의 크기(중앙값 1.0틱)의 약 세 배라는 데 있다 — 보정은 신호를 정제하는 대신 부호 경계 부근을 뒤집는 잡음으로 작용했다.
부수 결론
같은 평가 구간에서 “항상 하락”이라는 상수 예측만으로 56.09% 가 나온다. 학습한 두 갈래는 이 기준선을 각각 +0.68%p, +0.42%p 넘었을 뿐이다. 이 발견은 후속 실험의 설계(상수 기준선 사전 등록)에 반영했다.

용어 사전

대상은 한국거래소에 상장된 3년 국채선물이다. 아래 기호는 이 문서 안에서만 통용되는 약속이며, 다른 자료를 찾아볼 필요가 없도록 전부 여기에 정의한다.

동시호가
장 마지막에 주문을 모아 한 번에 하나의 가격으로 체결하는 방식. 3년 국채선물은 15:45 에 이 방식으로 당일 종가가 확정된다.
틱(tick)
가격의 최소 변동 단위. 이 상품은 0.01 포인트가 1틱이다. 이 문서의 가격 차이는 전부 틱 정수로 표기한다.
P34
제출 시각(15:34) 기준 가격.
P_ref
채점 기준가. 대회가 채점의 출발점으로 삼는 값으로, 15:35 직전 마지막 체결가다.
P45
정답 가격. 15:45 동시호가로 확정된 당일 종가.
d (드리프트)
제출 이후 1분 동안의 가격 변화, P_ref − P34. 제출 시점에는 알 수 없으나 사후에 정확히 관측된다.
y
모델의 예측 대상, P45 − P34.
ref_tick
채점 대상, P45 − P_ref 를 틱으로 센 값. 이 값의 부호가 정답이다.
ŷ (y-hat)
모델이 예측한 y. 문자 위의 삿갓(^)은 “실측값이 아니라 추정값”을 뜻하는 통계학 표기다.
0틱 무효일
ref_tick 이 0인 날. 상승도 하락도 아니어서 방향이 정의되지 않으므로 학습·채점에서 제외한다(건수는 항상 함께 보고한다).
적중률
방향을 맞힌 날의 비율. 이 대회에는 비용·수수료 개념이 없으므로 손익이 아니라 적중률이 성과 지표다.
누적틱
맞힌 날은 +, 틀린 날은 − 부호로 ref_tick 의 크기를 합산한 값. 적중률이 같아도 변동이 큰 날을 맞혔는지 구분하기 위해 함께 보고한다.
워크포워드 검증
과거 구간으로 학습하고 그 다음 해로 시험하기를 해마다 반복하는 평가 방식. 미래 정보가 학습에 유입되는 것을 막는다.
이항검정 p값
“무작위(적중률 50%)였더라도 이 정도 성적이 우연히 나올 확률”. 작을수록 우연으로 설명하기 어렵다. 이 문서의 p값은 전부 단측이다(“더 나은가”만 검정한다).

문제 정의

참가자는 매일 15:34 까지 당일 종가가 채점 기준가보다 오를지 내릴지를 제출한다. 순위는 적중률로 매기며, 미제출은 오답으로 처리되므로 모든 날에 답해야 한다(이하 “커버리지 100%”).

핵심 난점은 제출 시각과 채점 기준 시점이 어긋난다는 데 있다. 기준가는 15:35 직전 마지막 체결가인데 제출은 그보다 앞서므로, 참가자는 채점의 출발점을 모르는 상태에서 방향을 제출한다.

기준시점 격차의 실측

먼저 격차의 크기를 실측했다. “근월물”(현재 거래가 가장 활발한 만기)을 발행정보 표의 규칙대로 선택해 9년치를 재계산했다.

항목
0틱 무효 — 방향이 정의되지 않는 날22.47%
남은 유효일1,846일
15:34 기준 방향과 실제 정답 부호가 다른16.41%
└ 15:34 기준으로는 0틱이라 방향을 낼 수 없는 날258일
└ 부호가 실제로 반대인 날45일
제출 이후 1분이 1틱 이상 움직인 날56.8%
정답 크기가 정확히 1틱인 날47.1%

대상일 2,381(봉 누락일 제외). 출처 results/20260909T162843_flip/.

정답 크기의 절반가량이 1틱인데 제출 이후 1분이 그만큼 움직인다. 따라서 15:34 가격만으로 답하는 예측기는 완벽하더라도 적중률 상한이 83.6%다. 이 실험은 그 상한을 걷어내려는 시도다.

정답과 드리프트의 분포 히스토그램 둘
왼쪽이 채점 대상 ref_tick, 오른쪽이 제출 이후 1분 드리프트 d. 가로축은 둘 다 틱이다. 두 분포의 폭이 같은 자릿수라는 점이 이 문제의 본질이다 — 오른쪽이 0 부근에 몰려 있었다면 격차 자체가 문제가 되지 않았다.
연도별 부호가 뒤집히는 비율 막대 그래프
연도별로 12.3%~20.7%이며 9년 내내 예외 없이 나타난다. 특정 시기의 현상이 아니라 대회 규칙이 만든 구조적 격차라는 뜻이다. 붉은 파선이 전체 평균 16.41%.

데이터 요약

내용기간 · 규모해상도쓰임
price_data_f3y_1m_raw 3년 국채선물 1분봉 (인포맥스 단말, 연도별 CSV 11개) 2016-12-14 ~ 2026-09-07
대상일 2,385 · 약 90만 행
1분
일 약 420봉 (08:46~15:45)
라벨과 피처 모두
futures_issuance_info 선물 종목별 거래개시일·최종거래일 상장 전 종목 종목 단위 당일 근월물 선택

코스콤 실시간이 아니라 단말 저장분이다. 종가 축은 코스콤과 별도로 대조해 두었다(피처 모듈 독스트링).

표본 선정 절차

단계잔여 일수제외 사유
1분봉이 존재하는 모든 날2,385
− 봉 누락2,381세 시각(15:34·15:35·15:45) 중 하나라도 없는 날 4일
− 0틱 무효1,846정답이 0틱이라 방향이 정의되지 않는 날 535일 (22.4%)
= 평가 표본 (2020–2025)1,1752017–2019 는 학습에만 사용

동일 일자에 두 계약이 혼재하는 문제를 먼저 차단했다. 만기 전환(롤) 시기에는 하루에 두 종목의 봉이 함께 존재한다 (전체의 30.8%, 연도별 12.8%~72.0%). 종목을 고정하지 않고 날짜로만 집계하면 서로 다른 계약의 가격이 섞여 연도별 비교가 정확히 무효화된다. 피처 생성 단계에서 당일 근월물 코드로 먼저 필터링하며, 코드가 둘 이상인데 선택 근거가 없으면 임의로 하나를 택하지 않고 오류를 발생시킨다.

피처 구성

가격의 종가 축만 사용한다 — 거래량은 포함하지 않았다. 일중 다섯 시각(14:00 · 15:00 · 15:20 · 15:30 · 15:34)에서 각각 아래 여섯 개를 생성한다.

이름정의
ret_5 / ret_10 / ret_20 / ret_60 해당 시각까지 5·10·20·60분 동안의 가격 변화(틱)
rng_20최근 20분의 고가−저가(틱) — 해당 구간의 변동 폭
pos_20최근 20분 범위 내 현재가의 상대 위치(0=최저, 1=최고)

드리프트 d 는 피처에 포함하지 않는다. 제출 시점에 알 수 없는 값이므로 학습에 넣으면 미래 정보 누설이 된다. 노트북이 실행 중에 피처 목록에 d 가 없음을 확인하고, 포함돼 있으면 그 지점에서 중단한다.

여섯 피처의 상관행렬 히트맵
피처 간 중복 정도(1에 가까울수록 같은 정보를 담는다). 수익률 네 개는 시간 창이 겹치는 만큼 서로 유사하고 rng_20· pos_20 은 거의 독립이다. 정보가 중복돼 무의미해진 집합은 아니다 — 따라서 이후의 실패를 “관측할 정보가 없었다”로 설명할 수 없다.

모델과 학습 설정

결정트리를 순차적으로 이어 붙여 예측을 보정하는 그래디언트 부스팅 (LightGBM 구현)을 사용했다. 분류가 아니라 회귀다 — 상승·하락이 아니라 y몇 틱인지를 예측하고, 방향은 그 결과의 부호로 읽는다.

그림 A · 모델 구조 — 1분봉 회귀 + 관측 드리프트 보정 (시험 2025 모델, 학습 2016~2024) 입력 데이터 3년 국채선물 1분봉 2016-12-20 ~ 2026-09-07 결정시각 5개 × 유효일 학습 표 9,224행 0틱 무효일 제외 피처 6개 / 결정시각 종가 축만 사용 ret_5 · ret_10 ret_20 · ret_60 rng_20 · pos_20 드리프트 d 는 입력 아님 그래디언트 부스팅 결정트리 (LightGBM · 회귀) — 시험 2025 모델 f₁ f₂ f₃ f₄ f₅ ··· f₄₀₀ 위는 이 모델 트리 5그루와 마지막 그루의 실제 위상(점 = 잎) — 실물은 그림 B·C ŷ(x) = f₁(x) + f₂(x) + … + f₄₀₀(x) 잎값에 학습률 0.03 이 이미 곱해져 있다 · f₁ 에 평균(초기값) 포함 출력 ŷ = 예상 틱 수 ↓ 부호 상승 / 하락 매일 1건 제출 하이퍼파라미터 — 세팅한 상한과 학습이 실제로 닿은 값 n_estimators = 400 이어 붙이는 트리 개수 — 위 f₁ … 가 이만큼 실제 400그루 max_depth = 4 뿌리(깊이 0)에서 잎까지 분기 최대 4번 — 그림 B·C 의 오른쪽 눈금 실제 깊이 전부 4 · 상한에 닿은 트리 400/400 num_leaves = 15 트리 한 그루의 잎(끝 상자) 최대 개수 실제 잎 5~15개 · 상한에 닿은 트리 2/400 min_data_in_leaf = 50 잎 하나에 학습 표본 50개 미만이면 그 분기를 하지 않는다 실제 가장 작은 잎 n=50 feature_fraction = 0.8 트리마다 피처 6개 중 80%만 무작위로 후보에 올린다 → 그림 D 의 피처별 분기 횟수가 고르게 퍼지는 이유 learning_rate = 0.03 트리 하나가 더하는 값 = 적합값 × 0.03 (아래 잎값에 이미 곱해져 있다) 작을수록 트리 한 그루의 발언권이 작다 그루별 잎 수 분포 5 6 7 8 9 10 11 12 13 14 15 ← 상한 15 이 실험의 가설 — 출력 직전에 관측된 드리프트를 뺀다 (c) 보정 없음 sign(ŷ) → 방향 (d) 보정 — 가설 sign(ŷ − d) → 방향 d = P_ref − P34 제출 시점엔 모르지만 사후에 정확히 관측된다
입력에서 제출까지 한 장으로. 가운데 상자의 작은 트리들은 모식도가 아니라 시험 2025 모델의 f₁~f₅ 와 f₄₀₀ 의 실제 모양이다(잎 하나가 점 하나). 아래 띠는 세팅한 상한과 학습이 실제로 닿은 값 — 400그루 중 400그루가 깊이 4 에 닿았고, 잎 상한 15 에 닿은 트리는 2그루다. 트리를 멈춘 것은 잎 상한이 아니라 깊이 상한과 잎당 표본 50(가장 작은 잎 n=50)이다. 맨 아래 갈래 둘이 이 실험의 전부 — 같은 모델의 같은 출력 ŷ 를 두고 부호를 그대로 읽느냐(c) 관측된 드리프트 d 를 뺀 뒤 읽느냐(d)만 다르다.
그림 B · 첫 트리 f₁ 의 실제 분기 — 시험 2025 모델 (학습 7,564행) 깊이 0 · 뿌리 분기 조건 · n 깊이 1 분기 조건 · n 깊이 2 분기 조건 · n 깊이 3 분기 조건 · n 깊이 4 · 잎 분기 없음 max_depth = 4 뿌리→잎 분기 4번까지 이 트리 실제 깊이 4 아니오 아니오 아니오 아니오 아니오 아니오 아니오 아니오 rng_20 ≤ 16.5 n=7,564 ret_20 ≤ 1.5 n=7,513 rng_20 ≤ 10.5 n=6,006 ret_60 ≤ -6.5 n=5,902 잎값 -0.0600 n=297 잎값 -0.0778 n=5,605 pos_20 ≤ 0.1667 n=104 잎값 -0.1217 n=51 잎값 -0.1023 n=53 rng_20 ≤ 4.5 n=1,507 ret_60 ≤ 0 n=784 잎값 -0.0580 n=186 잎값 -0.0701 n=598 ret_5 ≤ 0 n=723 잎값 -0.0375 n=156 잎값 -0.0561 n=567 잎값 -0.1559 n=51 잎값 ≥ 0 (예측을 위로) 잎값 < 0 (예측을 아래로) n = 그 노드에 떨어진 학습 표본 수 · 조건(≤)이 참이면 왼쪽 가지 '예', 거짓(>)이면 오른쪽 '아니오'
f₁ 은 잔차가 아니라 y_tick 자체를 맞추는 첫 트리라 구조가 가장 크다. 뿌리에서 rng_20 ≤ 16.5 로 갈리고(왼쪽이 참), 각 상자의 n 은 학습 표본 7,564행 중 그 노드에 떨어진 수다. 잎값은 이 트리가 예측에 더하는 틱 수로 학습률 0.03 이 곱해진 뒤의 값이다. 오른쪽 눈금이 max_depth = 4 가 가리키는 구간 — 뿌리 아래 첫 분기부터 잎까지 분기 4번이다.
그림 C · 마지막 트리 f₄₀₀ 의 실제 분기 — 같은 모델 깊이 0 · 뿌리 분기 조건 · n 깊이 1 분기 조건 · n 깊이 2 분기 조건 · n 깊이 3 분기 조건 · n 깊이 4 · 잎 분기 없음 max_depth = 4 뿌리→잎 분기 4번까지 이 트리 실제 깊이 4 아니오 아니오 아니오 아니오 아니오 아니오 ret_60 ≤ 11.5 n=7,564 ret_60 ≤ 8.5 n=7,460 rng_20 ≤ 14.5 n=7,349 ret_60 ≤ -11.5 n=7,297 잎값 -0.0104 n=108 잎값 -0.000001 n=7,189 잎값 +0.0145 n=52 ret_5 ≤ 0 n=111 잎값 +0.0008 n=51 잎값 +0.0149 n=60 ret_5 ≤ 1.5 n=104 잎값 -0.0078 n=51 잎값 -0.0031 n=53 잎값 ≥ 0 (예측을 위로) 잎값 < 0 (예측을 아래로) n = 그 노드에 떨어진 학습 표본 수 · 조건(≤)이 참이면 왼쪽 가지 '예', 거짓(>)이면 오른쪽 '아니오'
f₄₀₀ 은 앞선 399그루가 남긴 잔차를 맞추는 마지막 트리다. 잎값의 절댓값이 f₁ 보다 작다 — 뒤로 갈수록 보정할 것이 줄기 때문이다. 이 트리의 깊이 4 · 잎 7개.
그림 D · 400그루 전체에서 어느 깊이에서 어느 피처로 갈랐나 (시험 2025 모델)
분기 위치 \ 피처ret_60rng_20ret_20ret_10pos_20ret_5
깊이 0 (뿌리)1706685271537400
깊이 120699831152095618
깊이 215716512913812284795
깊이 322617412212417694916
분기 합7595044194043333102,729
손실 감소(gain) 몫25.4%21.3%18.1%14.1%11.1%10.0%100%

위 표는 시험 2025 모델 400그루의 분기 전부를 깊이별·피처별로 센 것이다. 뿌리(깊이 0) 행이 각 트리가 가장 먼저 보는 피처고, 마지막 행은 분기가 손실을 줄인 몫(gain)의 피처별 비율이다. feature_fraction = 0.8 때문에 트리마다 후보 피처가 달라 분기가 한 피처에 몰리지 않는다. 아래 표는 폴드 여섯 개 모델 각각의 첫 트리 뿌리 분기 — 학습창이 길어지며 뿌리 조건이 어떻게 바뀌는지다.

표 · 폴드별 모델 — 시험연도마다 다시 적합한 모델 여섯 개. 「재현」은 커밋된 predictions.csv 와 소수점 열 자리까지 일치를 확인한 예측 건수(15:34 결정시각).
시험연도학습 행시험 행재현f₁ 뿌리 분기깊이잎 수
20202,652912183ret_20 ≤ 045~14
20213,564975195rng_20 ≤ 7.545~14
20224,5391,050210ret_5 ≤ 2.545~15
20235,589990198ret_20 ≤ 1.545~15
20246,579985197rng_20 ≤ 13.545~15
20257,564960192rng_20 ≤ 16.545~15
항목설명
구현 · 버전LightGBM 4.7.0 회귀CPU 전용
예측 대상y (틱 정수)P45 − P34
max_depth4트리 한 그루의 최대 깊이
num_leaves15트리 한 그루의 최대 잎 수
min_data_in_leaf50잎 하나에 필요한 최소 표본 수
learning_rate0.03트리 하나가 예측을 보정하는 보폭
n_estimators400이어 붙이는 트리 개수
feature_fraction0.8트리마다 피처의 80%만 사용
학습·평가 분할연도 확장창2017~Y−1 로 학습하고 Y 를 시험, Y=2020…2025
제출 시각15:34다섯 결정시각 중 채점에 사용하는 시각
난수 시드단일이 설정에는 무작위 요소가 없어 결과가 재현된다

위 값은 실행 전에 config.yaml 에 고정했으며 결과를 확인한 뒤 변경하지 않았다. 사전 고정 항목은 protocol.md 에 있다.

비교 대상 설계

갈래방향 결정 방식
(a) 무작위동전 던지기(고정 시드) — 하한 확인용
(b) 규칙최근 20분이 상승이면 상승, 하락이면 하락. 학습이 없는 고정 규칙
(c) 보정 없음모델 예측의 부호 그대로: ŷ > 0 → 상승
(d) 보정이 실험의 가설. 관측된 드리프트를 차감한 뒤 부호를 읽는다: ŷ − d > 0 → 상승

가설의 근거는 단순한 항등식이다. 정답은 P45 − P_ref = (P45 − P34) − (P_ref − P34) 로 분해되는데, 앞항은 모델이 예측하고 뒷항은 사후에 봉 두 개의 차이로 정확히 관측된다. 따라서 뒷항을 차감하면 제출 시점이 만든 격차가 제거되어야 한다.

결과

갈래평가일적중률이항 p(단측)누적틱
(a) 무작위1,17551.06%0.2423
(b) 규칙 20분94758.61%6.6e-08390
(c) 보정 없음1,17556.77%2.0e-06315
(d) 보정1,17556.51%4.5e-06277
아래 세 행은 결과를 확인한 뒤 추가한 사후 비교다 — 위 판정을 변경하지 않는다
(c) 를 (b) 와 같은 날만94757.02%8.7e-06264
(d) 를 (b) 와 같은 날만94756.49%3.6e-05214
규칙 우선 + 규칙 미제출 228일만 모델1,17558.21%9.9e-09453

출처 results/20260909_184746_nb/. (b) 의 평가일이 적은 이유는 최근 20분 변화가 정확히 0일 때 방향을 내지 않기 때문이다 (1,175일 중 947일 제출 = 커버리지 80.6%).

가설은 기각됐다. 보정한 (d) 가 보정하지 않은 (c) 에도, 규칙 (b) 에도 미치지 못했다. 평가일 수를 맞춰 재비교해도 결과는 같다(56.49% < 57.02%) — 두 비교 방식 모두에서 보정이 손해다.

연도별 네 갈래 적중률 막대 그래프
연도별로 나누면 보정이 유리한 해는 2024·2025 두 해뿐이고 나머지 네 해는 보정하지 않은 쪽이 낫다. 2022 는 53.81%에서 50.00%까지, 즉 무작위 수준으로 하락한다. 검은 점선이 50%. 학습이 없는 규칙 (b) 가 여섯 해 중 다섯 해에서 두 모델보다 위에 있다.

보정이 적중률을 낮춘 원인

두 가지 설명이 가능하며, 수치로 판별했다.

  1. 모델 오차가 차감 대상보다 훨씬 크다 — 이쪽이 원인이다. 예측과 실측의 차이(잔차)의 표준편차가 2.99틱인데, 차감하려는 d 는 평균 0.768틱·중앙값 1.0틱이다. 3틱 규모의 변동 위에서 1틱을 차감하는 조작은 신호를 정제하기보다 부호 경계 부근을 뒤집는 잡음으로 작용한다.
  2. 모델이 드리프트를 이미 학습해 이중 차감이 됐다 — 기각. 예측값과 드리프트의 상관계수가 0.034이고, 피처 네 개와 드리프트의 상관도 모두 0.02~0.07이다. 사실상 무관하다.

확률 환산과 확신도 선별

대회는 방향만 제출하지만, 예측의 확신도를 알 수 있다면 활용 여지가 있다. 그래서 예측을 상승 확률로 환산했다 — 잔차가 정규분포를 따른다고 보고 Φ((ŷ − d) / σ̂) 로 변환했다(Φ 는 표준정규 누적분포함수, σ̂ 는 잔차 표준편차의 추정값). σ̂ 는 시험 연도를 참조하지 않는다 — 연도 Y 의 값은 Y−1 의 잔차로 산출하며 그 모델은 Y−1 이전만 학습한다.

확률로그손실 ↓Brier ↓AUC ↑
보정한 확률0.73050.26040.567
보정하지 않은 확률0.69170.24900.567
무정보(항상 0.5)0.69310.25000.500

로그손실Brier 점수는 확률 예측의 정확도를 재는 지표로 작을수록 좋다. AUC 는 확률로 상승일과 하락일을 분리하는 능력이며 0.5 가 무작위 수준이다. 출처 results/20260910_163659_nb/ · 평가 1,175일.

보정한 확률이 무정보 예측보다 나쁘다(0.7305 > 0.6931). 아무 정보 없이 50%를 답하는 편이 이 모델의 확률보다 낫다는 뜻이다.

예측 확률 대 실제 상승 비율 곡선
가로축이 모델이 산출한 상승 확률, 세로축이 해당 구간에서 실제로 상승한 비율이다. 잘 보정된 확률이라면 대각선에 근접한다. 단조성도 없고 크게 이탈한다 — 확률 0.9~1.0 구간의 실제 상승률이 41.2%로 전체 평균(43.9%)보다도 낮다. 즉 모델의 확신이 클수록 오히려 틀리는 구간이 존재한다. 양 끝은 표본이 얇지만, 표본이 두꺼운 중간 구간에서도 대각선을 따라가지 못한다.
  • 확신도와 정오의 순위상관 (규칙 미제출 228일)0.061 · p=0.363 → 무관
  • 확신도 상위 30%의 적중률 (전체 56.51%)59.09%
  • 0틱일을 사전에 선별할 수 있는가 (AUC)0.523
  • 확신도 하위 10%의 0틱 비율 vs 전체17.0% vs 20.2%

마지막 항목이 특히 명확하다. “예측이 0에 가까운 날이 0틱일과 겹칠 것”이라는 기대와 반대로, 그런 날에 0틱이 오히려 발생한다. 모델은 방향을 모를 뿐 아니라 자신이 언제 확신할 수 있는지도 모른다.

사후 발견 — 상수 예측 기준선

실험을 모두 수행한 뒤에야 확인됐다 — 같은 1,175일에서 실제로 상승한 날이 43.9%다. 즉 아무것도 학습하지 않고 “항상 하락”이라고만 답해도 56.09% 다. 위 표의 (c)·(d) 는 그 바로 위에 있을 뿐이며, p값이 작게 나온 것은 비교 기준을 50%로 두었기 때문이지 이 기준선을 넘어서가 아니다.

56.09%“항상 하락” 상수 기준선
56.51%보정 — 기준선 대비 +0.42%p
58.21%규칙+모델 혼합 — 유일하게 뚜렷이 상회

이 발견이 후속 실험의 설계를 바꿨다 — 거기서는 이 상수 기준선을 실행 전에 사전 등록했고, 그 덕분에 처음부터 판정 기준으로 작동했다.

결론과 후속 실험 반영 사항

  1. 제출 시점이 만드는 적중률 상한의 정식 수치(부호 뒤집힘 16.41%, 0틱 22.47%). 이후의 모든 판정이 이 수치 위에서 해석된다.
  2. 비교 갈래에 상수 기준선을 반드시 포함해야 한다. 이 실험에서는 사후에 드러났고, 후속 실험에서 사전 등록 항목으로 전환했다.
  3. 확신도의 유효성을 모델 성능보다 먼저 검증하라. 확신도가 무정보이면 그 위에 어떤 선별 전략도 얹을 수 없다 — 이 프로젝트는 같은 벽에 세 번 부딪혔다.
  4. 규칙 우선 + 모델 폴백 혼합이 커버리지 100%를 만족하는 유일한 후보였다(58.21%). 다만 상수 기준선 대비로는 +2.12%p 에 불과하다는 점이 후속 실험의 비교에서 드러난다.

한계와 유효성 위협 요인

커밋된 결과는 “비표준 세션” 가드 적용 이전 판이다. 거래소는 수능일에 개장을 1시간 늦추고 16:45 에 마감하는데, 라벨 생성 코드가 15:45 를 상수로 사용해 그날 장중 구간을 정답으로 산출했다. 가드 적용 후 재실행하면 평가 표본에서 4일이 제외되고 학습 행도 달라진다 — 제외되는 날이 전부 정답/전부 오답이었다는 양극단 가정에서 (d) 의 적중률 변화 상한은 −0.15~+0.19%p 이므로 결론은 뒤집히지 않는다.

비용·체결 가정이 없다. 이 대회가 방향만 채점하기 때문이며 의도적 누락이 아니다. 실제 매매로 옮기려면 수수료·슬리피지·한도를 확정한 뒤 재계산해야 한다.

규칙 (b) 는 모든 날에 제출하지 않는다(커버리지 80.6%). 그 자체로는 제출 모델이 될 수 없어 혼합 갈래를 별도로 두었다.

결과표 하단 세 행은 사후에 구성한 비교다. 판정(상단 네 갈래)을 변경하지 않으며, 표 안에 그렇게 명시했다.

산출물 목록

  • 결과와 판정 (수치의 정본)analysis.md
  • 계획과 사전 고정 항목protocol.md
  • 뒤집힘 재측정results/20260909T162843_flip/
  • 확증 런results/20260909_184746_nb/
  • 확률 보정 런results/20260910_163659_nb/
  • 노트북 (이 페이지 그림의 출처)notebooks/01_bar_regression.ipynb