미국 장기 금리 예측 시계열 분석 1

in #timeseries3 years ago

장기금리 예측 시계열 분석.jpg

안녕하세요~!

오늘은 시계열 분석을 해보도록 하겠습니다.

오늘은 미국의 장기 금리 데이터를 이용하여 시계열 ARIMA 모형에 적합해보고,

예측해보는 것까지 하도록 하겠습니다.

사실 목표는 시계열회귀분석까지 해보는 것인데요. 이번 포스팅에서는 못할 것 같습니다.

데이터는 2013년 1월 1일부터, 2022년 4월 6일까지 일별 데이터입니다.

아쉽게도 2008년 데이터는 없네요..

image1.png

아래는 변수에 대한 간략한 설명입니다.

(오늘 볼 시계열은 US10Y에 국한되어 있긴 합니다)

KRBASE: 한국 기준금리

USBASE: 미국 기준금리

US2Y: 미국 2년채금리

US10Y: 미국 10년채금리

KR2Y: 한국 2년채금리 (14년도부터 산출이 중단되었죠)

KR10Y: 미국 10년채금리

분석 툴은 R이고, 불러와서 간단한 전처리를 해주었습니다.

저는 데이터 분석을 할 때는 주로 R을 사용합니다.

딥러닝을 할 때는 Python을 주로 이용하구요.

오늘은 간단한 시계열 분석을 해볼 것이기 때문에 R을 이용해보겠습니다.

R에서 쓸 패키지를 먼저 불러와주시구요. 엑셀도 함께 불러와줍니다.

'
packages <- c("tidyverse","foreach","readxl","stringr",
'imputeTS', 'TSstudio','forecast','dynlm', 'lmtest',
'sandwich','ggeffects', 'xts')
sapply(packages,require,character.only=TRUE)
rm(list = ls())
IR <- read_excel('장기금리예측.xlsx',sheet = '금리')
'

오늘은 미국 국채 10년물과 2년물에 대해 볼건데요,

위에 엑셀 파일에서 보듯이 결측값들이 있습니다.

결측값을 잘 채우는 것도 데이터 핸들링의 아주 큰 분야입니다.

전체의 평균으로 채워넣던, 전체 중앙값으로 채워넣던..

데이터를 다루는 사람의 철학이 들어가는 분야이니까요.

시계열, 특히 2년물 10년물 금리 데이터에서 저는 바로 이전 known value 값 그대로 사용하는 것을 택했습니다. 이유는, 정상시계열이면 그래서는 안되지만, 어제의 금리는 오늘의 금리와 사실 무관하지 않다는 판단 하에서입니다. 정상 시계열은 아래에서 설명 하도록 하겠습니다.

결측값을 채워넣고, 시도표를 그려보도록 하겠습니다.

'''{r}
IR$US10Y <- c(IR$US10Y[2],na.locf(IR$US10Y))
IR$US2Y <- c(IR$US2Y[2],na.locf(IR$US2Y))

R 최신버전(4.1.3) 이슈로 XTS는 column마다 적용해줘야 함..
US10Y <-xts(IR$US10Y, order.by=as.POSIXct(IR$DATE))
US2Y <-xts(IR$US2Y, order.by=as.POSIXct(IR$DATE))
plot.xts(US10Y)
'''

image2.png

시계열 분석을 하려면, '정상시계열'이라는 개념을 알아야 합니다.

우선 시계열을 확률과정(stochastic process)으로 보았을 때,

  1. 평균이 일정하고

  2. 분산이 존재하며 상수이다.

  3. 두 시점 사이의 자기공분산은 시차에만 의존

위 세 가지를 만족하는 시계열을 '정상시계열'이라고 하는데요,

정상성을 만족하지 못하는 시계열은 시계열 모형 ARIMA를 사용할 수 없습니다.

그래서 만약 위 3가지 만족을 하지 못한다면, '변환'​을 해서 시계열의 형태를 바꾸어줄 필요가 있습니다.

많은 경제 시계열의 경우, 추세가 증가함에 따라 계열의 변동도 함께 커지는 것이 사실인데요,

