3년 국채선물 · 동시호가 방향 · 인포맥스 데이터 API

인포맥스 API만으로 동시호가 방향 모델을 돌릴 수 있나

원자료를 디스크에 두지 않고, 필요한 과거를 API 로 받아 학습하고 체크포인트만 남긴다. 예측하는 날에는 그날치만 받는다. 재학습은 매주 월요일 아침 한 번이다. 이 설계가 대회용 모델로 쓸 만한지, 그리고 API 한도 안에서 돌아가는지를 쟀다.

폐기 · 규칙 미달 재생 시험 1,499일 API 창 시험 38일 설계 4 × 모델 5

세 줄 요약

  1. API 틱으로 만든 라벨은 로컬 1분봉과 100% 같았다.
  2. 그 위에서 주간 재학습 설계를 2019~2026년에 재생하면 정직 선택 승률이 56.97% 로, 20분 모멘텀 규칙 58.84% 를 넘지 못한다(짝지은 McNemar p=0.2168). 매일 재학습으로 바꿔도 나아지지 않는다(56.30%).
  3. 그리고 4개월 틱 창 한 번이 하루 사용량 한도의 약 80% 를 쓴다.

무엇을 물었나

종속변수는 하나다. 15:34 까지의 정보로 그날 15:45 동시호가가 15:35 직전 가격보다 오르나 내리나. 바꾼 것은 데이터의 출처(인포맥스 데이터 API)와, 그 출처가 강제하는 학습 설계다.

H34
API 틱으로 만든 라벨과 봉 피처가 로컬 1분봉과 같다. 같으면 로컬 과거를 «그때 API가 줬을 데이터»로 써서 설계를 재생할 수 있다.
H35
4개월 창으로 매주 다시 배운 모델(W)이 20분 모멘텀 규칙을 넘는다.
H36
학습 표본이 60일 안팎이면 작은 모델(8열 로지스틱)이 큰 모델(52열 트리)을 넘는다.
H37
원자료 없이 체크포인트 스냅샷으로 쌓은 기억(M)이 4개월 창보다 낫다.
H38
API 틱에만 있는 호가 잔량과 체결 성향이 동시호가 방향을 돕는다.
H39
매일 재학습(D)이 주간 재학습(W)보다 낫다. 아니라면 주간 운영에 손해가 없다.

기호: 틱 = 국채선물 호가 한 칸(0.01). P_ref = 15:35:00 직전 마지막 체결가. P45 = 15:45:00 동시호가 체결가. ref_tick = P45 − P_ref(틱), 라벨은 그 부호이고 0 인 날은 뺀다. 규칙20 = 15:14→15:34 수익률의 부호. 창 상수 = 그날 기준 4개월 창 유효일의 다수 방향. 적응 상수120 = 직전 120 유효일의 다수 방향. 정직 선택 = 시험연도 이전 성적으로만 모델을 고른 값. McNemar = 같은 날의 적중/실패를 짝지어 한쪽만 맞힌 날 수(b:c)로 보는 검정. 재생 = 로컬 1분봉 과거로 API 설계를 다시 돌리는 평가.

API 가 주는 것과 한도

API 가 주는 과거와 받은 구간
일별 자료는 2011년부터 열려 있지만 체결틱은 최근 4개월뿐이다. 라벨 (P_ref, P45)은 틱에서만 나오므로 API만으로 만들 수 있는 라벨도 4개월치다. 오른쪽 숫자는 정본 런이 부른 횟수와 행 수다.
실측한 제약(2026-09-23~28).
항목값
플랜Standard — 하루 1,024MB · 분당 120회
거부access_limit(분당 초과, 1분 안에 풀림) · error timeout(범위가 큼 → 시간대 조각) · 일별 사용량 제한 초과(키 전체, 자정에 초기화)
틱 창«오늘 − 4개월» 다음 날부터
세는 용량받은 JSON 의 약 3배 — gzip 으로 받아도(전송 7%) 한도는 그대로
틱 창 한 번164회 · 597,408행 · JSON 264MB → 세는 용량 약 800MB
하루 예측15회 · 8,492행 · JSON 3.6MB, 체결 지연 약 1초

이 한도 때문에 실행 전에 설계를 두 번 고쳤다. 개정 2 로 3년 선물 틱은 개장 2분과 13:30 이후, 10년 선물은 개장 2분과 14:00 이후만 받는다. 그래도 한 번에 다 받을 수 없어 정본 런은 틱을 이틀 자정에 나눠 받았다(받은 것은 메모리에만 두었다).

데이터셋

