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

3년 국채선물 종가 방향 예측:
체결틱 직접 분류 모형과 상수 예측 기준선 대비 성능 검증

채점 기준가를 거의 관측한 상태에서 방향을 직접 분류하면 제출 시점 격차가 해소되는가.

폐기 · 가설 미지지 체결틱 2023-01-02 ~ 2026-08-13 · 565만 건 평가 388일 · 2024–2025

이 실험의 가치는 실패한 방식에 있다. 설계의 전제 — 기준가를 관측하면 제출 시점이 만든 격차가 해소된다 — 는 실제로 성립했다(격차가 57.73%에서 24.97%로 축소). 그러나 그것이 적중률로 이어지지 않았다. 즉 축소된 불확실성이 예측 가능한 부분이 아니었다. 이번에는 사전 등록한 상수 기준선이 그 사실을 처음부터 드러냈다.

가설과 결론

가설
체결틱을 사용하면 15:34:58 까지 관측할 수 있으므로 채점 기준가를 거의 아는 상태에서 방향을 직접 분류할 수 있다. 그러면 선행 실험(0001)이 회귀로 메우려 했던 제출 시점 격차가 제거되어 적중률이 선행 실험을 상회한다.
결론
미지지. 격차는 실제로 축소됐으나(57.73% → 24.97%, 2.31배) 적중률은 54.64% 로 선행 실험(60.05%)에도, 사전 등록한 상수 기준선(61.08%)에도 미치지 못했다. 기저율 추정에 의존하지 않는 동일 날짜 짝지은 검정에서도 상수 대비 −6.44%p (b=58, c=83, p=0.043)다. 가설이 예측한 것과 방향 자체가 반대다.
부수 결론
사전 등록한 판정 기준 셋이 모두 구조적으로 통과 불가능한 형태였다(미결제약정 완전 일치 · 시드 분산의 2배 · 갈리는 날 각자 50% 초과). 사전 등록은 값을 미리 정하는 것만이 아니라 그 기준이 판정 능력을 갖는지를 미리 확인하는 것까지 포함해야 한다.

용어 사전

선행 실험(0001)과 중복되는 항목도 있으나 여기서 다시 정의한다 — 이 문서 하나만으로 읽히게 하기 위해서다.

동시호가
장 마지막에 주문을 모아 한 가격으로 체결하는 방식. 3년 국채선물은 15:45 에 이 방식으로 당일 종가가 확정된다.
틱(tick)
가격의 최소 변동 단위. 이 상품은 0.01 포인트가 1틱이다.
체결틱 (trade tick)
체결이 일어날 때마다 한 줄씩 쌓이는 기록(시각·가격·수량 등). 1분봉이 1분을 한 줄로 요약한 것이라면, 체결틱은 개별 거래 단위다.
호가
매수·매도 의사로 제출된 주문의 가격과 수량. 이 실험이 사용하는 체결틱 표에는 호가가 없다 — 따라서 생성 가능한 피처가 제한된다.
틱규칙 (tick rule)
호가 정보가 없을 때 체결이 매수 주도인지 매도 주도인지 직전 체결가와 비교해 추정하는 방법. 상승이면 +1, 하락이면 −1.
미결제약정
아직 청산되지 않고 남아 있는 선물 계약 수. 증가는 신규 포지션 유입, 감소는 청산으로 해석한다.
P_ref (기준가)
대회 채점의 출발점. 15:35 직전 마지막 체결가.
P45
정답 가격. 15:45 동시호가로 확정된 당일 종가.
P_obs_3458
이 실험이 제출 시점에 실제로 보는 값 — 15:34:58 까지의 마지막 체결가. 기준가와 동일하지 않다(차이는 뒤에서 실측한다).
0틱 무효일
정답이 0틱이라 방향이 정의되지 않는 날. 학습·채점에서 제외하되 건수는 항상 함께 보고한다.
기저율 · 다수 클래스
해당 기간에 상승한 날의 비율이 기저율이고, 더 많은 쪽이 다수 클래스다. 예컨대 상승일이 39%면 다수 클래스는 “하락”이며, 매일 하락이라고만 답해도 61%를 맞힌다.
상수 기준선
학습 없이 매일 같은 방향만 제출하는 갈래. 여기서는 “매일 하락”. 모델이 이 수준을 넘지 못하면 학습의 의미가 없다.
사전 등록
실험 실행 전에 판정 기준과 설정을 파일에 고정하는 것. 결과를 확인한 뒤 유리한 방향으로 기준을 변경하는 일을 막는다.
McNemar 검정
두 방식을 동일 날짜에 짝지어 비교하는 방법. “둘 다 맞힌 날”과 “둘 다 틀린 날”은 제외하고 한쪽만 맞힌 날의 개수만 비교한다. 기저율을 추정할 필요가 없으므로 이 실험의 판정 근거로 사용한다.
b · c
McNemar 표에서 b는 그 갈래만 맞힌 날 수, c는 상수 기준선만 맞힌 날 수. b < c 이면 상수가 더 우수하다는 뜻이다.
난수 시드
학습에 무작위 요소가 있을 때 그 난수를 고정하는 값. 시드를 바꿔 반복 실행하면 결과의 변동 폭을 알 수 있다.
워크포워드 검증
과거 구간으로 학습하고 그 다음 해로 시험하기를 해마다 반복하는 평가 방식. 미래 정보가 학습에 유입되는 것을 막는다.
적중률
방향을 맞힌 날의 비율. 이 대회에는 비용·수수료 개념이 없으므로 손익이 아니라 적중률이 성과 지표다.
누적틱
맞힌 날은 +, 틀린 날은 − 부호로 정답 크기(틱)를 합산한 값. 적중률이 같아도 변동이 큰 날을 맞혔는지 구분하기 위해 함께 보고한다.
이항검정 p값
“무작위(적중률 50%)였더라도 이 정도 성적이 우연히 나올 확률”. 작을수록 우연으로 설명하기 어렵다. 이 문서의 p값은 McNemar 검정을 제외하면 전부 단측이며, 양측인 경우 표에 그렇게 표기했다.

