Portfolio LabKnowledgeSign inCreate account

Economic pulse: how Portfolio Lab calculates early indicators

In depth10 min read · updated 28 October 2026 · 14 sources

The economic pulse in the Macro › Economic pulse tab answers one question: how is the economy doing right now, before the official figures come out? It uses daily and weekly series such as truck mileage, electricity consumption, job postings and unemployment insurance claims, expresses each as a change on the previous year, compares it with the five years before and combines them into a single value. This page describes what the code does: series, calculation steps, weights, limitations.

The idea: early indicators from daily and weekly data

Gross domestic product is published quarterly and with a delay, industrial production and labor market figures monthly. Data that are generated daily anyway arrive faster: toll collection for trucks, the load on the power grid, ads on job boards, claims filed with unemployment insurance. Such early indicators are used for nowcasting, the estimation of the present.

There is evidence for each type of series. Askitas and Zimmermann (2013) show that an index of truck mileage based on German toll data is hardly revised, is available quickly and, because of just-in-time deliveries, moves in step with production. Fezzi and Fanghella (2020) use daily electricity market data to estimate how hard the 2020 lockdown hit the Italian economy. Lewis et al. (2022) describe a weekly index for the US built from ten series that accurately estimated GDP growth for the current quarter in the first half of 2020. For Germany, the Bundesbank builds its Weekly Activity Index on Eraslan and Götz (2021).

The economic pulse is deliberately simpler than these models: not an estimated factor model, but a weighted average of standardized series that you can recalculate step by step. The two central bank indices are shown alongside for comparison.

The series by region

Only series that are freely available and whose terms allow display with attribution are included. The regions are the same as on the Macro page:

RegionSeries in the pulseFrequency and adjustmentWeight
GermanyTruck toll mileage index (2021 = 100)daily, calendar and seasonally adjusted⅓
Germanyelectricity consumption as grid load, GWh per daydaily, unadjusted⅓
Germanyjob postings (job postings index, February 1, 2020 = 100)daily, seasonally adjusted, already a 7-day average⅓
USAinitial unemployment insurance claimsweekly, seasonally adjusted¼
USAcontinued unemployment insurance claimsweekly, seasonally adjusted¼
USAjob postings USAdaily, seasonally adjusted½
Euro areajob postings in Germany, France, Italy, Spain, the Netherlands and Irelanddaily, seasonally adjustedby 2025 GDP: 34.2%, 22.6%, 17.1%, 12.8%, 8.8%, 4.5%

For comparison, but not part of the pulse: in Germany, the Bundesbank's Weekly Activity Index (Bundesbank, weekly activity index 2026); in the US, the Weekly Economic Index by Lewis, Mertens and Stock (Weekly Economic Index (Dallas Fed) 2026). Both already contain series of the pulse: the Activity Index includes toll and electricity data, the Weekly Economic Index the unemployment insurance claims. Otherwise they would count twice in the pulse.

Freely available daily or weekly series cover the euro area only thinly. The six countries with job postings account for 83% of euro area GDP (2025); there, the pulse is purely a labor market pulse. In the US, too, the series available freely and weekly are mainly labor market series. Initial and continued claims measure the same side of the labor market and therefore share half of the weight.

Sources of the series: truck toll mileage index from the Federal Statistical Office (Destatis) together with the Bundesbank and the Federal Office for Logistics and Mobility (Destatis, truck toll mileage index 2026), grid load from Bundesnetzagentur | SMARD.de (Bundesnetzagentur | SMARD.de 2026), job postings from Indeed Hiring Lab (Indeed Hiring Lab 2026), unemployment insurance claims from the US Department of Labor. The grid load and the job postings are licensed under CC BY 4.0; the page names the rights holders below the series.

Step 1: change on the previous year, to the day

Each series is first turned into a growth rate. To keep weekdays and weekends comparable, the code does not compare with the same calendar date, but with the day 364 days earlier (exactly 52 weeks, i.e. the same weekday):

