Skip to content

Dynamic Factor Models: Forecasting Economic Growth from Many Signals

Predicting the direction of the economy is difficult because there is no single variable that tells us exactly where economic activity is heading.

Consider manufacturing growth. Employment conditions may begin weakening while stock prices are still rising. Building permits may decline while commodity prices remain strong. The yield curve may signal slower growth months before it becomes visible in traditional economic statistics.

Looking at any one of these variables individually gives us only part of the picture.

This is exactly the problem that Dynamic Factor Models (DFMs) are designed to solve.

In this article, we will build an intuitive understanding of a Dynamic Factor Model using a practical problem:

Can we combine several leading economic indicators to forecast the ISM Manufacturing PMI?

Our Forecasting Problem

Suppose our target variable is the ISM Manufacturing Purchasing Managers’ Index (PMI).

PMI is particularly useful because it provides a timely measure of manufacturing conditions. A reading above 50 generally indicates expansion in the manufacturing sector, while a reading below 50 indicates contraction.

Our objective is not simply to explain today’s PMI.

We want to use information available today to estimate where PMI could be several months into the future.

For this example, suppose we collect the following indicators:

VariableWhy it may contain information about future PMI
ISM Manufacturing New Orders IndexNew orders can precede changes in production and the headline PMI
10Y–2Y Treasury Term SpreadThe yield curve contains information about expectations for future economic conditions
Initial Jobless ClaimsHigh-frequency indicator of changing labor-market conditions
S&P 500 IndexFinancial markets incorporate expectations about future corporate and economic conditions
Chicago Fed NFCIMeasures whether financial conditions are relatively loose or tight
Building PermitsHousing and construction activity can provide an early signal about demand
Global Copper PriceCopper demand is closely connected with industrial and construction activity

These variables behave very differently.

Some are percentages. Some are index levels. Some rise when economic conditions improve, while others may rise when conditions deteriorate.

More importantly, they are often correlated with each other.

That creates an interesting modeling problem.


Why Not Just Use a Regression?

A natural starting point would be a multiple regression:PMIt+h=β0+β1NewOrderst+β2TermSpreadt+β3Claimst+⋯+ϵtPMI_{t+h} = \beta_0 +\beta_1 NewOrders_t +\beta_2 TermSpread_t +\beta_3 Claims_t +\cdots +\epsilon_t

where hh represents our forecasting horizon.

There is nothing inherently wrong with this approach.

But macroeconomic datasets have an important characteristic:

Many economic variables move together because they are responding to the same underlying economic forces.

For example, imagine economic conditions begin deteriorating.

We might observe:

  • new orders falling,
  • building permits declining,
  • jobless claims increasing,
  • financial conditions tightening,
  • stock prices weakening,
  • industrial commodity prices declining.

These aren’t necessarily seven completely independent stories.

They may partly reflect one common underlying story: weakening economic conditions.

Instead of treating every indicator independently, a Dynamic Factor Model attempts to identify that hidden common signal.

The Core Idea: A Hidden Economic Factor

Imagine that underneath all our observed economic variables there exists something we cannot directly observe.

Call it:Ft=Underlying Economic MomentumF_t = \text{Underlying Economic Momentum}

We cannot download “economic momentum” directly from FRED or Bloomberg.

Instead, we observe its fingerprints.

When economic momentum strengthens, we might see stronger orders, improving financial markets, stronger commodity demand and increased construction activity.

When it weakens, many of these variables begin moving in the opposite direction.

A Dynamic Factor Model attempts to extract this hidden common factor from the observed data.

Conceptually:NewOrderst=λ1Ft+e1,tTermSpreadt=λ2Ft+e2,tClaimst=λ3Ft+e3,tSP500t=λ4Ft+e4,tNFCIt=λ5Ft+e5,tPermitst=λ6Ft+e6,tCoppert=λ7Ft+e7,t\begin{aligned} NewOrders_t &= \lambda_1F_t + e_{1,t}\\ TermSpread_t &= \lambda_2F_t + e_{2,t}\\ Claims_t &= \lambda_3F_t + e_{3,t}\\ SP500_t &= \lambda_4F_t + e_{4,t}\\ NFCI_t &= \lambda_5F_t + e_{5,t}\\ Permits_t &= \lambda_6F_t + e_{6,t}\\ Copper_t &= \lambda_7F_t + e_{7,t} \end{aligned}