선행 실험과의 관계

선행 실험(0001)은 15:34 시점의 1분봉까지만 관측하고 그 이후 1분의 변화를 회귀로 추정해 보정하려다 실패했다 — 모델 오차(2.99틱)가 보정 대상(약 1틱)의 세 배였다.

이 실험은 접근을 바꾼다. 격차를 추정으로 메우는 대신 관측으로 없앤다 — 체결틱을 사용하면 15:34:58 까지 볼 수 있기 때문이다. 대가는 표본 길이다: 1분봉 9년 대신 체결틱 2년을 쓰고, 그 대신 시간 해상도를 분에서 초로 높인다.

데이터 요약

무엇기간 · 크기해상도쓰임
선물3년_체결틱 3년 국채선물 체결 기록 (mficc 덤프, CSV 29조각) 2023-01-02 ~ 2026-08-13
873일 · 5,654,218건
체결 1건 = 1행
시각은 단위
피처
price_data_f3y_1m_raw 3년 국채선물 1분봉 (인포맥스 단말) 같은 기간의 899 거래일 1분 라벨(정답) — 선행 실험과 동일한 코드로 생성
futures_issuance_info 선물 종목별 거래개시일·최종거래일 상장 전 종목 종목 단위 당일 근월물 선택

체결틱 표의 성질 — 실측한 네 항목

성질실측 내용대응
열 구성일자·시간·가격·수량·금액·미결제약정호가가 없고 종목코드도 없다 호가 불균형 계열 피처가 원리적으로 불가능하다. 매수·매도 주도는 틱규칙으로만 추정한다
정렬하루 안이 대체로 시간 역순인데 873일 중 112일(12.8%)이 그마저 깬다 적재 시 항상 재정렬한다 — 원본 순서를 신뢰하면 방향 판정이 통째로 뒤집힌다
같은 초의 순서초 단위라 한 초에 여러 체결이 들어간다 원본 순서를 복원하는 2차 정렬 키를 추가했다(없으면 해당 초의 가장 이른 체결을 마지막으로 오인한다)
장 마감 뒤 행873일 전부에 컷오프 이후 행이 있고 871일에 15:45:00 대량 체결이 있다 그 체결가가 곧 정답이다 — 아래 “정답 누설 차단” 절 참조
하루 체결 건수와 총 수량의 분포 히스토그램 둘
제출 컷오프(15:34:58) 이전까지의 하루 체결 건수(왼쪽)와 총 수량(오른쪽). 하루 1,000~3,000건대에 몰려 있고 꼬리가 길다 — 초 단위 집계로 피처를 만들 만한 밀도는 있다는 첫 확인이다.

표본 선정 절차

