CEPI  ·  Methodology

Canada Economic Pulse Index (CEPI) — Methodology

Version 2.0 · Last Modified: 2026-04-30
Section 1

Overview

The Canada Economic Pulse Index (CEPI) is a daily composite index designed to measure real-time momentum in Canadian economic activity.

CEPI imagines Canada as if it were a tradable asset. It aggregates high-frequency throughput signals — including cross-border flows, transportation activity, currency stability, and monetary policy conditions — into a single, continuously updated index level.

CEPI is not a GDP forecast. It is not a long-term growth model. It is a structured measure of acceleration or deceleration in observable economic activity.

CEPI consists of two distinct layers:

  1. CEPI-D (Daily Pulse Index) — a bounded, mean-reverting daily composite centred on 100. Values above 100 indicate above-trend macro momentum; values below 100 indicate below-trend momentum.
  2. Structural Composite Index — quarterly composite built from core macroeconomic pillars.

All data sources, transformations, and weights are explicitly documented below.

Section 2

Design Principles

CEPI is governed by the following principles:

  • Transparency — All data inputs and transformations are published.
  • Reproducibility — A third party can reconstruct CEPI from this document.
  • Mean Reversion — CEPI-D is a bounded index centred on 100; it naturally reverts toward baseline, producing visible regime shifts and recoveries.
  • Lag Robustness — Explicit grace-period logic governs publication.
  • Layer Separation — Daily pulse and structural fundamentals are independent systems.
Section 3

Data Sources

3.1 Daily & High-Frequency Inputs (CEPI-D)

CEPI-D incorporates the following vectors:

Flow Signals

  • International arrivals by air (daily)
  • International arrivals by land (daily)
  • Cross-border truck entries (daily)

Financial Signals

  • CAD/USD daily average exchange rate
  • CAD/EUR daily average exchange rate
  • CAD/GBP daily average exchange rate
  • CAD/CNY daily average exchange rate
  • CAD/JPY daily average exchange rate

Monetary Policy

  • Bank of Canada target overnight rate (daily)

Transportation Activity

  • Domestic aircraft movements (weekly)
  • Transborder aircraft movements (weekly)

Freight Activity

  • National railway carloadings (monthly)

All vectors are version-locked and monitored for availability.

Section 4

CEPI-D Construction

4.1 Daily Spine

Let:

t ∈ {t0, t0 + 1, …, T}

Where:

  • t0 = canonical start date (2025-07-01)
  • T = publication end date, determined by grace logic

All vectors are mapped onto a common daily calendar spine.

4.2 Grace Period Logic

Define:

  • targetEnd = yesterday (UTC calendar date)
  • seriesMaxi = most recent available date for series i

Each series has a maximum permitted lag:

Series Grace Window
Arrivals / Trucks (border flows)45 days
FX (USD, EUR, GBP)3 days
FX (CNY, JPY)60 days
Policy Rate60 days

Lag is defined as:

lagi = targetEnd − seriesMaxi

If lagi > gracei, then:

graceEnd = min(seriesMaxi)

Otherwise:

graceEnd = targetEnd

The index publishes through spineEnd = graceEnd. Any previously computed values beyond spineEnd are pruned.

The border-flow inputs (air and land arrivals, and trucks) are daily observations, but Statistics Canada releases them in monthly batches in arrears — a month’s daily values are typically published roughly two weeks after month-end. Their grace window is therefore set to 45 days so the index keeps publishing between releases, forward-filling these inputs from their last reported day. While this forward-fill is active, cepi_border_data_status is set to forward_filled and cepi_border_data_as_of records the date through which real border-flow data exists; both are surfaced as a note on the index page.

4.3 Forward Fill

Sparse series are forward-filled onto the daily spine:

xt = vt      if observation exists at t
xt = xt−1   otherwise

This avoids artificial zeros during short reporting gaps.

4.4 Flow Transformations

For daily flow-type series:

Step 1 — 7-Day Rolling Sum

RSt = Σk=06 xt−k

Step 2 — Year-over-Year Growth (Preferred)

YoYt = (RSt − RSt−365) / RSt−365

Fallback (if insufficient history for YoY):

Momentumt = (RSt − RSt−14) / RSt−14

Step 3 — Rolling Causal Z-score (120-day window)

Zt = (signalt − μt−119:t) / σt−119:t

A minimum of 60 observations in the window is required before a z-score is emitted. This rolling normalization replaces the former expanding z-score, enabling CEPI-D to adapt to regime changes within approximately four months rather than carrying the full history as a permanent reference.

Step 4 — Winsorization

Extreme values are clamped to reduce tail distortions.

Step 5 — Nonlinear Scaling