Daily series: g_t = M7_t / M7_t−364 − 1; weekly series: g_w = M4_w / M4_w−52 − 1
M7_t
average of the seven days up to day t; if a day is missing, the average stays empty
M4_w
average of the four weeks up to week w (unemployment insurance claims)
g
change on the previous year in percent
  • Weekly grid: a week runs from Monday to Sunday and carries the Sunday's date. For a daily series, the value on the last day with data in that week counts; for a weekly series, its value for the week. Unemployment insurance claims dated Saturday fall into the week ending the following Sunday.
  • Job postings are already a 7-day average; the code compares the index value directly with the value 364 days earlier.
  • Activity Index and Weekly Economic Index are already growth rates (13 weeks against the previous 13 weeks, or scaled to year-on-year GDP growth) and enter the z-score unchanged.
  • Public holidays: toll and job postings are calendar adjusted. The Bundesbank developed a method for daily data for this purpose (Ollech (2021), seasonal adjustment). The grid load is not adjusted. If a nationwide public holiday on a weekday falls only in the current 7-day window or only in the window a year earlier (Easter, Ascension Day and Whitsun move around, and October 3 falls on a Friday one year and a Saturday another), the page names the holidays and warns of the distorted comparison. The code does not count holidays of individual German states.
  • Base effects: a year after a slump, the year-on-year comparison shows strong growth, even if the level is still lower (base effect). From 2020 to 2022, the swings are therefore extreme in both directions.

Step 2: robust z-score without look-ahead

A change of +2% is a lot for truck mileage but little for job postings. The code therefore makes the series comparable by measuring each week against the series' own history, with a robust z-score instead of the ordinary z-score:

z_w = s · (g_w − median) / (1.4826 · MAD), capped at ±4
median, MAD
median and median of the absolute deviations from the median over the 260 weeks before w (five years), excluding week w itself
1.4826
factor that makes the MAD equal to the standard deviation for normally distributed data (Rousseeuw and Croux 1993)
s
sign: +1, or −1 for unemployment insurance claims, because fewer claims mean a stronger economy
  • No look-ahead: the window ends in the week before w. A later value does not change any earlier z-score (look-ahead bias).
  • At least 104 weeks: with less than two years of comparison values, there is no z-score. Job postings start on February 1, 2020, so their year-on-year comparison starts in 2021 and their first z-score at the end of January 2023; the table shows for each series from when it has a z-score.
  • Median and MAD instead of mean and standard deviation: otherwise the pandemic months would sit in the window for five years and inflate the dispersion; every later move would look small. Individual outliers hardly shift the median and MAD, because the estimator has a breakdown point of 50%.
  • Capped at ±4: so that a single series with values like those of April 2020 cannot determine the pulse on its own.

Step 3: the pulse with weights and minimum coverage

Pulse_w = Σ_i w_i · z_i,w / Σ_i w_i (only series with a value in week w)
w_i
weight of series i according to the table above
z_i,w
capped z-score of series i in week w
  • Fixed weights: equal weights per area, and GDP shares in the euro area. With series this short (job postings have had a z-score only since 2023), estimated weights would mostly be estimation error. Smith and Wallis (2009) use this to explain why simple averages often beat sophisticated weightings in practice.
  • Minimum coverage: a pulse is only produced if at least two series (Germany, USA) or three countries (euro area) have a z-score in the week and together carry at least half of the weight. Otherwise a single series would stand in for the pulse. If a series is missing, the code spreads its weight across the others.
  • Latest week: the last week in which this condition is met. The series are published at different speeds: the grid load up to yesterday, the toll data with a lag of five to twelve days, the continued claims one week after the initial claims. Values are not carried forward into later weeks.
  • Change: this week's pulse minus the pulse of the previous week or of four weeks earlier.
  • Reading in words: from +0.5 “above usual”, from +1 “well above usual”; from −0.5 downwards “below usual”, from −1 “well below usual”, and “within the usual range” in between. The boundaries ±0.5 and ±1 belong to the outer level in each case.

