Quantile Vector Autoregression: estimation, Granger causality, forecasting, and impulse responses
Project description
QVAR — Quantile Vector Autoregression
A comprehensive Python library for Quantile Vector Autoregression: estimation, Granger causality testing with structural break detection, forecasting, stress testing, impulse response analysis, and publication-quality visualization.
Author: Dr. Merwan Roudane • Email: merwanroudane920@gmail.com
📚 Theoretical Foundations
This library implements methods from six key research papers:
| Paper | Method | Module |
|---|---|---|
| Chavleishvili & Manganelli (2019) ECB WP 2330 | QVAR estimation, forecasting, stress testing | core, forecasting |
| Mayer, Wied & Troster (2025) Journal of Econometrics | Quantile Granger causality under instability | granger |
| Carboni et al. (2024) ECB WP 3171 | VAR-QR Growth-at-Risk | varqr |
| Surprenant (2025) Bank of Canada SWP | QVAR forecast evaluation | evaluation |
| White, Kim & Manganelli (2015) J. Econometrics | MVMQ-CAViaR, QIRF foundations | irf |
| Ando, Hoshino & Tsay (2026) arXiv | Non-crossing QVAR (SQVAR) | Phase 2 |
🚀 Installation
pip install qvar
Or install from source:
git clone https://github.com/merwanroudane/QVAR.git
cd QVAR
pip install -e .
📖 Quick Start
QVAR Estimation
import pandas as pd
from qvar import QuantileVAR
# Prepare data
data = pd.DataFrame({'Y1': y1_series, 'Y2': y2_series})
# Estimate QVAR(1) at multiple quantiles
model = QuantileVAR(lags=1, recursive=True)
results = model.fit(data, taus=[0.05, 0.25, 0.50, 0.75, 0.95])
# View publication-quality coefficient table
from qvar.tables import format_qvar_summary
print(format_qvar_summary(results))
Quantile Granger Causality
from qvar import QuantileGrangerCausality
# Test: does Z Granger-cause Y in quantiles?
gc = QuantileGrangerCausality(lags=1, n_bootstrap=499)
results = gc.test(y=dep, z=cause, detect_regimes=True)
print(results.summary())
# Visualize CUSUM process and detected regimes
from qvar.plotting import plot_cusum_process, plot_regime_gc
plot_cusum_process(results, process_type="exp")
plot_regime_gc(results, dep_name="GDP", cause_name="FinStress")
Growth-at-Risk (VAR-QR)
from qvar import VARQR
model = VARQR(var_lags=2, qr_lags=1, taus=[0.10, 0.50, 0.90])
results = model.fit(data)
# Time-varying conditional variance
sigma_t = results.conditional_variance()
# Simulate forecasts
fc = model.simulate_forecast(results, horizon=12)
Quantile Impulse Responses
from qvar import QuantileIRF
qirf = QuantileIRF(results)
irf = qirf.compute(shock_var="WTI", horizon=20, tau_path=[0.10]*20)
irf_multi = qirf.compute_across_quantiles(
shock_var="WTI", taus_to_compare=[0.10, 0.50, 0.90]
)
from qvar.plotting import plot_qirf_fan, plot_qirf_across_quantiles
plot_qirf_fan(irf, response_var="GDP")
plot_qirf_across_quantiles(irf_multi, response_var="GDP")
Forecast Evaluation
from qvar.evaluation import qw_crps, diebold_mariano_test, coverage_test
scores_qvar = qw_crps(qvar_forecasts, actual, weight_fn="tails")
scores_var = qw_crps(var_forecasts, actual, weight_fn="tails")
dm = diebold_mariano_test(scores_qvar, scores_var)
cov = coverage_test(lower_q, upper_q, actual, nominal_coverage=0.90)
🎨 Visualizations
The library produces beautiful, publication-ready charts with a curated color palette:
- Coefficient heatmaps across quantiles
- CUSUM process with structural break markers
- Regime timelines for Granger causality
- Fan chart forecasts with confidence bands
- Quantile IRFs — single and multi-quantile comparison
- Growth-at-Risk plots with tail risk markers
📊 Publication Tables
All output is formatted for direct inclusion in academic papers:
from qvar.tables import format_results_table, format_granger_table
# LaTeX output
table = format_results_table(df, fmt="latex", title="Table 1: QVAR Coefficients")
# Console output with significance stars
table = format_granger_table(results_list, pairs, lags)
📁 Examples
| Example | Description |
|---|---|
example_qvar_basic.py |
QVAR estimation, IRFs, forecasting, stress testing |
example_granger_causality.py |
Quantile GC test replicating Mayer et al. (2025) |
example_growth_at_risk.py |
VAR-QR model for Growth-at-Risk |
example_forecast_evaluation.py |
QVAR vs VAR-N comparison with DM tests |
Run any example:
python examples/example_qvar_basic.py
🔧 Dependencies
numpy >= 1.21pandas >= 1.3scipy >= 1.7statsmodels >= 0.13matplotlib >= 3.5seaborn >= 0.12tabulate >= 0.9
📝 References
- Chavleishvili, S. and Manganelli, S. (2019). Forecasting and Stress Testing with Quantile Vector Autoregression. ECB Working Paper 2330.
- Mayer, A., Wied, D. and Troster, B. (2025). Quantile Granger Causality in the Presence of Instability. Journal of Econometrics, 249.
- Carboni, G., Fonseca, L., Fornari, F. and Urrutia, A. (2024). Structural Drivers of Growth at Risk. ECB Working Paper 3171.
- Surprenant, S. (2025). Quantile VARs and Macroeconomic Risk Forecasting. Bank of Canada Staff Working Paper 2025-4.
- White, H., Kim, T.-H. and Manganelli, S. (2015). VAR for VaR: Measuring Tail Dependence Using Multivariate Regression Quantiles. Journal of Econometrics, 187.
- Ando, T., Hoshino, T. and Tsay, R. (2026). Quantile Vector Autoregression without Crossing. arXiv:2601.04663v3.
📄 License
MIT License. See LICENSE for details.
🤝 Contributing
Contributions welcome! Please open an issue or pull request at GitHub.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file qvar_model-0.1.0.tar.gz.
File metadata
- Download URL: qvar_model-0.1.0.tar.gz
- Upload date:
- Size: 32.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2c582034f93d04fe941c7c6ad0aef6d41563ca5b177291a8e6dbdcaba5d05e04
|
|
| MD5 |
6852bb4c5140b81d19fb99e7186de8f3
|
|
| BLAKE2b-256 |
5d122b3b4dfb50f158a3ac936c6716a47a9018eba99e7acc073f67a48b7d04ce
|
File details
Details for the file qvar_model-0.1.0-py3-none-any.whl.
File metadata
- Download URL: qvar_model-0.1.0-py3-none-any.whl
- Upload date:
- Size: 34.3 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.11.0
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7b4e750959350855807759794a6f67cb28afab8b79ea31d3b4cf16f0530c3360
|
|
| MD5 |
3d099219dae300fa3fefcdd94b8dfa70
|
|
| BLAKE2b-256 |
93591e286789bc4e713237cd3d21bddfb647695e40e66a4b5b61cba23668f2fe
|