The Augmented Dickey—Fuller (ADF) Test for Stationarity

July 04, 2024

Stationarity is a fundamental concept in statistical analysis and machine learning, particularly when dealing with time series data. In simple terms, a time series is stationary if its statistical properties, such as mean and variance, remain constant over time. This constancy is crucial because many statistical models assume that the underlying data generating process does not change over time, simplifying analysis and prediction.

2024 07 04

In real-world applications, such as finance, time series data often exhibit trends and varying volatility, making them non-stationary. Detecting and transforming non-stationary data into stationary data is therefore a critical step in time series analysis. One powerful tool for this purpose is the Augmented Dickey—Fuller (ADF) test.

What is the Augmented Dickey—Fuller (ADF) Test?

The ADF test is a statistical test used to determine whether a given time series is stationary or non-stationary. Specifically, it tests for the presence of a unit root in the data, which is indicative of non-stationarity. A unit root means that the time series has a stochastic trend, implying that its statistical properties change over time.

Hypothesis Testing in the ADF Test

The ADF test uses hypothesis testing to make inferences about the stationarity of a time series. Here’s a breakdown of the hypotheses involved:

  • Null Hypothesis (H0): The time series has a unit root, meaning it is non-stationary.
  • Alternative Hypothesis (H1): The time series does not have a unit root, meaning it is stationary.

To reject the null hypothesis and conclude that the time series is stationary, the p-value obtained from the ADF test must be less than a chosen significance level (commonly 5%).

Performing the ADF Test

Here’s how you can perform the ADF test in Python using the statsmodels library:

import pandas as pd
from statsmodels.tsa.stattools import adfuller

# Example time series data
data = pd.Series([your_time_series_data])

# Perform the ADF test
result = adfuller(data)

# Extract and display the results
adf_statistic = result[0]
p_value = result[1]
used_lag = result[2]
n_obs = result[3]
critical_values = result[4]

print(f'ADF Statistic: {adf_statistic}')
print(f'p-value: {p_value}')
print(f'Used Lag: {used_lag}')
print(f'Number of Observations: {n_obs}')
print('Critical Values:')
for key, value in critical_values.items():
    print(f'   {key}: {value}')

Interpreting the Results

  • ADF Statistic: A negative value, where more negative values indicate stronger evidence against the null hypothesis.
  • p-value: If the p-value is less than the significance level (e.g., 0.05), you reject the null hypothesis, indicating that the time series is stationary.
  • Critical Values: These values help to determine the threshold at different confidence levels (1%, 5%, 10%) to compare against the ADF statistic.

Example and Conclusion

Consider a financial time series data, such as daily stock prices. Applying the ADF test might reveal a p-value greater than 0.05, indicating non-stationarity. In such cases, data transformations like differencing or detrending might be necessary to achieve stationarity before applying further statistical models.

In summary, the ADF test is an essential tool for diagnosing the stationarity of a time series. By understanding and applying this test, analysts can better prepare their data for modeling, ensuring the validity and reliability of their results.

Profile picture

Victor Leung, who blog about business, technology and personal development. Happy to connect on LinkedIn