세 줄 요약
- 칼만 필터 강도가 최근 평균보다 클 때 카드를 1.5배, 작을 때 0.5배로 실으면, 총 계약을 R1 과 같게 맞춘 뒤 일별 손익 차이가 발견 +0.080틱/일(p 0.32), 확인 −0.082틱/일(p 0.65) 이었다.
- 추적한 강도와 다음 카드 손익의 상관은 발견 0.10, 확인 0.03 이다. 확인 구간에서는 «강도가 센» 상태의 카드 손익(+1.50틱)이 «약한» 상태(+1.77틱)보다 오히려 낮았다.
- 칼만 필터로 추적한 되돌림 강도는 다음 카드 손익을 가르지 못한다. 판정은 폐기다.
가설과 결론
이 프로그램의 기준 전략(이하 카드)은 미국 10년 금리가 밤사이 3bp 이상 움직인 다음 날, 한국 3년 국채선물을 그 반대 방향으로 시가에 사거나 팔아 종가에 청산하는 되돌림 매매다. 계약 수는 원화 충격의 방향에 따라 1 또는 0.5 로 정한다(R1).
되돌림의 세기는 시기마다 다르다. 어떤 해에는 미국 금리가 1bp 오를 때 3선이 다음 날 장중에 0.5틱 넘게 되돌아오고, 어떤 해에는 거의 되돌아오지 않는다. 최근 되돌림이 센 시기라면 카드를 크게, 약한 시기라면 작게 싣는 것이 낫지 않을까. 이 실험은 그 세기를 칼만 필터로 매일 추적하고, 최근 평균보다 셀 때만 카드를 크게 싣는 규칙이 R1 보다 나은지 물었다.
| 가설 | 내용 | 결과 | 한쪽 p | 판정 |
|---|---|---|---|---|
| H289 | 확인 구간 일별 손익 차이(강도 사이징 − R1, 총 계약 같게) 평균 > 0 | −0.082틱/일(419일) | 0.652 | 미지지, 폐기 |
확인 구간 90% 구간은 [−0.449, +0.267] 이고, 확인 4개 연도 중 2개만 양이다. 같은 프로그램 주가설 63개(H259 ~ H321)에 Holm 보정을 걸면 1.00 이다. 판정은 폐기다.
용어와 기호
- 3선
- 한국거래소 3년 국채선물(최근월 연결). 가격으로 거래하며 금리가 오르면 가격이 내린다
- 틱
- 3선 가격의 최소 단위 0.01. 계약당 1만원
- 세션 s, e
- s 는 정보가 쌓이는 한국 거래일, e 는 다음 한국 거래일. 매매는 e 에서만 한다
- g_us
- 미국 10년 국채금리의 하루 변화(bp, 뉴욕 날짜 s). 1bp 는 0.01%p
- intra_next3
- 3선 e 시가 → e 종가(틱)
- 카드 날
- |g_us| ≥ 3bp, e 가 s 의 다음 달력일, 3선 롤 날이 아닌 날. 방향 sign(g_us)(채권 매수가 +)
- gross
- 카드 한 계약 손익 = sign(g_us) × intra_next3(틱)
- R1 가중 w
- 원화 고유 충격 ε 의 방향이 미국 금리와 어긋나면 1계약, 같으면 0.5계약, ε 가 없으면 1계약
- ε
- 원화 고유 충격. 밤사이 원화 변화에서 달러인덱스와 g_us 몫을 뺀 나머지
- 되돌림 강도 β
- intra_next3 = β × g_us + 잡음 에서의 β. 미국 금리 1bp 에 3선이 다음 날 장중 몇 틱 반대로(시가 갭을 되돌리는 쪽으로) 움직이는가. 양이면 되돌림이 있다
- 칼만 필터
- 시간에 따라 천천히 변하는 숨은 값(여기서는 β)을 매일 새 관측으로 조금씩 고쳐 추정하는 방법. 새 관측을 얼마나 믿을지는 두 잡음 분산의 비율이 정한다
- q, r
- q 는 β 가 하루에 얼마나 움직일 수 있는가(상태 잡음 분산), r 은 하루 장중 손익의 β 로 설명되지 않는 흔들림(관측 잡음 분산, 틱²)
- 필터 β
- 행 s−1 까지의 자료로만 만든 β 추정치. 규칙은 이 값을 쓴다(행 s 의 결과를 보지 않는다)
- 강도 상태
- 필터 β 가 그 직전 60행 필터 β 평균보다 크면 «셈», 아니면 «약함». 평균을 만들 행이 40 개 미만이면 중립(1배)
- 로그 우도
- 주어진 q, r 에서 실제 관측이 나올 확률의 로그 합. 클수록 그 q, r 이 자료를 잘 설명한다
- 총 계약 맞추기
- 구간마다 새 규칙의 총 계약을 R1 총 계약과 같게 비례 조정(발견 × 0.978, 확인 × 1.109)
- 월 블록 부트스트랩
- 같은 달 날짜를 한 덩어리로 다시 뽑기를 5,000번 해 평균의 분포를 만든다. 한쪽 p 는 평균 > 0 쪽
- 발견 구간, 확인 구간
- 발견 2013-01 ~ 2022-12(q, r 을 정하는 데도 씀), 확인 2023-01 ~ 2026-10(판정)
- Holm 보정
- 여러 가설을 함께 시험할 때 우연한 통과를 막도록 p 를 가설 수에 맞춰 단계적으로 키우는 방법
자료
데이터셋
| 자료 | 원천 | 기간 | 해상도 | 쓰임 |
|---|---|---|---|---|
| 3선 시가, 종가 | 인포맥스 단말 일봉(연결) | 2013 ~ 2026-10 | 일 | intra_next3, gross |
| 미국 10년 금리 | FRED DGS10 | 2013 ~ 2026-10 | 일 | g_us, 카드 날 |
| 원화 NDF, 달러인덱스 | 인포맥스 단말 | 2013 ~ 2026-10 | 일 | ε → R1 가중 |
| 항목 | 발견 2013 ~ 2022 | 확인 2023 ~ 2026-10 |
|---|---|---|
| 필터에 넣은 날(롤 날, 결측 제외, 카드 날만이 아니라 모든 날) | 2,333 | 880 |
| 카드 날 | 907 | 419 |
| 고정 기울기(intra_next3 ~ g_us 최소제곱, HAC t) | 0.360(t 4.45) | 0.152(t 2.52) |
| 필터 β 평균, 표준편차 | 0.291, 0.249 | 0.188, 0.196 |
| 필터 β 범위 | −0.40 ~ 1.40 | −0.26 ~ 0.83 |
언제 무엇을 아는가
| 시각 | 일어나는 일 |
|---|---|
| s 일 15:45 | 3선 s 종가. 행 s−1 의 intra_next3(= s 일 장중)까지 확정되어 필터 β 갱신 |
| e 일 새벽 5 ~ 6시 | 뉴욕 날짜 s 의 미국 10년 금리 확정. 카드 날 판단 |
| e 일 08:20 이전 | 필터 β 와 60행 평균 비교, 강도 상태와 크기 배수 결정. ε 와 R1 가중 계산 |
| e 일 개장 | 3선 시가 진입(2025-11 까지 09:00, 그 뒤 08:45) |
| e 일 15:45 | 종가 청산. 이 결과는 다음 날 필터에 들어간다 |
방법
- 잡음 분산 정하기. 발견 구간 2,333행에서 q 5개 × r 5개 격자의 로그 우도를 계산해 가장 큰 쌍(q = 0.001, r = 100)으로 고정한다.
- 강도 추적. 2013-01 부터 모든 날에 칼만 필터를 돌려 β 를 매일 갱신하고, 행 s 에서는 행 s−1 까지의 필터 값을 쓴다.
- 크기 정하기. 카드 날 계약 = w × (필터 β > 직전 60행 평균 ? 1.5 : 0.5). 평균이 없으면 1배.
- 총 계약 맞추기와 비교. 구간별로 총 계약을 R1 과 같게 맞추고, 같은 카드 날 (새 − R1) 손익 평균을 잰다. 비용은 계약당 왕복 1틱. 확인 구간 월 블록 부트스트랩 5,000회 한쪽 p.
- 판정에 쓰지 않는 탐색. 카드 날 필터 β 와 카드 1계약 손익의 상관(E1).
모델
모델은 계수가 시간에 따라 변하는 회귀다. 무엇을 학습하나: 미국 금리 변화가 3선 다음 날 장중을 얼마나 끌어당기는지(β)를 매일 새로 추정한다. 왜 넣었나: 고정 회귀는 10년 평균 강도 하나만 주지만, 실제 강도는 시기마다 바뀌는 것으로 보이므로(아래 그림) 그 변화를 따라가면 카드가 잘 듣는 시기를 미리 알 수 있을지 보려 했다.
칼만 필터와 잡음 분산
| 항목 | 값 |
|---|---|
| 관측식 | intra_next3t = βt × g_ust + 잡음(분산 r), 상수 없음 |
| 상태식 | βt = βt−1 + 잡음(분산 q), 랜덤워크 |
| 초기값 | β0 = 0, 분산 1 |
| 표본 | 2013-01 부터 모든 거래일(롤 날, 결측 제외), 3,213행 |
| q, r 선택 | 발견 구간 로그 우도 격자 최대. q ∈ {10−6, 10−5, 10−4, 10−3, 10−2}, r ∈ {50, 100, 200, 400, 800} |
| 고른 값 | q = 0.001, r = 100(로그 우도 −8,660.4) |
| 규칙이 쓰는 값 | 행 s−1 까지의 필터 β, 문턱은 직전 60행(최소 40) 필터 β 평균 |
| 크기 배수 | 셈 1.5, 약함 0.5, 중립 1 |
추적된 강도
q = 0.001 이면 β 의 하루 표준편차가 약 0.03 이라, 60 거래일이면 약 0.25 를 움직일 수 있다. 필터는 이 정도 속도의 변화를 따라가도록 맞춰졌다. 그 결과 강도 상태(평균보다 셈 또는 약함)는 발견 구간 카드 날 사이에 100번, 확인 구간에 42번 바뀌었다.
결과
확증 결과
| 항목 | 발견 2013 ~ 2022 | 확인 2023 ~ 2026-10 |
|---|---|---|
| 카드 날 | 907 | 419 |
| R1 일평균(틱) | 1.491 | 0.789 |
| 강도 사이징 일평균(총 계약 맞춘 뒤) | 1.572 | 0.707 |
| 일별 차이 평균(틱/일) | +0.080 | −0.082 |
| 블록 부트스트랩 한쪽 p, 90% 구간 | 0.315, [−0.203, +0.370] | 0.652, [−0.449, +0.267] |
| 차이가 양인 연도 | 5 / 10 | 2 / 4 |
| 총 계약 맞추기 배율 | 0.978 | 1.109 |
| Holm 보정 p(63개) | 1.00 | |
| E1 필터 β 와 카드 손익 상관 | 0.097 | 0.034 |
q, r 을 정한 발견 구간에서도 차이는 +0.08틱/일로 우연과 구별되지 않았고, 확인 구간에서는 음이다. 강도를 추적해 크기를 바꾸는 것은 R1 보다 나은 점이 없다.
상태와 연도로 보면
아래는 판정에 쓰지 않는 기술 통계다(results/20261030T165616_detail/, 격자 선택과 확증 수치를 먼저 다시 만들어 일치를 확인한 뒤 계산).
| 항목 | 발견 | 확인 |
|---|---|---|
| «셈» 상태 카드 날 비율 | 52% | 40% |
| «셈» 상태 카드 손익(틱, 비용 전), 날 | +2.64, 473 | +1.50, 169 |
| «약함» 상태 카드 손익, 날 | +2.42, 421 | +1.77, 250 |
| 중립(평균 없음) 비율 | 1.4% | 0% |
| 상태가 바뀐 횟수(카드 날 사이) | 100 | 42 |
| 연도 | R1 | 강도 사이징 | 차이 | 연도 | R1 | 강도 사이징 | 차이 |
|---|---|---|---|---|---|---|---|
| 2013 | +171.0 | +234.2 | +63.2 | 2020 | −24.5 | −66.2 | −41.7 |
| 2014 | +45.5 | −0.7 | −46.2 | 2021 | +56.5 | +48.2 | −8.3 |
| 2015 | +80.0 | +33.7 | −46.3 | 2022 | +784.0 | +886.9 | +102.9 |
| 2016 | +51.5 | +14.4 | −37.1 | 2023 | +258.0 | +216.8 | −41.2 |
| 2017 | +52.0 | +81.6 | +29.6 | 2024 | −38.5 | −55.2 | −16.7 |
| 2018 | +10.5 | +42.8 | +32.3 | 2025 | +99.0 | +118.1 | +19.1 |
| 2019 | +126.0 | +150.6 | +24.6 | 2026(10월까지) | +12.0 | +16.6 | +4.6 |
해석
되돌림 강도가 시기마다 다른 것은 사실이지만(고정 기울기가 발견 0.36, 확인 0.15), 하루 장중 손익의 잡음(r = 100, 표준편차 10틱)에 비해 g_us 가 주는 신호가 작아 강도의 단기 변화는 추정 오차에 묻힌다. 필터의 95% 띠가 거의 늘 0 을 걸치는 것이 그 증거다. 그래서 «최근 평균보다 셈» 이라는 판단은 대부분 잡음의 오르내림이다. 강도의 장기 평균은 쓸모가 있어도, 60일 단위의 오르내림으로는 다음 카드 날을 가르지 못한다.
한계
- q, r 은 25쌍 격자의 최대로 정했다. 연속 최적화는 하지 않았지만 우도가 q 에 거의 둔감해 결론에 영향이 작다.
- 관측식에 상수가 없고 g_us 하나만 쓴다. 원화 충격 같은 다른 설명 변수를 함께 넣은 시변 회귀는 시험하지 않았다.
- 필터는 카드 날만이 아니라 모든 거래일로 갱신된다. 미국 금리가 작게 움직인 날은 β 정보가 거의 없어 그날 갱신은 작다.
- 총 계약 맞추기 배율(0.978, 1.109)은 구간 전체를 본 뒤 정해진다. 실제 운용에서는 미리 알 수 없는 값이다.
산출물
- 계획
protocol.md(사전등록 88b2c97) - 코드
code/s1_kalman.py(확증),code/s_detail.py(격자, 경로, 상태, 연도),code/render_figures.py(그림) - 런
results/20261029T160608_main/,results/20261030T165616_detail/(ll_grid.csv, beta_path.csv, card_days.csv, metrics.json)
Appendix
A. 데이터셋 실물
card_days.csv 의 실제 행(일부 열, 2026 년 10월 카드 날). 열은 s, g_us(bp), 방향, R1 가중 w, gross(틱), 필터 β, 60행 평균, 크기 배수, R1 손익과 새 규칙 손익(총 계약 맞춘 뒤, 비용 뒤).
| s | g_us | 방향 | w | gross | 필터 β | 60행 평균 | 배수 | R1 | 새 규칙 |
|---|---|---|---|---|---|---|---|---|---|
| 2026-10-01 | −5 | −1 | 0.5 | −7 | 0.227 | 0.272 | 0.5 | −4.00 | −2.22 |
| 2026-10-13 | −3 | −1 | 1 | +4 | 0.133 | 0.259 | 0.5 | +3.00 | +1.66 |
| 2026-10-15 | −9 | −1 | 1 | −15 | 0.143 | 0.254 | 0.5 | −16.00 | −8.87 |
| 2026-10-19 | +6 | +1 | 1 | +19 | 0.063 | 0.244 | 0.5 | +18.00 | +9.98 |
| 2026-10-22 | −17 | −1 | 1 | +17 | 0.107 | 0.233 | 0.5 | +16.00 | +8.87 |
B. 모델 입출력 실물
- Request meta
- 카드 날 s = 2026-10-22(미국 10년 −17bp), e = 2026-10-23. 필터는 q = 0.001, r = 100, 행 2026-10-21 까지 갱신. 확인 구간 총 계약 배율 1.109
- Input
- 필터 β = 0.107, 직전 60행 필터 β 평균 = 0.233, R1 가중 w = 1(ε 가 미국 금리와 반대 방향)
- Model response
- 0.107 ≤ 0.233 이므로 «약함» 상태, 크기 배수 0.5. 계약 = 1 × 0.5 × 1.109 ≈ 0.55계약 3선 매도(R1 은 1계약)
- Ground truth check
- 3선 장중 −17틱 → 매도 gross +17. R1 손익 +16.00, 새 규칙 0.55 × 16 = +8.87. 강도가 «약함» 이라던 날에 되돌림은 1bp 당 1틱으로 오히려 컸다
C. 실험 설정
- 카드|g_us| ≥ 3bp, 다음 달력일 세션, 3선 롤 날 제외, 3선 시가 → 종가, R1 가중(불일치 1, 일치 0.5)
- 칼만 필터intra_next3 = β g_us + 잡음, β 랜덤워크, β0 = 0, P0 = 1, q 와 r 은 발견 구간 로그 우도 5 × 5 격자 최대(q 0.001, r 100)
- 사이징필터 β(행 s−1 까지) > 직전 60행(최소 40) 평균이면 1.5배, 아니면 0.5배, 평균 없으면 1배, 구간별 총 계약을 R1 에 맞춤
- 비용계약당 왕복 1틱
- 분할발견 2013-01 ~ 2022-12, 확인 2023-01 ~ 2026-10
- 문턱확인 구간 일별 차이 평균 > 0, 월 블록 부트스트랩 5,000회(seed 66) 한쪽 p < 0.05, 63개 Holm, 확인 연도 다수 양수
- 탐색E1 카드 날 필터 β 와 카드 손익 상관