NOONOO TRADING봇에서 시작하기

칼만 필터(Kalman Filter) 트레이딩 — 예측과 관측을 섞는 비율, 칼만 이득 계산법

칼만 필터(Kalman Filter)는 잡음이 섞인 관측값(가격)과 직전 추정에서 나온 예측값을 "어느 쪽을 더 믿을지"의 비율로 섞어, 보이지 않는 상태(가격의 진짜 수준, 두 코인 사이의 헤지 비율 등)를 매 순간 다시 추정하는 방법입니다. 그 비율이 칼만 이득 K이고, 매 단계 불확실성에 따라 스스로 바뀝니다. 가장 단순한 형태는 결국 이동평균의 한 종류가 되며, 페어 트레이딩에서는 고정된 헤지 비율 대신 시간에 따라 움직이는 비율을 구하는 데 씁니다. 본문의 가격과 파라미터는 모두 설명용 가정입니다.

모델 두 줄과 공식

트레이딩에서 가장 많이 쓰는 것은 "로컬 레벨" 모델입니다. 가격의 진짜 수준 x는 매 봉마다 조금씩 랜덤하게 움직이고, 우리가 보는 가격 z는 그 수준에 잡음이 더해진 값이라고 가정합니다.

모델
· 상태: xₜ = xₜ₋₁ + w (w의 분산 = Q, 진짜 수준이 움직이는 정도)
· 관측: zₜ = xₜ + v (v의 분산 = R, 가격에 섞인 잡음의 크기)

① 예측
· x̂⁻ = 직전 추정 x̂
· P⁻ = P + Q (불확실성이 Q만큼 늘어남)

② 갱신
· K = P⁻ ÷ (P⁻ + R)
· x̂ = x̂⁻ + K × (z − x̂⁻)
· P = (1 − K) × P⁻

(z − x̂⁻)는 "예측이 틀린 만큼"으로, 혁신(innovation)이라고 부릅니다. K가 1에 가까우면 새 가격을 거의 그대로 따라가고, 0에 가까우면 예측을 고집합니다. 추정의 불확실성 P가 크거나 잡음 R이 작으면 K가 커집니다.

예시 1 — 가격 5개로 따라가기

Q = 1, R = 4로 두고, 시작 추정 x̂ = 100, 시작 불확실성 P = 4에서 출발합니다. 가격은 102, 101, 105, 104, 108이 차례로 들어온다고 가정합니다.

1봉 (z = 102)
· P⁻ = 4 + 1 = 5 / K = 5 ÷ 9 = 0.556
· x̂ = 100 + 0.556 × 2 = 101.11 / P = 0.444 × 5 = 2.22

2봉 (z = 101)
· P⁻ = 3.22 / K = 3.22 ÷ 7.22 = 0.446
· 혁신 = 101 − 101.11 = −0.11 → x̂ = 101.06 / P = 1.78

3봉 (z = 105)
· P⁻ = 2.78 / K = 0.410 / 혁신 +3.94 → x̂ = 102.68

4봉 (z = 104)
· K = 0.398 / 혁신 +1.32 → x̂ = 103.20

5봉 (z = 108)
· K = 0.393 / 혁신 +4.80 → x̂ = 105.09

K가 0.556 → 0.446 → 0.410 → 0.398 → 0.393으로 줄어들다 멈추는 것이 보입니다. 처음에는 시작값을 잘 모르니 새 가격을 많이 반영하고, 관측이 쌓일수록 일정한 값에 수렴합니다. 같은 가격에 5기간 EMA를 쓰면 마지막 값이 104.53이라 칼만 추정(105.09)보다 조금 더 늦게 따라옵니다. 이 차이는 시작 구간에서 K가 컸기 때문이고, K가 수렴한 뒤에는 두 방법이 거의 같아집니다.

예시 2 — Q/R 비율은 사실상 EMA 기간이다

