Macro Regime Methodology

Macro Terminal classifies the macro environment into a small set of named regimes — states such as goldilocks, stagflation_risk, disinflation or soft_landing — using a fully rules-based pipeline. Twenty macroeconomic and financial indicators are normalised into robust z-scores, aggregated into four pillars (rates/liquidity, credit stress, inflation/energy, growth/labour), and matched against a priority-ordered taxonomy of regime definitions. Nothing is discretionary: the same observations always produce the same regime. This document describes the methodology as it currently operates — inputs, formulas, thresholds, the smoothing mechanisms that keep the headline stable, and the limitations we consider material enough to publish alongside the output.

1. Design principles

Rules, not judgement. Every step is a deterministic function. No analyst override, no forecast — the classifier describes the state implied by data that has already printed.

Neutral is a real answer. A classifier that always has an opinion has stopped carrying information. neutral is a first-class outcome, and thresholds are conservative so it stays meaningful rather than becoming a rounding artefact.

Explainability over fit. A call must be reconstructible from pillar states and top drivers. Any change that improves historical fit but makes a call harder to explain is rejected.

Stability over reactivity. The macro state does not change daily. Several smoothing mechanisms (sections 3.4, 4 and 9) exist purely to suppress churn.

2. The four pillars

Twenty indicators are partitioned into four pillars of five members each. Pillars are the unit of classification: regime definitions are written entirely in terms of pillar states, never individual indicators.

PillarWhat it measuresMembers
rates_liquidityThe policy and funding stance — how restrictive the rate and liquidity environment isyield-2y, curve-10y-2y, term-premium, bank-reserves-26w-change, sofr-iorb
credit_stressWhether credit is being extended or withdrawn, and at what pricenfci, hy-spread, sloos-tightening, ci-loans-yoy, ofr-funding
inflation_energyPersistent price pressure, in both realised and market-implied formcpi-services-yoy, cpi-median-annualized, pce-trimmed-yoy, breakeven-5y5y, crude-inventory-26w-change
growth_laborReal activity and labour demandgdpnow, initial-claims, unemployment-rate, housing-starts, payrolls-3m-change

Three composition rules govern membership.

Flow members, not trending levels. Two members are derived: bank-reserves-26w-change and crude-inventory-26w-change, each an absolute 26-week difference of its base series. Robust z-scores on a strongly trending level read secular drift as a permanent signal — a multi-year reserve drawdown would register as perpetual tightening long after the flow stabilised. Differencing over a half-year horizon restores the intended reading: is this getting tighter now? Raw levels remain available for display but do not vote.

Redundancy control. Members are screened for pairwise correlation. Two highly correlated inputs cast two of five votes on essentially one piece of information — enough to move the pillar alone — so a candidate correlating too closely with an incumbent is excluded regardless of standalone merit.

Information the pillar actually lacks. A series that is a smoothed, lagging echo of an existing member adds latency, not signal, and is excluded.

3. From observation to signal: the robust z-score

Each indicator is converted to a robust z-score measuring how unusual its latest observation is relative to its own history.

3.1 The formula

z = (x − median(window)) / (MAD(window) × 1.4826)

where the window is a rolling history that excludes the current point and MAD is the median absolute deviation. The constant 1.4826 rescales MAD so that, for normally distributed data, the result is comparable to a conventional standard-deviation z-score.

Median and MAD replace mean and standard deviation because macro series contain genuine outliers — one crisis-scale print inflates a standard deviation enough to mute every subsequent signal for years. The robust estimator keeps the outlier in the record without letting it destroy the scale.

3.2 Windows, floors and clamps

ParameterValuePurpose
Default z-score window2,520 rows (≈10 trading years)Long enough to span a full cycle
Default percentile window1,260 rows (≈5 trading years)Context display
Minimum observations30Below this, no z-score is emitted at all
Winsorisation limit±4Final z is clamped to [−4, +4]
MAD flooropt-in, per indicatorPrevents division by a near-zero dispersion