단계잔여 일수제외 사유
1분봉이 존재하는 날 (라벨 생성 가능일)899
− 0틱 무효728정답이 0틱이라 방향이 정의되지 않는 날 171일 (19.02%)
− 체결틱이 없는 날705덤프에 해당 일자가 없거나 비어 있어 피처를 생성할 수 없다
= 평가 표본 (2024–2025)3882023 은 학습에만 사용

연도별 표본: 2023년 197 · 2024년 197 · 2025년 191 · 2026년 120(미사용).

연도별 상승·하락 비율 누적 막대
해마다 오른 날과 내린 날의 비율(0틱 무효일 제외). 2024·2025는 하락이 뚜렷한 다수로 평가 구간의 상승 비율이 38.92%다. 이것이 뒤에 나올 상수 기준선의 근거다. 동시에 학습에 쓸 2023년은 48.5%로 거의 반반인데, 그 값으로 기준선의 방향을 미리 정했다.

기준가 관측 수준의 검증

설계의 전제를 먼저 검증한다. “거의 안다”가 정량적으로 얼마인가? 관측 경계를 어디에 두느냐에 따라 답이 달라지며, 세 경계는 서로 다른 질문에 답한다.

경계기준가와 정확히 같은 날1틱 이내최대 차이이 수치가 답하는 질문
아무 필터 없이 그날 마지막 행19.36%53.2%18틱(동시호가 체결에 오염된 값 — 사용하지 않는다)
15:34:58까지 = 모델이 보는 값75.03%99.8%2틱제출 시점에 기준가를 얼마나 아는가
15:35:00 직전 = 진짜 기준가 경계100.00%100%0틱이 틱 표가 1분봉과 같은 계약인가

873일 전수 대조.

맨 아래 100.00%(873일 전부, 최대 차이 0틱) 는 체결틱 표와 1분봉이 동일 계약임을 확정한다(다른 만기로 대조하면 3.94%로 떨어진다). 다만 모델이 실제로 관측하는 값은 가운데 75.03% 다 — 이 실험은 기준가를 아는 것이 아니라 거의 아는 것이며, 격차를 제거한 것이 아니라 축소했다.

앞 실험과 이 실험의 남은 공백 크기 비교 막대
설계가 성공한 지점. 같은 날짜 집합에서 “기준가를 모르는 정도”가 0이 아닌 날의 비율 — 앞 실험 57.73%, 이 실험 24.97%로 2.31배 줄었다. 전제는 맞았다. 문제는 이것이 적중률로 옮겨오지 않았다는 것이고, 그게 뒤에 나온다.

정답 누설 차단

체결틱 873일 전부에 컷오프 이후 행이 있고, 871일에 거래량이 큰 15:45:00 체결이 있다. 그 가격은 1분봉의 15:45 종가, 즉 정답과 0틱 일치 99.89%(870/871)다 — 실제 동시호가 체결이다. 원래 계획서는 하루치만 확인하고 “체결틱 표에 동시호가 체결이 없다”고 기술했다. 피처가 이 행을 한 번이라도 흡수하면 정답을 직접 관측하는 것이므로 실험 전체가 무효가 된다.

따라서 컷오프 함수를 하나로 통합하고, 피처 생성 경로가 반드시 그 함수를 거치도록 했다. 그리고 그 가드를 실제로 되돌려 터뜨려 봤다.

오염 전후 피처 비교 — 달라진 칸 0
컷오프 이후 4,501행 전부(15:45 동시호가 체결 892행 포함)를 가격 199.99 · 수량 999999 라는 비정상 값으로 치환한 뒤 피처를 재생성해 873일 × 11열 = 9,603칸을 대조했다 — 달라진 칸 0개. 오염 대상이 “사용되지 않는 행”이 아니라 가드가 깨질 경우 정확히 유입될 그 행들이라는 점이 이 검사의 핵심이다. 이 그림은 리포트를 쓰면서 같은 오염을 다시 돌려 얻은 것이다.

피처 구성

컷오프 이전 체결만 집계해 하루당 값을 생성한다. 생성되는 열은 11개지만 모델에 넣는 것은 아래 10개다 — P_obs_3458 은 제외한다.