미국 국채 10년물도 보시면 제 육안 판단으로는 평균도 일정하지 않고(추세가 보이고),

분산도 시간이 지남에 따라 커지고 있는 것 같습니다.

그래서 저희는 정상 시계열을 만들어 줄 것입니다.

  1. 분산 안정화

분산안정화를 위해서는 멱변환(power transformation)이 필요합니다.

가장 대표적인 예로, 로그변환인 것이죠.

실제로 경제변수를 다루는 시계열에서는 로그변환이 분산 안정화를 잘 잡는다는 논문도 있습니다.

(많은 사회과학 데이터는 exponential 형태이기 때문이죠)

주의할 점은, 분산안정화, 차분을 둘 다 이용할 경우, 분산안정화 과정을 차분보다 먼저 해주어야 한다는 것입니다. 차분 부터 수행할 경우 데이터에 음수가 나올 수 있어, 차분 뒤 로그변환을 해줄 경우 -INF가 나올 수 있기 때문입니다.

분산 안정화는 Box&Cox(1964)가 소개한 정규화변환을 이용하도록 하겠습니다.

'''{r}
#분산안정화
lambda <- BoxCox.lambda(IR$US10Y)
lambda
'''

결과, lambda 값이 1.32가 나왔습니다.

image3.png

x*는 변환된 자료를 의미하고, 위 코드의 결과로 lambda 값이 나오게 됩니다.

아래 표에서는 lambda 값별, 변환방법을 소개하고 있습니다.

image4.png

lambda값이 1이라 함은, 분산이 제 생각보다는 시간이 지남에도 변동성이 비슷하다는 말입니다.

1.32가 나왔는데요, 제 주관적 의견으로는 lambda 값이 1.32면 분산이 시간이 지남에 따라 일정하다고 판단하고 데이터의 아무런 가공 없이 모형을 적합시켜도 된다고 생각합니다.

그러나 이번 포스팅에서는 cox 변환을 해보도록 하겠습니다.

'''{r}

US10Y_cox <- BoxCox(US10Y, lambda)

'''

  1. 추세 없애기

그 다음, 추세를 없애주도록 하겠습니다.

추세가 있으면, 모형을 적합시켰을 때 잔차의 자기상관이 높게 되어 쓸 수 없는 모형이 나옵니다.

추세는 보통 차분을 이용하여 제거해줍니다.

'''{r}

coxdiff_US10Y <- base::diff(US10Y_cox, lag = 1, differences = 1)
plot.xts(coxdiff_US10Y)
'''

image5.png

1차 차분 한 번 해주었을 뿐인데, 추세가 없어진 것이 보이시죠?

시계열 분석을 하려면 추세를 제거해주는 과정이 꼭 필요합니다.

그 다음에는 모형을 적합하고, 진단하고, 예측을 하는 단계가 남았는데요.

쓰다보니 포스팅이 길어져서 제 2편으로 돌아오도록 하겠습니다.

2편도 기대해주세요!

도움이 되었다면 upvote 부탁드립니다! ( ღ'ᴗ'ღ )

Sort:  

안녕하세요 스팀잇 세계에 오신것을 환영합니다.
저는 여러분이 스팀잇에 잘 적응 할 수 있도록 응원하고 있습니다.
이 포스팅을 한번 끝까지 읽어보시고 STEEMIT-초보자를위한 가이드
혹시나 궁금하신 내용이 있으면 언제든
@ayogom, @jungjunghoon, @powerego, @tworld, @dorian-lee, @bitai, @kinghyunn, @maikuraki, @hiyosbi, @nasoe, @angma, @raah 님께 댓글 주시면 친절하게 알려드리겠습니다.

카카오톡 방에서 궁금한 점도 한번 해결해 보세요. 많은 스팀잇 경험자 분들께서 언제나 궁금한 부분을 즉시 해결해 주실 것입니다. 카카오톡 대화방 바로가기 패스워드(1004)

Coin Marketplace

STEEM 0.21
TRX 0.20
JST 0.033
BTC 93256.79
ETH 3124.97
USDT 1.00
SBD 3.05