Lower-frequency series carry shorter windows sized to their cadence: quarterly gdpnow uses 40 rows, monthly labour and housing series 120 rows, weekly series 520 rows. Windows are counted in rows, not calendar days.

The MAD floor matters for spread series pinned near zero, where a near-zero MAD collapses the denominator and manufactures enormous z-scores out of basis-point noise. Where applied it is expressed in the series' own units (for a funding spread, 2 basis points) and takes effect as max(MAD, floor) before rescaling. If dispersion is still zero, the calculation falls back to a conventional mean/standard-deviation z-score; if that too is degenerate, the z-score is reported as zero rather than undefined.

3.3 Sign convention

Indicators point in different economic directions: a rising high-yield spread is tightening, rising bank reserves are easing. Each indicator carries a direction flag, and series flagged falling_is_tightening have their z-score sign inverted. After normalisation the convention is universal:

Positive z means tighter or more pressured. Negative z means looser or more supportive.

3.4 Signal classification and the dead-band

A z-score becomes one of four signals:

SignalCondition
pressurez > +0.75
supportz < −0.75
watch−0.75 ≤ z ≤ +0.75, or z is not computable
stalethe observation is older than the indicator's freshness allowance

The band between −0.75 and +0.75 is the global signal dead-band; an indicator inside it casts no vote. This is the first smoothing mechanism in the pipeline: roughly the middle half of a series' historical distribution is treated as "not saying anything", usually the correct reading of a series near its own median.

A few members carry a wider member-level dead-band overriding the global threshold for that member only — the two 26-week flow members use ±1.0. Flow-transformed series print noisier z paths than levels, and at the global threshold they generated a measurable excess of confirmed regime flips in low-information periods. A wider bar for noisier voters is the targeted fix; global thresholds are untouched, and an indicator without the opt-in metadata behaves exactly as before.

3.5 Freshness

A stale observation is not a weak signal — it is not a signal. Each indicator has a staleness allowance derived from its publication frequency:

FrequencyAllowance
Daily14 days
Weekly14 days
Monthly45 days
Quarterly135 days

Individual indicators may override the frequency default — several monthly labour and housing series use 75 days rather than 45, because a series published with a multi-week reporting lag would otherwise spend part of every month incorrectly marked stale. Loosening an allowance is a methodology change, not a convenience: allowances follow observed publication behaviour, never what would suit the classifier.

4. From signals to pillar state

Within each pillar, votes are counted and netted:

netScore = (count of pressure signals) − (count of support signals)

Only fresh members vote. watch members are counted as eligible but contribute zero. The pillar state follows from the net:

ConditionPillar state
netScore ≥ +2pressure
netScore ≤ −2support
otherwiseneutral

Requiring a net of two — not one — is the second major smoothing mechanism. With five members, ±2 means at least two agree directionally with no offsetting vote, or three agree against one. A single indicator can never move a pillar alone. This is deliberately conservative: it accepts that some genuine turns are recognised late in exchange for the classifier not reacting to any individual print.

Three further pillar-level quantities are reported:

  • Eligibility. A pillar is eligible when at least 3 of its 5 members are fresh. Eligibility does not affect the regime match — it affects conviction (section 8.1) and the soft-landing gate (section 7).
  • Pillar confidence. high when at least 4 members are fresh and the net is decisive for the reported state (|net| ≥ 2 directional, |net| ≤ 1 neutral); low when fewer than 2 members are fresh; medium otherwise.
  • Top driver — the fresh member with the largest absolute z-score, which is what makes a regime call reconstructible in a sentence.

5. The regime taxonomy

Regime definitions are written as required pillar states plus optional unless vetoes, evaluated in priority order, first match wins. The first definition whose conditions hold is the baseline regime; if none holds, the result is neutral.

PriorityRegimeRequiredUnless (veto)
1stagflation_riskinflation = pressure and growth = pressure
2growth_scaregrowth = pressure and credit = pressureinflation = pressure
3goldilocksinflation = support and growth = supportcredit = pressure
4overheatinggrowth = support and inflation = pressure
5reflation_watchinflation = pressuregrowth = pressure
6disinflationinflation = supportgrowth = pressure
neutralfallback when nothing above matches

