잡음이 많은 데이터를 처리하는 응용에서 많이 사용. 특히 시간에 따라 변하는 데이터 값이나 모델 파라미터의 추정에 사용한다.
from pykalman import KalmanFilter로 사용할 수 있다.
확률 모델을 기반으로 새로운 데이터를 시계열의 현재 값 추정에 반영.
측정치가 주어졌을 때, 상태 변수의 사후 분포를 전파하는 베이즈 접근법을 이용한다.
예측 단계와 측정 단계 두 단계로 구성. 측정 단계에서, 정보를 더 확실한 추정치에 더 높은 가중치를 주는 식으로 평균해 추정치를 업데이트한다.
이때 가정들이 세 가지다.
통계 개념에서도 나왔는데,
1. 모델링하는 시스템이 선형으로 작동
2. 은닉 상태 프로세스는 마르코프 체인이어서, x_t는 x_t-1에만 의존한다.
3. 측정은 고정된 공분산의 가우시안, 비상관 잡음에 제약된다.
사실 금융 데이터는, 선형성과 가우시안 잡음 가정을 종종 위배한다. 그래서 이를 보완하는 extended, 그리고 unscented 형태로 비선형 시스템으로 확장해서 사용한다.
모델을 수식으로 보면 아래와 같다.
x(t+1)=A_t*x_t+b_t+e1(t+1) e1~N(0,Q)
z_t=C_tx_t+d_t+e2^2_t e2^2_t~N0,R)
initial_state_mean = 초기 평균
initial_state_covariance = 초기 공분산
transition_matrix: A
transition_offset : b
observation_matrix : C
observation_offset: d
observation_covariance : R
kf = KalmanFilter(transition_matrices = [1],
observation_matrices = [1],
initial_state_mean = 0,
initial_state_covariance = 1,
observation_covariance=1,
transition_covariance=.01)
이런식으로 사용한다. 초기값은 pykalman 설명서를 참고하라고 함.
이렇게 필터를 만든뒤,
statesmeans, = kf.filter(sp500) 을 하면, 은닉 상태를 반복적으로 추정할 수 있다. states_means가 시리즈 형태이므로, 그래프 위에 같이 그려볼 수 있다.
결과물을 보면, 1개월 이동편균과 꽤 유사한 그래프를 얻는다. 다만, 그래프의 추세가 변할 때 1개월 평균보다 조금 더 빨리 움직이는 것을 확인할 수 있다.