Python library for cointegration analysis.
- Carry out cointegration test
- Evaluate spread between cointegrated time-series
- Generate cointegrated time-series artificially
- Based on scikit-learn API
$ pip install cointanalysis
See Hamilton's book.
Let us see how the main class CointAnalysis
works using two ETFs, HYG and BKLN, as examples.
Since they are both connected with liabilities of low-rated companies, these prices behave quite similarly.
The method test
carries out a cointegration test.
The following code gives p-value for null-hypothesis that there is no cointegration.
from cointanalysis import CointAnalysis
hyg = ... # Fetch historical price of high-yield bond ETF
bkln = ... # Fetch historical price of bank loan ETF
X = np.array([hyg, bkln]).T
coint = CointAnalysis()
coint.test(X)
coint.pvalue_
# 0.0055
The test has rejected the null-hypothesis by the p-value of 0.55%, which implies cointegration.
The method fit
finds the cointegration equation.
coint = CointAnalysis().fit(X)
coint.coef_
# np.array([-0.18 1.])
coint.mean_
# 6.97
coint.std_
# 0.15
This means that spread "-0.18 HYG + BKLN" has a mean 6.97 and a standard deviation of 0.15.
In fact, the prices adjusted with these parameters clarifies the similarities of these ETFs:
The time-series of spread is obtained by applying the method transform
subsequently.
The mean and the standard deviation are automatically adjusted (unless you pass parameters asking not to).
spread = coint.transform(X)
# returns (-0.18 * hyg + 1. * bkln - 7.00) / 0.15
spread = coint.transform(X, adjust_mean=False, adjust_std=False)
# returns -0.18 * hyg + 1. * bkln
The method fit_transform
carries out fit
and transform
at once.
spread = coint.fit_transform(X)
The result looks like this: