Error Correction Models
Table of Contents
We'll get the data from the FRED API using the quantmod R package, and then we'll estimate error-correction models in both Python and R. For some reason the python package to access FRED (fredapi) requires an API key whereas quantmod does not.
library(quantmod) library(tseries) library(EIAdata)
1. 1 vs 2 Month Crude Oil Futures
key <- source("~/eia_key")$value one_month <- getEIA('PET.RCLC1.W', key = key) two_month <- getEIA('PET.RCLC2.W', key = key)
oil_data <- merge.xts(one_month, two_month, join="inner") oil_spurious_reg <- lm(I(log(oil_data$PET.RCLC2.W)) ~ I(log(oil_data$PET.RCLC1.W))) summary(oil_spurious_reg)
Call:
lm(formula = I(log(oil_data$PET.RCLC2.W)) ~ I(log(oil_data$PET.RCLC1.W)))
Residuals:
Min 1Q Median 3Q Max
-0.12913 -0.01096 0.00131 0.00853 1.58039
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 0.002357 0.005397 0.437 0.662
I(log(oil_data$PET.RCLC1.W)) 0.999474 0.001473 678.355 <2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
Residual standard error: 0.04251 on 1965 degrees of freedom
Multiple R-squared: 0.9957, Adjusted R-squared: 0.9957
F-statistic: 4.602e+05 on 1 and 1965 DF, p-value: < 2.2e-16
adf.test(oil_spurious_reg$resid)
Augmented Dickey-Fuller Test data: oil_spurious_reg$resid Dickey-Fuller = -9.0417, Lag order = 12, p-value = 0.01 alternative hypothesis: stationary Warning message: In adf.test(oil_spurious_reg$resid) : p-value smaller than printed p-value
We can reject the null of a unit root in the residuals, which is evidence that the two series are cointegrated.