논문의 모델은 설명변수 한 개짜리 단순회귀다 —
r_auc = α + β·r_final. 그것을 그대로 구현해 논문 표본에서
재현하고(성과 지표가 왜도·첨도까지 맞는다), 0003 과 같은 조건으로 시험했다.
시험 2019~2026 승률 0.6030·누적 +661틱으로 기준선 넷을 모두
넘었고, 무엇보다 0003 이 7그룹 150피처에서 고른 ExtraTrees 후보
(0.6030 · +663틱)와 점수가 같다. 짝지은 검정은 정확히 반으로 갈린다
(b=150 : c=150 · p=1.0).
무엇을 물었나
사용자 지시(2026-09-17): “논문에 나온 동시호가 수익률 예측 모델을 그대로 구현해서 학습하고 실험 0003 과 같은 조건으로 테스트해서 실험 목록에 추가해라.” 그래서 물음이 둘이다 — A. 우리 구현이 논문과 같은가, B. 그 모델이 우리 대회 조건에서 쓸 만한가.
원문: 김종재, 「대한민국 국채 선물 시장 장마감 동시호가 수익률
예측 / Predicting Closing Call Auction Return in the Korean Treasury Bond
Futures Market」, 한국과학기술원 금융공학프로그램 석사학위논문, 2024.2,
24+iii쪽, 지도교수 류혁선. hdl.handle.net/10203/321898.
KOASAS 항목에는 첨부 파일이 없다(Download 0) — 공개된 것은 서지와
초록뿐이고, 본문은 사용자가 KAIST 도서관에서 받은 인쇄본 PDF 를
literature/kim2024_closing_call_auction.pdf 로 두고 읽었다.
텍스트 레이어가 없는 스캔본이라 페이지 이미지를 읽어 옮겼다.
논문이 정의한 모델
기호는 논문 Table 1 그대로다. 하루를 30분으로 잘라
r_1(09:00→09:30) … r_12(14:30→15:00) 를 두고,
정규장 마지막 35분을 r_final(15:00→15:35), 장마감 동시호가
구간을 r_auc(15:35→15:45) 라 부른다. 예측 대상은
r_auc 다.
| 모델 | 절 | 정의 | 학습 |
|---|---|---|---|
| 윈도우 롤링 회귀 | §3.1 | r_auc,t = α + β·r_final,t + ε_t, 매일 갱신.
표본 밖 평가는 Campbell·Thompson(2008) R²_OS,
t 값은 Newey·West(1987) | 있다 |
| 바이너리 시그널 | §3.2 | 15:00→15:34:59 가 오르면 15:34:59 에 롱·동시호가에 매도 청산,
내리면 숏 — sign(r_final) | 없다 |
컷오프를 둘로 가른다. 논문의 r_final 은 15:35 가격
(P_ref)으로 끝난다. 논문 안에서는 look-ahead 가 아니다 —
15:35 에 들어가 15:45 에 나오는 전략이니까. 그런데 우리 대회는 15:35
전에 제출한다. 그래서 P_ref 는 제출 시점에 없다. 0003 이
0001 의 sign(ŷ−d)(60.05%)를 후보에서 뺀 것과 같은 성격이라
같은 취급을 한다:
- P — 논문 그대로
P(15:35) / P(15:00) − 1· 대회 제출 불가 - C — 0003 봉 컷오프
P(15:34) / P(15:00) − 1· 대회 제출 가능
둘을 한 숫자로 섞지 않는다. 표에는 둘 다 싣되 후보는 C 만이다.
A. 재현
논문 표본(2016-08-01 ~ 2023-07-01)·논문 분할로 3선·10선 둘 다 돌려 논문 표와 나란히 놓았다. 우리 1분봉이 2016-12-14 부터라 논문의 앞 넉 달이 없다 (표본 1,599일 vs 논문 1,702일).
| 상품 · 기간 | n | SRatio | 왜도 | 첨도 | 승률(%) |
|---|---|---|---|---|---|
| KTB3 전체 · 우리 | 1,599 | 1.595 | 0.422 | 6.773 | 57.157 |
| KTB3 전체 · 논문 | 1,702 | 1.656 | 0.455 | 6.786 | 57.30 |
| KTB3 OOS · 우리 | 470 | 1.819 | 0.344 | 2.421 | 57.341 |
| KTB3 OOS · 논문 | 474 | 1.707 | 0.345 | 2.413 | 56.99 |
| KTB10 전체 · 우리 | 1,599 | 1.343 | 0.577 | 7.377 | 55.296 |
| KTB10 전체 · 논문 | 1,702 | 1.460 | 0.573 | 7.311 | 56.00 |
KTB3 표본 밖에서 왜도 0.344 vs 0.345 · 첨도 2.421 vs 2.413 이 나온다.
이 정도로 맞는 것은 같은 r_auc 계열을 보고 있다는 뜻이다 —
승률은 정의를 고르면 맞출 수 있지만 첨도는 못 맞춘다.
논문의 “In sample” 은 학습창이 아니라 전체 표본이다
사전등록한 재현 기준 1·2 는 논문의 “In sample statistics” 를 1,228일
학습창으로 읽고 세운 문장이고, 그 읽기로는 둘 다 실패했다(KTB3 학습창
β 4.516 · t 1.865). 그런데 원문 안에 답이 있었다. 논문 Table 9 는
“the application of the regression model to the total dataset that
from August 1, 2016, to July 1, 2023” 이라고 적고, 그 마지막 행
(r_auc = α + β·r_final)의 값이 KTB3 8.251 (4.466) 2.310 ·
KTB10 5.908 (3.062) 1.234 로 Table 2 의 “In sample” 열과 글자 그대로
같다. Table 8 의 “In sample” 패널도 같은 값이다.
| 기준 | 글자 그대로 (학습창) | 교정 (전체 표본) |
|---|---|---|
| 1. β>0 이고 |t|>2 (KTB3·KTB10 둘 다) | ✗ KTB3 4.516 (t 1.865) | ✓ KTB3 8.386 (4.460) · KTB10 5.837 (2.905) |
2. r_final 의 R² 가 r_1…r_12 전부보다 큼 |
✗ KTB3 는 r_3 가 이긴다 |
✓ 둘 다 r_final |
| 3. 바이너리 승률 ±5%p | ✓ (최대 1.076%p) | ✓ |
| → 판정 | 부분 재현 | 재현 성공 |
결과를 보고 기준을 옮긴 것이 아니라 원문을 잘못 읽었던 것을
원문 안의 증거로 고친 것이다 — 근거는 Table 9 의 자기 진술이고 우리
숫자와 무관하게 논문 안에서 확인된다. r_final 정의를 달리 읽는
가능성(15:05→15:35 로 정확히 30분)도 재 봤지만 계수가 거의 안 움직여 원인이
아니다(repro_rfinal_variants.csv).
[U].어떻게 쟀나 — 0003 조건
「같은 조건」의 내용은 0003 의 protocol.md 와 run.py
가 정한 것을 그대로 가져왔다: 3선 근월 · note 가드와 0틱 무효일
제외 · 연도 확장창(학습 2017~) · 시험 2019~2026 n=1,491 · 방향 승률과
누적 틱. 기준선 넷·컨셉1·게이트 열·채점·McNemar 는 0003 의 코드를 그대로
호출한다(experiments/0003_contest_model_selection/code/models.py)
— 같은 조건이라고 말하려면 같은 코드를 밟아야 한다.
α·β 는
2017년부터 Y−1년 말까지의 날들로만 적합하고(짙은 막대), 채점은
Y년만(주황 막대) 한다. 막대 안 숫자는 그 폴드가 쓴 날 수이고
학습 쪽은 contest_coefs.csv 의 n_train 그대로다.
주황 막대의 합 1,491일이 승률의 분모이며, 0003 과 같은 날
집합이다. 아래: 같은 시험일을 세 가지 갱신 주기로 본 것 — 판정
갈래는 해마다 한 번만 계수를 갱신하고(계단), 논문 §3.1 의 일별
확장창과 길이 1,228일 고정 롤링창은 민감도로만 싣는다. 세
갈래 모두 그날 이전 데이터만 쓴다. 2023년 무렵 초록 점선이 갈라지는
지점이 롤링창이 상한 1,228일에 닿아 옛 날을 버리기 시작하는
자리다.-1.717e-05 가 이 모델의 일 절반이다 — β 와 나누면 1.95bp(≈2틱) 라는 문턱이 되고, 15:00→15:34 가 그보다 더 올라야 롱을 낸다. 동시호가가 평균적으로 내리쪽으로 기운다는 기저율이 이 한 숫자에 들어 있다.B. 결과
| 갈래 | 승률 | 누적 틱 | 적응 상수 대비 | McNemar b:c | p | 제출 |
|---|---|---|---|---|---|---|
paper_reg_C 논문 회귀 · 15:00→15:34 |
0.6030 | +661 | +5.23%p | 268:190 | 0.0003 | 가능 |
paper_reg_C_daily 일별 갱신 |
0.5942 | +619 | +4.36%p | 260:195 | 0.0027 | 가능 |
paper_bin_C 논문 바이너리 · 15:00→15:34 |
0.5936 | +627 | +4.29%p | 338:274 | 0.0108 | 가능 |
paper_reg_C_roll1228 1,228일 롤링 |
0.5922 | +611 | +4.16%p | 254:192 | 0.0038 | 가능 |
paper_reg_P 논문 회귀 · 15:00→15:35 |
0.5889 | +587 | +3.82%p | 262:205 | 0.0095 | 불가 |
b_rule20 규칙 20분 모멘텀 |
0.5875 | +609 | +3.69%p | 315:260 | 0.0242 | 가능 |
paper_bin_P 논문 바이너리 · 15:00→15:35 |
0.5748 | +485 | +2.41%p | 331:295 | 0.1618 | 불가 |
e_adaptive 적응 상수(후행 120일 다수) |
0.5506 | +229 | — | — | — | 가능 |
c_concept1 |
0.5399 | +183 | −1.07%p | 334:350 | 0.5663 | 가능 |
a_random |
0.4950 | −37 | −5.57%p | 345:428 | 0.0032 | 가능 |
판정: 채택. paper_reg_C·paper_bin_C 둘 다
기준선 넷을 모두 넘고 적응 상수 대비 McNemar 에서 b>c 다 — 사전등록
문장이 요구한 것이 정확히 이것이다.
| 승률 | 누적 틱 | vs 0003 McNemar | |
|---|---|---|---|
0003 후보 T0_core/et/none (70피처 ExtraTrees) |
0.6030 | +663 | — |
paper_reg_C (피처 1개) |
0.6030 | +661 | b=150 : c=150 · p=1.0 |
paper_bin_C | 0.5936 | +627 | b=161 : c=175 · p=0.478 |
b_rule20 | 0.5875 | +609 | b=149 : c=172 · p=0.219 |
갈리는 300일에서 둘 다 정확히 50.0% 다(150:150). 합의하는 1,191일의 승률은 62.9%. 즉 두 모델은 같은 신호를 다른 경로로 잡고, 서로 다른 곳에서는 둘 다 아무것도 모른다. 앙상블 재료가 없다 — 0002 가 H6 를 접은 것과 같은 모양이다.
paper_reg_C 0.5704 가 규칙(0.6197)과 적응 상수(0.5845) 둘 다에
진다(0003 의 ET 는 그해 0.6127 였다). 표본 142일이라 ±4%p 는 잡음 안이지만,
대회가 도는 해가 하필 그 해다.왜 그런가 — 절편이 절반이다
부호만 쓰는 paper_bin_C 0.5936 에서 회귀 paper_reg_C
0.6030 으로 +0.94%p. 그것을 만든 것은 β 가 아니라 α 다.
β>0 인 단순회귀에서 sign(α + β·x) 는 x > −α/β
와 같으므로, 회귀가 배우는 것은 기울기가 아니라 문턱이다.
| 시험연도 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | 2025 | 2026 |
|---|---|---|---|---|---|---|---|---|
| 문턱 (틱) | 1.06 | 1.15 | 3.01 | 2.81 | 1.84 | 1.09 | 1.56 | 2.05 |
0003 의 ExtraTrees 와 같은 점수가 나오는 이유도 여기 있다. 0003 의 SHAP 에서
상위였던 g1_pos_20m·g1_pos_day 는 결국 “마감 무렵
가격이 당일 범위의 어디에 있나” 이고 g6_baserate_* 는 기저율이다.
모멘텀 × 기저율 이 그 모델이 배운 것의 대부분이었고, 논문의 두 계수가
같은 것을 더 짧게 적는다.
P 가 C 보다 나쁘다. 논문 정의(15:35 까지)의
승률이 대회 컷오프(15:34)보다 낮다(0.5889 vs 0.6030). 마지막 1분의
움직임(d = P_ref − P34)이 동시호가로 되돌아오기
때문이다 — 0001 이 sign(−d) 만으로 54.9% 를 얻었던 그 사실이다.
창을 1분 줄이는 것이 정보를 버리는 게 아니라 반대 부호 성분을 빼는
것이고, 우리 대회 규칙이 우연히 더 나은 컷오프를 강제한다.
한계
P갈래는 대회에서 낼 수 없다.r_final이 15:35 가격으로 끝나는데 제출은 그 전이다. 표에 실었지만 후보로 올리지 않는다(0003 의d1_nonlive와 같은 취급).- 2026 이 약하다.
paper_reg_C2026 0.5704 가 규칙·적응 상수 둘 다에 진다. 대회 라이브가 2026-09-28~ 이라 이 한 칸이 가장 불편한 숫자다. - 레짐 분해를 안 했다(지표 계약 경고 1건). 0003 이 게이트 7종을 재서 미지지(H9)로 끝냈기 때문에 같은 축을 다시 열지 않았다.
- 재현의 남은 구멍은 표본 밖 β
[U]— 표본 넉 달 차이로는 다 설명이 안 된다. - Success(%) 정의가 논문에 없다. 두 정의를 다 냈더니 Table 5 는 “움직인 날만”, Table 3 은 “전체 날” 과 맞는다. 바이너리는 움직임 0 인 날 포지션을 안 잡고 회귀는 언제나 잡기 때문이면 논문 안에서 일관되지만, 확인할 길이 없어 둘 다 싣는다.
- 진짜 블라인드 구간은 없다. 2026-09-11 이전을 전부 봤다. 대회 라이브가 유일한 최종 OOS 다.
- 캐파시티 비해당 — 방향 채점 게임이라 체결·수량 축이 없다.
산출물
- 사전등록
protocol.md - 분석·판정
analysis.md - 논문 모델 정본
code/paper_model.py - 시각 격자 캐시
code/build_grid.py - 런
results/20260917_172623_paper/ - 배포용 적합
results/…/model_candidate.joblib - 원문 사본
literature/kim2024_closing_call_auction.pdf