makystats GitHub PyPI FR · EN

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)

ParameterValuesRole
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_diffint (≥ 0)Lags in differences (= levels VAR order − 1)
coint_rankintCointegration rank r
test_caseMeaning
'1'No deterministic terms
'2'Restricted constant (inside cointegration)
'3'Unrestricted constant
'4'Unrestricted constant + restricted trend
'5'Unrestricted constant and trend
det_caseMeaning
3a / 4a / 5aJHJ dual deterministic terms
3b / 4b / 5bClassical 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

FunctionRule
select_coint_rankContinuous MHM p-values
summarize_johansenTabulated 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):

methodConstruction
analytic (default)Lütkepohl MSE via MA representation + normal quantiles
bootstrapResample residual rows; empirical percentiles
gaussianDraws from N(0, Σu); empirical percentiles
MHM tables (mhm_tables.npz) ship inside the package. Deeper formulas and JHJ details: DOCUMENTATION.md.