Skip to content

Bayesian Vector Autoregression: Forecasting Economic Growth Without Losing the Variables

Economic variables rarely move independently.

A decline in building permits may eventually affect manufacturing activity. Tighter financial conditions may influence stock markets and investment. Changes in employment conditions may both affect and respond to broader economic activity.

This creates an important forecasting problem:

How can we model many economic variables together without creating an enormous and unstable model?

One solution is a Bayesian Vector Autoregression, commonly called a BVAR.

In this article, we will build an intuitive understanding of BVAR using the same practical problem:

Can several leading economic indicators help us forecast future ISM Manufacturing PMI?


Our Forecasting Problem

Suppose our target is the ISM Manufacturing PMI.

We want to forecast where PMI might be several months into the future using indicators such as:

VariableEconomic intuition
ISM Manufacturing New OrdersForward-looking information about manufacturing demand
10Y–2Y Treasury Term SpreadExpectations about future economic conditions
Initial Jobless ClaimsHigh-frequency labor-market signal
S&P 500Financial markets incorporate expectations about future conditions
Chicago Fed NFCIMeasures financial conditions and financial stress
Building PermitsForward-looking signal for housing and construction
Copper PriceIndicator of industrial and global demand

With a normal regression, we might write:PMIt+6=β0+β1Coppert+β2Claimst+β3NFCIt+⋯+ϵtPMI_{t+6} = \beta_0 +\beta_1 Copper_t +\beta_2 Claims_t +\beta_3 NFCI_t +\cdots +\epsilon_t

But this treats PMI as the main variable being explained while the other variables simply act as predictors.

A VAR takes a different approach.

The Core Idea Behind a VAR

A Vector Autoregression (VAR) assumes that several variables evolve together through time.

Instead of having only one dependent variable, every variable in the VAR is treated as endogenous.

Imagine a simplified system containing only:PMI,Copper,ClaimsPMI,\quad Copper,\quad Claims

A VAR might estimate:PMIt=α1+β11PMIt−1+β12Coppert−1+β13Claimst−1+ϵ1,tPMI_t = \alpha_1 + \beta_{11}PMI_{t-1} + \beta_{12}Copper_{t-1} + \beta_{13}Claims_{t-1} + \epsilon_{1,t}

But it also estimates:Coppert=α2+β21PMIt−1+β22Coppert−1+β23Claimst−1+ϵ2,tCopper_t = \alpha_2 + \beta_{21}PMI_{t-1} + \beta_{22}Copper_{t-1} + \beta_{23}Claims_{t-1} + \epsilon_{2,t}

and:Claimst=α3+β31PMIt−1+β32Coppert−1+β33Claimst−1+ϵ3,tClaims_t = \alpha_3 + \beta_{31}PMI_{t-1} + \beta_{32}Copper_{t-1} + \beta_{33}Claims_{t-1} + \epsilon_{3,t}

So the model does not simply ask:

“Does copper help predict PMI?”

It asks something broader:

“How do PMI, copper, claims and the other economic variables dynamically interact with each other through time?”

That is the basic idea behind a VAR.

Why Are Lags Important?

The AR in VAR stands for autoregression.

This means that past observations are used to explain current observations.

For example:PMIt=β1PMIt−1+β2PMIt−2+γ1Coppert−1+γ2Coppert−2+⋯PMI_t = \beta_1 PMI_{t-1} + \beta_2 PMI_{t-2} + \gamma_1 Copper_{t-1} + \gamma_2 Copper_{t-2} +\cdots

This makes sense economically.

A change in financial conditions today may not immediately affect manufacturing.

Instead:NFCIt→Investmentt+1→Orderst+2→PMIt+3NFCI_t \rightarrow Investment_{t+1} \rightarrow Orders_{t+2} \rightarrow PMI_{t+3}

The lag structure allows the model to capture these delayed relationships.

If we use two lags, for example, every equation considers information from the previous two periods.

The Problem with a Normal VAR

VARs have one major weakness:

They become very large very quickly.

Suppose we have eight variables:K=8K=8

and use six monthly lags:p=6p=6

Each equation potentially contains:8×6=488\times6=48

lag coefficients.

And because there are eight equations, the entire system contains roughly:8×48=3848\times48=384

lag coefficients, before even considering intercepts and other parameters.

But macroeconomic datasets are often relatively small. We might have only 15–20 years of monthly observations. Now we are trying to estimate hundreds of relationships from only a few hundred observations.