두 표. 같은 함수로 만든다 — API 틱은 먼저 로컬 1분봉과 같은 모양으로 바꾼다.
표기간행(유효일)봉·라벨 원천일별 원천쓰임
API 표2026-05-28 ~ 09-2382 (70)API 체결틱APIH34 · H38 · 서빙 체크포인트
재생 표2016-12-14 ~ 2026-09-232,396 (1,849)로컬 1분봉(API 와 같은 가림)APIH35~H37 · H39, 시험 2019~2026년 1,499일
피처 블록. 전부 15:34:00 이전에 관측된다. 일별은 전 거래일 값, 뉴욕 종가는 날짜가 그날보다 앞선 레코드다(뉴욕 세션 날짜로 붙어 있다).
블록열무엇
b_ 봉283년 선물 1·5·10·20·30·60·120분 수익률, 시가 대비, 갭, 20·60분 레인지·위치·이평괴리, «일중»(개장 2분 + 13:30~15:34) 위치·레인지·거래량·VWAP 괴리, 15:00→15:34 수익률 / 10년 선물 5·20·60분·시가 대비, 3−10 커브 20·60분
d_ 일별24전일 3년 선물 수익률·5일 합·미스프라이싱(종가−이론가)·시장/이론 베이시스·미결제 변화·거래량 z·협의대량 비중 / 10년 수익률·3−10 수익률차 변화 / 투자자 순매수(외국인·증권·은행·투신· 보험·개인)·외국인 5일 / 뉴욕 종가 변화(달러지수·엔·유로·원) / 코스피 / 만기까지 일수·요일
m_ 미시구조85호가·총호가 잔량 불균형, 호가 건수 불균형, 스프레드, 5·20·60분·하루 체결 성향 불균형 — API 틱에만 있다(재생 불가)
API 틱과 로컬 1분봉의 봉 피처 일치율
H34. 겹치는 유효일 69일에서 라벨은 전부 같고, 봉 피처 칸의 96.1% 가 1e-9 안에서 같다(문턱 95%). 갈린 것은 거래량 3열(로컬 봉 거래량과 API 체결량이 날마다 조금 다르다)과 10년 선물 6열의 3일이다. 가격 계열은 전부 같다.

학습 설계와 분할

설계 넷. W 가 운영 설계다(사용자 결정).
설계학습 표본API 로 가능한가
W 주간 재학습그 주 월요일 m 기준 (m − 4개월, m) 의 유효일. 월요일 아침 한 번 학습해 그 주 내내 쓴다가능 — 월요일 API 가 주는 틱이 정확히 이 창
D 매일 재학습(참고)그날 t 기준 (t − 4개월, t)가능하지만 매일 틱 창을 다시 받는다
M 기억 앙상블W 모델을 4주마다 스냅샷으로 남겨, 그 주 W + 이전 스냅샷 11개의 확률 평균운영하며 쌓인다(원자료 없이 약 1년 기억)
E 확장창(참고)시험연도 이전 전부(2017~), 해마다 한 번불가 — 로컬 데이터가 있을 때의 참고선
확장창 폴드와 시험일 하나의 실제 학습창
왼쪽은 E 의 폴드(막대 안 숫자는 학습과 시험 유효일). 오른쪽은 마지막 시험일(2026-09-23) 하나의 실제 학습창이다. W 와 D 는 약 69일, M 은 여기에 4주 간격 스냅샷 11개를 더한다. 학습 유효일이 30일보다 적으면 규칙20 으로 채운다.

모델

모델 다섯(+ 미시구조를 더한 et_m). 시드가 있는 모델은 시드 0·1·2 확률 평균.
이름피처설정
log_s 작은 로지스틱8열: b_ret_20m·b_ret_5m·b_pos_20m·b_pos_day·b_vwap_dev·b_curve_20m·b_ret_open·d_mis_prev중앙값 대치 → 표준화 → L2 로지스틱 C=1.0
log 로지스틱b_ + d_ 52열중앙값 대치 → 표준화 → L2 로지스틱 C=0.1
et ExtraTrees52열400그루 · 깊이 4 · 잎 최소 5 · max_features=√
lgb LightGBM52열100그루 · 학습률 0.05 · 잎 7 · 자식 최소 10 · 행/열 표본 0.8 · L2 1.0
paper 1변수 회귀b_ret_1500최소제곱 ref_tick = α + β·x, 방향 sign(α + β·x)
et_m52열 + m_ 8열et 와 같다(API 창 전용, H38)

아래 구조도는 서빙 체크포인트(API 유효일 70일, 2026-05-29~09-23 로 학습한 객체)에서 그렸다. 그리기 전에 런이 기록한 예측 경로 확률(9/21, 22, 23)을 API 에서 다시 받아 1e-9 로 재현했다.

작은 로지스틱 회귀 log_s — 서빙 모델

미리 고른 8열(마감 전 20·5분 수익률, 20분·일중 위치, VWAP 괴리, 3−10 커브 20분, 시가 대비, 전일 미스프라이싱)을 표준화해 L2(C=1.0) 로지스틱으로 상승 확률을 낸다. 4개월 창의 유효일은 60일 안팎이다 — 모수가 적은 모델이 과적합을 덜 한다는 가설(H36)의 앞쪽이다. 첫 시험연도의 사전등록 모델이기도 하다.

그림 A · 구조 — 체크포인트 log_s · 학습 2026-05-29~2026-09-23 입력 데이터 인포맥스 API 만 2026-05-29 ~ 2026-09-23 유효일 70일 · 하루 1행 창 4개월(API 틱 한계) 원자료 디스크 저장 없음 피처 8개 / 2블록 3년·10년 선물 1분봉(API 틱→봉) 일별 API(T-1·뉴욕 < t) 작은 로지스틱 회귀 — 체크포인트 log_s · 학습 2026-05-29~2026-09-23 1. 결측 대치 학습창 중앙값으로 채운다(시험연도를 보지 않는다) 2. 표준화 학습창 평균·표준편차로 z 화 — 계수가 서로 비교 가능해진다 3. 선형 결합 z = b + Σ wᵢ·xᵢ (계수 8개) 4. 링크 σ(z) → 확률 출력 P(상승) ↓ 0.5 기준 상승 / 하락 0.5 면 창 다수 방향 동시호가 방향 하루 1건 계수 — 세팅과 학습 결과 피처 8개 표준화된 공간의 계수 — 서로 크기 비교가 된다 0 이 아닌 계수 8개 절편 b = -0.4446 모든 피처가 학습창 평균일 때의 출발점 기저율 쏠림이 여기에 담긴다 |w| 최대 = 0.7805 가장 센 피처: b_ret_20m |w| 중앙값 0.2782 C = 1.0 역정규화 강도 작을수록 더 강한 규제
피처 8개 중 0 이 아닌 계수 8개 · 절편 -0.4446.
그림 B · 계수 — 어느 피처가 어느 쪽으로 미나 ← 하락 쪽 상승 쪽 → b_ret_20m +0.7805 3년·10년 선물 1분봉 b_ret_5m -0.5266 3년·10년 선물 1분봉 b_pos_day -0.3085 3년·10년 선물 1분봉 b_vwap_dev +0.2782 3년·10년 선물 1분봉 b_pos_20m -0.2428 3년·10년 선물 1분봉 b_ret_open +0.1048 3년·10년 선물 1분봉 d_mis_prev -0.0886 일별 API b_curve_20m -0.0224 3년·10년 선물 1분봉 표준화된 공간의 계수 상위 8개 · 절편 b = -0.4446 · 전체 8개 중
표준화된 공간의 계수라 서로 크기를 비교할 수 있다.

