7. ARIMA, ARCH 모형

   이 포스트는 AR과 MA를 혼합한 ARMA에서 한 발 더 나아간 ARIMA 모형을 소개한다. 그리고 시점마다 분산이 변하는 시계열을 처리하기 위한 이분산(heteroskedastic) 모형을 소개한다.


1. ARIMA(Autoregressive Integrated Moving average)

 
   ARMA 모형의 경우 불안정(non-stationary) 시계열을 모델링하는데 적합하지 않다. 하지만 불안정 시계열의 차분을 새로운 시계열로 만들면 안정적(stationary) 시계열이 될 수 있다. 이 점이 ARIMA 모형을 사용하게하는 중요한 이유이다.
   ARIMA 모형은 ARIMA(p, d, q)로 표현한다. 여기서 p와 q는 앞선 포스트에서 소개한 AR과 MA의 차수이고, d는 몇 번의 차분을 수행하는가의 의미이다. (차분이 왜 integrated라는 이름을 달고있는가는 이해하지 못했다.)
   ARIMA(p, d, q)는 d번의 차분을 시계열에 수행했을 때, 그 시계열이 ARMA(p, q) 모형을 따른다는 의미이다. 이를 식으로 정의하면 다음과 같다.
$$
\theta_p(\mathbf{B})(1-\mathbf{B})^d x_t = \phi_q(\mathbf{B})\omega_t
$$
   이식을 ARMA(p, q)를 나타내는 $\theta_p(\mathbf{B})x_t = \phi_q(\mathbf{B})\omega_t$와 비교하면 그 차이를 명확히 알 수 있다.
   다음의 코드는 Amazon의 시계열을 받아와 ARIMA모형으로 피팅하는 R 코드이다.

 
require(quantmod)

getSymbols("AMZN", src="google")
# close price
amzn = diff(log(Cl(AMZN)))
plot(amzn)

# remove na
ft <- as.numeric(amzn)
ft <- ft[!is.na(ft)]

# fitting ARIMA
ftfinal.aic <- Inf
ftfinal.order <- c(0, 0, 0)

for(p in 1:4)
{
    for(d in 0:1)
    {
        for(q in 1:4)
        {
            ftcurrent.aic <- AIC(arima(ft, order=c(p, d, q)))
            if(ftcurrent.aic < ftfinal.aic)
            {
                ftfinal.aic <- ftcurrent.aic
                ftfinal.order <- c(p, d, q)
                ftfinal.arima <- arima(ft, order=ftfinal.order)
            }
        }
    }
}

ftfinal.order

   이 코드에서 AIC 함수를 이용하여 ARIMA(p, d, q)의 각 차수를 결정하는 것을 볼 수 있다.


2. ARCH(Autoregressive Conditional Heteroskedastic)과 GARCH 모형

 
   앞서 ARMA 계열의 모형은 어찌했건 시계열의 안정적 상태를 가정한다. 즉, 분산이 시점에 상관없이 같은 값을 갖는다고 가정한다. 하지만 이와 다르게 분산이 시점에 따라 달라지는 시계열을 자주 볼 수 있으며, 이를 시계열이 이분산(heteroskedastic) 특성을 갖는다고 한다. 이와 더불어 이분산 특성이 연속적으로 연관되어 나타난다면, 특정 조건하에서 이분산이 나타나는 것이므로 이를 조건부 이분산(conditional heteroskedastic) 특성이라 한다.
   이런 특성을 갖는 시계열을 분석하기 위해 변동성 자체를 모형으로 만드는 ARCH나 GARCH 모형을 사용할 수 있다. 차수가 1인 ARCH(1) 모형은 시계열 $\{ \epsilon_t \}$에 대해 다음과 같이 정의한다.
$$
\epsilon_t = \sigma_t \omega_t \\
\sigma_t^2 = \alpha_0 + \alpha_1 \epsilon_{t-1}^2
$$
   위의 식을 $\epsilon_t$에 대해 풀면 다음과 같다.
$$
\epsilon_t = \omega_t \sqrt{\alpha_0 + \alpha_1 \epsilon_{t-1}^2}
$$
   위의 식을 p 차수로 확장한 ARCH(p)의 식은 다음과 같다.
$$
\epsilon_t = \omega_t \sqrt{\alpha_0 + \sum_{i=1}^p \alpha_i \epsilon_{t-i}^2}
$$
   여기서 $\alpha$는 모형 인수이다.

   GARCH(Generalized Autoregressive Conditional Heteroskedastic) 모형은 ARCH(p)를 확장한 모형으로서, GARCH(p, q)로 표현한다. 표현식은 다음과 같다.