This creates a serious risk of:Overfitting\boxed{\text{Overfitting}}

The model may explain historical data extremely well while producing poor forecasts.

This is where the Bayesian part becomes useful.

What Does the “Bayesian” Part Actually Do?

A Bayesian VAR is still a VAR.

The difference is that instead of allowing every coefficient to move completely freely, we introduce prior beliefs about what reasonable coefficients should look like.

Before observing the data, we might say:

“Most relationships between these variables probably aren’t extremely large.”

This can be represented conceptually as:βi∼N(0,σ2)\beta_i \sim N(0,\sigma^2)

Instead of freely estimating huge coefficients, the prior encourages coefficients toward zero unless the data provides enough evidence to move them away.

This is called shrinkage.

The easiest way to think about it is:BVAR=VAR+Regularization through Bayesian Priors\boxed{ \text{BVAR} = \text{VAR} + \text{Regularization through Bayesian Priors} }

The prior prevents the model from believing every historical relationship is equally important.

An Intuitive Example of Shrinkage

Suppose an ordinary VAR estimates:PMIt=0.7PMIt−1+1.4Coppert−1−0.9Claimst−1+2.1NFCIt−1+⋯PMI_t = 0.7PMI_{t-1} + 1.4Copper_{t-1} – 0.9Claims_{t-1} + 2.1NFCI_{t-1} +\cdots

Some of these large coefficients may simply result from noise.

A BVAR starts with a prior belief that many coefficients should probably be relatively small.

After combining the prior with the observed data, we might obtain something closer to:PMIt=0.72PMIt−1+0.30Coppert−1−0.21Claimst−1+0.25NFCIt−1+⋯PMI_t = 0.72PMI_{t-1} + 0.30Copper_{t-1} – 0.21Claims_{t-1} + 0.25NFCI_{t-1} +\cdots

The exact values are only illustrative.

The important idea is:

The data can still move coefficients away from zero when there is strong evidence, but weak relationships are shrunk toward zero.

This often produces more stable forecasts.

The Minnesota Prior

One of the most famous priors used with BVARs is the Minnesota Prior.

Its intuition is surprisingly simple. It typically expresses beliefs such as:

A variable’s own recent history is probably important

For example:PMIt≈PMIt−1PMI_t \approx PMI_{t-1}

may be a reasonable starting assumption because macroeconomic variables often exhibit persistence.

Other variables may matter, but we should initially be more skeptical

For example:Coppert−1→PMItCopper_{t-1}\rightarrow PMI_t

is possible, but we do not automatically assume that relationship is large.

Distant lags should generally matter less

We might expect:PMIt−1PMI_{t-1}

to contain more useful information than:PMIt−12PMI_{t-12}

unless the data strongly suggests otherwise.

So the prior introduces economically sensible structure into a model that would otherwise contain hundreds of freely estimated coefficients.

How Does the BVAR Produce a PMI Forecast?

Suppose our system contains:Yt=[PMItNewOrderstTermSpreadtClaimstSP500tNFCItPermitstCoppert]Y_t = \begin{bmatrix} PMI_t\\ NewOrders_t\\ TermSpread_t\\ Claims_t\\ SP500_t\\ NFCI_t\\ Permits_t\\ Copper_t \end{bmatrix}

A VAR with pp lags can be written compactly as:Yt=c+A1Yt−1+A2Yt−2+⋯+ApYt−p+ϵtY_t = c + A_1Y_{t-1} + A_2Y_{t-2} +\cdots+ A_pY_{t-p} + \epsilon_t

Each AA is a matrix containing relationships between the variables.

The BVAR places priors on the coefficients inside these matrices.

Once estimated, forecasting is recursive.

The model predicts the next values:Y^t+1\hat{Y}_{t+1}

and those predictions can then help produce:Y^t+2\hat{Y}_{t+2}

until we reach our desired horizon:PMI^t+6\hat{PMI}_{t+6}

So conceptually:Past Economic System→BVAR→Future Economic System→Future PMI\boxed{ \text{Past Economic System} \rightarrow \text{BVAR} \rightarrow \text{Future Economic System} \rightarrow \text{Future PMI} }

How Do We Interpret a BVAR?

This is particularly important for our application.

Unlike a DFM, the BVAR does not compress all our indicators into a hidden factor.

The original economic variables remain inside the model.

However, interpreting individual coefficients becomes difficult because each variable can appear at several lags and across several equations.