로지스틱 회귀 log

봉·일별 52열 전부를 표준화해 강한 L2(C=0.1) 로 묶은 로지스틱이다. 같은 선형 계열에서 열을 여섯 배 넣으면 어떻게 되는지 보는 짝이다.

그림 A · 구조 — 체크포인트 log · 학습 2026-05-29~2026-09-23 입력 데이터 인포맥스 API 만 2026-05-29 ~ 2026-09-23 유효일 70일 · 하루 1행 창 4개월(API 틱 한계) 원자료 디스크 저장 없음 피처 52개 / 2블록 3년·10년 선물 1분봉(API 틱→봉) 일별 API(T-1·뉴욕 < t) 로지스틱 회귀 — 체크포인트 log · 학습 2026-05-29~2026-09-23 1. 결측 대치 학습창 중앙값으로 채운다(시험연도를 보지 않는다) 2. 표준화 학습창 평균·표준편차로 z 화 — 계수가 서로 비교 가능해진다 3. 선형 결합 z = b + Σ wᵢ·xᵢ (계수 52개) 4. 링크 σ(z) → 확률 출력 P(상승) ↓ 0.5 기준 상승 / 하락 0.5 면 창 다수 방향 동시호가 방향 하루 1건 계수 — 세팅과 학습 결과 피처 52개 표준화된 공간의 계수 — 서로 크기 비교가 된다 0 이 아닌 계수 52개 절편 b = -0.4746 모든 피처가 학습창 평균일 때의 출발점 기저율 쏠림이 여기에 담긴다 |w| 최대 = 0.3880 가장 센 피처: b_f10_ret_5m |w| 중앙값 0.1077 C = 0.1 역정규화 강도 작을수록 더 강한 규제
피처 52개 중 0 이 아닌 계수 52개 · 절편 -0.4746.
그림 B · 계수 — 어느 피처가 어느 쪽으로 미나 ← 하락 쪽 상승 쪽 → b_f10_ret_5m -0.3880 3년·10년 선물 1분봉 b_ret_5m -0.2519 3년·10년 선물 1분봉 b_rng_day -0.2269 3년·10년 선물 1분봉 b_rng_20m -0.2186 3년·10년 선물 1분봉 b_ret_60m +0.2132 3년·10년 선물 1분봉 b_gap_open +0.2131 3년·10년 선물 1분봉 d_vol_z_prev -0.2108 일별 API b_ret_20m +0.1920 3년·10년 선물 1분봉 d_inv_inv_prev +0.1911 일별 API b_f10_ret_20m +0.1647 3년·10년 선물 1분봉 d_ret5_prev -0.1438 일별 API d_curve_chg_prev -0.1430 일별 API b_pos_60m +0.1406 3년·10년 선물 1분봉 b_curve_20m -0.1388 3년·10년 선물 1분봉 b_pos_20m -0.1382 3년·10년 선물 1분봉 b_ma_dev_20m +0.1259 3년·10년 선물 1분봉 표준화된 공간의 계수 상위 16개 · 절편 b = -0.4746 · 전체 52개 중
표준화된 공간의 계수라 서로 크기를 비교할 수 있다.

ExtraTrees et

봉·일별 52열로 무작위 분기 결정트리 400그루(깊이 4·잎 최소 5·분기마다 √52≈7열 후보)를 키워 잎의 상승 비율을 평균한다. 시드 0·1·2 세 벌의 평균이다. 가설 H36 의 뒤쪽(큰 모델)이자, 미시구조를 더한 `et_m` 의 기준이다.