K가 수렴한 값(정상 상태 이득)은 Q와 R의 비율만으로 정해집니다. P⁻ = (Q + √(Q² + 4QR)) ÷ 2를 구한 뒤 K = P⁻ ÷ (P⁻ + R)을 계산하고, EMA의 α = 2 ÷ (N + 1) 공식에 맞춰 기간 N으로 바꿔 보면 다음과 같습니다.

Q/R 비율별 수렴 이득
· Q/R = 0.25 (예시 1의 Q = 1, R = 4): P⁻ = (1 + √17) ÷ 2 = 2.56 → K = 2.56 ÷ 6.56 ≈ 0.390 → EMA 약 4기간
· Q/R = 0.1 (R = 1): P⁻ = (0.1 + √0.41) ÷ 2 = 0.370 → K ≈ 0.270 → EMA 약 6기간
· Q/R = 0.01 (R = 1): P⁻ = (0.01 + √0.0401) ÷ 2 = 0.105 → K ≈ 0.095 → EMA 약 20기간

EMA 환산
· N = 2 ÷ K − 1 → 0.095면 2 ÷ 0.095 − 1 ≈ 20

즉 가장 단순한 칼만 필터는 "기간을 Q/R로 정하는 EMA"입니다. 잡음 R을 크게 볼수록(Q/R이 작을수록) 느린 선이 되고, 진짜 수준이 빨리 움직인다고 볼수록 빠른 선이 됩니다. 단일 가격 평활화만 놓고 보면 EMA보다 특별히 앞서는 신호를 주지 않으며, 후행(lag)도 그대로 남습니다. 칼만 필터가 쓸모를 보이는 곳은 상태가 둘 이상이거나, 관측식에 다른 변수가 곱해지는 경우입니다.

예시 3 — 페어 트레이딩의 동적 헤지 비율

두 코인 A, B의 가격 관계를 yₜ = βₜ × xₜ + v로 두고, 헤지 비율 β가 천천히 움직인다고 가정합니다. 이때 관측식에 B의 가격 x가 곱해지므로, 이득 공식이 조금 바뀝니다.

가정
· 직전 β̂ = 20, P = 0.5, Q = 0.01, R = 1
· 이번 봉: B 가격 x = 2, A 가격 y = 41

예측
· P⁻ = 0.5 + 0.01 = 0.51
· 예상 A 가격 = 20 × 2 = 40 → 혁신 = 41 − 40 = +1

갱신
· 혁신 분산 S = x² × P⁻ + R = 4 × 0.51 + 1 = 3.04
· K = P⁻ × x ÷ S = 0.51 × 2 ÷ 3.04 = 0.336
· β̂ = 20 + 0.336 × 1 = 20.34
· P = (1 − K × x) × P⁻ = 0.329 × 0.51 = 0.168

스프레드 신호
· 표준화 혁신 = 1 ÷ √3.04 = 약 0.57

고정 비율로 회귀를 한 번 돌리는 방식은 기간 전체의 평균 관계 하나만 남기지만, 칼만 필터는 봉마다 β를 고칩니다. 표준화 혁신(혁신 ÷ √S)은 스프레드가 평소보다 얼마나 벌어졌는지를 나타내므로, Z-점수처럼 ±2 같은 기준으로 진입·청산 규칙을 만들 수 있습니다. 위 예시의 0.57은 평범한 범위라 신호가 아닙니다. 다만 비율이 계속 따라 움직인다는 것은 관계가 깨질 때도 필터가 그것을 "새로운 β"로 흡수해 버린다는 뜻이기도 합니다. 두 코인이 정말 함께 움직이는 관계인지는 공적분 검정으로 따로 확인하고, 스프레드가 되돌아오는 속도는 평균회귀 반감기로 점검합니다.

백테스트에서 자주 생기는 실수

① 필터 대신 스무더를 씀
· RTS 스무더 등은 이후 데이터까지 써서 과거 값을 다시 고침
· 차트에는 깔끔하게 보이지만 그 시점에는 알 수 없는 값 → 미래참조