St = tanh(Zt / 2)

4.5 FX Stability Signal

Exchange rate stability is computed via rolling realized volatility. Let σc,t denote the 30-day rolling volatility for currency c.

Signal:

Signalc,t = −σc,t

Currency weights are derived from export shares:

wc = exportSharec

Basket signal:

FXt = Σc wc · Signalc,t

Standardization and scaling follow the same Z-score and tanh transformation.

4.6 Policy Rate Signal

The policy rate signal is constructed from daily changes (first differences):

Δrt = rt − rt−1

Rate holds produce a near-zero signal; cuts or hikes produce directional scores. This replaces the former level-based signal, which produced persistent negative drift whenever rates were below their expanding-window mean.

Standardized via rolling z-score and winsorized as above.

4.7 Weekly & Monthly Inputs

Weekly and monthly inputs are forward-filled to the daily spine before transformation. Each applies the same YoY-preferred signal chain with a frequency-appropriate fallback window for the pre-YoY period:

  • Weekly aircraft (28-day rolling sum): YoY preferred; 42-day momentum fallback.
  • Monthly rail (90-day rolling sum): YoY preferred; 90-day momentum fallback.
Section 5

CEPI-D Composite Formula

The composite Z is the weighted average of the component z-scores available on a given day (with the trade-exposure multiplier applied to trucks and rail), renormalized by the sum of those available weights. On days when some components do not report — for example the daily border-flow series on weekends — the composite uses only the components that reported rather than treating the missing ones as neutral, so daily values stay comparable across dates. The composite is then transformed to a bounded signal:

Si,t = tanh(Zi,t / 2)

The bounded CEPI-D level is:

CEPIt = 100 + 10 · Σi wi · Si,t

CEPI-D is centred on 100. Values above 100 indicate above-trend macro momentum; values below 100 indicate below-trend momentum. The practical range is approximately [90, 110]. This bounded construction replaces the former chain-linked cumulative return, which produced irreversible downward drift.

Section 6

Structural Composite Index (Quarterly)

Quarterly pillars:

  • Real GDP per capita
  • Business investment per worker
  • Business R&D intensity
  • Labour productivity
  • Export diversification

Structural momentum:

Momentumstructural = slope3y − slope10y

Nowcast momentum:

Momentumnowcast = slope1y − slope10y

Standardized and scaled to:

Index = 50 + 25 · score
Section 7

Export Diversification Score

Herfindahl–Hirschman Index:

HHI = Σ si2

Diversification score:

D = 1 − HHI
Section 8

Publication Policy

  • CEPI-D updates daily.
  • Structural index updates only when all pillars are available.
  • Trade data may lead the structural composite.
  • Quarter mismatches are disclosed.
Section 9

Revision Policy

  • All source revisions propagate automatically.
  • Composite recalculated on each run.
  • Methodology changes increment the version number.
  • All changes are documented within this file.
Section 10

Limitations

  • High-frequency data exhibits volatility.
  • Weekend and holiday distortions exist.
  • Forward-fill assumes short persistence.
  • Grace logic introduces bounded estimation risk.
  • Structural data is release-lagged.
Section 11

Change Log

Version 2.0  ·  2026-04-30
  • Methodological upgrade from cumulative chain-linked returns to bounded level index. CEPI-D now uses CEPIt = 100 + 10 · Σwi·tanh(Zi,t/2), producing a mean-reverting index centred on 100.
  • Expanding z-scores replaced with rolling causal z-scores (120-day window, 60-day minimum warmup). This enables CEPI-D to detect regime changes and recover from deteriorations rather than carrying a permanent negative reference.
  • Policy rate signal changed from z-score of rate level to z-score of daily rate change (Δr). Rate holds now produce near-zero signals instead of persistent negative drift.
  • Chain-linking and the daily return function removed. CEPI-D is now a direct bounded level, not a cumulative product of daily returns.
  • Component contributions now use bounded signals (tanh of z-score) rather than raw z-scores.
  • Rationale: the v1 chain-linked construction produced monotonic downward drift because negative signals compounded irreversibly while stabilization produced near-zero returns. The bounded level model recovers naturally and produces visible regime shifts, matching CEPI's intended behaviour as a tradable macro pulse index.
Version 1.1  ·  2026-03-12
  • Fallback momentum horizons shortened to improve CEPI responsiveness in the pre-YoY period: daily flows 28d → 14d; weekly aircraft 84d → 42d; monthly rail 180d → 90d.
  • Rolling aggregation windows, normalization framework, and chain-linking behaviour unchanged.
Version 1.0  ·  2026-03-02
  • Initial public release.
  • Grace period framework formalized.
  • Equal-weight CEPI-D composite locked.