The ordering runs from more specific to less specific: overheating requires everything reflation_watch requires plus growth support, so it must sit above it, or the more specific state could never be reached. The stress states sit at the top because when growth is under pressure the question of why — inflation or credit — dominates. goldilocks requires inflation support and so cannot overlap the hawkish family at all.

overheating exists because a single inflation-pressure catch-all is semantically too coarse. Demand-led price pressure (inflation pressure with growth support) and inflation pressure with neutral growth are materially different environments; collapsing them meant one regime absorbed a large share of all classified periods and stopped discriminating. Splitting out the growth-support cells left reflation_watch with the growth-neutral cases only.

Note that rates_liquidity appears in no regime definition. This is intentional: restrictive policy rates are compatible with almost every macro state, including benign ones, so a veto would produce systematically wrong calls. Rates evidence enters through two other channels — counter-evidence capping conviction (8.1) and the financial_tightening_watch tag (8.2).

6. The inflation momentum overlay

Pillar states are level reads: they answer "is inflation high relative to its own history?", not "is inflation falling?" A disinflation well underway but not yet back to normal levels still registers as inflation pressure — correct as a level statement, misleading as a description of the environment. A separate inflation momentum computation supplies the missing dimension.

6.1 Construction

Four core inflation series are evaluated over a 6-month horizon: cpi-services-yoy, cpi-median-annualized, pce-trimmed-yoy and breakeven-5y5y. For each, the change from six months prior is compared against a per-series dead-band:

SeriesDead-band (own units, percentage points)
cpi-services-yoy0.10
cpi-median-annualized0.10
pce-trimmed-yoy0.10
breakeven-5y5y0.05

A series is decelerating when its 6-month change is below −deadBand, accelerating when above +deadBand, neither when inside. The change must strictly clear the band; a move exactly at the boundary does not count.

The comparison point is bounded: it must fall within 45 days of the exact six-month target date. Without this bound, sparse history would let a nominal "6-month momentum" silently span nine or twelve months. When no admissible comparison point exists, the contributor reports unavailable rather than producing a misleading number.

6.2 Aggregation

  • Momentum support requires at least 3 of the 4 core series decelerating and the market veto clear.
  • Momentum pressure is the exact mirror: at least 3 of the 4 accelerating. The symmetry is deliberate — missing an inflation upturn is as costly as missing the downturn.
  • The market veto is asymmetric. Market-implied inflation (breakeven-5y5y) accelerating beyond its dead-band blocks momentum support, since a market pricing inflation higher contradicts a disinflation claim. A flat or missing market read does not block, and the veto does not gate pressure.
  • Momentum reports unavailable when core contributors are missing, but support and pressure outrank unavailability: three series moving the same way is a real signal even with the fourth absent.

6.3 Effect on the headline

When the baseline regime is reflation_watch or overheating, growth is not in pressure, and momentum reads support, the displayed regime is overridden to disinflation. The baseline is retained in the payload alongside an overlay flag, so the derivation stays auditable.

Both hawkish baselines share the overlay. Excluding either produced the pathological result of a period whose levels read "inflation pressure with growth support" displaying an overheating narrative while core inflation was decelerating — the opposite of the true reading.

7. The soft-landing gate

soft_landing is an overlay-only state: it has no pillar-based definition of its own and can be reached only from a baseline of neutral.

The gate is built entirely from positive evidence. A construction assembled from negations fires vacuously: with sparse data, "nothing is in pressure" is trivially true, and a single benign observation could promote an empty read to a confident soft-landing call. Bare neutrality is therefore not sufficient — all five conditions must hold:

  1. The baseline regime is neutral. (goldilocks, growth_scare and stagflation_risk are excluded outright; a genuine disinflation is protected and never overwritten.)
  2. Inflation momentum reads support under the rule in section 6.
  3. Zero pressure-signal contributors in both growth_labor and credit_stress — evaluated per indicator, not per pillar.
  4. A data-adequacy floor: each of growth_labor, credit_stress and inflation_energy has at least 3 fresh members with computable z-scores (fresh members without a z-score do not count). "Calm" is only believable when enough data is present for turbulence to have shown up.
  5. The Sahm rule is not triggered.