The important term here is:FtF_t

It represents the common factor shared across the indicators.

The λ\lambda‘s are called factor loadings. They tell us how strongly each variable is associated with the common factor.

The ee‘s represent information unique to each variable.

So we can think of every observed indicator as:Observed Indicator=Common Economic Signal+Indicator-Specific Noise\boxed{\text{Observed Indicator}=\text{Common Economic Signal}+\text{Indicator-Specific Noise}}

That is the fundamental intuition behind a factor model.

Why Is It Called a Dynamic Factor Model?

A normal factor model identifies common patterns across variables.

A Dynamic Factor Model goes one step further.

It recognizes that the hidden economic factor itself evolves through time.

For example:Ft=ϕFt−1+utF_t = \phi F_{t-1} + u_t

This equation says that today’s economic momentum depends partly on yesterday’s economic momentum plus some new information arriving today.

That makes intuitive sense.

The economy does not normally jump randomly between completely unrelated states every month. Expansion and contraction tend to develop over time.

The complete model therefore has two pieces.

Measurement equation

The first connects our observed indicators to the hidden factor:Xt=ΛFt+etX_t = \Lambda F_t + e_t

where XtX_t contains New Orders, the term spread, claims, the S&P 500, NFCI, building permits and copper.

Transition equation

The second describes how the hidden factor evolves:Ft=AFt−1+utF_t = AF_{t-1} + u_t

Together, these equations create the Dynamic Factor Model.

An Intuitive Example

Imagine the following situation.

Over several months we observe:

Month 1: Building permits start declining.

Month 2: Copper prices weaken and the yield curve deteriorates.

Month 3: Jobless claims begin increasing.

Month 4: New orders weaken.

Looking at each variable independently can make the economic picture noisy.

The DFM asks a different question:

Is there a common movement hidden underneath these different signals?

If several indicators begin pointing toward weaker activity, the estimated factor may start declining.

Instead of monitoring seven separate charts, we now have something closer to:7 Economic Indicators→Common Economic Factor→Future PMI\text{7 Economic Indicators} \rightarrow \boxed{\text{Common Economic Factor}} \rightarrow \text{Future PMI}

This compression is one of the most useful features of factor models.

From the Factor to a PMI Forecast

Extracting the economic factor is only part of our objective.

Ultimately, we want to forecast PMI.

One simple forecasting specification is:PMIt+h=α+βFt+γPMIt+ϵt+hPMI_{t+h} = \alpha + \beta F_t + \gamma PMI_t + \epsilon_{t+h}

Suppose we want a six-month-ahead forecast.

Then:PMIt+6=α+βFt+γPMIt+ϵt+6PMI_{t+6} = \alpha + \beta F_t + \gamma PMI_t + \epsilon_{t+6}

The model therefore uses both the current economic factor and information contained in current PMI to estimate future PMI.

The workflow becomes:Economic Data→Dynamic Factor Model→Ft→PMI Forecast\text{Economic Data} \rightarrow \text{Dynamic Factor Model} \rightarrow F_t \rightarrow \text{PMI Forecast}

How Do We Interpret a Dynamic Factor Model?

One advantage of a traditional regression is its interpretability.

If we estimate:PMIt+6=β0+β1Coppert+β2Claimst+⋯+ϵtPMI_{t+6} = \beta_0 +\beta_1 Copper_t +\beta_2 Claims_t +\cdots +\epsilon_t

we can examine the coefficient and statistical significance of each predictor. For example, the coefficient on copper tells us about its conditional relationship with future PMI, while its t-statistic and p-value help us assess whether that relationship is statistically distinguishable from zero under the model assumptions.

A Dynamic Factor Model works differently.

With a single-factor DFM, our indicators do not individually enter the final PMI forecasting equation. Instead, they first contribute to a common latent factor:Economic Indicators→Ft→PMIt+6\text{Economic Indicators} \rightarrow F_t \rightarrow PMI_{t+6}

This means interpretation happens at two levels.

Step 1: Which Variables Define the Factor?

Each economic indicator has a factor loading.

For example, suppose our estimated model produces:

VariableFactor Loading
New Orders0.85
Copper0.72
Building Permits0.68
S&P 5000.55
Term Spread0.42
Jobless Claims-0.60
NFCI-0.51