이름정의
n_trades_5m · qty_5m마지막 5분의 체결 건수와 총 수량
big_ratio_5m5분 수량 중 대량 체결(100계약 이상)이 차지하는 비율
tickrule_5m5분 동안 틱규칙 부호의 평균 — +1 에 가까울수록 매수 주도
gap_mean_5m체결 간 평균 간격(초) — 거래 밀도의 지표
rv_5m5분 실현변동성 — 가격 변화 제곱의 합
oi_chg_5m5분 동안 미결제약정 변화
ret_1m · ret_5m · ret_20m최근 1·5·20분의 가격 변화(틱)
아래는 같은 계산에서 나오지만 모델 입력이 아니다
P_obs_3458 컷오프 시점의 마지막 체결가. 기준가를 얼마나 아는지 재는 데 쓴다(앞 절의 75.03% 표). 가격 수준이라 그대로 넣으면 학습 구간의 금리대에 모델이 맞춰지므로 입력에서 뺐다 — 가격 정보는 수준이 아니라 변화(ret_*)로 들어간다.

피처 목록의 정본은 contest_features_tick.TICK_FEATURE_COLUMNS 이고, 노트북이 학습 직전에 P_obs_3458 이 빠졌는지 단언한다.

학습 피처 10개의 상관행렬 히트맵
학습에 쓰는 피처 10개의 중복 정도(1 에 가까울수록 같은 정보를 담는다). 수익률 계열끼리 유사한 것을 제외하면 대체로 독립이다 — 중복으로 정보가 소실된 집합은 아니다.
학습 피처 10개의 분포 히스토그램
피처 열 개의 분포. n_trades_5m·qty_5m· rv_5m·gap_mean_5m 은 오른쪽 꼬리가 길고, tickrule_5m 과 수익률 셋은 0 을 중심으로 대칭이다. oi_chg_5m 의 왼쪽 꼬리(최대 −3만 계약대)는 만기 전환 구간의 대량 청산이다. 죽은 열(상수·전부 결측)이 하나도 없다는 것이 여기서 확인하려던 것이다.
대량 체결 기준 후보별 분포
“대량 체결”의 기준 계약 수를 정한 근거. 100 을 유지했다 — 전체 체결의 93.6% 분위이며, 더 높이면 해당 값이 0 인 날이 급증해 피처가 무의미해진다. 학습 구간(2023)만으로 재측정해도 동일한 결론이었다.

모델과 학습 설정

선행 실험과 같은 계열(그래디언트 부스팅, LightGBM 구현)이지만 이번에는 분류다 — 몇 틱인지가 아니라 상승·하락을 직접 예측한다.