Suppose the PMI equation contains:PMIt=β1Coppert−1+β2Coppert−2+β3Coppert−3+⋯PMI_t = \beta_1Copper_{t-1} +\beta_2Copper_{t-2} +\beta_3Copper_{t-3} +\cdots

Looking at only one copper coefficient does not tell us the complete story.

Instead, VAR-type models are often interpreted using tools such as Impulse Response Functions and Forecast Error Variance Decomposition.

Impulse Response Functions

An Impulse Response Function (IRF) asks:

What happens to PMI over the following months after an unexpected change in one variable?

Suppose copper experiences a positive shock today.

We can examine how the model predicts PMI responds:

Month 0     Copper shock occurs
Month 1     PMI +0.1
Month 2     PMI +0.3
Month 3     PMI +0.5
Month 4     PMI +0.3
Month 5     PMI +0.1
Month 6     Effect disappears

We can plot:Copper Shock→PMI Response Over Time\text{Copper Shock} \rightarrow \text{PMI Response Over Time}

This is much more informative than looking at a single coefficient.

Similarly, we could investigate:NFCI Shock→PMI\text{NFCI Shock} \rightarrow \text{PMI}

or:Jobless Claims Shock→PMI\text{Jobless Claims Shock} \rightarrow \text{PMI}

One important caution is that an IRF should not automatically be interpreted as a causal effect. Its interpretation depends on how shocks are identified and on the assumptions imposed by the model.

Forecast Error Variance Decomposition

Another useful tool is Forecast Error Variance Decomposition (FEVD).

The question is:

How much of the uncertainty in future PMI forecasts is associated with shocks to each variable?

Suppose at a six-month horizon we obtain something like:

ShockShare of PMI Forecast Error Variance
PMI itself42%
New Orders22%
NFCI12%
Jobless Claims9%
Copper7%
Term Spread4%
Building Permits3%
S&P 5001%

These numbers are hypothetical, but the interpretation is useful.

We could say:

“At the six-month horizon, shocks associated with New Orders account for 22% of the model’s PMI forecast error variance.”

Again, this should not automatically be interpreted as saying New Orders causes 22% of PMI movements.

It describes importance within the estimated BVAR and its shock-identification assumptions.

For our project, IRFs and FEVD provide a useful way of understanding how individual economic indicators relate to the PMI forecast.

A Simple Python Example

A production BVAR requires us to specify priors and estimate a posterior distribution. To make the mechanics clear, we can first fit an ordinary VAR using statsmodels, then extend the same system with Bayesian shrinkage.

import pandas as pd
from statsmodels.tsa.api import VAR

variables = [
    "ISM_PMI",
    "new_orders",
    "term_spread",
    "jobless_claims",
    "sp500",
    "nfci",
    "building_permits",
    "copper"
]

data = df[variables].dropna()

model = VAR(data)

results = model.fit(
    maxlags=3,
    ic="aic"
)

print(results.summary())

We can then produce forecasts:

lag_order = results.k_ar

forecast = results.forecast(
    data.values[-lag_order:],
    steps=6
)

forecast = pd.DataFrame(
    forecast,
    columns=variables
)

print(forecast["ISM_PMI"])

This gives us the basic VAR mechanics.

For an actual BVAR, the next step is to place priors on the VAR coefficients and estimate their posterior distributions using a Bayesian implementation such as PyMC or a dedicated BVAR package.

The conceptual structure remains:Yt=c+A1Yt−1+⋯+ApYt−p+ϵtY_t = c + A_1Y_{t-1}+\cdots+A_pY_{t-p}+\epsilon_t

but now:A1,…,ApA_1,\ldots,A_p

are estimated under Bayesian priors rather than completely freely.

Why Bayesian Forecasts Are Different

Another useful feature of Bayesian modeling is that we do not have to think of parameters as single fixed estimates.

Instead, we obtain a posterior distribution.

Conceptually:P(θ∣Data)∝P(Data∣θ)P(θ)P(\theta\mid Data) \propto P(Data\mid\theta) P(\theta)

or simply:Posterior∝Likelihood×Prior\boxed{ Posterior \propto Likelihood \times Prior }

The prior represents our assumptions before observing the data.

The likelihood represents what the observed data tells us.

The posterior combines both.

As a result, instead of saying:

“PMI six months from now will be 51.4”

we can produce a forecast distribution.