The loading tells us how strongly each variable is associated with the common factor.

For example, the relatively large loading for copper suggests that copper prices contain substantial information about the common movement captured by this factor.

Jobless claims might have a negative loading because claims tend to increase when economic conditions weaken.

Depending on the estimation method, we can also examine standard errors and statistical significance of estimated loading parameters.

However, an important distinction must be made:

A significant factor loading tells us that a variable is related to the latent factor. It does not by itself tell us that the variable significantly predicts future PMI.

Also, the overall sign of a latent factor is arbitrary: multiplying both the factor and all its loadings by -1 represents the same model. Therefore, interpretation should focus on the relative signs and magnitudes across variables rather than treating the factor’s orientation as inherently positive or negative.

Step 2: Does the Factor Predict Future PMI?

Next, we examine the forecasting equation:PMIt+6=α+βFt+γPMIt+ϵtPMI_{t+6} = \alpha + \beta F_t + \gamma PMI_t + \epsilon_t

Suppose we estimate:β=2.4,t=3.1,p=0.003\beta=2.4,\qquad t=3.1,\qquad p=0.003

This provides evidence that the common economic factor contains information associated with future PMI.

We can therefore interpret the model as:Copper⟶λCopperEconomic Factor⟶βFuture PMICopper \overset{\lambda_{Copper}}{\longrightarrow} Economic\ Factor \overset{\beta}{\longrightarrow} Future\ PMI

The copper factor loading tells us how strongly copper relates to the common economic signal, while the forecasting coefficient tells us whether that common signal helps forecast PM

Why Standardization Matters

There is another problem we need to solve before fitting our model.

Our variables have completely different units.

The S&P 500 may be measured in thousands of index points. Initial claims are measured in thousands of people. The yield spread is measured in percentage points. PMI is centered around roughly 50.

Feeding these raw values directly into a factor extraction procedure can cause variables with larger numerical scales to dominate.

A common solution is standardization:Zi,t=Xi,t−μiσiZ_{i,t} = \frac{X_{i,t}-\mu_i}{\sigma_i}

After standardization, each series is expressed in terms of deviations from its own mean.

This makes the common movement across variables easier to identify.

In a real forecasting system, we also need to consider transformations such as percentage changes, differences or log differences depending on the statistical properties of each series.

A Simple Python Example

We can implement a basic Dynamic Factor Model using statsmodels.

Assume we have a monthly DataFrame called df:

import pandas as pd
from sklearn.preprocessing import StandardScaler
from statsmodels.tsa.statespace.dynamic_factor import DynamicFactor

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

X = df[features].dropna()

# Standardize the economic indicators
scaler = StandardScaler()
X_scaled = pd.DataFrame(
    scaler.fit_transform(X),
    index=X.index,
    columns=X.columns
)

# One latent economic factor with AR(1) dynamics
model = DynamicFactor(
    X_scaled,
    k_factors=1,
    factor_order=1
)

results = model.fit(maxiter=1000, disp=False)

print(results.summary())

The key parameters are:

k_factors=1

which tells the model that we want to estimate one common latent factor, and:

factor_order=1

which allows the factor to depend on its previous value.

We can then extract the estimated factor:

factor = results.factors.filtered[0]

df.loc[X.index, "economic_factor"] = factor

We have now transformed several economic indicators into a single estimate of underlying economic conditions.

Using the Factor to Forecast PMI

We can then create a forecasting model.

For example, suppose we want to forecast PMI six months ahead:

import statsmodels.api as sm

horizon = 6

forecast_df = df[["ISM_PMI", "economic_factor"]].copy()

forecast_df["PMI_future"] = (
    forecast_df["ISM_PMI"].shift(-horizon)
)

forecast_df = forecast_df.dropna()

X = forecast_df[
    ["economic_factor", "ISM_PMI"]
]

X = sm.add_constant(X)

y = forecast_df["PMI_future"]

forecast_model = sm.OLS(y, X).fit()

print(forecast_model.summary())

Conceptually, we are estimating:PMIt+6=α+β1Factort+β2PMIt+ϵtPMI_{t+6} = \alpha + \beta_1 Factor_t + \beta_2 PMI_t + \epsilon_t

The factor summarizes the broader economic information contained across our leading indicators, while current PMI captures persistence in manufacturing conditions.