그림 A · 모델 구조 — 체결틱 직접 분류 (시드 0 · 시험 2025 모델, 학습 2023~2024) 입력 데이터 3년 국채선물 체결틱 (근월물) 2023-01-02 ~ 2026-08-13 컷오프 15:34:58 까지만 학습 표 705행 (하루 = 한 행) 0틱 무효일 제외 틱 피처 10개 / 일 컷오프 전 5분·1분·20분 창 n_trades_5m · qty_5m big_ratio_5m · tickrule_5m gap_mean_5m · rv_5m · oi_chg_5m ret_1m · ret_5m · ret_20m 그래디언트 부스팅 결정트리 (LightGBM · 이진 분류) — 시드 0 · 시험 2025 모델 f₁ f₂ f₃ f₄ f₅ ··· f₃₀₀ 위는 이 모델 트리 5그루와 마지막 그루의 실제 위상(점 = 잎) — 실물은 그림 B·C log-odds(x) = f₁(x) + f₂(x) + … + f₃₀₀(x) 잎값 = 로그오즈 기여(학습률 0.03 반영) · f₁ 에 학습창 기저율 포함 출력 p(상승) = σ(Σ f) ↓ 0.5 기준 상승 / 하락 매일 1건 제출 하이퍼파라미터 — 세팅한 상한과 학습이 실제로 닿은 값 n_estimators = 300 이어 붙이는 트리 개수 — 위 f₁ … 가 이만큼 실제 300그루 max_depth = 3 뿌리(깊이 0)에서 잎까지 분기 최대 3번 — 그림 B·C 의 오른쪽 눈금 실제 깊이 전부 3 · 상한에 닿은 트리 300/300 num_leaves = 7 트리 한 그루의 잎(끝 상자) 최대 개수 실제 잎 4~7개 · 상한에 닿은 트리 30/300 min_data_in_leaf = 30 잎 하나에 학습 표본 30개 미만이면 그 분기를 하지 않는다 실제 가장 작은 잎 n=20 (하한 30 아래 — 근사 검사, 오류 아님) learning_rate = 0.03 트리 하나가 더하는 값 = 적합값 × 0.03 (아래 잎값에 이미 곱해져 있다) 작을수록 트리 한 그루의 발언권이 작다 그루별 잎 수 분포 4 5 6 7 ← 상한 7 학습·평가 분할 — 연도 확장창 (워크포워드) 2023 2024 2025 2026 평가 밖 (120일 · 시험연도 아님) 학습 시험 2024 · 197일 학습 시험 2025 · 191일 평가 표본 합 388일 시드 5개 × 폴드 2 = 모델 10개
입력에서 제출까지 한 장으로. 앞 실험과 갈리는 곳은 입력출력 머리 둘이다 — 1분봉 대신 체결틱을 15:34:58 까지 보고, 몇 틱인지를 회귀하는 대신 상승 확률을 바로 분류한다. 가운데 상자의 작은 트리들은 시드 0 · 시험 2025 모델의 f₁~f₅ 와 f₃₀₀ 의 실제 모양이다(잎 하나가 점 하나). 아래 띠는 세팅한 상한과 학습이 실제로 닿은 값 — 300그루 중 300그루가 깊이 3 에 닿았고, 잎 상한 7 에 닿은 트리는 30그루다. 학습 표가 394행뿐이라 잎당 표본 하한 30 이 트리를 자주 멈췄다. 가장 작은 잎이 n=20 로 하한보다 작은 것은 오류가 아니다 — LightGBM 은 이 하한을 히스토그램 위에서 근사로 검사해 실제 표본 수가 하한 아래로 내려갈 수 있다(같은 설정에서 하한을 20 으로 낮추면 예측이 달라지므로 30 이 적용된 것은 맞다).
그림 B · 첫 트리 f₁ 의 실제 분기 — 시드 0 · 시험 2025 모델 (학습 394행) 깊이 0 · 뿌리 분기 조건 · n 깊이 1 분기 조건 · n 깊이 2 분기 조건 · n 깊이 3 · 잎 분기 없음 max_depth = 3 뿌리→잎 분기 3번까지 이 트리 실제 깊이 3 아니오 아니오 아니오 아니오 아니오 ret_1m ≤ 0 n=394 ret_20m ≤ -1.5 n=104 잎값 -0.2362 n=49 잎값 -0.2020 n=55 ret_20m ≤ 1.5 n=290 big_ratio_5m ≤ 0.5463 n=190 잎값 -0.2376 n=84 잎값 -0.2585 n=106 qty_5m ≤ 3720 n=100 잎값 -0.2153 n=70 잎값 -0.2437 n=30 잎값 ≥ 0 (예측을 위로) 잎값 < 0 (예측을 아래로) n = 그 노드에 떨어진 학습 표본 수 · 조건(≤)이 참이면 왼쪽 가지 '예', 거짓(>)이면 오른쪽 '아니오'
f₁ 은 학습창 기저율(로그오즈)에서 출발해 처음 갈라지는 트리다. 뿌리에서 ret_1m ≤ 0 로 갈리고(왼쪽이 참), 각 상자의 n 은 학습 표본 394행 중 그 노드에 떨어진 수다. 잎값은 이 트리가 로그오즈에 더하는 값으로 학습률 0.03 이 곱해진 뒤의 것 — 양이면 상승 쪽, 음이면 하락 쪽으로 민다. 오른쪽 눈금이 max_depth = 3 가 가리키는 구간이다.
그림 C · 마지막 트리 f₃₀₀ 의 실제 분기 — 같은 모델 깊이 0 · 뿌리 분기 조건 · n 깊이 1 분기 조건 · n 깊이 2 분기 조건 · n 깊이 3 · 잎 분기 없음 max_depth = 3 뿌리→잎 분기 3번까지 이 트리 실제 깊이 3 아니오 아니오 아니오 아니오 아니오 아니오 ret_1m ≤ 0 n=394 qty_5m ≤ 4079 n=262 big_ratio_5m ≤ 0.6233 n=199 잎값 +0.0022 n=147 잎값 -0.0118 n=52 rv_5m ≤ 27 n=63 잎값 +0.0247 n=30 잎값 +0.000028 n=33 oi_chg_5m ≤ -42 n=132 rv_5m ≤ 16 n=86 잎값 +0.0129 n=32 잎값 -0.0043 n=54 잎값 -0.0138 n=46 잎값 ≥ 0 (예측을 위로) 잎값 < 0 (예측을 아래로) n = 그 노드에 떨어진 학습 표본 수 · 조건(≤)이 참이면 왼쪽 가지 '예', 거짓(>)이면 오른쪽 '아니오'
f₃₀₀ 은 앞선 299그루가 남긴 잔차를 맞추는 마지막 트리다. 이 트리의 깊이 3 · 잎 7개. 잎의 n 이 수십 개 수준인 곳이 많다 — 표본이 적어 잎당 표본 하한이 곧 트리의 모양이다.
그림 D · 300그루 전체에서 어느 깊이에서 어느 피처로 갈랐나 (시드 0 · 시험 2025 모델)
분기 위치 \ 피처oi_chg_5mtickrule_5mqty_5mret_20mbig_ratio_5mgap_mean_5mret_1mrv_5mn_trades_5mret_5m
깊이 0 (뿌리)343924403422671039300
깊이 11058968556143112795473
깊이 210658726947391739421490
분기 합245186164164142104956751451,263
손실 감소(gain) 몫20.1%14.3%14.7%16.2%10.3%6.0%8.4%4.3%3.6%2.0%100%

