ARモデル,Dickey-Fuller検定
やること
- (確率変数列が定常性を満たすとして)次数1の自己回帰モデル(ARモデル)を作成してみる。
- 単位根を有するか否かの検定(Dickey-Fuller検定)
参考サイト
コード
次数1の自己回帰モデル(ARモデル)
まず作成
とりあえず実装しながらARモデルを理解してみる。自己回帰モデルのパラメータとして以下の3つを設定。
また、いま定常性を有することを仮定しているので、自己回帰係数は絶対値1より小さくすることに注意。(今回は0.8)
- 切片(1.8)
- 自己回帰係数(0.8)
- イノベーションの分散(0.52)
とりあえず長さ(データ数)は260とする(1年の営業日数)
# make sample data params = {'intercept': 1.8\ ,'coefficient': 0.8\ ,'sigma': 0.5\ ,'length': 260} mu = params['intercept'] / (1.0 - params['coefficient']) ar1_data = [] first_term = mu + np.random.normal(0, params['sigma']) ar1_data.append(first_term) for i in range(1, params['length']): A = params['coefficient'] * ar1_data[i - 1] B = np.random.normal(0, params['sigma']) i_term = params['intercept'] + A + B ar1_data.append(i_term) # visualize sns.set() sns.lineplot(data = pd.DataFrame(ar1_data)) # sns.lineplot(data = ar1_data) # NG
とりあえずこんな過程が得られた。
コレログラムもつくってみる
import statsmodels.graphics.api as smg from statsmodels.graphics.tsaplots import plot_acf from statsmodels.graphics.tsaplots import plot_pacf plot_acf(ar1_data, lags = 29) plt.show() plot_pacf(ar1_data, lags = 29) plt.show()
推移律を考慮したバージョンは以下 これをみるとラグ1だなあと。
ちなみに、初項first_term
が必要だったので、過程の平均値mu
にホワイトノイズを追加しておいた。ここは正直てきとう(過程の平均値使ってるからまあいいでしょ、くらい。)
作成したやつを、自己回帰モデルに当てはまるか推定してみる
作ったけど、じゃあこれを自己回帰モデルに当てはまるか再度推定してみたら、本当にどれくらいパラメータを正しく推定できるの?という検証。
# ARモデルへつっこむ model = sm.tsa.AR(ar1_data) # モデルの最適次数選択 degree = model.select_order(maxlag = 6, ic = 'aic') print(degree) # 推定 result = model.fit(maxlag = degree)
# 比較 print('----------切片---------') print('設定パラメータ', params['intercept']) print('推定パラメータ', result.params[0]) print('----------自己回帰係数---------') print('設定パラメータ', params['coefficient']) print('推定パラメータ', result.params[1]) print('----------イノベーション分散---------') print('設定パラメータ', params['sigma'] ** 2) print('推定パラメータ', result.sigma2)
まあ悪くないんでしょうか。よくわからんけど。
Dickey-Fuller検定
帰無仮説は「単位根が存在する」。参考サイトを本当にそのままコピペした。ちなみに、ADF検定というものにした。そっちのが、対象過程の次数を1と仮定せず検定できる。
data = ar1_data result = sm.tsa.stattools.adfuller(data) print('value = {:.4f}'.format(result[0])) print('p-value = {:.4}'.format(result[1]))
有意水準1%で帰無仮説棄却。よって、「単位根をもたない」(この時点では、定常性を有するとは必ずしもいえない)。
まあグラフの形状的に、定常性をもつといっていいでしょう、って感じ。(自己回帰係数の絶対値は1より小さいでしょう)