Dickey-Fuller 検定
注目する時系列データに自己回帰モデルを適用するとき、それが単位根を持つかどうかを調べる検定。
理論
時系列 $r_t$ に対し、一次の自己回帰モデル $\mathrm{AR}(1)$ を適用する。
\[r_t = \phi_0 + \phi_1 r_{t-1} + \varepsilon_t \tag{1}\]両辺から $r_{t-1}$ を引いて $\Delta r_t = r_t - r_{t-1}$ と置くと、
\[\Delta r_t = \phi_0 + (\phi_1-1) r_{t-1} + \varepsilon_t \tag{2}\]- 帰無仮説 $H_0$:時系列 $r_t$ が単位根を持つ($\phi_1 = 1$)
-
対立仮説 $H_1$:時系列 $r_t$ が単位根を持たず($ \phi_1 < 1$)、弱定常である
(ToDo:検定統計量と分布について記載 → 分かりやすい分布による検定はできない??)
ADF 検定
Dickey-Fuller 検定の拡張。
実験
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.tsa.stattools import adfuller
def generate(phi0, phi1, sigma, n):
es = np.random.normal(size=n-1)
r = [0.0 if phi1==1.0 else phi0/(1.0-phi1)] # 定常な AR(1) モデルの期待値を初期値に設定
for e in es:
r.append(phi0 + phi1*r[-1] + e)
return r
def my_dftest(r):
dftest = adfuller(r)
print('ADF Statistic : %f' % dftest[0])
print('p-value : %f' % dftest[1])
print('Critical values :')
for k, v in dftest[4].items():
print('\t', k, v)
def func(phi0, phi1, sigma, n):
r = generate(phi0=phi0, phi1=phi1, sigma=sigma, n=n)
my_dftest(r)
plt.plot(range(n), r)
plt.title(r'$\phi_0={}, \phi_1={}, \sigma={}$'.format(phi0, phi1, sigma))
plt.show()
func(phi0=1, phi1=0.7, sigma=0.5, n=300)
"""
ADF Statistic : -6.710218
p-value : 0.000000
Critical values :
1% -3.4524113009049935
5% -2.8712554127251764
10% -2.571946570731871
"""
func(phi0=1, phi1=0.9, sigma=0.5, n=300)
"""
ADF Statistic : -3.672402
p-value : 0.004519
Critical values :
1% -3.4524113009049935
5% -2.8712554127251764
10% -2.571946570731871
"""
func(phi0=1, phi1=0.99, sigma=0.5, n=300)
"""
ADF Statistic : -1.095170
p-value : 0.716994
Critical values :
1% -3.4524113009049935
5% -2.8712554127251764
10% -2.571946570731871
"""
func(phi0=1, phi1=1.0, sigma=0.5, n=300)
"""
ADF Statistic : -0.079003
p-value : 0.951490
Critical values :
1% -3.4525611751768914
5% -2.87132117782556
10% -2.5719816428028888
"""
$p = 0.000000$ |
$p = 0.004519$ |
---|---|
$p = 0.716994$ |
$p = 0.951490$ |