위 표는 시드 0 · 시험 2025 모델 300그루의 분기 전부를 깊이별·피처별로 센 것이다. 뿌리(깊이 0) 행이 각 트리가 가장 먼저 보는 피처고, 마지막 행은 분기가 손실을 줄인 몫(gain)의 피처별 비율이다. 아래 표는 모델 열 개(시드 5 × 폴드 2) 각각의 첫 트리 뿌리 분기 — 시드는 LightGBM 의 표본·피처 추출 순서만 바꾸는데, 이 세팅(추출 없음)에서는 같은 폴드의 뿌리가 시드와 무관하게 같은지가 여기서 보인다.

표 · 모델 열 개 — 시드 5개 × 시험연도 2개. 「재현」은 커밋된 predictions.csv 의 pred 와 한 날도 다르지 않음을 확인한 예측 건수.
시드시험연도학습 행시험 행재현f₁ 뿌리 분기깊이잎 수
02024197197197ret_20m ≤ -1.52~34~6
02025394191191ret_1m ≤ 034~7
12024197197197ret_20m ≤ -1.52~34~6
12025394191191ret_1m ≤ 034~7
22024197197197ret_20m ≤ -1.52~34~6
22025394191191ret_1m ≤ 034~7
32024197197197ret_20m ≤ -1.52~34~6
32025394191191ret_1m ≤ 034~7
42024197197197ret_20m ≤ -1.52~34~6
42025394191191ret_1m ≤ 034~7
항목
구현 · 버전LightGBM 4.7.0 분류CPU 전용
예측 대상정답 부호 (상승/하락)
피처 컷오프15:34:58제출 마감 직전 마지막 초
max_depth3트리 한 그루의 최대 깊이
num_leaves7트리 한 그루의 최대 잎 수
min_data_in_leaf30잎 하나에 필요한 최소 표본 수
learning_rate0.03트리 하나가 예측을 보정하는 보폭
n_estimators300이어 붙이는 트리 개수
난수 시드0 · 1 · 2 · 3 · 4다섯 회 반복해 변동 폭을 확인
학습·평가 분할연도 확장창2023 → 2024 시험, 2023+2024 → 2025 시험
사전 등록한 기준선 방향하락학습 구간(2023)의 다수 클래스로 실행 전에 고정

위 값은 실행 전에 config.yaml 에 고정했다. 노트북이 학습 구간에서 다수 클래스를 재계산해 등록값과 일치하는지 확인하고, 다르면 그 지점에서 중단한다.

시드 다섯 개는 결과적으로 무의미했다. 위 설정에는 무작위 요소(표본·피처의 부분 추출 옵션)가 없어 LightGBM 이 완전히 결정적이다 — 다섯 시드의 예측이 모든 날짜에서 동일했고 적중률의 표준편차가 정확히 0 이다. 사후에 bagging 을 활성화해 의미를 부여할 수도 있었으나, 결과를 확인한 뒤 설정을 변경하는 것이므로 수행하지 않았다.

결과

갈래평가일적중률p vs 50%p vs 다수 클래스누적틱
무작위38850.26%0.4801.00054
상수 “매일 하락” — 사전 등록38861.08%7.4e-060.522172
규칙 20분29956.52%0.0140.95349
틱 직접 분류 — 이 실험38854.64%0.0380.99678

평가 2024–2025, 다수 클래스 비율 61.08%. 두 p값은 모두 단측이다. 출처 results/20260910_191958_nb/.

갈래별 적중률 막대와 상수 기준선
가로선이 사전 등록한 상수 기준선이다. 학습한 갈래가 모두 그 아래에 있다. 이 그림 한 장이 이 실험의 결론이며, 기준선을 실행 전에 고정해 두었기 때문에 처음부터 드러났다(선행 실험에서는 모든 실행을 마친 뒤에야 확인됐다).