Worked example: one week in Germany

Freely chosen but realistic figures. The 7-day average of the toll index is 95.6, a year earlier it was 93.9. The median and MAD come from the 260 weeks before:

The same for the US, in a week without continued claims: the 4-week average of initial claims is 13.2% below the previous year (median +2.0%, MAD 6.0), job postings are 2.8% above it (median −6.0%, MAD 7.0).

Comparison with the Activity Index and the Weekly Economic Index

Both comparison indices are built more broadly. The Weekly Activity Index combines nine weekly indicators with monthly industrial production and GDP, and shows the trend-adjusted growth rate of the last 13 weeks against the 13 weeks before; the Weekly Economic Index combines ten series and is scaled to year-on-year GDP growth. Such indices stand in the tradition of factor models: Stock and Watson (2002) condense 215 macroeconomic series into a few indices using principal components, and Aruoba et al. (2009) measure business conditions with a dynamic factor model across series of mixed frequency.

The page shows both indices as a growth rate in percent and as a z-score, calculated as for the series of the pulse but without the year-on-year comparison. If the pulse and a comparison index diverge, it is worth looking at the individual series: in the US, the pulse consists only of labor market series, whereas the Weekly Economic Index also includes trade, industry and energy.

Data retrieval, timeliness and notes

  • Cache: all series of a region are retrieved at the same time and cached for 12 hours each. If a retrieval fails, the code uses the last stored data and labels it as such; if a series is missing entirely, the reason appears above the pulse and the remaining series keep being calculated.
  • Outdated: if the last value of a series lags more than 28 days behind the newest series of the region, the table marks it as outdated.
  • Grid load: values for the current day are not yet available. The code only uses completed days according to the German calendar.
  • Charts over time show the pulse from its first week (from 2005 at the earliest), the z-scores and the changes on the previous year; you can choose two years, five years or all.

Limitations

  • Relative to the usual: the z-score measures the deviation from the five years before. If a series has been falling for years, a further decline eventually counts as normal. That is why the page shows the percentage changes alongside.
  • Few, narrow series: in the euro area and the US, the pulse consists only of labor market series; consumption, industry and energy are missing there.
  • Revisions: the sources correct values after the fact, for example seasonally adjusted series with new seasonal factors; according to its own methodology, the Bundesbank revises the Activity Index. Earlier pulse values can therefore change.
  • Grid load: unadjusted; weather, public holidays, the clock change and electricity prices shift the comparison, and power from private solar installations is missing from the grid load.
  • Job postings only reflect the ads of one job board and depend on its market share.
  • No forecast: the pulse does not estimate GDP and does not predict anything about markets. It is a tool for context, not investment advice.

Frequently asked questions

What does a pulse of +1 mean?

On average, the series are growing by about one robust standard deviation more than was usual over the previous five years. From +1 the page calls this “well above usual”, from +0.5 “above usual”. A pulse of 0 does not mean standstill, but growth as usual.

Why does the pulse compare with 364 days earlier instead of the same date?

364 days are exactly 52 weeks, so the comparison is always with the same weekday. Otherwise a Monday with full truck traffic would be compared with a Sunday. Moving holidays such as Easter still shift the comparison; for the unadjusted grid load, the page points this out.

Why is the Bundesbank's Activity Index not part of the pulse?

It already contains toll and electricity consumption data. These series would appear twice in the pulse. That is why it is shown alongside for comparison, as is the Weekly Economic Index, which contains the unemployment insurance claims.

Why is the euro area pulse only a labor market pulse?

There are hardly any freely available daily or weekly series for the euro area as a whole. Job postings are available for six countries with 83% of GDP; they enter with their share of GDP.

Why is there no pulse in some weeks?

