세 줄 요약
- 3년 국채선물 근월물에서 큐 맨 뒤 50계약 지정가가 60초 안에 채워질 확률은 13.2%였다. LightGBM 체결 확률 모델의 Brier 점수는 큐 길이만 쓴 기준보다 7.4% 낮아 사전 문턱 10% 에 못 미쳤다.
- 모델이 고른 주문만 지정가로 내고 못 채우면 60초 뒤 시장가로 넘기는 정책은 시장가(주문당 0.504틱)보다 0.098틱 아꼈다. 24일 모두 양이고 0 보다 크다는 것은 뚜렷하지만(p 0.0002) 문턱 0.25틱에는 멀다.
- 판정은 보류다. 이득의 93%는 «큐가 짧을 때만 지정가» 라는 한 줄 규칙에서 나오고, 미래를 아는 오라클도 0.177틱이라 0.25틱은 큐 앞자리를 미리 잡지 않으면 닿지 않는다.
가설과 결론
앞선 장중 실험들은 공격적으로 시장가로 들어가는 신호가 1틱 비용을 넘지 못한다는 결론을 여러 번 냈다. 신호를 바꾸지 않고 비용을 줄이는 길은 실행에 있다. 시장가 매수는 매도 1호가에 사므로 스프레드가 1틱이면 중간가보다 0.5틱 비싸게 산다. 매수 1호가에 지정가를 걸어 채워지면 반대로 0.5틱 싸게 산다. 둘의 차는 주문당 1틱이다. 문제는 지정가가 늘 채워지지 않는다는 것이고, 채워지지 않는 때가 하필 가격이 우리 방향으로 달아날 때라는 것(역선택)이다. 앞선 실험 하나는 무조건 지정가를 냈다가 이 역선택에 이득을 거의 다 잃었다.
이 실험은 «언제 지정가를 내야 하나» 를 모델에게 맡긴다. 지정가를 내기 전에 그 주문이 10초, 60초 안에 채워질 확률을 호가 잔량, 불균형, 직전 체결 흐름으로 예측하고, 못 채웠을 때 치를 비용까지 예측해, 기대 비용이 시장가보다 작을 때만 지정가를 낸다. 아이디어는 Jane Street 인턴 성과 글(2026)의 «호가창의 모든 주문의 미래를 답하는 신경망» 한 줄에서 왔다. 원문에는 라벨, 시간 지평, 특징이 적혀 있지 않아 설계는 이 실험의 사전등록이 정했다. 장중 신호 봇이 실제로 주문을 낼 때 바로 붙일 수 있는 실행 덮개라 빈도 규칙은 적용하지 않았다.
- 가설
- H822: LightGBM 이 예측한 60초 체결 확률의 확인 구간 Brier 점수가 큐 길이만 쓴 로지스틱 기준보다 10% 이상 낮다. H823: 정책 비용이 시장가 비용보다 주문당 0.25틱 이상 작다. H824: 정책이 지정가로 낸 주문 중 체결된 것의 60초 마크아웃이, 모든 주문을 지정가로 냈을 때 체결된 것의 마크아웃보다 0.2틱 이상 낫다. 세 가설 모두 거래일 블록 부트스트랩 한쪽 p 와 Holm 보정으로 판정한다.
- 결론
- 세 가설 모두 지지되지 않았다. Brier 개선은 7.4%(90% 구간 6.3 ~ 8.4%), 정책 절감은 0.098틱(0.093 ~ 0.102), 마크아웃 차는 0.020틱이다. 세 Holm p 는 모두 1.00 이다. 다만 정책 절감이 0 보다 크다는 것은 p 0.0002 로 뚜렷해 사전 규칙에 따라 판정은 보류다.
| 가설 | 내용 | 예측 | 값 | Holm p | 판정 |
|---|---|---|---|---|---|
| H822 | Brier 개선 ≥ 10% | 15 ~ 30% | 7.4% (0.1041 → 0.0965) | 1.00 | 미지지 |
| H823 | 정책 절감 > 0.25틱 | 0.1 ~ 0.3틱 | +0.098틱 | 1.00 | 미지지 |
| H824 | 체결분 마크아웃 차 > 0.2틱 | 0.05 ~ 0.2틱 | +0.020틱 | 1.00 | 미지지 |
예측 칸은 사전등록 때 적은 부호와 크기다. 정책 절감과 마크아웃 차는 예측 구간의 아래쪽 끝에, Brier 개선은 예측 구간 바로 아래에 떨어졌다. 모델은 체결을 잘 맞히고 비용도 꾸준히 줄이지만, 줄이는 크기가 사전에 요구한 0.25틱의 40% 안팎이다.
용어와 기호
- 3선
- 한국거래소 3년 국채선물. 이 페이지의 주문은 모두 그날 거래량이 가장 많은 월물(근월물)에 낸다
- 틱
- 3선 가격의 최소 단위 0.01. 비용과 절감은 모두 주문 한 건당 틱이다
- 최우선 호가, 1호가
- 가장 높은 매수 호가 b1 과 가장 낮은 매도 호가 a1. 스프레드는 a1 − b1 이고 98% 이상의 시각에서 1틱이다
- 시장가, 지정가
- 시장가는 반대편 1호가에 바로 체결하는 주문이다. 지정가는 자기 쪽 1호가 가격에 걸어 두고 상대가 와서 칠 때까지 기다린다
- 큐, Q0
- 같은 가격에 먼저 걸린 주문들의 줄. Q0 는 주문을 넣는 순간 우리 앞에 선 잔량(계약)이다. 거래소는 가격이 같으면 먼저 온 주문부터 채운다
- t0, s, P
- t0 는 가상 주문을 넣는 시각, s 는 방향(매수 +1, 매도 −1), P 는 자기 쪽 1호가 가격(매수면 b1)이다
- M0
- t0 의 중간가 (a1 + b1) / 2. 모든 비용은 이 도착 중간가를 기준으로 잰다
- F10, F60, tf
- 지정가가 t0 뒤 10초, 60초 안에 채워졌으면 1. tf 는 채워진 시각이다
- cM, cF, cU
- 시장가 비용 s(반대 1호가 − M0), 지정가 체결 비용 s(P − M0), 못 채웠을 때 60초 뒤 시장가로 넘긴 비용 s(반대 1호가(t0+60초) − M0). 단위 틱, 양수가 비용이다. 스프레드 1틱이면 cM = 0.5, cF = −0.5
- p̂60, ĉU, Ê
- 모델이 예측한 60초 체결 확률, 못 채웠을 때의 예상 대체 비용, 예상 지정가 비용 Ê = p̂60 cF + (1 − p̂60) ĉU
- 정책
- Ê < cM 이면 지정가 + 60초 대체, 아니면 바로 시장가. 문턱을 고르는 단계가 없다
- 절감
- cM − 정책 비용. 양수면 시장가보다 싸게 샀다는 뜻이다
- 마크아웃 mk60
- 체결된 지정가에 대해 s(체결 60초 뒤 중간가 − P). 음수면 채워진 뒤 가격이 불리하게 갔다(역선택)
- Brier 점수
- 예측 확률과 실제 0/1 의 차 제곱 평균. 작을수록 좋다. 60초 체결률이 13% 라 항상 0.13 을 말하는 예측의 Brier 는 약 0.115 다
- AUC
- 체결된 주문 하나와 안 된 주문 하나를 골랐을 때 모델이 체결된 쪽에 더 높은 확률을 줄 비율. 0.5 는 동전
- 오라클
- 미래를 알고 주문마다 시장가와 지정가 중 싼 쪽을 고르는 가상의 정책. 어떤 모델도 넘을 수 없는 상한이다
- 거래일 블록 부트스트랩
- 확인 구간 24거래일을 날짜째 복원 추출해 통계량을 5,000번 다시 구한다. 같은 날 표본끼리의 상관을 그대로 둔다. 한쪽 p 는 통계량이 0 이하인 재표본의 비율이다
- Holm 보정
- H822, H823, H824 세 p 를 한 묶음으로 보고, 여럿을 시험해 생기는 우연 통과를 막는 보정
자료
데이터셋
| 자료 | 기간 | 해상도 | 쓰임 |
|---|---|---|---|
| 코스콤 KRX 선물 호가(B606F) | 2026-07-08 ~ 2026-11-05, 74거래일 | 호가 갱신 하나하나, 거래소 시각 마이크로초 | 1~5단 가격과 잔량, 큐 길이, 중간가 |
| 코스콤 KRX 선물 체결(G706F) | 같음 | 체결 하나하나, 마이크로초 | 체결 재생, 체결 흐름 특징 |
| 앞선 장중 되돌림 실험 두 개의 사건 목록 | 2026-07 ~ 2026-10 | 사건 시각과 방향 | 실제 신호에 정책 적용(탐색, 51건) |
코스콤 직수신 시세를 미러 데이터베이스에서 하루 파일로 받은 것이다. 거래소가 찍은 시각(HOGA_TIME, TRADE_TIME)을 쓰고 우리 쪽 수신 시각은 쓰지 않았다. 근월물은 그날 3선 종목 가운데 체결량이 가장 많은 것으로 정했고, 9월물에서 12월물로의 교체는 09-14 에 일어났다. 롤 주간(09-08 ~ 09-14)에는 근월물의 거래량 점유율이 0.58 ~ 0.92 로 낮았지만, 실제 거래자가 겪는 조건이라 그대로 두었다. 온전한 날의 3선 근월물 하루 체결은 약 2,600 ~ 7,800건, 거래량은 7만 ~ 19만 계약이고, 1호가 잔량의 하루 중앙값은 약 490 ~ 1,160계약이다.
정리와 제외
결과 지표를 보기 전에 날짜별 행 수, 첫 행과 끝 행 시각, 중복, 시각 공백을 점검해 제외 규칙을 사전등록에 적었다. 07-29 는 체결이 1,368건뿐이고 5시간 넘는 공백이 있어 뺐다. 07-31 은 같은 행이 겹쳐 들어온 날로, 완전 중복을 지운 뒤에도 체결 9,770건과 거래량 24만 계약으로 평소의 두 배라 행을 믿을 수 없어 뺐다. 그 밖의 날에도 호가가 90초 넘게 끊긴 구간이 있었다(07-09 34분, 09-10 34분, 10-30 21분, 11-04 2시간 25분). 가상 주문 시각의 앞 5분과 뒤 3분 안에 이런 공백이 있으면 그 주문을 버렸고, 그날 첫 호가 뒤 5분 안과 마지막 자료 3분 전 뒤의 주문도 버렸다. 07-08, 08-20, 09-04 처럼 일부 시간만 받은 날은 받은 구간만 쓴다.
11-04 와 11-05 는 다른 미러에서 받은 날이라 호가 행이 평소의 세 배다. 갱신이 더 촘촘하게 기록됐을 뿐 상태는 같으므로, 갱신 횟수처럼 기록 밀도에 따라 값이 바뀌는 특징은 처음부터 쓰지 않았다. 결과를 본 뒤에는 체결 표의 공격 방향 필드가 10월 말까지 모든 행 «매도», 그 뒤 빈 값이라는 것도 알았다. 이 결함의 영향은 결과 절의 실패 진단에서 따로 잰다.
방법
가상 주문과 체결 재생
09:00:00 부터 15:15:00 까지 10초마다(하루 최대 2,251 시각) 매수와 매도 가상 주문을 하나씩 넣는다. 장 시작 15분과 마감 단일가 앞 20분을 뺀 연속 거래 구간이다. 주문은 50계약이고, 그 순간 자기 쪽 1호가 가격 P 에 큐 맨 뒤로 선다. 그 순간 같은 가격에 걸린 잔량 Q0 가 모두 우리 앞에 있다고 본다.
체결은 보수적으로 판정한다. t0 뒤 가격 P 에서 일어난 체결의 누적 수량이 Q0 + 50 이상이 되면, 또는 가격 P 를 넘어서는 체결(매수면 P 보다 낮은 체결)이 나오면, 그 시각에 50계약 전부가 채워진 것으로 본다. 우리 앞 주문의 취소는 실제로는 우리 차례를 앞당기지만 자료에서 알 수 없으므로 세지 않는다. 부분 체결도 미체결로 본다. 그래서 이 재생의 체결률은 실제보다 낮은 쪽으로 기운다. 격자에서는 큐 앞 잔량의 절반만 앞에 있다고 보는 가정과 맨 앞에 선다고 보는 가정도 함께 돌려 그 폭을 보였다.
비용과 정책
모든 비용은 주문을 넣는 순간의 중간가 M0 와 실제 실행 가격의 차로 잰다. 시장가는 그 순간 반대편 1호가에 산다. 지정가가 60초 안에 채워지면 P 에 산 것이고, 못 채우면 60초 뒤의 반대편 1호가에 시장가로 산다. 못 채운 주문은 대개 가격이 우리 방향으로 달아난 경우라 이 대체 비용이 시장가보다 크다. 이것이 역선택이 비용에 들어오는 길이다. 정책은 주문마다 예상 지정가 비용 Ê 를 계산해 시장가 비용 cM 보다 작으면 지정가를, 아니면 시장가를 고른다. cM 은 주문 순간 화면에 보이는 값이고 Ê 는 t0 이전 정보로만 만든 예측이다. 비교 문턱이 cM 자체라 학습 자료에서 문턱을 고르는 단계가 없고, 그래서 선택 편향을 막는 순열 귀무를 따로 돌릴 필요가 없었다. 대신 같은 비율로 무작위로 지정가를 고르는 귀무 1,000회를 함께 보였다.
검정, 기준선, 격자
학습은 2026-07-08 ~ 09-30 의 48거래일, 확인은 10-01 ~ 11-05 의 24거래일이다. 공통 규칙인 «확인 구간 2024년 이후» 는 마이크로초 호가가 2026-07 부터라 지킬 수 없었다. 모델 설정은 미리 고정했고 튜닝하지 않았다. 세 가설의 통계량은 확인 구간에서 계산하고, 거래일 블록 부트스트랩 5,000회로 한쪽 p 를 구해 Holm 으로 보정한다. H822 는 0.9 × 기준 Brier − 모델 Brier 가 0 보다 큰지, H823 은 평균 절감 − 0.25 가 0 보다 큰지, H824 는 마크아웃 차 − 0.2 가 0 보다 큰지 본다. 채택은 H823 과 H822 가 모두 Holm 을 통과할 때, 보류는 그렇지 않지만 정책 절감이 0 보다 유의하게 클 때, 폐기는 그 밖이다.
기준선은 여섯이다. 항상 시장가, 항상 지정가 + 60초 대체, 큐가 학습 구간 중앙값(678계약)보다 짧을 때만 지정가, 큐 길이만 쓴 로지스틱 정책, 전체 특징 로지스틱 정책, 오라클이다. 강건성 격자는 대기 시간 10, 30, 60초와 큐 가정 셋(전부, 절반, 맨 앞), 주문 크기 10, 50, 100계약의 27칸이고 칸마다 그 칸의 라벨로 모델을 다시 학습했다. 실행 지연은 주문이 1초 늦게 닿는 경우로, 그때의 호가로 P 와 Q0 를 다시 정하고 비용은 여전히 t0 중간가로 잰다. 충격 구간은 확인 구간 안의 금통위 날 하루(10-22)를 뺀 결과로 본다.
모델
확증 모델은 LightGBM 이진 분류기다. 주문 하나의 특징 23개를 받아 60초 안 체결 확률 p̂60 을 낸다. 특징은 네 무리다. 큐와 불균형(자기 쪽 1호가 잔량의 로그, 반대쪽 잔량의 로그, 1호가 불균형, 1~5단 누적 불균형, 2~5단 잔량, 지금 큐가 직전 5분 평균의 몇 배인지), 체결 흐름(직전 10초와 60초의 체결 건수, 같은 가격 체결량, 방향별 공격 수량), 가격(직전 10초, 60초, 5분 중간가 변화를 주문 방향 부호로, 5분 변동성, 마지막 가격 변경 뒤 경과 초), 그리고 시각과 방향이다. 같은 설정의 LightGBM 회귀기를 학습 구간에서 못 채운 주문만으로 학습해 대체 비용 ĉU 를 예측한다. 비교 모델은 큐 길이 하나만 넣은 로지스틱 회귀(기준)와 23개 특징을 표준화해 넣은 로지스틱 회귀다. 아래 구조도는 정본 런에 저장된 분류기 파일을 그대로 읽어 그렸고, 그리기 전에 그 파일의 예측이 탐색 스크립트의 재적합 예측과 소수 9자리까지 같은지 확인했다.
| 분기 위치 \ 피처 | 장 시작 뒤 분 | 5분 변동성 | log(1+반대 잔량) | log(1+Q0) | 가격 변경 뒤 초 | 1호가 불균형 | Q0 / 5분 평균 잔량 | 직전 60초 같은 가격 체결 | 반대 2~5단 | 자기 쪽 2~5단 | 5단 불균형 | 5분 중간가 변화 | 60초 체결 건수 | 60초 자기 쪽 공격량 | 60초 반대 공격량 | 60초 중간가 변화 | 직전 10초 같은 가격 체결 | 10초 중간가 변화 | 10초 반대 공격량 | 10초 체결 건수 | 10초 자기 쪽 공격량 | 매수 여부 | 스프레드 | 합 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 깊이 0 (뿌리) | 15 | 3 | 14 | 25 | 20 | 22 | 51 | 9 | 12 | 9 | 5 | 21 | 5 | 7 | 9 | 13 | 10 | 6 | 9 | 8 | 8 | 2 | 17 | 300 |
| 깊이 1 | 60 | 34 | 25 | 30 | 32 | 31 | 21 | 45 | 26 | 18 | 16 | 25 | 15 | 17 | 15 | 8 | 34 | 22 | 5 | 7 | 8 | 2 | 10 | 506 |
| 깊이 2 | 106 | 81 | 34 | 45 | 31 | 60 | 45 | 36 | 33 | 44 | 23 | 33 | 35 | 20 | 20 | 20 | 21 | 28 | 6 | 25 | 7 | 1 | 3 | 757 |
| 깊이 3 | 171 | 98 | 56 | 54 | 61 | 66 | 40 | 46 | 54 | 58 | 25 | 67 | 45 | 23 | 28 | 32 | 20 | 20 | 10 | 11 | 10 | 6 | 7 | 1,008 |
| 깊이 4 | 226 | 96 | 88 | 65 | 59 | 77 | 61 | 61 | 60 | 46 | 52 | 56 | 45 | 36 | 40 | 32 | 14 | 11 | 9 | 9 | 13 | 8 | 2 | 1,166 |
| 깊이 5 | 214 | 88 | 83 | 75 | 85 | 60 | 65 | 62 | 56 | 63 | 64 | 57 | 38 | 39 | 31 | 13 | 24 | 10 | 9 | 7 | 6 | 7 | 2 | 1,158 |
| 깊이 6 | 188 | 76 | 61 | 79 | 82 | 58 | 56 | 69 | 63 | 57 | 58 | 39 | 46 | 37 | 37 | 13 | 17 | 3 | 6 | 7 | 5 | 8 | 3 | 1,068 |
| 깊이 7 | 134 | 58 | 69 | 72 | 64 | 37 | 55 | 65 | 59 | 67 | 63 | 25 | 34 | 28 | 25 | 17 | 10 | 1 | 12 | 3 | 5 | 10 | 0 | 913 |
| 깊이 8 | 114 | 38 | 73 | 57 | 47 | 41 | 39 | 49 | 60 | 39 | 49 | 13 | 23 | 31 | 28 | 10 | 6 | 1 | 8 | 6 | 8 | 5 | 0 | 745 |
| 깊이 9 | 76 | 32 | 54 | 41 | 48 | 30 | 33 | 32 | 39 | 28 | 42 | 12 | 25 | 26 | 18 | 7 | 3 | 1 | 6 | 3 | 5 | 1 | 0 | 562 |
| 깊이 10 | 42 | 22 | 38 | 15 | 22 | 16 | 25 | 24 | 25 | 27 | 21 | 8 | 18 | 21 | 10 | 3 | 0 | 0 | 7 | 3 | 3 | 3 | 0 | 353 |
| 깊이 11 | 29 | 21 | 17 | 13 | 18 | 13 | 12 | 11 | 15 | 15 | 20 | 1 | 8 | 8 | 7 | 1 | 1 | 0 | 1 | 0 | 1 | 5 | 0 | 217 |
| 깊이 12 | 17 | 3 | 6 | 15 | 6 | 2 | 10 | 6 | 11 | 11 | 14 | 4 | 9 | 3 | 6 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 0 | 128 |
| 깊이 13 | 8 | 2 | 2 | 8 | 6 | 11 | 2 | 3 | 4 | 2 | 0 | 1 | 2 | 3 | 5 | 1 | 0 | 0 | 2 | 0 | 0 | 1 | 0 | 63 |
| 깊이 14 | 2 | 2 | 3 | 2 | 2 | 2 | 2 | 2 | 1 | 0 | 2 | 0 | 2 | 0 | 2 | 0 | 1 | 0 | 0 | 1 | 0 | 2 | 0 | 28 |
| 깊이 15 | 2 | 1 | 0 | 3 | 2 | 0 | 5 | 0 | 1 | 0 | 3 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 20 |
| 깊이 16 | 1 | 0 | 2 | 0 | 0 | 1 | 1 | 1 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 7 |
| 깊이 17 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| 분기 합 | 1,405 | 655 | 626 | 599 | 585 | 527 | 523 | 521 | 519 | 484 | 457 | 362 | 351 | 301 | 282 | 170 | 162 | 103 | 91 | 91 | 80 | 62 | 44 | 9,000 |
| 손실 감소(gain) 몫 | 11.5% | 6.0% | 2.9% | 9.8% | 3.0% | 8.3% | 27.3% | 5.9% | 2.3% | 2.2% | 1.9% | 3.1% | 2.5% | 1.2% | 1.3% | 1.2% | 6.4% | 1.1% | 0.2% | 1.1% | 0.2% | 0.4% | 0.2% | 100% |
300그루 전체에서 깊이마다 어떤 특징으로 갈랐는지 센 표다.
| 모델 | 목표 | 학습 행 | 설정 |
|---|---|---|---|
| LightGBM 분류기(확증) | F60, 따로 F10 | 205,790 | 트리 300, 학습률 0.05, 잎 31, 잎 최소 200행, 행 표본 0.8, 특징 표본 0.8, seed 241 |
| LightGBM 회귀기 | cU (못 채운 주문) | 학습 구간 F60 = 0 인 행 | 같은 설정 |
| 로지스틱(기준) | F60, F10 | 205,790 | 입력 log(1+Q0) 하나, L2, C = 1 |
| 로지스틱(전체) | F60, F10 | 205,790 | 23개 특징 표준화, L2, C = 1 |
분류기에서 분기 이득이 가장 큰 특징은 지금의 큐 길이를 직전 5분 평균으로 나눈 상대 길이이고, 그다음이 장 시작 뒤 경과 분, 큐 길이의 로그, 1호가 불균형이다. 큐 상대 길이, 큐 길이, 1호가 불균형 셋이 분기 이득의 45% 를 차지한다. 대체 비용 회귀기는 1호가 불균형을 가장 많이 쓴다. 반대쪽 잔량이 얇으면 그쪽 가격이 곧 사라져 60초 뒤 시장가가 비싸질 가능성이 높기 때문이다.
결과
확증 결과
확인 구간 105,856건의 가상 주문 가운데 60초 안에 채워진 것은 13.2%, 10초 안은 2.0%였다. 3선 1호가에는 보통 수백 계약이 서 있고 1분 거래량도 수백 계약이라, 큐 맨 뒤 주문은 가격이 우리 쪽으로 넘어오지 않는 한 1분 안에 잘 채워지지 않는다. 시장가의 평균 비용은 0.504틱(스프레드가 2틱인 0.8% 표본 때문에 0.5 보다 조금 크다), 모든 주문을 지정가로 냈을 때의 평균 비용은 0.465틱, 정책의 평균 비용은 0.406틱이었다. 정책은 주문의 53%를 지정가로 냈다.
| 가설 | 통계량 | 추정 | 90% 구간 | 한쪽 p | 문턱 |
|---|---|---|---|---|---|
| H822 | 1 − BrierLGBM / Brier기준 | 7.4% | 6.3 ~ 8.4% | 1.00 | 10% |
| H823 | 평균 절감 cM − c정책 | +0.098틱 | 0.093 ~ 0.102 | 1.00 (0 대비 0.0002) | 0.25틱 |
| H824 | mk60(정책 체결) − mk60(전체 체결) | −0.154 − (−0.174) = +0.020틱 | 0.011 ~ 0.029 | 1.00 | 0.2틱 |
세 통계량 모두 부호는 예측대로 양이고 구간도 좁다. 문제는 크기다. 정책 절감 90% 구간의 위 끝 0.102틱은 문턱 0.25틱의 절반에도 못 미친다. 체결분 마크아웃은 정책이 고른 주문이 −0.154틱, 전체가 −0.174틱이다. 지정가가 채워지면 60초 뒤 중간가가 이미 체결가보다 불리한 쪽에 있고, 모델은 그 역선택을 0.02틱만 덜어 낸다.
체결 확률은 얼마나 맞나
60초 체결 확률의 Brier 점수는 큐 길이만 쓴 로지스틱이 0.1041, 전체 특징 로지스틱이 0.0982, LightGBM 이 0.0965다. AUC 는 각각 0.715, 0.773, 0.784 다. 10초 체결은 기준 0.01849, LightGBM 0.01719(7.0% 개선)이고 AUC 는 0.816 에서 0.868 로 올랐다. 그림 3 왼쪽에서 LightGBM 의 점은 대각선에 붙어 있어, 예측이 0.4 라고 하면 실제로 40% 안팎이 채워진다. 오른쪽 그림은 체결률이 큐 길이에 얼마나 묶여 있는지 보여 준다. 큐가 200계약 아래면 60초 체결률이 50% 에 가깝고 300계약 아래면 30% 를 넘지만, 1,300계약을 넘으면 5% 안팎으로 떨어진다. 큐 길이 하나가 이미 이 곡선의 대부분을 설명하므로, 나머지 22개 특징이 더할 수 있는 몫이 처음부터 작았다.
정책과 기준선
| 정책 | 비용 | 절감 | 90% 구간 | 지정가 비율 |
|---|---|---|---|---|
| 항상 시장가 | 0.504 | 0 | 0% | |
| 항상 지정가 + 60초 대체 | 0.465 | +0.039 | 0.036 ~ 0.043 | 100% |
| 큐 < 678계약이면 지정가 | 0.425 | +0.079 | 0.075 ~ 0.083 | 45% |
| 큐 길이만 로지스틱 정책 | 0.413 | +0.091 | 0.086 ~ 0.095 | 56% |
| 전체 특징 로지스틱 정책 | 0.408 | +0.096 | 0.091 ~ 0.100 | 54% |
| LightGBM 정책(확증) | 0.406 | +0.098 | 0.093 ~ 0.102 | 53% |
| 오라클(상한) | 0.327 | +0.177 | 0.164 ~ 0.190 | 18% |
| 무작위 귀무 1,000회 | 평균 +0.021 | 99% 분위 +0.023 | 53% |
표는 이 실험의 핵심을 담고 있다. 항상 지정가를 내기만 해도 0.039틱을 아끼지만, 무작위로 절반만 지정가로 내면 0.021틱에 그친다. 큐가 학습 중앙값보다 짧을 때만 지정가를 내는 한 줄 규칙은 0.079틱, 큐 길이만 넣은 로지스틱 정책은 0.091틱을 아낀다. LightGBM 정책의 0.098틱과의 차는 0.007틱이다. 같은 날을 짝지은 부트스트랩으로 이 차가 0 보다 크다는 것은 뚜렷하지만(p 0.0002, 90% 0.005 ~ 0.008) 크기는 작다. 정책 이득의 93%가 큐 길이 하나로 설명된다. 그리고 미래를 아는 오라클도 0.177틱밖에 못 아끼므로, 보수적 체결 가정 아래에서 0.25틱이라는 문턱은 어떤 모델로도 닿을 수 없는 값이었다. 사전등록 때 이 상한을 계산하지 않은 것은 설계의 실수다.
격자, 지연, 날짜
27칸 모두 절감이 양이다. 대기 시간이 길수록, 큐 앞 잔량을 적게 볼수록, 주문이 작을수록 절감이 커진다. 큐 앞 잔량 전부를 기다리는 확증 가정에서는 대기 10초가 0.036틱, 30초가 0.070틱, 60초가 0.098틱이다. 큐의 절반만 앞에 있다고 보면 60초에서 0.122틱으로 오른다. 0.25틱을 넘는 칸은 큐 맨 앞에 선다고 가정한 두 칸(30초 10계약 0.258틱, 60초 10계약 0.366틱)뿐이다. 즉 이 비용 문제의 손잡이는 «어떤 주문을 지정가로 낼까» 가 아니라 «큐의 어디에 서 있나» 다.
날짜별로 보면 정책 절감은 가장 낮은 날(10-08)이 0.072틱, 가장 높은 날(10-23)이 0.128틱이다. 24일 가운데 음수인 날은 없고, 문턱 0.25 에 다가간 날도 없다. 금통위 날(10-22)을 빼도 절감은 0.097틱이다. 주문이 1초 늦게 닿는다고 해도 0.090틱으로 거의 줄지 않는다. 학습 구간 안에서 잰 절감은 0.120틱으로 확인 구간보다 0.02틱 높아 과적합의 흔적은 작다. 진입과 청산 둘 다에 이 정책을 쓰면 왕복 0.195틱을 아끼는데, 이는 다른 실험들이 판정에 쓰는 왕복 1틱 비용의 19.5%, 보고용 2틱의 9.8% 다.
실패 진단
절감은 큐가 짧은 주문에 몰려 있다. 큐 앞 잔량이 가장 짧은 5분위(중앙값 294계약)에서는 정책이 93%를 지정가로 내고 0.307틱을 아낀다. 가장 긴 5분위(1,351계약)에서는 지정가를 19%만 내고 0.010틱을 아낀다. 같은 5분위에서 항상 지정가는 −0.124틱으로 시장가보다 나쁘다. 정책이 하는 일은 대부분 «긴 큐에는 서지 않는다» 이다. 시간대로 보면 점심 무렵인 12시가 0.068틱으로 가장 작고, 9시와 10시, 14시가 0.11틱 안팎으로 크다. 거래가 많아 큐가 빨리 소진되는 시간에 지정가가 유리하다.
왜 0.25틱에 못 미치는지 분해하면 이렇다. 정책이 지정가로 낸 주문의 60초 체결률은 20.0% 다. 채워지면 시장가보다 1틱을 아끼고, 못 채운 80% 는 60초 뒤 평균 0.530틱에 시장가로 산다(도착 때의 0.5 보다 조금 나쁨). 이득을 키우려면 체결률을 올려야 하는데, 큐 맨 뒤라는 자리가 그것을 막는다. 공격 방향 필드 결함도 확인했다. 방향 흐름 특징 넷을 빼고 다시 적합하면 Brier 0.0965, 절감 0.097틱이고, 직전 호가로 방향을 추정해 다시 만들면 Brier 0.0964, 절감 0.098틱이다. 결함은 결론을 바꾸지 않는다.
대기 시간을 주문마다 고르게 해도 나아지지 않았다(탐색). 바로 시장가, 지정가 + 10초, 30초, 60초 대체의 넷 가운데 예상 비용이 가장 작은 것을 고르면 절감은 0.096틱(90% 0.091 ~ 0.100)으로 60초 하나만 쓰는 확증 정책과 같다. 정책은 시장가를 43%, 60초 대기를 47% 골랐고 10초와 30초 대기는 합쳐 10% 였다. 이 네 선택지에서 미래를 아는 오라클도 0.185틱이라 상한이 거의 오르지 않는다. 주문을 언제 거둘지보다 어디에 서는지가 문제라는 진단과 맞는다.
방향성 신호와 실제 사건
위 결과는 방향이 무작위인 가상 주문의 평균이다. 실제 신호 주문은 방향이 있고, 신호가 맞을수록 가격이 우리 방향으로 달아나 지정가가 안 채워진다. 이를 보려고 60초 안 중간가의 움직임으로 표본을 셋으로 나눴다(탐색). 74% 는 중간가가 그대로였고 정책은 0.050틱을 아꼈다. 주문 방향으로 움직인 13% 에서는 체결률이 1.4% 로 떨어지고 정책이 −0.306틱을 잃었다. 반대로 움직인 13% 에서는 체결률 66.6%, 절감 0.771틱이다. 움직인 표본에서 방향이 맞은 비율을 h 라 하면 절감은 h 에 대해 직선이다. h = 0.6 이면 정책 절감이 0.069틱으로 줄고, 손익분기는 h = 0.84 다. 항상 지정가의 손익분기는 0.57 에 불과하다. 첫 1분 방향을 84% 넘게 맞히는 신호는 드물므로, 정책은 방향성 신호에서도 대체로 시장가보다 낫다.
앞선 두 장중 되돌림 실험(3선 고유 충격 되돌림, 고요 속 급변 되돌림)의 2026-07 ~ 10 사건 51건 가운데 47건이 표본 격자에 닿았다(탐색). 정책을 적용하면 시장가보다 0.064틱을 아꼈고(지정가 55%, 체결 19%), 항상 지정가는 0.000틱이었다. 고유 충격 사건 30건에서 정책 0.067틱 대 항상 지정가 −0.033틱, 급변 사건 17건에서 둘 다 0.059틱이다. 47건은 무작위 방향 표본의 0.098틱과 구별하기에 너무 적다. 독립성 점검은 이 실험에 맞지 않는다. 실행 덮개라 손익 흐름이 따로 없고, 기존 전략의 진입 시각에 붙여 본 것이 이 사건 분석이다.
해석
체결 확률 모형 자체는 성공적이다. AUC 0.78 로 체결될 주문을 가려내고, 예상 지정가 비용을 10분위로 나눠 보면 예측 평균과 실현 평균이 모든 분위에서 0.03틱 안으로 맞는다. 그 예측으로 고른 정책은 24일 내내 시장가보다 싸다. 그러나 이 성공의 대부분은 큐 길이라는 한 숫자가 이미 갖고 있던 정보다. 3선 근월물은 1호가에 수백 계약이 서 있는 두꺼운 시장이라, 큐 맨 뒤에 선 주문은 가격이 우리 쪽으로 넘어올 때 주로 채워지고, 그렇게 채워진 주문은 곧바로 불리한 마크아웃을 안는다. 모델이 더 영리해져도 «큐 맨 뒤» 라는 출발점이 바뀌지 않는 한 오라클 상한 0.177틱 아래에 갇힌다.
남은 길은 정책을 정교하게 하는 것이 아니라 큐 앞자리를 미리 확보하는 것이다. 격자에서 큐 맨 앞, 10계약, 60초 칸은 0.366틱을 아꼈다. 신호와 무관하게 양쪽 1호가에 작은 주문을 미리 걸어 두는 운용은 원치 않는 체결이라는 새 비용을 낳으므로 그 비용까지 재야 한다. 지금 당장 장중 봇에 쓸 수 있는 것은 큐 길이 한 줄 규칙이다. 1호가 잔량이 학습 중앙값(약 680계약)보다 짧으면 지정가를 내고 60초 뒤 못 채우면 시장가로 넘긴다. 이것만으로 시장가 대비 0.079틱, 모델 정책 이득의 80% 를 얻는다.
한계
확인 구간이 24거래일, 한 달 남짓이다. 24일 모두 절감이 양이라 부호는 안정적이지만, 금리가 크게 움직이는 국면이나 유동성이 마른 국면은 이 표본에 거의 없다. 마이크로초 호가가 2026-07 부터라 공통 규칙인 2024년 이후 확인 구간을 지킬 수 없었다. 체결 재생은 큐 앞 취소를 세지 않는 보수적 가정이라 실제 체결률은 더 높을 수 있다. 반대로 숨은 주문, 같은 마이크로초 안의 순서, 우리 50계약이 큐에 서서 다른 참가자의 행동을 바꾸는 효과는 모른다. 격자의 «절반», «맨 앞» 칸이 그 불확실성의 폭을 보여 준다.
표본은 10초마다 방향이 무작위인 가상 주문이다. 실제 신호 주문은 방향성이 있어 절감이 줄어들며(손익분기 h 0.84), 실제 사건 47건은 탐색으로만 봤다. 결과를 본 뒤 두 가지를 알았다. 하나는 체결 표의 공격 방향 필드가 상수라 방향 흐름 특징 넷이 쓸모없었다는 것이고, 다시 적합해도 수치가 0.001틱 안에서 같았지만 체결 흐름의 방향 정보가 체결 예측을 돕는지는 제대로 묻지 못했다. 다른 하나는 H823 문턱 0.25틱이 오라클 상한 0.177틱보다 높아 처음부터 닿을 수 없었다는 것이다. 문턱은 결과를 본 뒤 바꾸지 않았다. 비용은 도착 중간가 대비 실행 가격만 쟀고 거래소 수수료와 주문 취소 비용은 넣지 않았다. 10선과 30선은 스프레드와 큐가 달라 이 수치를 그대로 옮길 수 없다.
다음에 해 볼 것
첫째, 큐 앞자리 상시 유지를 재생한다. 신호와 무관하게 양쪽 1호가에 10계약씩 걸어 두고, 신호가 나면 이미 큐 앞에 있는 쪽을 쓰며 반대쪽은 취소한다. 가격이 바뀌면 새 가격 큐 맨 뒤로 다시 선다. 같은 코스콤 자료로 우리 주문의 큐 위치를 체결로 차감해 추적하고, 신호 없이 채워진 원치 않는 체결의 마크아웃 비용과 신호 진입 절감을 함께 센다. 격자의 0.366틱이 상한이다. 둘째, 동적 재판정이다. 지정가를 낸 뒤 10초마다 남은 체결 확률과 대체 비용을 다시 예측해 일찍 시장가로 넘긴다. 방향성 신호(h 0.6 이상)에서 손실 꼬리를 줄이는지 본다.
산출물
코드는 실험 폴더의 code/, 정본 런은 results/20261108T055011_main/ 이고 탐색 결과는 그 아래 explore/ 다. 하루 단위 호가와 체결 캐시와 가상 주문 표는 크기 때문에 저장소 밖 캐시 폴더에 두며 아래 첫 두 명령이 다시 만든다. 그림은 모두 정본 런의 표와 학습된 모델 파일에서 다시 그린다.
| 경로 또는 명령 | 내용 |
|---|---|
uv run python code/data.py | 근월물 호가와 체결 하루 캐시, 점검표 |
uv run python code/s1_samples.py | 10초 격자 가상 주문, 특징, 체결 재생 라벨 |
uv run python code/s2_main.py | 확증 런: 모델, 정책, 검정, 기준선, 격자, 지연, 실제 사건 |
uv run python code/d1_explore.py results/20261108T055011_main | 재현 확인, 짝지은 비교, 방향 적중률 곡선 |
SIDE_MODE=inferred uv run python code/s1_samples.py → code/d2_side.py | 공격 방향 필드 결함 탐색 |
uv run python code/d3_multiwait.py results/20261108T055011_main | 대기 시간까지 고르는 정책(탐색) |
uv run python code/render_figures.py | 이 페이지의 그림과 모델 구조도 |
results/20261108T055011_main/metrics.json | 확증 통계량, 기준선, 분해, 지연, 금통위 제외 |
grid.csv, daily_saving.csv, by_queue.csv, by_hour.csv | 격자 27칸, 날짜별, 큐 분위별, 시간대별 절감 |
model_f60_lgbm.txt, model_cu60_lgbm.txt | 학습된 체결 확률 분류기와 대체 비용 회귀기 |
protocol.md, analysis.md | 사전등록(수정 절 포함)과 결과 기록 |
Appendix
A. 데이터셋 실물
확인 구간 가상 주문 하나(2026-10-14 09:00:40, 매도)의 원자료다. 값은 하루 캐시와 가상 주문 표에서 그대로 옮겼다. 가격은 원 단위 지수, 잔량과 수량은 계약이다.
| 거래소 시각 | b1 | bq1 | a1 | aq1 | b2 | bq2 | a2 | aq2 |
|---|---|---|---|---|---|---|---|---|
| 09:00:39.580320 | 102.92 | 351 | 102.93 | 203 | 102.91 | 444 | 102.94 | 635 |
| 09:00:39.733417 | 102.92 | 360 | 102.93 | 203 | 102.91 | 444 | 102.94 | 626 |
| 거래소 시각 | 가격 | 수량 | 누적 |
|---|---|---|---|
| 09:00:42.319078 | 102.93 | 1 | 1 |
| 09:00:48.283085 | 102.93 | 50 | 56 |
| 09:00:59.711968 | 102.93 | 30 | 95 |
| 09:01:00.955551 | 102.93 | 50 | 171 |
| 09:01:02.153801 | 102.93 | 3 | 215 |
| 09:01:02.894203 | 102.93 | 161 | 376 |
매도 주문이므로 자기 쪽은 매도 1호가 102.93, 큐 앞 잔량 Q0 는 203계약이다. 우리 50계약까지 채우려면 이 가격에서 253계약이 체결돼야 하고, 누적이 215 에서 376 으로 넘어간 09:01:02.894 에 채워진 것으로 본다(t0 뒤 22.9초). 가상 주문 표의 같은 행에는 특징 23개(예: log(1+Q0) 5.318, 1호가 불균형 −0.279, 직전 60초 체결 52건, 큐 상대 길이 0.909, 5분 변동성 4틱)와 cM 0.5, cF −0.5, 60초 뒤 매수 1호가 102.94 가 함께 있다.
B. 모델 입출력 실물
같은 주문이 모델과 정책을 지나간 기록이다. 수치는 탐색 스크립트가 남긴 표본별 예측 표에서 옮겼다.
- Request meta
- LightGBM 분류기(F60, 트리 300) + LightGBM 회귀기(ĉU), 대기 60초, 큐 앞 잔량 전부, 50계약, 비용 기준 도착 중간가 102.925
- Input
- s = −1, P = 102.93, Q0 = 203, 반대 잔량 360, 스프레드 1틱, 직전 10초 체결 5건, 직전 60초 중간가 변화 −1틱(주문 방향 부호), 마지막 가격 변경 뒤 17.9초, 장 시작 뒤 0.7분
- LightGBM response
- p̂60 = 0.442(큐 길이만 로지스틱은 0.276), ĉU = 0.902틱. Ê = 0.442 × (−0.5) + 0.558 × 0.902 = 0.282틱 < cM 0.5 이므로 지정가로 102.93 에 50계약 매도
- Ground truth check
- 22.9초 뒤 체결, 비용 −0.5틱, 시장가 대비 절감 +1.0틱. 그러나 체결 60초 뒤 중간가는 102.955 로 올라 마크아웃은 −2.5틱이다. 가격이 우리 매도 가격을 밀고 올라가면서 채워진 역선택의 전형이다. 못 채웠다면 60초 뒤 매수 1호가 102.94 에 팔아 비용 −1.5틱이었을 것이다
C. 실험 설정
- 종목3년 국채선물 근월물(그날 체결량 최대 월물)
- 기간2026-07-08 ~ 11-05, 72거래일(07-29, 07-31 제외), 학습 ~ 09-30(48일), 확인 10-01 ~(24일)
- 표본09:00:00 ~ 15:15:00 10초 격자 x 매수와 매도, 호가 공백 90초 초과 구간 주변 [−300, +180]초 제외, 311,646건
- 체결 재생P 에서의 누적 체결 ≥ 큐 가정 x Q0 + 크기, 또는 P 관통 체결, 지평 120초
- 비용도착 중간가 대비 실행 가격(틱), 미체결은 대기 끝 반대 1호가로 시장가
- 특징23개(큐와 불균형 7, 체결 흐름 10, 가격과 변동성 5, 시각 1), t0 이하 정보만
- 모델LightGBM 300그루, 학습률 0.05, 잎 31, 잎 최소 200, 표본 0.8, 특징 0.8, seed 241, 튜닝 없음
- 정책Ê = p̂60 cF + (1 − p̂60) ĉU < cM 이면 지정가
- 검정확인 구간 거래일 블록 부트스트랩 5,000회 한쪽 p, Holm(H822, H823, H824), 무작위 귀무 1,000회
- 격자대기 10, 30, 60초 x 큐 가정 1, 0.5, 0 x 크기 10, 50, 100계약, 칸마다 재학습
- 현실화지연 1초, 금통위 10-22 제외, 실제 신호 사건 47건(탐색)
- Kaggle쓰지 않음(CPU 로 충분, 원자료 반출 없음)