본문 바로가기
시계열모델링

다이나믹 모델링 : 칼만필터(Kalman Filter)를 이용한 주가예측

by 다빈치스탁 2021. 6. 28.
728x90
반응형

어떠한 현상을 모델링함에 있어서 크로스섹셔널 분석(횡단면적)의 경우 변하지 않는 상수 파라미터를 추정하는 정적 추정이 더 적합할 수도 있다. 그러나 롱기튜드(종단면) 분석, 특히 시계열 자료에 있어서는 경우에 따라 시스템의 구조적인 변화 등으로 시간에 따라 변하는 상태변수를 추정하는 것이 더 유용할 때가 있는데 이러한 분석법을 동적 추정이라고 하며 그 대표적인 사례가 바로 칼만필터 모델링 기법이다. 
 
주식분석 생성형 인공지능, 지금 바로 클릭
https://leenaissance.site/

리네상스 테크놀로지

인공지능 주식대장, 무엇이든 물어보세요.

leenaissance.site


칼만필터 모형의 사전적 정의를 살펴보면 칼만 필터(Kalman filter)는 잡음이 포함되어 있는 측정치를 바탕으로 선형 역학계의 상태를 추정하는 재귀 필터로, 루돌프 칼만이 개발하였다. 칼만 필터는 컴퓨터 비전로봇 공학레이다 등의 여러 분야에 사용된다. 칼만 필터는 과거에 수행한 측정값을 바탕으로 현재의 상태 변수의 결합분포를 추정한다. 알고리즘은 예측과 업데이트의 두 단계로 이루어진다. 예측 단계에서는 현재 상태 변수의 값과 정확도를 예측한다. 현재 상태 변수의 값이 실제로 측정된 이후, 업데이트 단계에서는 이전에 추정한 상태 변수를 기반으로 예측한 측정치와 실제 측정치의 차이를 반영해 현재의 상태 변수를 업데이트한다. 확장 칼만 필터는 비선형 시스템을 기반으로 동작한다. 여기서 유의 깊게 살펴볼 점은 "상태변수의 결합분포", 그리고 "예측과 업데이트" 이 두 가지인데 우선 예측과 업데이트라는 말은 모델이  이산 시간 선형 동적 시스템을 기반으로 동작한다는 것을 의미하고, 상태 변수의 결합분포를 추정한다는 것은 각 시간에서의 상태 벡터는 이전 시간의 상태 벡터를 통해서 결정된다는 마르코프 연쇄를 가정하고 있다.  [참고 : 위키백과]
 
여기서 상태변수란 물리학에서는 물체의 위치나 속도, 가속도 등이 되겠지만 금융에서는 환율, 금리, 원자재, 국제 정세 등이 될 것이다. 예를 들어 환율 = f(x)+e1, 원자재 = g(x)+e2, 삼성전자의 주가(등락률) = a*환율(f(x)+e1) + b*원자재(g(x)+e2) + e(error) 라고 가정해보자. 단, 삼성전자의 주가는 환율, 원자재의 흐름과 연관돼 있어서 삼성전자의 주가를 측정하면 미지의 상수벡터 환율, 원자재에 관한 정보를 알 수 있다고 가정하자. 이때 a*{f(x)+e1) + b*{g(x)+e2} + e 이 측정모델이 되며 환율 모형과 원자재 모형은 시스템 모델이 된다.
 
이 때 측정모델을 이용하여 여러번 반복측정이 이루어지면 위 측정방정식의 시간에 관한 함수로 표현할 수 있고 그에 따른 시스템방정식 역시 시간 인덱스를 포함한 방정식으로 표현할 수 있다. 매 관측마다 수행된 측정치들의 집합과 실제 관측치들의 집합을 최대로 근사할 수 있는 상수벡터를 추정하는 방법이 바로 칼만필터의 방법인데 미지의 상수벡터를 어떻게 구분하는가에 따라 베이즈 방법과 비 베이즈방법이 존재한다. 우선 둘 사이의 큰 차이점은 베이즈 방법에서는 상수벡터를 랜텀 벡터로 보고 이에 관한 사전 확률정보를 알고 있다고 가정하고 대표적인 방식은 최대사후 추정기와 최소평균제곱오차 방법이 있다. 반명 비베이즈 방법에서는 상수벡터를 미지의 확정적인 값으로 간주하여 최대빈도(MLE), 최소제곱 추정방식을 사용하고 있다. [ 참고 : 수학으로 풀어보는 칼만필터 알고리즘 | 위키북스 ]
 