“p vs 다수 클래스” 열은 액면대로 해석해서는 안 된다. 다수 클래스 비율을 평가 기간에서 추정했으므로, 상수 기준선 행의 p값은 자기 자신을 상대로 검정한 값이어서 의미가 없다. 따라서 추정이 필요 없는 짝지은 검정을 별도로 수행했다 — 아래가 실제 판정 근거다.

동일 날짜 짝지은 비교 (McNemar 검정)

갈래적중률상수 대비b (갈래만 정답)c (상수만 정답)p (양측)
선행 실험 — 드리프트 보정60.05%−1.03%p80840.815
선행 실험 — 보정 없음56.70%−4.38%p56730.159
이 실험 — 틱 직접 분류54.64%−6.44%p58830.043

모두 동일한 388일. scipy.stats.binomtest(b, b+c, 0.5) 양측 정확검정을 사용했다(statsmodels 가 이 환경에 없다).

각 갈래와 상수 기준선의 한쪽만 맞힌 날 비교
둘 다 맞히거나 둘 다 틀린 날은 제외하고 한쪽만 맞힌 날만 표시했다. 세 갈래 전부 상수 쪽(c)이 더 많다. 따라서 “어떤 갈래도 상수를 넘지 못했다”는 결론이 기저율 추정에 의존하지 않는다 — 위 표의 약점을 명시만 하고 넘어가지 않고 이 검정을 추가한 이유다.
연도별 갈래 적중률 막대
연도별로 나누어도 상수가 두 해 모두 우위다(2024년 60.4%, 2025년 61.8%). 틱 직접 분류는 2024년에 52.3%로 특히 낮다.
피처 중요도 막대
모델이 어떤 피처를 많이 참조했는지(분할 횟수 합. 해석용이며 판정과 무관). 위쪽 셋이 미결제약정 변화 · 틱규칙 · 대량체결 비율 로 전부 체결틱에서만 얻는 미시구조 값이다 — 수익률 계열은 네 번째 (ret_20m)에 처음 나온다. 이 설계가 새로 얻은 정보를 모델이 실제로 많이 봤다는 뜻이고, 그럼에도 적중률이 상수 기준선에 미치지 못했다는 점이 결론을 더 분명하게 만든다. 이 그림은 기록된 예측을 날짜 단위로 100% 재현하는 것을 확인한 뒤 다시 학습한 모델에서 뽑았다.

두 실험의 동일 표본 비교

두 실험과 상수 기준선의 적중률 비교
공통 388일에서의 최종 비교. 순서가 상수(61.08%) > 선행 실험(60.05%) > 이 실험(54.64%) 이다. 가설은 “이 실험이 선행 실험을 상회한다”였으므로 방향 자체가 반대다(둘 사이 짝지은 비교는 84 대 63).
두 실험이 갈리는 날의 각자 적중률과 상수 적중률
두 방식을 결합할 근거가 없음을 보이는 그림. 두 실험이 서로 다른 답을 낸 147일(37.9%)에서 선행 실험 57.1%, 이 실험 42.9%인데 같은 날짜 집합에서 상수가 63.3% 로 둘 다를 상회한다(두 실험이 일치한 날의 상수는 59.8%). 예측이 갈리는 날은 정보가 있는 날이 아니라 상수가 특히 잘 맞는 날이다.

사전에 세운 판정 기준이 성립 불가능한 형태였다. 계획서는 “두 방식이 갈리는 날에 각각 50%를 넘으면 결합할 근거가 있다”고 기술했으나, 두 방식이 상승·하락 중 하나만 제출하고 갈리는 날에는 정의상 서로 반대이므로 두 적중률의 합이 항상 정확히 1 이다(실측 57.14+42.86=100.0). 어떤 데이터에서도 통과할 수 없다. 판정을 가능하게 한 것은 그 기준이 아니라 상수 기준선 대비라는 대체 기준이었다.

축소된 불확실성이 예측 가능한 부분이 아니었다

네 가지 관측이 하나의 결론으로 수렴한다. 선행 실험에서 모델 오차가 보정 대상보다 컸고, 확률로 환산해도 무정보 예측보다 나빴으며, 확신도가 정답 여부와 무관했다. 여기에 이 실험이 네 번째를 더한다 — 격차를 2.31배 축소해도 적중률이 오르지 않았다. 15:34 에서 15:35 사이를 관측으로 대체하는 것은 정보를 추가하는 일이 아니라, 이미 무작위인 항을 다른 무작위 항으로 교체하는 일에 가까웠다.