그림 A · 구조 — 체크포인트 et · 학습 2026-05-29~2026-09-23 (학습 70행) 입력 데이터 인포맥스 API 만 2026-05-29 ~ 2026-09-23 유효일 70일 · 하루 1행 창 4개월(API 틱 한계) 원자료 디스크 저장 없음 피처 52개 / 2블록 3년·10년 선물 1분봉(API 틱→봉) 일별 API(T-1·뉴욕 < t) ExtraTrees — 체크포인트 et · 학습 2026-05-29~2026-09-23 f₁ f₂ f₃ f₄ f₅ ··· f₄₀₀ 위는 이 모델 트리 5그루와 마지막 그루의 실제 위상(점 = 잎) — 실물은 그림 B·C P(상승) = (1/K) Σ treeₖ(x) 라벨 sign(ref_tick) · 컷오프 15:34:00 · 일별은 T-1 출력 P(상승) ↓ 0.5 기준 상승 / 하락 0.5 면 창 다수 방향 동시호가 방향 하루 1건 하이퍼파라미터 — 세팅한 상한과 학습이 실제로 닿은 값 n_estimators = 400 이어 붙이는 트리 개수 — 위 f₁ … 가 이만큼 실제 400그루 max_depth = 4 뿌리(깊이 0)에서 잎까지 분기 최대 4번 — 그림 B·C 의 오른쪽 눈금 실제 깊이 0~4 · 상한에 닿은 트리 397/400 min_samples_leaf = 5 잎 하나에 표본 5개 미만이면 그 분할을 하지 않는다 실제 가장 작은 잎 n=5 max_features = sqrt 분할마다 피처 52개 중 7개만 후보로 뽑는다 트리끼리 서로 다른 곳을 보게 만든다 그루별 잎 수 분포 1 2 3 4 5 6 7 8 9 10 11 잎 1~11개
트리 400그루 · 실제로 닿은 깊이 0~4 · 잎 1~11개. 체크포인트는 시드 3벌의 확률 평균이고, 그림은 시드 0 모델이다. 세팅의 상한과 학습이 실제로 멈춘 자리를 나란히 둔다.
그림 B · 첫 트리 f₁ 의 실제 분기 깊이 0 · 뿌리 분기 조건 · n 깊이 1 분기 조건 · n 깊이 2 분기 조건 · n 깊이 3 분기 조건 · n 깊이 4 · 잎 분기 없음 max_depth = 4 뿌리→잎 분기 4번까지 이 트리 실제 깊이 4 예 아니오 예 아니오 예 아니오 예 아니오 예 아니오 예 아니오 예 아니오 예 아니오 예 아니오 예 아니오 d_inv_ins_prev ≤ -0.001161 n=70 b_pos_day ≤ 0.5341 n=17 잎값 +0.1429 n=7 b_gap_open ≤ -1.971 n=10 잎값 +0.4000 n=5 잎값 +0.4000 n=5 b_ret_30m ≤ -0.8697 n=53 d_inv_sec_prev ≤ -0.002373 n=26 d_basis_theo_prev ≤ -15.62 n=14 잎값 +0.3333 n=6 잎값 +0.1250 n=8 b_pos_60m ≤ 0.3175 n=12 잎값 +0.6667 n=6 잎값 +0.3333 n=6 b_rng_20m ≤ 3.835 n=27 b_vwap_dev ≤ 1.823 n=11 잎값 +0.5000 n=6 잎값 +0.8000 n=5 b_pos_20m ≤ 0.5942 n=16 잎값 +0.2857 n=7 잎값 +0.5556 n=9 잎값 ≥ 0 (예측을 위로) 잎값 < 0 (예측을 아래로) n = 그 노드에 떨어진 학습 표본 수 · 조건(≤)이 참이면 왼쪽 가지 '예', 거짓(>)이면 오른쪽 '아니오'
분기 조건·표본 수·잎값을 체크포인트 객체에서 그대로 읽었다. 노드 안 n 은 그 노드를 지난 학습 표본 수다.
그림 C · 마지막 트리 f₄₀₀ 의 실제 분기 깊이 0 · 뿌리 분기 조건 · n 깊이 1 분기 조건 · n 깊이 2 분기 조건 · n 깊이 3 분기 조건 · n 깊이 4 · 잎 분기 없음 max_depth = 4 뿌리→잎 분기 4번까지 이 트리 실제 깊이 4 예 아니오 예 아니오 예 아니오 예 아니오 예 아니오 예 아니오 b_curve_60m ≤ 13.52 n=70 d_basis_mkt_prev ≤ -26.64 n=64 d_dte ≤ 69.85 n=24 d_inv_bank_prev ≤ 0.007421 n=11 잎값 +0.4000 n=5 잎값 +0.1667 n=6 잎값 +0.6154 n=13 b_ret_1500 ≤ 3.188 n=40 d_inv_for5_prev ≤ 0.04084 n=34 잎값 +0.3750 n=24 잎값 +0.2000 n=10 잎값 +0.5000 n=6 잎값 +0.5000 n=6 잎값 ≥ 0 (예측을 위로) 잎값 < 0 (예측을 아래로) n = 그 노드에 떨어진 학습 표본 수 · 조건(≤)이 참이면 왼쪽 가지 '예', 거짓(>)이면 오른쪽 '아니오'
마지막 트리 — 부스팅이면 잔차를 마지막으로 다듬는 트리이고, 배깅이면 다른 무작위 분기로 키운 또 한 그루다.
그림 D · 400그루 전체의 깊이×피처 분기 수
분기 위치 \ 피처d_wdb_pos_dayb_pos_60mb_f10_ret_5mb_ret_20md_basis_theo_prevb_rng_dayd_inv_for5_prevd_inv_inv_prevb_ret_30md_dteb_ret_120mb_gap_openb_pos_20mb_ret_60md_basis_mkt_prevb_ret_1500b_ret_5mb_f10_ret_20mb_vwap_devb_curve_20mb_ret_opend_inv_bank_prevd_kospid_ret5_prevb_rng_20mb_f10_ret_openb_ma_dev_60md_inv_ind_prevb_vol_last30_shareb_ma_dev_20mb_rng_60mb_f10_ret_60md_vol_z_prevd_inv_ins_prevd_ret10_prevb_ret_1mb_curve_60md_fx_usdkrwd_inv_sec_prevb_vol_dayd_curve_chg_prevd_ret_prevd_fx_usdjpyd_inv_for_prevb_ret_10mb_vol_last5_shared_block_share_prevd_fx_eurusdd_fx_dollard_mis_prevd_oi_chg_prev합
깊이 0 (뿌리)1115151114620122016101187179128161010655210111349108651121621222203212034398
깊이 13322222628161623191716191419152291723142115148191617713889157510778735611812565745688
깊이 240333326152424181723262122242122191012181319202712181015191514117181116161514181518148158109106124885
깊이 335201820243418221715191924181515262881714181912186111211131216151315131611131114912129791091036791
분기 합1199088838180787573717170686868686663595958585852515049474745444443434241403937373434343332302626262322192,762