The Most Important Rule: Avoid Look-Ahead Bias

There is one major problem with the simple example above.

This line:

scaler.fit_transform(X)

uses the entire dataset to calculate the mean and standard deviation.

If we are performing a historical backtest, that means information from the future could indirectly influence transformations applied to the past.

Similarly, estimating the DFM once using the complete dataset and then pretending we generated historical forecasts would create an unrealistic test.

A proper forecasting experiment should instead use an expanding window.

For example:

Train through 2018 → Forecast 2019
Train through 2019 → Forecast 2020
Train through 2020 → Forecast 2021
Train through 2021 → Forecast 2022
...

At every point in history, the model should only see information that would actually have been available at that time.

This is particularly important in macroeconomic forecasting because many economic datasets are revised after their initial publication.

A truly rigorous backtest therefore needs to think about data vintages and publication dates, not simply the dates attached to observations.

How Do We Know Whether the DFM Actually Works?

A sophisticated model is not automatically a better model.

We need a benchmark.

A useful baseline might simply be:PMIt+6=α+βPMIt+ϵtPMI_{t+6} = \alpha+\beta PMI_t+\epsilon_t

Then compare this against:PMIt+6=α+β1PMIt+β2Ft+ϵtPMI_{t+6} = \alpha+\beta_1PMI_t+\beta_2F_t+\epsilon_t

If adding the Dynamic Factor Model does not improve out-of-sample forecasting performance, the additional complexity may not be justified.

Metrics such as RMSE and MAE can be used:RMSE=1N∑t=1N(y^t−yt)2RMSE = \sqrt{ \frac{1}{N} \sum_{t=1}^{N} (\hat{y}_t-y_t)^2 }

The key phrase here is out-of-sample.

We care less about how beautifully the model explains historical data and more about whether the information available at time tt helps predict PMI at t+ht+h.

One Important Caveat About New Orders

There is an important modeling distinction in our particular example.

The ISM Manufacturing New Orders Index is itself a component of the headline ISM Manufacturing PMI.

That means it is fundamentally different from external predictors such as Treasury yields, jobless claims, building permits or copper prices.

Using New Orders is reasonable if the research question is:

“Can information contained in PMI components and external economic indicators forecast future headline PMI?”

But if the objective is specifically to test whether independent external leading indicators can forecast PMI, New Orders should be excluded because it introduces a direct structural relationship with the target.

This distinction should be explicitly documented when interpreting the results.

What Makes Dynamic Factor Models Useful?

The real advantage of a DFM becomes clearer as the dataset grows.

Imagine that instead of seven indicators we eventually collect:

  • labor-market indicators,
  • credit spreads,
  • interest rates,
  • housing indicators,
  • equity-market variables,
  • commodity prices,
  • consumer indicators,
  • industrial-production variables,
  • financial-condition measures.

We might eventually have 30, 50 or even 100 economic series.

Putting all of them directly into a regression creates problems with dimensionality, multicollinearity and overfitting.

A factor model instead attempts to compress them:50 Economic Variables\boxed{50\ Economic\ Variables}↓\downarrow2 or 3 Common Economic Factors\boxed{2\ or\ 3\ Common\ Economic\ Factors}

Those factors can then be used for forecasting.

This is one reason factor models became particularly important in macroeconomics: modern economists have access to enormous datasets, but the number of underlying forces driving those datasets may be much smaller.


Final Intuition

The easiest way to understand a Dynamic Factor Model is to imagine a room full of people describing the weather.

One person says the temperature is falling.

Another notices dark clouds.

Another notices the wind increasing.

Another sees people opening umbrellas.

Each observation is noisy on its own.

But together they reveal something that none of them directly measured:

A storm is approaching.

Macroeconomic indicators work in a similar way.

Jobless claims, Treasury yields, financial conditions, building permits, stock prices and commodity prices each provide incomplete information about the economy.

A Dynamic Factor Model tries to extract the common economic signal hidden underneath all of them.

For our application, the ultimate question is therefore not whether any single indicator perfectly predicts manufacturing activity.

It is:Can their shared signal help us forecast where ISM PMI is heading?\boxed{ \text{Can their shared signal help us forecast where ISM PMI is heading?} }

That is the problem the Dynamic Factor Model is designed to answer.

Leave a Reply

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