Because fewer than two series (three countries in the euro area) have a value, or together they carry less than half of the weight. This happens at the current edge, when only a few series have been published, and at the beginning of the history.

Literature

  1. Aruoba, S. Borağan; Diebold, Francis X.; Scotti, Chiara (2009): Real-Time Measurement of Business Conditions. Journal of Business & Economic Statistics 27 (4), pp. 417–427. doi:10.1198/jbes.2009.07205
  2. Askitas, Nikolaos; Zimmermann, Klaus F. (2013): Nowcasting Business Cycles Using Toll Data. Journal of Forecasting 32 (4), pp. 299–306. doi:10.1002/for.1262
  3. Bundesnetzagentur (2026): SMARD Strommarktdaten: Stromverbrauch – Gesamt (Netzlast), Tageswerte; Datennutzung. Bundesnetzagentur; Daten der Übertragungsnetzbetreiber über ENTSO-E, abgerufen am 27.10.2026. Source
  4. Deutsche Bundesbank (2026): Wöchentlicher Aktivitätsindex für die deutsche Wirtschaft (WAI), Zeitreihe BBDE1.W.DE.Y.WAI.A2N400000.A.N.R00.A und Methodik. Deutsche Bundesbank; abgerufen am 27.10.2026. Source
  5. Eraslan, Sercan; Götz, Thomas (2021): An unconventional weekly economic activity index for Germany. Economics Letters 204, pp. 109881. doi:10.1016/j.econlet.2021.109881
  6. Federal Reserve Bank of Dallas (2026): Weekly Economic Index (Lewis-Mertens-Stock), Daten 2008 bis heute. Federal Reserve Bank of Dallas (seit Dezember 2023, vorher New York Fed); abgerufen am 27.10.2026. Source
  7. Fezzi, Carlo; Fanghella, Valeria (2020): Real-Time Estimation of the Short-Run Impact of COVID-19 on Economic Activity Using Electricity Market Data. Environmental and Resource Economics 76 (4), pp. 885–900. doi:10.1007/s10640-020-00467-4
  8. Indeed Hiring Lab (2026): Indeed Job Postings Index (Datenarchiv auf GitHub, hiring-lab/data). Indeed Hiring Lab; Daten bis 16.10.2026, abgerufen am 27.10.2026. Source
  9. Lewis, Daniel J.; Mertens, Karel; Stock, James H.; Trivedi, Mihir (2022): Measuring real activity using a weekly economic index. Journal of Applied Econometrics 37 (4), pp. 667–687. doi:10.1002/jae.2873
  10. Ollech, Daniel (2021): Seasonal Adjustment of Daily Time Series. Journal of Time Series Econometrics 13 (2), pp. 235–264. doi:10.1515/jtse-2020-0028
  11. Rousseeuw, Peter J.; Croux, Christophe (1993): Alternatives to the Median Absolute Deviation. Journal of the American Statistical Association 88 (424), pp. 1273–1283. doi:10.1080/01621459.1993.10476408
  12. Smith, Jeremy; Wallis, Kenneth F. (2009): A Simple Explanation of the Forecast Combination Puzzle. Oxford Bulletin of Economics and Statistics 71 (3), pp. 331–355. doi:10.1111/j.1468-0084.2008.00541.x
  13. Statistisches Bundesamt (2026): Statistischer Bericht – Täglicher Lkw-Maut-Fahrleistungsindex (EVAS 42191), Datenstand 17.10.2026. Statistisches Bundesamt (Destatis), Deutsche Bundesbank, Bundesamt für Logistik und Mobilität (BALM); erschienen am 22.10.2026, abgerufen am 27.10.2026. Source
  14. Stock, James H.; Watson, Mark W. (2002): Macroeconomic Forecasting Using Diffusion Indexes. Journal of Business & Economic Statistics 20 (2), pp. 147–162. doi:10.1198/073500102317351921

Full bibliography

This page describes how Portfolio Lab calculates; past results are not a forecast. All terms in the glossary.