어느 깊이에서 어느 피처가 몇 번 갈랐나(그루 400개 합).

LightGBM lgb

봉·일별 52열로 잎 7개짜리 트리 100그루를 학습률 0.05 로 차례로 더하는 그래디언트 부스팅이다(행·열 표본 0.8, L2 1.0). 시드 세 벌의 평균이다. 배깅과 다른 방식(잔차를 줄여 가는 방식)의 트리 계열을 하나 둔다.

그림 A · 구조 — 체크포인트 lgb · 학습 2026-05-29~2026-09-23 (학습 70행) 입력 데이터 인포맥스 API 만 2026-05-29 ~ 2026-09-23 유효일 70일 · 하루 1행 창 4개월(API 틱 한계) 원자료 디스크 저장 없음 피처 52개 / 2블록 3년·10년 선물 1분봉(API 틱→봉) 일별 API(T-1·뉴욕 < t) LightGBM — 체크포인트 lgb · 학습 2026-05-29~2026-09-23 f₁ f₂ f₃ f₄ f₅ ··· f₁₀₀ 위는 이 모델 트리 5그루와 마지막 그루의 실제 위상(점 = 잎) — 실물은 그림 B·C P(상승) = σ(Σₖ ηfₖ(x)) 라벨 sign(ref_tick) · 컷오프 15:34:00 · 일별은 T-1 출력 P(상승) ↓ 0.5 기준 상승 / 하락 0.5 면 창 다수 방향 동시호가 방향 하루 1건 하이퍼파라미터 — 세팅한 상한과 학습이 실제로 닿은 값 n_estimators = 100 이어 붙이는 트리 개수 — 위 f₁ … 가 이만큼 실제 100그루 max_depth = -1 뿌리(깊이 0)에서 잎까지 분기 최대 -1번 — 그림 B·C 의 오른쪽 눈금 실제 깊이 2~4 · 상한에 닿은 트리 0/100 num_leaves = 7 트리 한 그루의 잎(끝 상자) 최대 개수 실제 잎 3~6개 · 상한에 닿은 트리 0/100 min_data_in_leaf = 10 잎 하나에 학습 표본 10개 미만이면 그 분기를 하지 않는다 실제 가장 작은 잎 n=6 (하한 10 아래 — 근사 검사, 오류 아님) feature_fraction = 0.8 트리마다 피처 52개 중 80%만 무작위로 후보에 올린다 → 그림 D 의 피처별 분기 횟수가 고르게 퍼지는 이유 learning_rate = 0.05 트리 하나가 더하는 값 = 적합값 × 0.05 (아래 잎값에 이미 곱해져 있다) 작을수록 트리 한 그루의 발언권이 작다 그루별 잎 수 분포 3 4 5 6 7 잎 3~6개 · 상한 7
트리 100그루 · 실제로 닿은 깊이 2~4 · 잎 3~6개. 체크포인트는 시드 3벌의 확률 평균이고, 그림은 시드 0 모델이다. 세팅의 상한과 학습이 실제로 멈춘 자리를 나란히 둔다.
그림 B · 첫 트리 f₁ 의 실제 분기 깊이 0 · 뿌리 분기 조건 · n 깊이 1 분기 조건 · n 깊이 2 · 잎 분기 없음 max_depth = -1 뿌리→잎 분기 -1번까지 이 트리 실제 깊이 2 예 아니오 예 아니오 예 아니오 d_inv_inv_prev ≤ -0.00211 n=60 d_fx_dollar ≤ 0.04638 n=26 잎값 -0.4613 n=16 잎값 -0.3908 n=10 b_gap_open ≤ 0 n=34 잎값 -0.4096 n=16 잎값 -0.3416 n=18 잎값 ≥ 0 (예측을 위로) 잎값 < 0 (예측을 아래로) n = 그 노드에 떨어진 학습 표본 수 · 조건(≤)이 참이면 왼쪽 가지 '예', 거짓(>)이면 오른쪽 '아니오'
분기 조건·표본 수·잎값을 체크포인트 객체에서 그대로 읽었다. 노드 안 n 은 그 노드를 지난 학습 표본 수다.
그림 C · 마지막 트리 f₁₀₀ 의 실제 분기 깊이 0 · 뿌리 분기 조건 · n 깊이 1 분기 조건 · n 깊이 2 분기 조건 · n 깊이 3 · 잎 분기 없음 max_depth = -1 뿌리→잎 분기 -1번까지 이 트리 실제 깊이 3 예 아니오 예 아니오 예 아니오 b_rng_day ≤ 18.5 n=59 d_oi_chg_prev ≤ 0.9765 n=48 d_mis_prev ≤ -3.55 n=30 잎값 +0.0376 n=19 잎값 -0.0095 n=11 잎값 -0.0082 n=18 잎값 -0.0195 n=11 잎값 ≥ 0 (예측을 위로) 잎값 < 0 (예측을 아래로) n = 그 노드에 떨어진 학습 표본 수 · 조건(≤)이 참이면 왼쪽 가지 '예', 거짓(>)이면 오른쪽 '아니오'
마지막 트리 — 부스팅이면 잔차를 마지막으로 다듬는 트리이고, 배깅이면 다른 무작위 분기로 키운 또 한 그루다.
그림 D · 100그루 전체의 깊이×피처 분기 수
분기 위치 \ 피처d_inv_inv_prevd_inv_ind_prevb_f10_ret_5md_fx_usdjpyd_inv_bank_prevb_gap_opend_vol_z_prevb_rng_dayb_vol_last30_shareb_ret_60mb_vol_last5_shared_fx_usdkrwb_f10_ret_20mb_pos_dayb_vol_dayd_inv_for5_prevb_ret_5mb_rng_20md_kospib_f10_ret_openb_pos_60md_block_share_prevb_ret_120mb_ret_opend_basis_mkt_prevd_fx_dollard_mis_prevd_oi_chg_prevd_ret_prevd_basis_theo_prevd_fx_eurusdd_ret10_prevd_wdb_ret_10mb_ret_1500b_rng_60md_curve_chg_prevd_inv_ins_prevd_inv_sec_prevb_curve_60mb_ret_20md_ret5_prevb_curve_20mb_f10_ret_60mb_pos_20mb_vwap_devd_dted_inv_for_prevb_ma_dev_20mb_ma_dev_60mb_ret_1mb_ret_30m합
깊이 0 (뿌리)81792535764326410410220103000000010100000210000000000100
깊이 112498965334631434133016342213422433111121000110100000141
깊이 2643515312004104413342011033212100012211101000001000080
깊이 3200000100100000010101000001000100000010000100100000012
분기 합2825211515141411119998888777666555555544443333332221111110000333
손실 감소(gain) 몫11.7%8.2%5.7%4.5%3.9%4.6%3.7%3.6%4.9%2.8%2.5%2.4%3.1%2.6%3.1%2.1%1.3%1.7%1.3%1.6%1.5%1.6%1.0%2.8%1.3%1.5%0.8%0.9%1.1%0.7%1.8%0.8%1.2%1.2%1.6%0.7%0.9%0.3%0.8%0.5%0.5%0.4%0.0%0.1%0.5%0.1%0.3%0.1%0.0%0.0%0.0%0.0%100%

