Johansen Cointegration
Calculate the Johansen test for cointegration among every ticker in the Toolkit instance.
The Engle-Granger test only handles two assets and imposes an arbitrary normalization (which asset is “dependent”). Johansen’s test generalizes this to N >= 2 assets at once by testing the rank of the long-run coefficient matrix in a Vector Error Correction Model (VECM) fit to all assets jointly. The estimated rank equals the number of independent cointegrating (long-run equilibrium) relationships among the assets: rank 0 means none of them are cointegrated, rank N means the whole system is already stationary in levels, and a rank in between means that many independent stationary combinations exist among the N individually non-stationary price series.
For more information about the method, see the following papers:
- Johansen, S. (1988). “Statistical Analysis of Cointegration Vectors.” Journal of Economic Dynamics and Control, 12(2-3), 231-254.
- Johansen, S. (1991). “Estimation and Hypothesis Testing of Cointegration Vectors in Gaussian Vector Autoregressive Models.” Econometrica, 59(6), 1551-1580.
Also known as: Johansen test, Johansen procedure, VECM rank test.
No programming experience? With the Finance Toolkit MCP server, AI assistants such as Claude and ChatGPT can calculate the Johansen Cointegration for you. Just ask in plain English.
Calculate the Johansen Cointegration in Python
The Johansen Cointegration is available in the Econometrics module of the open-source Finance Toolkit. Install it with:
pip install financetoolkit -U
Then call get_johansen_cointegration as shown below.
from financetoolkit import Toolkit
toolkit = Toolkit(["AAPL", "MSFT"], api_key="FINANCIAL_MODELING_PREP_KEY")
toolkit.econometrics.get_johansen_cointegration(period="quarterly")
Which returns:
(showing the trace-statistic columns; the max-eigenvalue-statistic columns follow the same pattern)
| Eigenvalue | Trace Statistic | Trace Critical Value 95% | Reject (Trace, 5%) | |
|---|---|---|---|---|
| r <= 0 | 0.5653 | 14.1993 | 15.4943 | False |
| r <= 1 | 0.3674 | 5.0363 | 3.8415 | True |
Parameters
get_johansen_cointegration accepts the following parameters:
- period (str, optional): The data frequency (daily, weekly, monthly, quarterly, or yearly). Defaults to “daily”.
- column (str, optional): The historical data column to test. Defaults to “Adj Close”.
- det_order (int, optional): Which deterministic term to include: -1 (none), 0 (a constant, restricted to lie in the cointegrating relation) or 1 (a linear trend restricted to the cointegrating relation, alongside an unrestricted constant in the short-run dynamics). Defaults to 0.
- k_ar_diff (int, optional): The number of lagged first differences to include as short-run dynamics. Defaults to 1.
- include_benchmark (bool, optional): Whether to include “Benchmark” among the tickers tested jointly. Defaults to False.
- rounding (int | None, optional): The number of decimals to round the results to. Defaults to None.
Related Cointegration & Causality
The Econometrics module page introduces the module, and the sidebar lists all of its functions.