The Sahm rule

A widely used recession indicator computed from the unemployment rate alone:

sahm = mean(unemployment rate, last 3 months)
       − min(3-month means over the trailing 12 windows)
triggered when sahm ≥ 0.50 percentage points

It requires 15 monthly observations spanning no more than 16 calendar months; sparser history is rejected rather than approximated. A trigger contradicts the claim that the economy is landing rather than falling, and vetoes the overlay regardless of inflation momentum.

8. Conviction and watch tags

8.1 Conviction

Every regime call carries a conviction level describing how well-supported it is.

LevelConditions
highNot neutral, and ≥3 eligible pillars, and ≥3 pillars in a directional (non-neutral) state, and ≥75% of all 20 members fresh, and ≤1 counter
medium≥2 eligible pillars, and ≥2 directional pillars, and ≥60% of all members fresh
lowotherwise

Counters are contributors arguing against the call: for a definition-based regime, members signalling the opposite of a required pillar state; for disinflation, core series re-accelerating beyond their dead-bands; for soft_landing and goldilocks, pressure contributors in the rates pillar. That last case is how the classification-inert rates pillar exerts influence — restrictive rates do not veto a benign call, but two or more such contributors cap it at medium.

Conviction means different things for named regimes and neutral: for a named regime it reports confidence in the call, for neutral it reports data adequacy. A low-conviction neutral is a statement about the data, not the economy.

8.2 Watch tags

Watch tags are additive annotations surfacing near-regime conditions without disturbing the headline. They exist because the conservative ±2 pillar threshold necessarily discards information about states that are forming but not yet confirmed.

TagFires when
growth_scare_watchGrowth and credit both show pressure contributors, inflation not in pressure, but the regime is not yet growth_scare
growth_deterioration_watchLabour-led deterioration without credit confirmation — growth pillar in pressure with inflation not in pressure, or Sahm triggered (which bypasses the inflation guard and escalates severity to alert)
financial_tightening_watchRates in pressure, credit not in support, growth not in pressure, within the hawkish family (neutral, reflation_watch, overheating)
soft_patch_watchNeutral headline with inflation support, growth pressure, credit not in pressure
reflation_transition_watchreflation_watch still correct on levels, but growth and credit are both quiet — the environment has moved beyond a simple inflation watch
reacceleration_watchThe displayed regime is disinflation or soft_landing while inflation momentum has flipped to pressure

reacceleration_watch is reconciled against the confirmed headline, not the instantaneous candidate (section 9): a held disinflation headline coexisting with re-accelerating momentum is exactly when a reader must be warned.

The design rule: a signal useful for interpretation but not strong enough to change positioning should be a tag, not a regime. Tags are additive and backward-compatible; regimes are not.

9. Confirmation: the streak rule

The classification above produces a candidate regime for each observation date, which is not displayed immediately. A new candidate must be the instantaneous classification on 3 distinct observation dates before the displayed headline switches; until then the previously confirmed regime is held.

  • The streak is counted over stored daily snapshot rows, not pipeline runs, so re-computation or cache rebuilds cannot inflate it.
  • Missing snapshot days do not reset it; the three most recent stored rows must agree.
  • There is no same-family exemption and no fast-track for high-conviction candidates.
  • On a cold start with no prior confirmed row, the first classification confirms immediately.

The cost is explicit: the displayed regime can lag the data by up to two observations. That is accepted. Regime history is used to reason about persistent environments, and a history littered with two-day round trips is not usable for that purpose.

10. Validation