For example:PMI^t+6=51.4\hat{PMI}_{t+6}=51.4

with an uncertainty interval around that forecast.

For economic forecasting, understanding this uncertainty can be just as important as the point forecast itself.

Avoiding Look-Ahead Bias

Just like the DFM, a BVAR must be evaluated realistically.

We should not estimate the model using the entire historical dataset and then claim that historical predictions represent true out-of-sample forecasts.

Instead, use an expanding or rolling window:

Train through 2018 → Forecast next 6 months
Train through 2019 → Forecast next 6 months
Train through 2020 → Forecast next 6 months
Train through 2021 → Forecast next 6 months
...

At every forecasting date, the model should only use information that would have been available at that point in time.

For macroeconomic data, publication delays and historical revisions should also be considered when constructing a rigorous real-time backtest.

How Do We Know Whether the BVAR Is Actually Better?

The BVAR should compete against simpler models.

For example:PMI-only autoregression\text{PMI-only autoregression}

versus:VAR\text{VAR}

versus:BVAR\text{BVAR}

and perhaps:DFM\text{DFM}

We can compare their out-of-sample forecasting performance using metrics such as:RMSERMSE

and:MAEMAE

For example:

Model6-Month RMSE6-Month MAE
PMI AR Model3.83.0
VAR3.62.9
BVAR3.12.5
DFM3.22.6

These values are only illustrative.

The important principle is:

A more sophisticated model is useful only if it produces better out-of-sample forecasts or provides additional useful information.

BVAR vs DFM: What Is the Difference?

This is perhaps the easiest way to understand why we might test both models.

A Dynamic Factor Model says:

“These economic variables share some hidden common movement. Let me extract that signal.”

So:7 Indicators→Ft→PMIt+67\ Indicators \rightarrow F_t \rightarrow PMI_{t+6}

A BVAR says:

“Let me keep the variables themselves and model how they dynamically interact, while using priors to prevent the model from becoming too complex.”

So:PMICopperClaimsNFCIPermits⋮⟶BVARPMIt+1Coppert+1Claimst+1NFCIt+1Permitst+1⋮\begin{matrix} PMI\\ Copper\\ Claims\\ NFCI\\ Permits\\ \vdots \end{matrix} \quad \overset{BVAR}{\longrightarrow} \quad \begin{matrix} PMI_{t+1}\\ Copper_{t+1}\\ Claims_{t+1}\\ NFCI_{t+1}\\ Permits_{t+1}\\ \vdots \end{matrix}

The DFM achieves dimensionality reduction through latent factors.

The BVAR controls dimensionality through Bayesian shrinkage.

That is the fundamental difference.

One Important Caveat About New Orders

As with our DFM specification, ISM Manufacturing New Orders is itself a component of headline ISM Manufacturing PMI.

Therefore, we should be clear about the research question.

If we want to know whether PMI components plus broader economic information can forecast future PMI, including New Orders is reasonable.

If we specifically want to test whether external leading indicators predict PMI, we should exclude New Orders.

A useful robustness experiment would therefore estimate:BVARA=PMI+NewOrders+ExternalIndicatorsBVAR_A = PMI + NewOrders + ExternalIndicators

and:BVARB=PMI+ExternalIndicatorsBVAR_B = PMI + ExternalIndicators

and compare their out-of-sample forecasting performance.


Final Intuition

Imagine several people sitting around a table.

PMI says:

“My recent history tells me manufacturing conditions are slowing.”

Copper responds:

“Industrial demand also appears weaker.”

Jobless claims say:

“The labor market is beginning to soften.”

NFCI adds:

“Financial conditions are tightening.”

A DFM listens to everyone and tries to summarize the conversation into a single underlying economic signal.

A BVAR does something different.

It attempts to model the conversation itself — how each variable’s past relates to the future values of the others.

The problem is that this conversation creates hundreds of possible relationships.

Bayesian priors prevent the model from taking every relationship equally seriously.

That gives us the central intuition:BVAR=Dynamic relationships between many variables+Bayesian shrinkage\boxed{ \text{BVAR} = \text{Dynamic relationships between many variables} + \text{Bayesian shrinkage} }

For our application, the final question is straightforward:

Can the historical interactions among our leading economic indicators provide useful information about where ISM Manufacturing PMI will be six months from now?

That is the question a Bayesian Vector Autoregression is designed to help answer.

Leave a Reply

Your email address will not be published. Required fields are marked *