어느 깊이에서 어느 피처가 몇 번 갈랐나(그루 100개 합).

설명변수 하나짜리 회귀 paper

15:00→15:34 수익률 x 하나로 최소제곱 ref_tick = α + β·x 를 맞추고 sign(α + β·x) 를 방향으로 낸다. 확률이 아니라 부호다. 모수가 둘뿐인 가장 작은 학습 모델 — 작은 표본에서 무엇이 버티는지의 하한이다.

그림 A · 구조 — 체크포인트 paper · 학습 2026-05-29~2026-09-23 입력 데이터 인포맥스 API 만 2026-05-29 ~ 2026-09-23 유효일 70일 · 하루 1행 창 4개월(API 틱 한계) 원자료 디스크 저장 없음 피처 1개 / 1블록 3년·10년 선물 1분봉(API 틱→봉) 설명변수 하나짜리 회귀 — 체크포인트 paper · 학습 2026-05-29~2026-09-23 1. 선형 결합 ŷ = α + β·x 2. 링크 ŷ 의 부호가 방향(0 이면 창 다수 방향) 출력 P(상승) ↓ 0.5 기준 상승 / 하락 0.5 면 창 다수 방향 동시호가 방향 하루 1건 계수 — 세팅과 학습 결과 피처 1개 원공간의 계수 — 표준화 단계가 없다 0 이 아닌 계수 1개 절편 b = -0.3522 모든 피처가 학습창 평균일 때의 출발점 평균적인 ref_tick 변화 |w| 최대 = 0.1473 가장 센 피처: b_ret_1500 |w| 중앙값 0.1473
α = -0.3522틱 · β = +0.1473 — x 가 +2.39틱을 넘으면 상승으로 낸다.
그림 B · 계수 ← 하락 쪽 상승 쪽 → b_ret_1500 +0.1473 3년·10년 선물 1분봉 원공간의 계수 상위 1개 · 절편 b = -0.3522 · 전체 1개 중
원공간 계수다(대치·표준화 단계가 없다).

ExtraTrees + 미시구조 et_m

`et` 와 같은 설정에 API 틱에만 있는 8열(5호가·총호가 잔량 불균형, 호가 건수 불균형, 스프레드, 5·20·60분·하루 체결 성향 불균형)을 더한 60열 모델이다. 가설 H38 — 로컬 틱에 없어 과거 재생이 불가능하고 API 창에서만 잰다.