The methodology is validated by replay: the classifier is re-run over the full available history under identical rules, and the resulting regime path is examined for statistical health and episode alignment. Any candidate change must be replayed against the current version before adoption, and must clear the following gates:

GateRequirement
Data coverageNo coverage stop condition may be active
Non-neutral lower boundThe classifier must produce a directional call in a meaningful share of periods
Stability — transitionsTransition count ≤ (total observation points ÷ 3)
Stability — durationAverage regime duration ≥ 2 months
Episode improvementImprove at least 2 historical episode outcomes versus the current version
Episode regressionDowngrade none of the currently passing episodes
ExplainabilityEvery changed episode must be reconstructible from pillar states and top drivers

Episode gates test the classifier against named historical macro environments — an inflation shock, a tightening peak, a growth shock, a disinflation and a soft landing — chosen because they are unambiguous ex post and stress different parts of the taxonomy. Transitional windows serve as diagnostics and tie-breakers rather than hard gates; a candidate that makes a transition window less explainable, typically through rapid churn, is flagged even when it clears the hard gates. A high rate of directional calls is a qualitative review risk, not an automatic pass: additional non-neutral periods must improve episode alignment and remain explainable rather than merely converting neutral into noise.

Every payload carries a methodology version stamp. Any change to scoring, thresholds, taxonomy or smoothing requires a full historical replay and a new version string — outputs computed under different versions are never silently mixed.

11. Known limitations

We publish these because a methodology page that lists only strengths is not a methodology page.

Level-based classification with one momentum channel. Only inflation has an explicit momentum overlay. A growth or credit environment improving rapidly from a poor level reads as pressure until the level itself recovers. Extending momentum treatment to the other pillars is a recognised open question, not a solved one.

Threshold conservatism is a deliberate trade. The ±2 pillar net and ±0.75 signal band mean turns are recognised late. Loosening to ±1 has been tested: it increases sensitivity and improves recognition of sharp shocks, but pushes the share of directional calls high enough that neutral stops functioning as a meaningful fallback and single-indicator moves can flip a pillar. The current calibration prefers late recognition to false confidence; readers needing earlier warning should watch the tags in section 8.2.

No dedicated shock regime. Discontinuous shocks — where the macro state changes faster than monthly and quarterly data can describe it — are handled through the growth and credit watch tags, because threshold changes broad enough to catch shocks reliably degrade behaviour in every ordinary period. Recognition of an abrupt shock therefore depends on tags rather than the headline.

The confirmation streak imposes a known lag of up to two observations — the price of a stable, interpretable regime history.

Correlated inputs are controlled, not eliminated. Within-pillar correlation is screened, but macro indicators are correlated by nature; a pillar can still move on a common factor.

Revisions. Macroeconomic data is revised. Z-scores use currently available history, so a regime path recomputed today can differ from what the classifier showed at the time. Replay describes the methodology's behaviour on data as it now stands — it is not a simulated live track record.

Freshness policy is a genuine trade-off. Set too tight, pillars go under-populated and the classifier drifts to a data-driven neutral; set too loose, stale evidence is presented as current.

Published history is bounded. The exposed history covers a rolling multi-year window rather than the full computed history, so the very long-run regime distribution is not directly inspectable.

This is a description, not a forecast. The classifier states which regime the printed data implies. It does not predict the next regime, does not estimate transition probabilities, and does not constitute investment advice.

12. Glossary

TermMeaning
Macro regimeA named macro state produced by the classifier
PillarOne of four indicator groups; the unit in which regime definitions are written
Robust z-score(x − median) / (MAD × 1.4826) over a rolling window excluding the current point. MAD = median absolute deviation
SignalAn indicator's classification: pressure, support, watch or stale
Dead-bandA neutral band around zero that a value must clear before it counts as a signal
OverlayA rule overriding the baseline regime while preserving it in the payload
Watch tagAn additive annotation flagging a near-regime condition
StreakConsecutive observation dates a candidate must hold before it is displayed
Convictionhigh / medium / low — call confidence for a named regime, data adequacy for neutral