VECM / Johansen
Vector error-correction models and Johansen rank tests.
- Reduced-rank regression (Johansen / Lütkepohl)
- Eight deterministic specifications, including JHJ variants
- MacKinnon–Haug–Michelis (1999) p-values and critical values
- Native IRF, FEVD, Granger, JB, whiteness, diagnostics and forecasts
README: makystats/vecm/README.md ·
Full technical guide: DOCUMENTATION.md
Parameters (makystats API — not statsmodels names)
| Parameter | Values | Role |
|---|---|---|
test_case | '1'…'5' | Deterministic specification of the rank test |
det_case | '1', '2', '3a', '3b', '4a', '4b', '5a', '5b' | VECM estimation (default '3a') |
k_ar_diff | int (≥ 0) | Lags in differences (= levels VAR order − 1) |
coint_rank | int | Cointegration rank r |
test_case | Meaning |
|---|---|
'1' | No deterministic terms |
'2' | Restricted constant (inside cointegration) |
'3' | Unrestricted constant |
'4' | Unrestricted constant + restricted trend |
'5' | Unrestricted constant and trend |
det_case | Meaning |
|---|---|
3a / 4a / 5a | JHJ dual deterministic terms |
3b / 4b / 5b | Classical single-term counterparts |
Imports
from makystats import VECM, select_coint_rank
from makystats.vecm import (
VECMModel, JohansenTest, vecm, VECM,
select_coint_rank, summarize_johansen,
information_criteria_table, mhm_pvalue, mhm_critical,
)
At package root only VECM is exported (not vecm), so the submodule stays importable.
Minimal workflow
from makystats import VECM, select_coint_rank, select_var_order
from makystats.vecm import summarize_johansen, information_criteria_table
# data: DataFrame or ndarray (T × n) in LEVELS
order = select_var_order(data, maxlags=4, criterion="bic")
k_ar_diff = order.best - 1
summarize_johansen(data, k_ar_diff=k_ar_diff, signif=0.05)
rank = select_coint_rank(data, k_ar_diff=k_ar_diff, test_case="3")
rank.summary()
model = VECM(data, k_ar_diff=k_ar_diff, coint_rank=max(rank.rank, 1),
det_case="3a").fit()
model.summary()
print(model.forecast(steps=5))
print(model.forecast(steps=5, variables="DTS"))
print(model.forecast(steps=5, conf_int=True, method="bootstrap",
sim_reps=1000, variables=["DTS", "FMG"]))
model.plot_forecast(steps=8, method="bootstrap", sim_reps=1000, variables="DTS")
model.fitted_values(level=True)
model.irf(10).plot()
model.plot_diagnostics()
information_criteria_table(data, k_ar_diff=k_ar_diff)
Rank: p-values vs critical values
| Function | Rule |
|---|---|
select_coint_rank | Continuous MHM p-values |
summarize_johansen | Tabulated MHM critical values |
Near the boundary the displayed ranks may differ by one unit.
Forecast confidence intervals
With conf_int=True, parameters are held fixed (innovation uncertainty only):
method | Construction |
|---|---|
analytic (default) | Lütkepohl MSE via MA representation + normal quantiles |
bootstrap | Resample residual rows; empirical percentiles |
gaussian | Draws from N(0, Σu); empirical percentiles |
MHM tables (
mhm_tables.npz) ship inside the package.
Deeper formulas and JHJ details: DOCUMENTATION.md.