② Q, R을 전체 기간으로 맞춤
· 전체 데이터로 Q/R을 최적화한 뒤 같은 데이터로 성과를 재면 과적합

③ 시작 구간 포함
· 초기 P가 커서 K가 큰 구간(예시 1의 1~2봉)은 추정이 불안정 → 워밍업으로 제외

④ 비용 누락
· β가 바뀔 때마다 포지션 비율을 맞추면 매 봉 소액 거래가 생김 → 수수료·슬리피지 반영

①은 특히 라이브러리 함수 이름만 보고 쓰다 생깁니다. 결과가 지나치게 좋다면 계산에 그 봉 이후 데이터가 들어갔는지부터 확인하는 것이 순서입니다(미래참조 편향 참고). ②는 Q/R을 앞 구간에서 정하고 뒤 구간에서 검증하는 워크포워드 분석으로 줄일 수 있고, 후보 파라미터를 많이 시험했다면 그만큼 결과를 할인해서 봐야 합니다(과최적화). ④는 헤지 비율 변화가 일정 폭을 넘을 때만 리밸런싱하는 식으로 거래 횟수를 줄입니다.

직접 구현할 때의 순서

① 상태와 관측 정하기
· 가격 수준만인지, 헤지 비율(β, 절편)인지

② R 추정
· 짧은 구간 가격 변화의 분산 등으로 잡음 크기를 대략 잡음

③ Q/R 정하기
· 원하는 반응 속도(EMA 환산 기간)로 역산 → 예: 20기간이면 Q/R ≈ 0.01

④ 초기값과 워밍업
· x̂₀ = 첫 가격, P₀는 크게 두고 처음 수십 봉은 신호에서 제외

⑤ 봉 마감마다 예측 → 갱신
· 완성된 봉의 종가만 사용, 진행 중인 봉 값은 쓰지 않음

스프레드시트로도 열 몇 개면 됩니다. P⁻, K, x̂, P 네 열을 만들고 위 공식을 한 행씩 이어 붙이면 예시 1의 숫자가 그대로 나옵니다. 상태가 둘 이상(β와 절편)이 되면 P가 행렬이 되므로 그때부터는 코드로 구현하는 편이 정확합니다.

정리

칼만 필터는 예측과 관측을 칼만 이득 K로 섞어 숨은 상태를 추정합니다. K는 불확실성 P와 잡음 R로 매 단계 정해지고, 단순 가격 모델에서는 Q/R 비율에 따라 일정 값으로 수렴해 EMA와 같아집니다(Q/R 0.01 ≈ EMA 20). 실무에서 차이를 만드는 곳은 페어 트레이딩의 동적 헤지 비율처럼 관측식에 다른 변수가 곱해지는 경우이며, 이때 표준화 혁신을 스프레드 신호로 쓸 수 있습니다. 백테스트에서는 필터와 스무더를 구분하고, Q/R을 검증 구간 밖에서 정하고, 리밸런싱 비용을 넣어야 결과를 믿을 수 있습니다.

주의

본문의 가격, Q·R 값, 헤지 비율은 모두 계산 구조를 설명하기 위한 가정 예시이며 실제 측정값이나 미래 수익을 뜻하지 않습니다. 필터가 추정한 수준이나 비율은 과거 관측에서 나온 값일 뿐 앞으로의 가격을 보장하지 않습니다. 이 글은 교육 정보이며 특정 자산·전략의 매수·매도 권유가 아닙니다. 코인과 선물·레버리지 거래는 원금 손실 위험이 있고, 투자 판단과 그 결과는 본인 책임입니다.

NOONOO TRADING 무료 채팅방에서 실시간 트레이딩을 같이 보세요.

봇에서 시작하기

📈 OKX 신규 가입 시 거래 수수료 할인

OKX 수수료 할인 가입 →