시계열(Time series) > White Noise, Random walk

2020. 12. 6. 22:33계량경제학

반응형

본격적인 시계열 분석에 들어가기 앞서, 시계열 분석에서 중요한 개념인 백색잡음(White Noise)와 랜덤워크(Random walk) 개념에 대해서 정리해보겠습니다.

[백색잡음(White Noise)]

백색잡음은 평균이 0이고 분산이 일정한 상수($\sigma^2$)인 정규분포를 따르며, 시간에 흐름에 따른 다른 백색잡음들과 Correlation이 0인 잡음입니다.

만약 $a_t$가 백색잡음 프로세스를 따른다고 한다면, $a_t$는 아래와 같은 성질을 만족해야 합니다.

만약에 우리가 가지고 있는 시계열 데이터에서 "시계열적인 부분"을 모두 제외한다면 남는 것은 White Noise뿐입니다.

우리가 시계열 분석을 통해 이상적으로 시계열 분석을 수행했다면, 예측 오차는 White Noise를 따를것입니다. 그렇기 때문에 시계열 모형의 오차가 White Noise라는 것은 "시계열적인 부분"을 잘 잡아 냈다는 신호로 볼 수 있을 것입니다.

Python으로 White Noise를 만들어보겠습니다. 사용하는 데이터는(direction-f.tistory.com/63)를 참고하시면 되며, S&P 500 Index입니다. 다만 여기서는 Plotting의 용이성을 위해 평균을 0으로 하지 않고 가지고 있는 데이터의 평균값을 집어 넣었습니다.

##White Noise
wn = np.random.normal(df.mean(), scale = df.std(),size = len(df))
df["wn"]=wn

df["wn"].plot()
plt.title("White Noise")
plt.show()

[Random Walk]

Random Walk는 단순 Random number를 generation하는 것과는 다릅니다. Random Walk는 해당 Sequence에서 그 전의 값이 그 다음 값에 영향을 주기 때문입니다. 예를 들어 Random Walk는 다음과 같이 표현할 수 있습니다.

$y(t)$는 다음 값이고 $X(t-1)$은 그 전의 값입니다. $e(t)$는 백색잡음과 같은 Noise를 나타냅니다. 위에 표현된 모형에서 볼 수 있듯이 전의 값이 다음값에 영향력을 가지게 됩니다. 

가장 간단한 Random Walk 프로세스 사례는 다음과 같습니다.

stpe 1. -1 또는 1로 시작

step 2. -1 또는 1를 Random하게 선택하고, 전의 값에 더함

Python을 활용하여 위의 간단한 Random walk를 시뮬레이션 해보겠습니다.(출처 : Introduction to Time Series Forecasting with Python)

seed(1)
random_walk = []
random_walk.append(-1 if random() <0.5 else 1)

for i in range(1,1000):
    movement = [-1 if random() <0.5 else 1]
    value = random_walk[i-1]+movement[0]
    random_walk.append(value)

plt.plot(random_walk, "r-")
plt.title("Random walk")
plt.show()

 

[Stationarity]

주가, 금융 Index같은 경우는 위에서 말한것과 같이 Random walk Process를 많이 따르게 됩니다. 하지만 Random walk Process를 따르는 모형에 대한 통계적 추정을 하기가 현실적으로 어렵습니다. 따라서 시계열 정상성(Stationarity) 가정이 필요하게 됩니다.

약한 정상성(Weak Stationary)은 아래와 같은 성질 만족하게 됩니다.

확률과정 $Z_1$,$Z_2$, ... ,$Z_n$에 대해

만약 시계열이 정상성이 아니라면 통계적으로 우리가 추정해야 할 모수는 $\mu_1$, $\mu_2$ ,.. ,$\mu_n$, $\sigma_1$, $\sigma_2$,...$\sigma_n$과 같이 총 2n개의 모수를 추정해야 하는데 우리가 가지고 있는 시계열 데이터는 n개이기 때문에, 불가능하게 됩니다. 반면에 만약 같은 평균과 분산을 가지는 데이터라면 n개 데이터로 충분히 2개의 모수(평균, 분산)을 추정할 수 있게 됩니다. 따라서 정상성 가정은 통계적 분석을 가능하게 해주는 중요한 개념입니다.

Stationarity는 ADF test(Augmented Dickey-Fuller test)를 통해서 검정할 수 있습니다. ADF Test 검증 모형은 아래와 같습니다.

https://en.wikipedia.org/wiki/Augmented_Dickey%E2%80%93Fuller_test

 해당 Test의 귀무가설($H_0$)과 대립가설($H_1$)은 다음과 같습니다.

귀무가설($H_0$): 데이터는 비정상성이다.[단위근이 존재한다.](Non-stationary)

대립가설($H_1$): 데이터는 정상성을 만족한다.[단위근이 존재하지 않는다.](Stationary)

만약 $\delta$가 1이라면 이는 Unit root를 가지게 되는 것이고, 시간이 지남에 따라 시계열 데이터는 분산이 무한대로 커지게 됩니다. 따라서 위에 정리한 ADF test  검증모형에서 $\gamma$는 0이 되면 시계열 데이터가 비정상성을 가진다고 볼 수 있습니다.

Python에서 statsmodels 패키지를 활용하여 쉽게 ADF Test를 수행할 수 있습니다.

import statsmodels.tsa.stattools as sts 

sts.adfuller(df["Close"])
'''
(1.059624647407287,
 0.9948568682915807,
 6,
 6774,
 {'1%': -3.43131571888621,
  '5%': -2.8619667679228646,
  '10%': -2.5669971648470256},
 55484.34577265247)
 '''

sts.adfuller(df["wn"])
'''
(-82.61985810790189,
 0.0,
 0,
 6780,
 {'1%': -3.4313148639438347,
  '5%': -2.861966390170326,
  '10%': -2.5669969637620627},
 105778.09936636973)
 '''

위의 결과에서 2번째 줄이 P-value를 나타내며, 일반적으로 P-value가  0.05미만일 때 해당 데이터는 정상성을 가진다고 볼 수 있습니다. White noise같은 경우는 정상성을 가지고 있으며, S&P500 index의 경우에는 비정상성을 띄고 있습니다.

반응형