为什么我在 adfuller 测试中得到 p 值 0.00000?
Why am I getting p-value 0.00000 in adfuller test?
我正在使用 ARIMA。为了使数据静止,我使用 log 转换数据,然后使用 shift 减去值。当我再次使用滚动均值和 adfuller 测试进行测试时。我得到的 p 值为 0.0000 为什么会这样?
我的代码:
import numpy as np
import pandas as pd
from statsmodels.tsa.stattools import adfuller
import matplotlib.pyplot as plt
df =
Date open high low close adjclose Volume
2010-06-30 5.158000 6.084000 4.660000 4.766000 4.766000 85935500
2010-07-01 5.000000 5.184000 4.054000 4.392000 4.392000 41094000
df['Date']=pd.to_datetime(df['Date'], infer_datetime_format=True)
df=df.set_index(['Date'])
def test_ad(values):
mvm = values.rolling(window=12).mean()
mvstd = values.rolling(window=12).std()
orig = plt.plot(values,color='blue',label='org')
mean = plt.plot(mvm,color='red',label='mvm')
std=plt.plot(mvstd,color='black',label='mvstd')
plt.legend(loc='best')
plt.show(block=False)
result=adfuller(values)
print('ADF Statistic: %f' % result[0])
print('p-value: %f' % result[1])
print('Critical Values:')
#labels = ['ADF Test Statistic','p-value','#Lags Used','Number of Observations Used']
for key, value in result[4].items():
print('\t%s: %.3f' % (key, value))
if result[1] <= 0.05:
print("Data is stationary")
else:
print("non-stationary ")
test_ad(df['Close'])
给出:
ADF Statistic: 6.450459
p-value: 1.000000
Critical Values:
1%: -3.433
5%: -2.863
10%: -2.567
df['log']=np.log(df["Close"])
df['close']=df['log']-df['log'].shift()
#df['close']=df['log'].diff()
test_ad(df['close'].dropna())
给出
ADF Statistic: -50.361617
p-value: 0.000000
Critical Values:
1%: -3.433
5%: -2.863
10%: -2.567
该图看起来很稳定,而且如上所示,临界值也得到满足。
您可以自己看到,您的 ADF 统计量远小于 1% 的临界值,因此您的 p 非常小。
令人困惑的是您正在使用 %f
来打印出此值,默认情况下(即没有指定精度,例如 %.2f
包含 2 位小数或 %.10f
包括 10 位小数)只包括点后 6 位小数。
如果您要打印完整的值(例如 print('p-value: %s' % result[1])
,您将 p 值视为字符串(因此无需指定精度),或者在 f 字符串中 print(f'p-value: {result[1]}')
),你会看到你的 p 值实际上大于 0(尽管仍然很小)。
我正在使用 ARIMA。为了使数据静止,我使用 log 转换数据,然后使用 shift 减去值。当我再次使用滚动均值和 adfuller 测试进行测试时。我得到的 p 值为 0.0000 为什么会这样?
我的代码:
import numpy as np
import pandas as pd
from statsmodels.tsa.stattools import adfuller
import matplotlib.pyplot as plt
df =
Date open high low close adjclose Volume
2010-06-30 5.158000 6.084000 4.660000 4.766000 4.766000 85935500
2010-07-01 5.000000 5.184000 4.054000 4.392000 4.392000 41094000
df['Date']=pd.to_datetime(df['Date'], infer_datetime_format=True)
df=df.set_index(['Date'])
def test_ad(values):
mvm = values.rolling(window=12).mean()
mvstd = values.rolling(window=12).std()
orig = plt.plot(values,color='blue',label='org')
mean = plt.plot(mvm,color='red',label='mvm')
std=plt.plot(mvstd,color='black',label='mvstd')
plt.legend(loc='best')
plt.show(block=False)
result=adfuller(values)
print('ADF Statistic: %f' % result[0])
print('p-value: %f' % result[1])
print('Critical Values:')
#labels = ['ADF Test Statistic','p-value','#Lags Used','Number of Observations Used']
for key, value in result[4].items():
print('\t%s: %.3f' % (key, value))
if result[1] <= 0.05:
print("Data is stationary")
else:
print("non-stationary ")
test_ad(df['Close'])
给出:
ADF Statistic: 6.450459
p-value: 1.000000
Critical Values:
1%: -3.433
5%: -2.863
10%: -2.567
df['log']=np.log(df["Close"])
df['close']=df['log']-df['log'].shift()
#df['close']=df['log'].diff()
test_ad(df['close'].dropna())
给出
ADF Statistic: -50.361617
p-value: 0.000000
Critical Values:
1%: -3.433
5%: -2.863
10%: -2.567
该图看起来很稳定,而且如上所示,临界值也得到满足。
您可以自己看到,您的 ADF 统计量远小于 1% 的临界值,因此您的 p 非常小。
令人困惑的是您正在使用 %f
来打印出此值,默认情况下(即没有指定精度,例如 %.2f
包含 2 位小数或 %.10f
包括 10 位小数)只包括点后 6 位小数。
如果您要打印完整的值(例如 print('p-value: %s' % result[1])
,您将 p 值视为字符串(因此无需指定精度),或者在 f 字符串中 print(f'p-value: {result[1]}')
),你会看到你的 p 值实际上大于 0(尽管仍然很小)。