그림 A · 구조 — 체크포인트 et_m · 학습 2026-05-29~2026-09-23 (학습 70행) 입력 데이터 인포맥스 API 만 2026-05-29 ~ 2026-09-23 유효일 70일 · 하루 1행 창 4개월(API 틱 한계) 원자료 디스크 저장 없음 피처 60개 / 3블록 3년·10년 선물 1분봉(API 틱→봉) 일별 API(T-1·뉴욕 < t) 호가 잔량·체결 성향(API 틱 전용) ExtraTrees + 미시구조 — 체크포인트 et_m · 학습 2026-05-29~2026-09-23 f₁ f₂ f₃ f₄ f₅ ··· f₄₀₀ 위는 이 모델 트리 5그루와 마지막 그루의 실제 위상(점 = 잎) — 실물은 그림 B·C P(상승) = (1/K) Σ treeₖ(x) 라벨 sign(ref_tick) · 컷오프 15:34:00 · 일별은 T-1 출력 P(상승) ↓ 0.5 기준 상승 / 하락 0.5 면 창 다수 방향 동시호가 방향 하루 1건 하이퍼파라미터 — 세팅한 상한과 학습이 실제로 닿은 값 n_estimators = 400 이어 붙이는 트리 개수 — 위 f₁ … 가 이만큼 실제 400그루 max_depth = 4 뿌리(깊이 0)에서 잎까지 분기 최대 4번 — 그림 B·C 의 오른쪽 눈금 실제 깊이 0~4 · 상한에 닿은 트리 392/400 min_samples_leaf = 5 잎 하나에 표본 5개 미만이면 그 분할을 하지 않는다 실제 가장 작은 잎 n=5 max_features = sqrt 분할마다 피처 60개 중 7개만 후보로 뽑는다 트리끼리 서로 다른 곳을 보게 만든다 그루별 잎 수 분포 1 2 3 4 5 6 7 8 9 10 11 12 잎 1~12개
트리 400그루 · 실제로 닿은 깊이 0~4 · 잎 1~12개. 체크포인트는 시드 3벌의 확률 평균이고, 그림은 시드 0 모델이다. 세팅의 상한과 학습이 실제로 멈춘 자리를 나란히 둔다.
그림 B · 첫 트리 f₁ 의 실제 분기 깊이 0 · 뿌리 분기 조건 · n 깊이 1 분기 조건 · n 깊이 2 분기 조건 · n 깊이 3 분기 조건 · n 깊이 4 · 잎 분기 없음 max_depth = 4 뿌리→잎 분기 4번까지 이 트리 실제 깊이 4 예 아니오 예 아니오 예 아니오 예 아니오 d_oi_chg_prev ≤ 7.151 n=70 b_ma_dev_60m ≤ 1.584 n=60 b_ret_60m ≤ -1.877 n=45 잎값 +0.2778 n=18 d_inv_inv_prev ≤ 0.004728 n=27 잎값 +0.4000 n=15 잎값 +0.6667 n=12 잎값 +0.5333 n=15 잎값 +0.1000 n=10 잎값 ≥ 0 (예측을 위로) 잎값 < 0 (예측을 아래로) n = 그 노드에 떨어진 학습 표본 수 · 조건(≤)이 참이면 왼쪽 가지 '예', 거짓(>)이면 오른쪽 '아니오'
분기 조건·표본 수·잎값을 체크포인트 객체에서 그대로 읽었다. 노드 안 n 은 그 노드를 지난 학습 표본 수다.
그림 C · 마지막 트리 f₄₀₀ 의 실제 분기 깊이 0 · 뿌리 분기 조건 · n 깊이 1 분기 조건 · n 깊이 2 분기 조건 · n 깊이 3 분기 조건 · n 깊이 4 · 잎 분기 없음 max_depth = 4 뿌리→잎 분기 4번까지 이 트리 실제 깊이 4 예 아니오 예 아니오 예 아니오 예 아니오 예 아니오 b_ret_60m ≤ -5.568 n=70 잎값 +0.2857 n=7 d_block_share_prev ≤ 0.03307 n=63 b_vol_last30_share ≤ 0.3213 n=55 b_rng_day ≤ 16.95 n=40 잎값 +0.4062 n=32 잎값 +0.1250 n=8 b_pos_60m ≤ 0.4687 n=15 잎값 +0.4000 n=5 잎값 +0.5000 n=10 잎값 +0.6250 n=8 잎값 ≥ 0 (예측을 위로) 잎값 < 0 (예측을 아래로) n = 그 노드에 떨어진 학습 표본 수 · 조건(≤)이 참이면 왼쪽 가지 '예', 거짓(>)이면 오른쪽 '아니오'
마지막 트리 — 부스팅이면 잔차를 마지막으로 다듬는 트리이고, 배깅이면 다른 무작위 분기로 키운 또 한 그루다.
그림 D · 400그루 전체의 깊이×피처 분기 수
분기 위치 \ 피처d_wdm_ob5_imbb_pos_dayb_ret_60mb_rng_dayb_f10_ret_5mm_ob_imbb_curve_20mb_pos_60md_inv_inv_prevb_gap_openb_ret_20mb_ret_120md_basis_theo_prevb_ret_5mm_cnt5_imbb_f10_ret_20mb_pos_20md_dteb_vwap_devb_ret_1500b_ret_30mb_f10_ret_openb_vol_dayb_rng_20md_basis_mkt_prevd_inv_for5_prevb_ret_opend_inv_bank_prevb_vol_last30_shareb_rng_60md_inv_ind_prevd_inv_sec_prevb_curve_60mb_ma_dev_20md_inv_for_prevd_inv_ins_prevd_kospid_block_share_prevd_vol_z_prevb_vol_last5_shared_ret10_prevb_f10_ret_60md_mis_prevd_ret5_prevb_ma_dev_60mb_ret_1md_curve_chg_prevd_ret_prevd_fx_usdkrwb_ret_10md_fx_dollard_fx_usdjpyd_fx_eurusdd_oi_chg_prevm_aggr_20mm_aggr_5mm_aggr_60mm_aggr_daym_spread합
깊이 0 (뿌리)72211221712201012910151831015118261011778714657151461241365526500231353300000399
깊이 1282023142415141718181411121314151610142012151713910181415158141141310157121161071171055754871300000669
깊이 22827281718182028181719211623201718242316231914161918172112131891320151412171413106137111015147912959700000877
깊이 3301913211324151118222016162317131417201511111719181958161115141713714101010913149141071112151310576400000761
분기 합93887574726969666666636362626160595959575656555554545449484642424241413939383736353534343432313131302725241917000002,706

