시계열(Time series) > Break

2021. 1. 5. 22:53계량경제학

반응형

지금까지 시계열 모형을 수립하면서 우리가 가지고 있는 시계열 데이터의 패턴이나 구조적 변화에 대해서는 고려하지 않았습니다. 하지만 실제로는 금융위기, 코로나와 같은 모든 영역에 지대한 영향을 미치는 사건이 발생한다면 데이터가 가지고 있는 구조는 변화할 것입니다. 

따라서 지금부터는, 이러한 구조 변화를 Detecting 하는 것과, 구조 변화가 일어난 시점을 감지했다면 구조 변화를 일으킨 사건이 어떻게 우리가 관심있어하는 영역에 얼마나 영향을 미쳤는지를 분석해보겠습니다.

먼저 이번 포스팅에서는 Break Point, 즉 변화가 일어난 구간을 어떻게 감지할 것인가에 대해 통계적 방법을 적용하여 분석해보도록 하겠습니다.

Break Point를 알아보기 위해서 ADL(Autoregressive Distributed Lag) Model을 아래와 같이 수립했다고 가정해보겠습니다. 여기서 $D_t$는 우리가 가정한 구조적 Break를 나타내며 Break가 일어난 시점 이후에는 1의 값을, 이전에는 0의 값을 가집니다.(예를 들어, Break 시점을 코로나가 발생한 시점으로 생각한다면 발생 후에는 1, 발생 전에는 0으로 처리함을 뜻합니다.

https://www.econometrics-with-r.org/14-8-niib.html

만약 위의 식에서 $\gamma$들이 0이 아니라면 우리가 가정한 Break가 유의한 영향을 가진다고 판단할 수 있을 것입니다.

우리가 만약 Break가 일어난 시점을 정확히 파악할 수 없다면, Break가 일어난 시점에 대해서 검증을 수행해야 합니다. 이때 수행하는 것이 Chow Test이며, 이는 이전에 정리했던 회귀분석에서 특정 독립변수의 계수가 0인지 아닌지를 검정하는 F-test를 활용합니다.(direction-f.tistory.com/50)

Python을 활용하여 해보겠습니다. 여기서 활용한 데이터는 us_macro_quarterly.xlsx입니다.(다운로드는 아래 사이트를 Chorme에 복사 붙여넣기 하면 받을 수 있습니다. http://wps.pearsoned.co.uk/wps/media/objects/16103/16489878/data3eu/us_macro_quarterly.xlsx)

import pandas as pd
import numpy as np
import statsmodels.api as sm
import statsmodels.formula.api as smf
import matplotlib.pyplot as plt
import seaborn as sns
from statsmodels.tsa.arima_model import ARIMA
from statsmodels.stats.anova import anova_lm
import scipy.stats
import os

org_path = ".../time-series"
os.chdir(org_path)

USMacroSWQ = pd.read_excel("us_macro_quarterly.xlsx")
USMacroSWQ.columns = ["Date", "GDPC96", "JAPAN_IP", "PCECTPI", "GS10", "GS1", "TB3MS", "UNRATE", "EXUSUK", "CPIAUCSL"] 


### pd.DataFrame.from_records(USMacroSWQ["Date"].str.split(":"), columns=["year","quarter"]) (Unlist method in pandas)
USMacroSWQ["Date"]=USMacroSWQ["Date"].str.split(":").apply(lambda x: ",".join(map(str,x)))
USMacroSWQ["Date"]=USMacroSWQ["Date"].str.replace(",0","Q")
USMacroSWQ.Date = pd.to_datetime(USMacroSWQ.Date).dt.to_period("Q")
USMacroSWQ.set_index("Date", inplace = True)

USMacroSWQ["GDP"]=USMacroSWQ["GDPC96"]
USMacroSWQ["GDPGrowth"] =np.append(np.nan, 400*np.log(USMacroSWQ["GDP"][1:].values/USMacroSWQ["GDP"][:-1].values))

USMacroSWQ["GDPGrowth"][1:].plot()
plt.title("U.S Real GDP Growth Rates")
plt.show()

USMacroSWQ["TSpread"]=USMacroSWQ["TB10YS"]=USMacroSWQ["TB3MS"]

## Intervention model, Breaks
USMacroSWQ["GDPGrowth_lag1"] = USMacroSWQ["GDPGrowth"].shift(1)
USMacroSWQ["GDPGrowth_lag2"]  = USMacroSWQ["GDPGrowth"].shift(2)

USMacroSWQ["TSpread_lag1"] = USMacroSWQ["TSpread"].shift(1)
USMacroSWQ["TSpread_lag2"]  = USMacroSWQ["TSpread"].shift(2)

데이터를 Loading 하고 Break가 일어날만한 후보군을 추출합니다. 해당 Break Point를 하나씩 대입해보면서 Unrestriced 모델과 Restriced 모델의 F-test statistic을 저장하고, F-statistic이 가장 큰 시점을 Break Point로 결정하게 됩니다. F-statstic이 크다는 것은 해당 Break point가 가장 큰 설명력을 가진다는 것입니다. 

우리가 추정하고자 하는 Unrestriced Model(Full Model)은 아래와 같습니다.

USMacroSWQ_1962 = USMacroSWQ.loc[(USMacroSWQ.index > "1961Q4") & (USMacroSWQ.index<"2013Q1") ].copy()
Candidate = USMacroSWQ.loc[(USMacroSWQ.index > "1980Q1")&(USMacroSWQ.index < "2010Q1")].index

F_stat ={}
for i in Candidate:   
    
    print(i)

    USMacroSWQ_1962["Intervention"] = np.where(USMacroSWQ_1962.index >= i, 1,0)
    mod_unrestriced=smf.ols("GDPGrowth~GDPGrowth_lag1+GDPGrowth_lag2+TSpread_lag1+TSpread_lag2+Intervention+Intervention*TSpread_lag1+Intervention*TSpread_lag2", data=USMacroSWQ_1962).fit()       
    mod_restriced=smf.ols("GDPGrowth~GDPGrowth_lag1+GDPGrowth_lag2+TSpread_lag1+TSpread_lag2", data=USMacroSWQ_1962).fit()    
    
        
    anovaResults = anova_lm(mod_restriced, mod_unrestriced)
    chow = anovaResults.F[1]
    keys =str(i)
    F_stat[keys]=chow

max(F_stat, key = F_stat.get) ## 1980Q4

결과를 바탕으로 1980 Q4를 Break Point로 선정할 수 있습니다.

반응형