이 중에서 최대빈도 추정법에 대해서 알아보면 MLE는 추정하고자 하는 상수벡터를 미지의 확정적인 값으로 간주하기 때문에 사전확률에 대한 정보도 전혀 없는 상태이다. 따라서 측정 값들은 상수벡터의 값에 따라 변하기 때문에  측정치 들의 집합은 상수벡터와 측정치들의 결합확률 밀도로 표기할 수 있다. 왜냐하면 이 모형들(환율,원자재 모형)의 error 텀들은 일정한 확률분포를 가지게 되고 그것의 선형결합이 되는 측정모델(삼성전자의 주가 등락률)의 error 텀들은 시스템 모형으로 인한 확률분포와 측정모형으로 인한 확률분포의 결합확률분포를 가지기 때문이다. 이 때 이 확률밀도함수를 최대로 하는 값을 추정값으로 사용한다. 
 
자 그럼 여기까지 살펴본 내용을 토대로 R의 dlm 패키지를 이용해서 실전분석에 한번 돌입해보자. 그 전에 dlm 패키지는 Bayesian and Likelihood Analysis of Dynamic Linear Models 를 다루는 패키지인데 베이즈 필터는 이산시간 확률 동적 시스템의 상태변수를 추정하기 위한 확률론적인 방법으로 칼만필터를 비롯한 대부분의 상태변수 추정 알고리즘의 근간을 이룬다. [ 참고 : 수학으로 풀어보는 칼만필터 알고리즘 | 위키북스 ]

칼만필터 | 검색 결과  | 위키북스

wikibook.co.kr

 

kodex.csv
0.01MB

 
kodex200 etf 를 가지고 칼만필터를 이용한 동적 예측을 한번 수행해보자. 시계열자료는 첨부파일을 다운로드해도 좋고 그게 아니면 HTS에서 제공하는 excel 로 보내기 기능을 이용해도 좋다. 우선은 첫 번째로 추정을 위한 모델을 선정해야 하는데 단변량 자기회귀이동평균 모형인 ARMA로 선정하고 모델의 ar, ma 차수는 autoarmafit 을 이용해서 추정해보자. 그 다음으로는 해당 차수를 가진 arma 모형에 대한 모델을 정의하고 이를 토대로 위에서 설명한 MLE를 통해 상태변수를 추정한다. 이 추정된 상태변수를 이용한 칼만필터를 생성 후 이를 통해 향후 발생할 주가흐름에 대한 예측을 수행해 볼건데 상세한 R 코드는 아래와 같다.
 

library(dlm)

#작업경로를 지정하는 명령어
setwd("")

mydatat<-read.csv("kodex.csv",
                  header=TRUE, na.strings = "")

o=mydatat$y

do<-diff(log(o))
do<-do[1:300]
testar<-timsac::autoarmafit(do)
str(do)
testar$best.model$arorder

ar1<-testar$best.model$arcoef
ma1<-testar$best.model$macoef

build<-function(x){
  dlmModARMA(ar = c(ar1), ma = ma1, sigma2=0.2)
}

fit<-dlmMLE(do,parm=c(ar1,ma1),build)
mod<-build(fit$par)

filt<-dlmFilter(do,mod)
summary(filt)
fore<-dlmForecast(filt,nAhead=100)

plot(fore$f)
칼만필터를 이용한 등락률 예측

 
향후 약 100일 간의 등락률의 예측 산포도를 그려본 결과 하루는 하락 다음날은 상승을 반복하다(전형적인 박스권 장세) 일정기간 후 평균회귀하는 것으로 나타났다. 칼만필터는 동적예측을 위한 모델이기 때문에 이렇게 한 번에 멀리 예측을 하는 것 보다는 다음날 새로운 주가흐름이 나타나면 계속해서 업데이트 해주어야 하기 때문에 약 10거래일 이후부터는 모형을 그렇게 신뢰할 수 없고 매일 매일 약 10일 정도의 예측치를 반복해서 수행하는 편이 모델의 성격과 더 부합될 거라 본다.
 
개인적으로는 다른 여타의 모델링 기법에 비해서 칼만필터는 직관적으로 쉽게 이해하기가 조금 까다로운 편이었다. 그래서 혹시나 위의 내용 중에 잘 못 이해하고 있거나 삽질한 내용이 있다면 이 글을 보고 있는 누구라도 좋으니 날카로운 지적을 해주면 엄청 고마울 따름이다. 

728x90
반응형

댓글