2.31배잔여 격차 축소 — 설계 전제는 성립
−6.44%p그러나 적중률은 상수 기준선 미만
63.27%두 실험이 갈리는 날의 상수 적중률

후속 과제 — 기저율의 예측 가능성

상수 기준선이 강한 이유는 상승일과 하락일의 비율이 50:50 에서 멀기 때문이다(평가 구간 상승 38.92%). 그런데 그 비율 자체가 해마다 변동한다.

2020~2025 연도별 상승 비율 변화
2020년 40.4% → 2021년 44.1% → 2022년 51.4% → 2023년 48.5% → 2024년 39.6% → 2025년 38.5%. 2022년은 상승이 다수였다 — “매일 하락”을 고정 기준선으로 삼는 전략은 그런 해에 전면적으로 패배한다. 따라서 상수를 넘어서는 경로는 상수를 무시하는 것이 아니라 상수의 방향을 국면에 따라 전환하는 것이며, 그러려면 기저율 자체의 예측 가능성을 먼저 측정해야 한다. 아직 측정된 바 없다.

사전 등록 판정 기준의 설계 결함

이 실험이 사전에 등록한 판정 기준 셋이 모두 성립 불가능한 형태였다. 세 번 모두 구현이 기준에 걸려 중단됐고, 세 번 모두 기준 쪽이 잘못된 것이었다.

세워 둔 기준실패 방식
틱 표와 봉의 미결제약정이 완전히 일치해야 한다 (95%) 통과 불가 서로 다른 피드의 시점 스냅샷이므로 정확히 일치할 수 없다
두 방식의 차이가 시드 분산의 2배를 넘어야 한다 항상 통과 설정에 무작위 요소가 없어 시드 분산이 0 이고 기준값도 0
갈리는 날에 각자 50%를 넘어야 한다 정의상 불가능 예측이 서로 반대이므로 두 적중률의 합이 항상 1

특히 첫 번째는 위험했다 — 기준 미달을 이유로 이 실험을 폐기했다면 실제로는 측정 코드의 정렬 버그 때문에 실험을 중단하는 셈이었다(해당 버그를 수정하자 일치율이 83.05%에서 100%로 수렴했다).

시사점. 사전 등록은 값을 미리 정하는 것만이 아니라 그 기준이 실제로 판정 능력을 갖는지를 미리 확인하는 것까지 포함한다. 점검 방법은 간단하다 — 기준을 세울 때 통과하는 결과와 통과하지 못하는 결과를 각각 하나씩 실제로 기술해 보는 것이다. 둘 중 하나를 기술할 수 없으면 그 기준은 아무것도 판정하지 못한다.

한계와 유효성 위협 요인

평가 구간이 두 해뿐이다. 체결틱 덤프가 2023년부터이기 때문이다. 이 문서는 어디에서도 “유의하다”고 기술하지 않으며, p값은 방향을 가리키는 참고값으로만 해석해야 한다.

시드 다섯 개가 변동 폭을 측정하지 못했다. 설정이 결정적이어서 분산이 0 이다(위 모델 표 아래 설명). 따라서 “차이가 있다”는 주장을 하지 않았다.

커밋된 결과는 “비표준 세션” 가드 적용 이전 판이다. 거래소가 수능일에 16:45 로 마감하는 것을 라벨 생성 코드가 반영하지 못했다. 가드 적용 후 재실행하면 평가에서 2일이 제외되어 적중률이 −0.24~+0.28%p 변동한다 — 결론은 뒤집히지 않는다.

체결틱 원천이 아직 출처 대장(data/SOURCES.yaml)에 등록되지 않았다. 경로는 코드 한 곳에서 파생하지만 해시·크기가 고정돼 있지 않다.

수능일 실거래 경로가 정의되지 않았다. 연구 표본에서 제외하는 것까지만 처리했으나 대회는 그날도 제출을 요구한다.

산출물 목록

  • 결과와 판정 (수치의 정본)analysis.md
  • 계획과 사전 고정 항목protocol.md
  • 정본 런results/20260910_191958_nb/
  • 두 실험 비교 런results/20260910_195935_compare_fix1/
  • 학습 노트북notebooks/01_tick_direct.ipynb
  • 비교 노트북notebooks/02_두컨셉_비교.ipynb
  • 계약 확인 스크립트code/check_near_month.py