$$
\epsilon_t = \sigma_t \omega_t \\
\sigma^2_t = \alpha_0 + \sum_{i=1}^p \alpha_i \epsilon_{t-i}^2 + \sum_{j=1}^q \beta_j \epsilon_{t-j}^2
$$
   여기서 $\alpha$와 $\beta$는 모형의 인수이다. GARCH는 ARCH에 이동 평균(moving average) 항을 추가한 모형으로 이해할 수 있다.

도구로써의 Machine Learning

   최근 기술의 발달은 꿈의 기술이라 불리는 인공지능(AI)를 가까이서 체험할 수 있는 계기를 만들어 주었다. '무어의 법칙'으로 대변할 수 있는 컴퓨터의 발달은 이미 개인용 기기가 수십년 전 메인프레임급의 컴퓨팅 파워를 갖게했다. 그리고 그것을 넘어 직접 서버를 사지 않고도 클라우드 컴퓨팅을 통해 초고성능 컴퓨터를 어디에서나 사용할 수 있게됐다.

   뉴럴네트워크를 위시한 인공지능 알고리즘은 1943년 처음 모형이 등장했고, 1980년대 연결주의란 이름으로 뇌의 뉴런 연결을 모형화하기 이른다. 하지만 지금에 비하면 조악한 컴퓨팅 파워로 인해 큰 발전을 하지못했고, 2000년대 중반까지도 발전이 더딘 분야였다. 하지만 컴퓨터 자체의 연산 능력이 늘어남은 물론, 클라우드 컴퓨팅 모델이 발달하면서 큰 전기가 마련된다. 특히 클라우드 컴퓨팅은 저렴한 비용으로 고성능 서버의 묶음을 사용하게 한다. 그럼으로써 비용만 충분히 지불한다면 거의 원하는만큼의 컴퓨터를 이용하여 뉴런의 연결을 표현할 수 있다. 그로인해 더 다양한 알고리즘이 등장한다. 특히 2010년경 발표된 'Recursive Neural Network'은 자연어, 시계열 등의 처리에 있어 획기적인 전기를 마련한다. 게다가 구글에서 발표한 'Tensorflow'와 이를 쉽게 사용하기 위한 API까지 등장해 사용자 접근성 또한 획기적으로 높아졌다.

   이런 큰 발전에 힘입어 일반 사용자들도 그 혜택을 보기 시작했다. 개인이 집에 둘 수 있는 인공지능 스피커가 있다. 이 스피커는 사용자의 말을 받아들여 연결되어있는 서버에서 답변을 처리해 사용자에게 돌려준다. 아x존의 에x, SxT의 누x 등이 있다. 스마트폰은 이미 S사와 A사가 모두 인공지능 비서를 내부에 탑재하고 있다. 그 외에 바둑을 스포츠로 삼는 동아시아권에서 구x 알파고의 승전보는 매우 큰 충격을 안겨주었다. 이렇다 보니 각종 매체에서 인공지능으로 대체될 직업의 이야기가 심심치않게 보이고, 마치 터x네이터2에서 보던 종말이 다가온 것이 아닌가 하는 영화적 걱정도 보인다.

   내 의견은 그런 걱정이 너무 지나치다는 것이다. 인공지능의 사용 추세를 보면 이미 변혁을 일으키기 위한 임계치 근처에 와 있다는 판단은 든다. 이미 사람들이 알게 모르게 인공지능을 접하고 있고, 많은 산업이 인공지능을 도입하여 생산성을 높이려 하고있다. 아마 조금의 시간이 지나면 스마트폰이나 인터넷이 그랬듯이 인공지능도 당당하게 필수 도구의 한 자리를 차지할 것이다. 그렇다면 인터넷과 스마트폰에 빗대어 앞으로를 예상해볼 수 있을 것 같다.

   스마트폰이나 인터넷이 등장하고 기술이 발전하면서 사라지거나 힘이 약해진 직업들이 있다. 전화 교환원, 타자를 대신 쳐주던 타자원, 인쇄에 꼭 필요하던 식자공 등이 있다. 하지만 그에 반해 생긴 직업도 있다. 각 회사마다 상주하는 네트워크 관리를 하는 사람, 스마트폰을 파는 사람, 스마트폰 어플리케이션을 개발하는 사람 등 다양하다. 즉, 기술의 발전이 단순히 파괴적 상황만을 가져왔다고 보기 힘들다는 이야기다.
 
   아직 어떤 방향으로 흐를지 정확히 예측하긴 어려우나, 인공지능도 앞선 기술과 비슷하게 대체재와 보완재의 역할을 수행할 것으로 판단한다. 의료, 금융, 통신 등 이미 인공지능을 도입하고 있는 곳도 비슷한 양상일 것이다. 물론 골드만삭스가 트레이딩 데스크를 모두 IT 인프라로 갈아엎었다는 기사가 났으나, 이것이 성공적이라는 판단은 아직 섣부르다. 이미 잘 나가는 '켄쇼'의 경우 머신러닝으로 데이터를 분석하고 리포팅하는 것이지 시장을 예측해 직접 투자에 나서는 것은 아니다.
   인공지능은 사람이 할 수 있는 분석보다 더 많은 양의 분석을 수행함으로써 최종 결정을 더 탄탄하게 만들어줄 수 있으나 최종 결정권자는 아니다. 최종적으로 인간이 인공지능을 통해 나온 결과와 데이터를 이해하고 본인의 전문 지식과 연결해야한다. 예전의 망치와 못이 지금의 컴퓨터와 인공지능이라는 도구로 바뀌는 것이고, 그 도구로 무엇을 만들지는 결국 개인, 회사의 몫이다.

   결론적으로 자신의 현 분야의 전문성이 뛰어나고 다른 분야와 연결시켜보는 것을 좋아하는 사람이 주도권을 쥘 것이다. 그런데 이상하지 않은가? 이미 이런 사람들은 예전부터 성공가도를 달렸다. 결국 성공하는 인재상은 크게 달라질 것이 없다.

