Aggregating an hourly series to daily makes the forecast look dramatically better, and the size of that improvement is exactly √24 under one assumption that is usually false. Working out how false it is for your series is a five-minute calculation and it decides whether coarsening is a real win or a cosmetic one.
The aggregation algebra
Model each hour as a level plus noise: value = μ + ε, where ε has standard deviation σ and, for now, is independent from hour to hour. A daily total is the sum of k = 24 of these.
signal: 24 hours × μ = 24μ
variance: Var(sum of 24 independent) = 24σ²
sd: σ√24 = 4.90σ
coefficient of variation, hourly: σ / μ
coefficient of variation, daily: 4.90σ / 24μ = 0.204 × (σ / μ)
The signal grows by k and the noise only by √k, so the relative error falls by √k: a factor of 4.90 for hourly-to-daily, 2.65 for daily-to-weekly (√7), and 5.29 for daily-to-monthly (√28). Aggregation is the cheapest accuracy improvement available and it involves no modelling at all. Which is precisely why a percentage-error figure quoted without its granularity is meaningless: the same forecaster on the same data can report 20% error hourly and 4% error daily.
What correlated noise does to it
The √k result required independence, and hourly forecast errors are not independent. If your model is missing a driver — an unusual weather day, a competitor’s promotion, a road closure — it misses it for the whole day, so every hour’s error leans the same way. With a common correlation ρ between hourly errors:
Var( sum of k ) = k·σ² · ( 1 + (k − 1)·ρ )
ρ = 0.0, k = 24: 24σ² × 1.0 = 24.0σ² sd = 4.90σ
ρ = 0.1, k = 24: 24σ² × 3.3 = 79.2σ² sd = 8.90σ
ρ = 0.3, k = 24: 24σ² × 7.9 = 189.6σ² sd = 13.77σ
ρ = 1.0, k = 24: 24σ² × 24 = 576.0σ² sd = 24.00σ
At ρ = 0.3 — a modest correlation, and lower than a typical shared-driver miss produces — the daily standard deviation is 13.77σ instead of 4.90σ. The improvement in coefficient of variation falls from 4.90× to 1.74×, which is most of the benefit gone. At perfect correlation there is no benefit at all: the daily error is 24 times the hourly one, exactly in proportion to the level, and the relative error is unchanged.
This is worth measuring rather than assuming, and it is easy to measure: take your hourly residuals, group them by day, and compute the average pairwise correlation within days. If it is near zero, aggregation is buying you the full √k. If it is 0.3, you have a missing daily-level driver and the productive move is to find that driver rather than to coarsen the output.
What you give up by coarsening
- The shape inside the period. A daily total cannot staff a shift. If the decision is “how many people at 6pm” then the intra-day profile is the answer and aggregating away is not available, however much it flatters the error metric.
- Data volume for the model. Three years is 26,280 hourly points, 1,095 daily points, or 156 weekly points. That last number is a serious constraint — 156 observations will not identify a seasonal ARIMA with any confidence, and it is barely two cycles of an annual pattern.
- Responsiveness to a change. A level shift is visible within a few hourly observations and takes weeks to establish itself in weekly data. If you need to detect structural breaks quickly, the fine series is where you detect them, even if you forecast the coarse one.
- The zeros come back at fine granularity. A SKU selling three units a day is a healthy daily series and an intermittent hourly one, with all the metric problems that brings. Granularity determines whether you have an intermittent demand problem.
Cutting the other way: a fine granularity multiplies the number of steps in the horizon. A one-week-ahead decision is 1 step weekly, 7 steps daily and 168 steps hourly, and the error growth over 168 steps is a different regime from the growth over 7 — the arithmetic is on long-horizon forecast error. Forecasting hourly for a week ahead means asking a model to be accurate 168 steps out, which is the hardest version of the problem you could have chosen for that decision.
Fine granularity means nested seasonality
An hourly retail or utility series has at least three seasonal periods running at once: 24 hours in a day, 168 hours in a week, and roughly 8,766 hours in a year. Weekly data has one, or none. That difference rules out a whole class of models.
A seasonal ARIMA takes exactly one seasonal period. Handed hourly data it can model the daily cycle or the weekly one, not both, and whichever it does not model stays in the residual and shows up as autocorrelation that violates the model’s own assumptions — which then makes its prediction intervals wrong, not just its point forecasts. The methods built for this case represent multiple seasonalities explicitly: MSTL runs a seasonal-trend decomposition once per period, TBATS uses trigonometric terms per period, and a regression-style model can take Fourier terms at each period as covariates. If you commit to hourly data, you have committed to one of these.
A further trap: at hourly granularity, daylight saving transitions give you a 23-hour day and a 25-hour day once a year each, and any code that assumes 24 rows per day will silently misalign every subsequent observation. Store timestamps in UTC and derive local hour as a covariate. This costs nothing to do up front and is unpleasant to fix after a year of history has been indexed the wrong way.
Forecasting at more than one granularity
Where different decisions need different granularities, the tempting approach is to forecast at the finest and sum up. It works, and it throws away the accuracy advantage the coarse level had: the summed hourly forecast inherits the hourly model’s errors, correlations and all, and will typically be worse at the daily level than a model fitted on daily totals.
Forecasting each level independently has the opposite problem — the numbers do not add up, and a planner who notices that the daily forecasts sum to something other than the weekly one will stop trusting all of them. The systematic resolution is temporal reconciliation: forecast at several granularities, then project the whole set onto the space of coherent forecasts. The projection is a least-squares step that uses information from every level, so the reconciled forecasts are usually more accurate at every level than any of the originals, not merely consistent. That is the same machinery as hierarchical reconciliation, applied down the time axis instead of across a product hierarchy.
If you take one rule from this page: pick the granularity from the decision, not from the data you happen to have. Then check whether the aggregation you are relying on is actually buying you √k, or whether a correlated missing driver has quietly taken most of it back.
Top comments (0)