어느 깊이에서 어느 피처가 몇 번 갈랐나(그루 400개 합).

결과

설계 넷 × 모델 다섯의 풀링 승률
재생 2019~2026 같은 1,499일. 붉은 실선이 규칙20(58.84%). 주간 재학습(짙은 막대) 중 규칙선에 닿는 모델이 없다. 확장창(연한 막대)의 1변수 회귀만 60.31% 로 선을 넘지만 API 로는 할 수 없는 설계이고 유의하지도 않다.
설계별 정직 선택(시험연도 이전 성적으로 고른 모델).
설계승률누적해마다 고른 모델
W 주간 재학습0.5697+440틱log_s → et ×2 → paper → log_s → paper ×2 → log_s
D 매일 재학습0.5630+400틱W 와 같고 2026 만 paper
M 기억 앙상블0.5811+508틱log_s → log ×4 → paper ×3
E 확장창0.5991+626틱log_s ×2 → paper ×6
규칙200.5884+612틱—
창 상수0.5330+48틱—
적응 상수1200.5544+274틱—
연도별 승률
연도별. 규칙20 이 2019, 2023, 2026 에 강하고 설계 사이 순서는 해마다 바뀐다.
누적 틱
맞히면 +|ref_tick|, 틀리면 −|ref_tick| 를 더한 누적. 방향 채점 게임의 점수판이지 손익이 아니다.
API 창 승률
실제 API 데이터(2026-07-27~09-23, 38일). 창 상수가 60.5% 로 모든 모델보다 높다. 이 구간은 기저율이 쏠려 있고, 38일로는 어떤 차이도 판정할 수 없다.

가설별로 읽기

같은 시험일을 짝지은 McNemar. 앞쪽이 높고 p<0.05 여야 «지지».
#비교앞 vs 뒤b:cp판정
H34API 틱 ↔ 로컬라벨 100% · 칸 96.1%——지지
H35W 정직 ↔ 규칙200.5697 vs 0.5884225:2530.2168미지지
H36W log_s ↔ W et0.5851 vs 0.5730185:1670.3649미지지
H37M 정직 ↔ W 정직0.5811 vs 0.5697214:1970.4300미지지
H38API W et_m ↔ et0.5263 vs 0.5526 (38일)0:11.0판정 불가
H39D 정직 ↔ W 정직0.5630 vs 0.569751:610.3952미지지
  • 4개월 창으로 배운 모델은 규칙 수준에 머문다. 학습 유효일 60~70일로 배울 수 있는 것이 «마감 전 모멘텀» 정도이고 규칙20 이 그것을 공짜로 준다. 가장 좋은 주간 모델(작은 로지스틱 58.51%)도 규칙 아래다.
  • 작고 단순한 모델이 조금 낫다. 작은 로지스틱과 1변수 회귀가 52열 모델보다 높지만 유의하지 않다.
  • 기억을 늘리면 나아지는 방향이다. M(+1.14%p)과 E(+2.94%p) 모두 W 보다 높다. API 만으로는 M 을 운영하며 쌓는 길뿐이다.
  • 주간 재학습으로 잃는 것은 없다(H39). 매일 재학습이 오히려 0.67%p 낮다.
  • 주간 재학습은 창 상수는 유의하게 넘는다(0.5697 vs 0.5330, 242:187, p=0.0091).

대회 모델과 운영

  • 서빙 체크포인트 checkpoints/serving.joblib = log_s(W 재생 풀링 1위 0.5851), API 유효일 70일로 학습. 예측 경로 동등성: 9/21, 22, 23 을 그날만 다시 받아 만든 피처와 확률이 학습 표와 같다(0.171395, 0.197325, 0.549428).
  • 예측: infer11.py predict: 15:34 직후 그날 틱을 endTime=153400 으로 받는다(약 11MB).
  • 재학습: infer11.py train --out …: 월요일 아침. 세는 용량 약 800MB 라 하루 한도의 80% 를 쓰고, 같은 키를 쓰는 배치의 장중 수급 수집과 겹친다. 이틀에 나눠 받기, 플랜 상향, 받는 시간대 축소 중 하나가 필요하다.
  • 규칙20 을 넘지 못했으므로 대회 제출 대장에는 올리지 않았다.

한계

재생은 로컬 1분봉을 «그때 API가 줬을 것»의 대리로 쓴 것이다(거래량 계열 일치율 72.5%). «일중» 봉 피처는 개장 2분 + 13:30 이후에서 잰 것이라 하루 전체로 잰 값과 다르다. API 창 38일은 판정에 쓰기에 짧다. 레짐별 분해는 하지 않았다. 누설 카나리아(피처 하나의 부호가 기저율을 10%p 넘게 맞히는가)는 재생과 API 모두 0건이다.

산출물

  • results/20260928_000523_api/metrics.json: 지표, 판정, 동등성, API 사용량 원장
  • results/20260928_000523_api/per_day.parquet: 날짜별 예측 확률(원자료 아님)
  • results/20260928_000523_api/checkpoints/: API 데이터로만 학습한 체크포인트 7개
  • code/: api11(수집, 한도 대기), feat11(봉, 라벨, 피처), data11, models11, infer11(예측, 재학습), 그림