3줄 요약)
1) 인공지능 많이 발전 해 도구의 위치까지 오고있음
2) 없어지는 직업도 생기는 직업도 있는데, 이는 이미 예전에도 그랬음
3) 그래도 어차피 될놈 될

6. Auto-regressive Moving Average 모형

   이 포스트에서는 p차 Auto-regressive(AR)와 q차 Moving Average(MA) 모형을 다룬다. 그리고 이 두 모형을 조합한 (p, q)차 ARMA(Auto-regressive, Moving Average) 모형을 소개한다.


1. 엄격한 안정성(strict stationarity)


   앞선 포스트에서 어떤 시계열의 평균이 시간 간격에 상관없이 같은 값이고, 공분산이 시간 간격의 함수로 나타난다면, 그 시계열이 안정적이다라고 정의하였다. 이러한 조건의 안정성을 '약한 안정성(weak stationarity)'라 한다. 여기서는 '엄격한 안정성(strict stationarity)' 조건을 제시한다.

   Strict Stationarity -  어떤 시계열 모형 $\{ x_t \}$가 있을 때, 모든 $t_i$와 $m$에 대해 $x_1, \dots , x_{t_n}$과 $x_{t_1 + m}, \dots , x_{t_n + m}$의 joint distribution이 같은 경우, 이 시계열이 strict stationary라고 한다.


2. AIC(Akaike Information Crietrion)와 BIC(Bayesian Information Criterion)


   시계열 모형을 선택하는데 있어 어떠한 지표가 될만한 값이 있으면 편할 것이다. 그 지표를 제시해주는 것이 이 AIC 값이다. AIC 값은 다음의 식으로 산출한다.
$$
AIC = -2\log(L) + 2k
$$
   여기서 $L$은 likelihood 값의 최대치이고, $k$는 모형을 구성하는 인수의 갯수이다. 모형 자체를 선택하거나 모형 내에서 인수의 갯수를 선택할 때, 이 값이 작은 방향으로 선택한다. 즉, likelihood를 크게하고 인수를 적게 쓰는 방향으로 모형 선택을 하는 것이다.

   BIC(Bayesian Information Criterion)는 AIC와 유사하며 다음과 같은 식으로 표현한다.
$$
BIC = -2\log(L) + k\log(n)
$$
   여기서 $n$은 시계열의 데이터 수를 말한다. 이 값 역시 값이 작아지는 방향으로 모형을 선택한다.


3. Auto-regressive(AR) 모형


   'p'의 차수를 갖는 Auto-regressive 모형은 AR(p)라고 쓰며 다음의 식으로 표현한다.
$$
x_t  = \alpha_1 x_{t-1} + \dots + \alpha_{p}x_{t-p} + \omega_t \\
     = \sum^{p}_{i=1} \alpha_i x_{t-i} + \omega_t
$$
   여기서 $\{\omega_t \}$는 white noise이다.

 3.1 AR(p) 모형의 안정성

   AR(p) 모형의 안정성은 인수 $\alpha$의 값에 따라 달라진다.
   이를 위해 우선 AR(p) 모형을 backward shift operator의 식 $\theta$로 표현한다. 그 식은 다음과 같다.
$$
\theta_p (\mathbf{B}) x_t = (1 - \alpha_1 \mathbf{B} - \alpha_2 \mathbf{B}^2 - \dots - \alpha_p \mathbf{B}^p)x_t = \omega_t
$$
   여기서 다음의 식을 $\mathbf{B}$에 대해 푼다고 하자.
$$
\theta_p (\mathbf{B}) = 0
$$
   그렇다면 $\mathbf{B}$의 해를 구할 수 있을 것이다. 이 해의 값이 1인 경우 안정적이지 않고, 1이 아니라면 안정적인 시계열을 갖는다. 이 부분은 특성 함수(characteristic function)에 대한 이해가 필요해 추후 다시 정리를 해보겠다.

 3.2 이차 특성(Second-order properties)

   AR(p) 모형의 이차 특성은 다음과 같다.
$$
\mu_x = E(x_t) = 0 \\
\gamma_k = \sum^p_{i=1} \alpha_i \gamma_{k-i}, k > 0 \\
\rho_k = \sum^p_{i=1} \alpha_i \rho_{k-i}, k > 0
$$


4. Moving Average 모형

 
   'q' 차수를 갖는 Moving average 모형은 MA(q)로 쓰며 다음의 식으로 표현한다.
$$
x_t = \omega_t + \beta_1 \omega_{t-1} + \dots + \beta_q \omega_{t-q}
$$
   Moving average 모형은 white noise 항의 평균으로 시계열을 표현하는 방법이다. 이 white noise는 평균이 0이며 분산이 $\sigma^2$이다. 이 식을 back-shift operator의 함수 $\phi$로 나타내면 다음과 같다.
$$
x_t = (1 + \beta_1 \mathbf{B} + \beta_2 \mathbf{B}^2 + \dots + \beta_q \mathbf{B}^q)\omega_t = \phi_q(\mathbf{B})\omega_t
$$

4.1 이차 특성

   이 모형의 이차 특성은 다음과 같다.
$$
\mu_x = 0 \\
Var(x) = \sigma^2_{\omega} (1 + \mathbf{B}^2_1 + \dots + \mathbf{B}^2_q) \\
\rho_k = \left\{ \begin{array} \\ 1 & \text{if}\quad k = 0 \\
\sum_{i=0}^{q-k}\beta_i \beta_{i+k} / \sum^q_{i=0} \beta^2_i & \text{if}\quad k = 1, \dots, q\\
0 & \text{if}\quad k>q \end{array} \right.
$$
   여기서 $\beta_0 = 1$이다.


5. ARMA(p, q)


   ARMA(p, q) 모형은 AR모형과 MA모형을 붙인 형태이다. 이 모형은 이전 시계열의 값과 현 시점에 누적된 white noise를 모두 고려하여 더 유연하게 시계열을 표현할 수 있다. ARMA(p, q)는 다음과 같은 식으로 표현한다.
$$
x_t = \sum^{p}_{i=1} \alpha_i x_{t-i} + \sum^{q}_{j=0} \beta_j \omega_{t-j}
$$
   여기서 $\beta_0 = 1$이다.
   위의 식을 앞서 제시한 AR과 MA의 back-shift operator의 함수로 나타내면 다음과 같다.
$$
\theta_p (\mathbf{B})x_t = \phi_q (\mathbf{B}) \omega_t
$$
   이 모형의 차수인 p와 q를 알맞게 구하기 위해 AIC나 BIC 등의 값을 구한다. 이 작업을 반복하여 AIC, BIC 값이 작아지는 방향으로 차수를 선택한다.

5. 시계열 모형, Random Walks와 White Noise

1. 시계열 모형을 다루는 과정

   
   시계열 모형은 시계열에 있는 serial correlation을 설명하기위한 수학모형이다. 여기서 설명한다는 의미는 다음과 같다. 일단 지정한 모형을 시계열에 맞추면(fitting), correlogram에서 보이는 해당 시계열의 serial correlation을 대부분 설명할 수 있어야 한다.
   모형을 선택하고 맞춰가는 과정은 다음과 같이 요약할 수 있다.
  • 특정 시계열과 그 움직임에 대한 가설의 윤곽을 잡는다
  • R 등의 도구를 이용하여 해당 시계열의 correlogram을 그려본다.
  • 오류항(residuals)의 serial correlation을 줄이는 모형을 찾아 맞춘다
  • 반복적으로 serial correlation을 없애는 방향으로 맞춰보고 통계 테스트를 수행한다
  • 모형과 모형의 'second-order properties'를 이용하여 미래값을 예측한다.
  • 예측의 정확도가 최적일 때까지 반복한다.
   여기서 'second-order properties'는 앞 포스트에서 얘기한 평균, 분산, serial correlation의 특성을 지칭한다.

   모형을 설명하기에 앞서 두 가지 연산자를 소개하고 넘어가려 한다.
  1. Backward shift operator (lag operator) - $\mathbf{B}$로 표현하며 $\mathbf{B}x_t = x_{t-1}$이다. 반복 적용하면 $\mathbf{B}^n x_t = x_{t-n}$이 된다.
  2. Difference operator - 표현은 $\nabla$로 한다. 라플라스 연산자(Laplace operator)와 같은 모양인데, 이 책에서는 difference로 사용한다. $\nabla x_t = x_t - x_{t-1}$ 또는 $\nabla x_t = (1-\mathbf{B})x_t$이다.


2. White Noise


   White noise 모형은 방향성이 없는 모형이며, 주로 오류항의 시계열을 나타내기위해 사용한다. $y_t$가 관찰한 값의 시계열이고, $\hat{y}_t$가 예측치라면, 오류항의 시계열 $x_t$는 $y_t - \hat{y}_t$이다. 
   만약 적당한 시계열 모형을 선택했다면, 모형으로 측정한 값과 실측값의 차이(오류 시계열)의 serial correlation은 거의 없게 된다. 즉, 오류 자체가 white noise로서 서로 독립적인 값이 되므로 새로운 모형을 적용할 여지가 없어진다. 

   White noise의 second-order properties는 다음과 같다.
$$ \begin{eqnarray}
& \mu_{\omega} = \mathbf{E}(\omega_t) = 0 \\
& \rho_k = \mathbf{Cor}(\omega_t, \omega_{t+k}) =
\left\{ \begin{array} \\
1, k = 0 \\
0, k \not= 0
\end{array}  \right. \end{eqnarray}
$$
   그리고 correlogram은 다음과 같이 나타난다.



3. Random Walk


   Random walk 시계열 모형은 직전 시계열 값에 오류항을 더한 식으로 표현한다.
$$
x_t = \mathbf{B}x_t + \omega_t = x_{t-1} + \omega_t
$$
   위의 식을 반복하여 적용하면 다음과 같은 식을 얻을 수 있다.
$$
x_t = (1 + \mathbf{B} + \mathbf{B}^2 + \dots )\omega_t \Longrightarrow x_t = \sum_{i=0}^n \omega_{t-i}
$$
   즉, random walk는 서로 독립인 오류항의 합으로 나타난다.

   오류항의 분산이 $\sigma^2$라고 하면, random walk의 second-order properties는 다음과 같다.
$$
\begin{eqnarray}
&\mu_x = 0 \\
&\gamma_k(t) = \mathbf{Cov}(x_t, x_{t+k}) = t\sigma^2 \\
&\rho_k(t) = \frac{\mathbf{Cov}(x_t, x_{t+k})}{\sqrt{\mathbf{Var}(x_t)\mathbf{Var}(x_{t+k})}} = \frac{t\sigma^2}{\sqrt{t\sigma^2(t+k)\sigma^2}} = \frac{1}{\sqrt{1+k/t}} \end{eqnarray}
$$
   위의 식에서 볼 수 있듯이, random walk의 공분산이 $k$가 아닌 $t$의 함수이다. 그러므로 random walk는 non-stationary 시계열 모형이다. 이 모형의 correlogram은 다음과 같다.
   $\nabla x_t = x_t - x_{t-1}$의 correlogram을 그려본다. 이 작업은 random walk로 생성한 데이터를 random walk 모형으로 추정했다고 가정했을 때, 오류항의 serial correlation을 볼 수 있는 작업이다.

4. 시계열 분석과 Serial Correlation

1. 시계열 분석

   
   시계열이란 시간 순서대로 관찰한 어떠한 값의 모음을 이야기한다. 어떤 주가 지수의 종가를 날짜별로 나열한 값이나, 시점에 따른 직장인 평균 월급을 모아놓은 값 등이 예제가 될 수 있다. 
   시계열 분석은 이 데이터를 가지고 어떤 일이 일었났는가를 추론한다. 그리고 그 추론을 바탕으로 미래값을 예측하는 방법이다. 
   일반적으로 시계열은 다음과 같은 특성을 지닌다.
  • Trend - trend는 시계열이 지니고 있는 방향성을 의미한다. 방향성은 deterministic할 수도 있고, stochastic할 수도 있다.
  • Seasonal Variation - 주기에 따른 시계열의 변화를 의미한다. 예를들어 천연가스의 사용량은 계절에 따라 주기성을 보인다.
  • Serial Dependence - 시계열의 시간에 따른 관찰 결과가 어떤 상관관계를 갖을 수 있다. 금융 시계열 분석에서 매우 중요하게 생각하는 serial correlation으로 나타낸다.

2. 시계열의 Stationarity


   Stationarity는 시계열 분석에 있어 중요한 부분을 차지한다. 많은 금융 데이터 시계열분석이 stationarity를 염두해두고 수행된다. 시계열의 stationarity를 이야기하기 위해서 시계열의 expectation(기대값)과 variance(분산)을 이야기해야 한다. 

   우선 시계열 $x_t$의 기대값(평균)은 $t$의 함수인 $\mu(t)$로 나타내며, $\mathbf{E}(x_t)=\mu(t)$로 표현한다. 평균, 분산 등을 구하기 위한 시계열이 여러개일 수 있지만, 일반적으로 하나의 시계열을 가지고 작업하는 경우가 많다. 시계열이 하나라면, 평균을 구하기위해 다음의 두가지 방법을 고려할 수 있다.
  1. 관찰한 데이터를 바탕으로 각 점에서 단순히 평균을 구하는 방법
  2. 시계열 데이터에서 trend, seasonality 효과를 제거하여 residual series를 만든다. 이 경우 만들어진 residual series가 stationarity in the mean(안정적 평균) 상태임을 가정할 수 있다. 그래서 상수의 $\bar{x} = \sum^{n}_{t=1} x_t/n$로 평균을 추정한다.
   앞서 'stationarity in the mean'은 $\mu(t) = \mu$를 의미한다. 즉, 시계열이 시간에 관계없이 항상 동일한 평균을 갖는다는 의미이다. 시계열이 이 상태라면 분산을 다음과 같이 구한다.
$$
\sigma^2 = \mathbf{E}[(x_t - \mu)^{2}]
$$
   이 때 역시 시계열이 하나밖에 없을 경우, 분산이 시간에 관계없이 일정하다고 가정하고 sample variance를 구하는 방법이 있다.
$$
\mathbf{Var}(x) = \frac{\sum(x_t - \bar{x})^2}{n-1}
$$
   이 경우 이 시계열을 stationarity in the variance(안정적 분산) 상태라고 부른다.



3. Serial Correlation


   Serial correlation을 위해 우선 lag라는 개념을 보자. Lag는 하나의 전체 시계열이 있을 때 시간 차를 두고 추출한 하위 시계열이다. 예를 들어 시계열 $\vec{x}_{t} = \{x_t, x_{t-1}, x_{t-2} ... x_{0}\}$가 있다고 하자. 여기서 lag이 1일 때 시계열은 $\vec{x}_{t+1} = \{x_{t+1}, x_{t}, x_{t-1} ... x_{1}\}$이 된다.
   이렇게 lag를 건너 뛴 시계열도 하나의 또 다른 시계열로 볼 수 있다. 그래서 두 시계열간의 상관관계가 존재한다. 이 때 이 상관관계가 $t$의 함수가 아니라 lag를 의미하는 $k$의 함수로 나타낼 수 있다면, 이런 경우를 'Second order stationary'상태라 한다.
   시계열이 second order stationary 상태라면, 두 시계열간 공분산(autocovariance)을 다음과 같이 구할 수 있다.
$$
C_k = \mathbf{E}[(x_t - \mu)(x_{x+k} - \mu)]
$$
   잘 보면 이 second order stationary가 앞서 이야기한 mean, variance의 stationary를 포함하는 것으로 볼 수 있다.
   이렇게 구해진 autocovariance를 이용하여 serial correlation(autucorrelation)을 다음과 같이 구할 수 있다.
$$
\rho_k = \frac{C_k}{\sigma^2}
$$



4. 예제


   다음의 차트는 100개의 난수로 이루어진 시계열의 correlogram(lag별 autocorrelation 차트)이다.
   난수의 시계열이므로 lag가 0인경우만 serial correlation이 1이고 나머지는 거의 0에 수렴한다.
   다음은 1부터 100까지의 수열에 대한 차트이다.
    Lag값이 커질수록 값이 줄어들지만, 전반적으로 높은 수준의 상관관계를 보여준다.
   마지막으로 반족되는 수열의 차트이다.
   차트에서 보듯이 반복 주기마다 상관계수가 높아지는 것을 확인할 수있다.

잡설 - 이상한 꿈

   이상한 꿈을 꾸었다.
 
   나는 나도 모르는 사이 이 세상 사람이 아니었다. 그 사실을 알게된 것은 약간의 시간이 지나서였다. 나름 하루 일과를 마치고 거리를 걷고있는데 이상한 느낌이 들었다. 어딘가에 부딪힌 것 같은데 아무 느낌이 없었다.
   집으로 돌아왔다. 분명 내가 살던 집인데 낯설었다. 와이프는 말 없이 음식을 준비하고 있었고, 아들은 여느때 처럼 거실에서 스케치북에 그림을 그리고 있었다. 그 때 아들이 아빠가 보고싶다며 엄마에게 칭얼거렸다. 엄마는 잠시 멈칫하다 하던 일을 다시했고, 나는 그 모습을 가만히 보고있었다. 와이프의 뺨을 만져봤지만 내 손에 느껴지는 감각이 약했다. 그리고 와이프도 아무런 반응이 없었다. 평소같으면 집에 돌아온 아빠에게 안겼을 아이들이 내 옆을 지나쳐간다.
   시간 개념이 뚜렷치 않아 꽤 시일이 지난 후 같다. 비가 오고 있었다. 빗속을 비에 젖지 않은체 걸었다. 비가 그치고 해가 났을 때, 누군가와 이야기를 나누었다. 누구인지 보지 않고 이야기를 나누었다. 이제 내 상황을 알았으니 체념하겠다. 이런식으로 지내는 것도 나쁘지 않다라는 내용이었다. 그 때, 갑자기 혼자 남은 와이프와 앞으로 아빠를 잊어갈 아이들이 생각났다. 그리고 내가 왜 죽음으로 내몰렸는지(아마도 어이없이 살해당했던 것으로 기억한다.)도 기억이 나기 시작했다. 원망스러움과 안타까움, 슬픔, 그 외 수 많은 감정이 파도처럼 밀려왔고, 나는 그 자리에 주저앉아 큰 소리로 울었다. 어차피 누구도 우는 소리를 못 들을테니까.

   그렇게 우는 장면을 마지막으로 꿈에서 깼다. 잠에서 깬 직후의 멍멍함과 꿈속에서의 감각이 남아 베개에 얼굴을 파묻고 잠시 있었다. 시계를 보니 알람이 울리기 30분 전이었다. 아이들과 와이프가 자고있는 방으로 가 그들을 바라보니 다시 현실임을 자각했다. 마지막 장면의 강렬함 때문이었을까. 문득 이렇게 현실에서 살아있는게 다행이라는 생각이 들었다.
   참 이상한 꿈이었다.

3. Bayesian Linear Regression

1. Frequentist 방식

 
   다음의 예측 식이 있다고 하자.
$$
f(\mathbf{X}) = \beta_0 + \sum_{j=1}^{p}\mathbf{X}_j\beta_j + \epsilon \\
= \beta^T \mathbf{X} + \epsilon
$$
   여기서 $\epsilon \sim N(0, \sigma^2)$인 에러텀이다. 여기서 학습을 위한 데이터가 $(x_1, y_1), ...(x_N, y_N)$과 같이 있다고 하면, 우리는 이 데이터를 가장 비슷하게 맞추는 $\beta$를 찾아야 한다. 이를 위해 일반적으로 OLS(ordinary least squares)방식을 사용한다. OLS 방식을 사용하기 위해 우선 측정 값과 $\beta$를 통한 예측치간의 차이를 나타내는 다음의 식을 정의한다.
$$
RSS(\beta) = \sum^{N}_{i=1}(y_i - f(x_i))^2
$$
   이 식(RSS: residual sum of squares)는 일종의 비용(에러)함수로 볼 수 있다. OLS의 목적은 이 함수의 값을 최소화하는 $\beta$를 찾는 것이고, 이를 위해 Maximum Likelihood Estimate 방식을 사용한다. 이 식은 다음과 같다.
$$
\hat{\beta} = (\mathbf{X}^T \mathbf{X})^{-1}\mathbf{X}^T \mathbf{y}
$$
   이렇게 찾아진 $\hat{\beta}$를 이용하여 $x_{N+1}$ 값에 대한 결과치 $y_{N+1}$을 추정한다.


2. Bayesian 방식


   Bayesian 방식으로 Linear Regression을 수행하기 위해 다음과 같이 $\mathbf{y}$에 대해 정의한다.
$$
\mathbf{y} \sim N(\beta^T \mathbf{X}, \sigma^2 \mathbf{I})
$$
   즉, 앞서 소개한 방식과 다르게 $y$를 어떤 점으로 보는 것이 아니라, 일종의 확률변수로 보는 것이다. 이를 수행하기 위해 다음의 두 가지를 고려해야 한다.

  • Prior Distribution - $\beta$에 대한 선행 정보가 있을 경우, 이를 반영하기 위한 분포를 지정한다. 만약 정보가 없을 경우 'non-informative prior'를 선택한다. 
  • Posterior Distribution - Bayesian 방식은 $\beta$도 분포를 갖는 확률변수로 취급하므로 데이터 추가에 따른 새로운 $\beta$의 분포를 도출한다. 
   위에서 등장하는 non-informative prior는 추가 정보를 찾아봐야 이해할 것 같다. 지금 여기선 잠시 넘어간다.
   앞선 포스트에서 설명하였듯이, $\beta$의 분포가 conjugate prior인 경우 닫힌 해를 이용하여 다음 $\beta$의 분포를 추정할 수 있다. 그렇지 않을 경우 일정 분포를 가정하고 Markov Chain Monte Carlo 방법을 이용하여 추정작업을 수행한다.


3. PyMC3를 이용한 Bayesian Linear Regression 예제


   너무나도 간단한 설명을 마치고 PyMC3를 이용하는 예제를 소개한다.

 3.1 Generalized Linear Model(GLM)

   GLM 모형은 일반적인 Linear Regression 모형의 확장형태라고 볼 수 있다. 결과 값으로 나오는 $y$의 오류값이 정규분포가 아닌 다른 분포를 갖을 수 있도록 허용한 방식이다. 자세한 내용은 위키페이지를 참고하기 바란다.
   GLM 모형은 결과값 $y$가 지수형태를 갖는 특정 분포를 통해 만들어진다고 가정한다. $y$는 다음과 같은 평균값을 갖는다.
$$
\mathbf{E}(\mathbf{y}) = \mu = g^{-1}(\mathbf{X}\beta)
$$
   여기서 $\mathbf{X}\beta$가 linear predictor 역학을 하는데, $\beta$가 미지수이다. $g()$는 연결함수(link function)이다. 그리고 분산은 평균의 함수 $V$로 표현한다.
$$
Var(\mathbf{y}) = V(\mathbf{E}(\mathbf{y})) = V(g^{-1}(\mathbf{X}\beta))
$$
   이 모형을 가지고 $\beta$를 다양한 방식으로 추정하는데, 여기서는 Markov Chain Mote Carlo를 이용한다.

  3.2 수행 예제


   다음의 예제는 위의 GLM모형을 임의의 데이터에 적용하는 예제이다. 난수로 만들어진 일정 데이터에 맞게 $\beta$를 찾는 코드이다. 우선 다음의 그림은 frequentist 방식으로 fitting한 결과이다.
   이 작업을 MCMC를 이용한 결과는 다음과 같다. 다음의 그림은 5000번의 수행 중, 100개의결과를 임의 추출한 것이다.
   위 그림의 녹색선이 목표지점이다. 이 MCMC수행의 추적 차트는 다음과 같다.
   위 그림에서 intercept가 $\beta_0$, $x$가 $\beta_1$, sd가 error이다.
   이를 수행하는 코드를 다음에 첨부한다.

 
# simul_fit.py

import numpy as np
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import pymc3 as pm

sns.set(style="darkgrid", palette="muted")

# simulate function
def simulate_linear_data(N, beta_0, beta_1, eps_sigma_sq):
    """
    simulate a random dataset using a noisy linear proces

    :param N: Number of data points
    :param beta_0: Intercept
    :param beta_1: slope of univariate predictor, X
    :param eps_sigma_sq:
    :return: pandas dataframe
    """

    # create pandas DataFrame
    # column 'x' : N uniformly sampled values b/w 0.0 and 1.0
    df = pd.DataFrame(
        { "x":
            np.random.RandomState(42).choice(
              list(map(
                  lambda x: float(x) / 100.0,
                  np.arange(N)
              )), N, replace=False
            )
        }
    )

    # Use linear model (y ~ beta_0 + beta_1*x + epsilon) to
    # generate a column 'y' of responses based on 'x'
    eps_mean = 0.0
    df["y"] = beta_0 + beta_1 * df["x"] + np.random.RandomState(42).normal(
        eps_mean, eps_sigma_sq, N)

    return df


def glm_mcmc_inference(df, iterations=5000):
    """
    Calculate MCMC trace of GLM
    :param df:
    :param iterations:
    :return:
    """

    # use PyMC3 to construct model context
    basic_model = pm.Model()
    with basic_model:
        # create the glm using the Patsy model syntax
        # Normal distribution for likelihood
        pm.glm.GLM.from_formula("y ~ x", df, family=pm.glm.families.Normal())

        # use Maximum A Posterior(MAP) optimization as initial value
        start = pm.find_MAP()

        # use the No-U-Turn Sampler
        step = pm.NUTS()

        # Calculate trace
        trace = pm.sample(iterations, step, start, random_seed=42, progressbar=True)

    return trace


# main
if __name__ == "__main__":
    # true parameters
    beta_0 = 1.0 # Intercept
    beta_1 = 2.0 # Slope

    # simulate 100 points
    N = 100
    eps_sigma_sq = 0.5

    # Simulate the linear data
    df = simulate_linear_data(N, beta_0, beta_1, eps_sigma_sq)

    # plot data, and Frequentist linear regression fit
    # using seaborn package
    sns.lmplot(x="x", y="y", data=df, size=10)
    plt.xlim(0.0, 1.0)

    trace = glm_mcmc_inference(df, iterations=5000)
    pm.traceplot(trace[500:])
    plt.show()

    # plot a sample of posterior regression lines
    sns.lmplot(x="x", y="y", data=df, size=10, fit_reg=False)
    plt.xlim(0.0, 1.0)
    plt.ylim(0.0, 4.0)
    pm.plot_posterior_predictive_glm(trace, samples=100)
    x = np.linspace(0, 1, N)
    y = beta_0 + beta_1 * x
    plt.plot(x, y, label="True Regression Line", lw=3., c="green")
    plt.legend(loc=0)
    plt.show()



인생논어 - 1

  0. 조형권님이 쓴 <<인생논어>> 를 읽고 필사한다는 생각으로 구문들을 옮겨 적으려 한다.  1. 나만의 속도를 유지하라.   子曰, 射不主皮 爲力不同科 古之道也 (자왈, 사부주피 위력부동과 고지도야)  해석: 활을 쏠 때 ...