← Writing

Research · · 10 min

A forecast should know what a product is

For a fashion retailer, the catalogue changes every season. When the autumn collection lands, most products on the shelf have never been sold before, and the same happens again in spring. The quantities for each collection are bought months ahead, but how that stock is split between the stores and the online fulfilment centre is decided week by week as sales come in.

Take two new products: wool gloves launched in late November and leather sandals launched in late May. A week after launch, their sales look alike. What can the planner say about the weeks ahead? Figure 1 sums up the problem. To answer, the forecast has to know what each product is: a new pair of wool gloves or a new model of sandals.

Forecasters call such product characteristics static covariates. They belong to a series and do not change over time, like a product’s category, brand, price tier or collection.

How to spot a static covariate? Its value never changes for a given product.

SalesDateCategorySKU-ID
41 DecGlovesGL-0417
32 DecGlovesGL-0417
53 DecGlovesGL-0417
111 DecSandalsSA-1288
92 DecSandalsSA-1288
103 DecSandalsSA-1288
…………

At The Forecasting Company we build t0, a foundation model for time series, and the catalogues our retail customers send us carry more columns of this kind than of sales. To see what forecasting models do with them, we built a simulated catalogue of gloves and sandals and asked each model to forecast the new products.

01 / The catalogue
Two years of an established glove and an established sandal
Established product: over a year of sales, so at least one past peak. New product: one week of sales.
Typical glove salesTypical sandal sales
Daily units soldnew product (sandals)new product (gloves)New glove product?initial salesNew sandal product?initial salesAprJulOctJanAprJulOctJan
Touch or hover for the weekly average of daily sales.
Figure 1. Top: weekly average daily sales of one established glove and one established sandal over two years. Below, on the same time axis: a new glove product and a new sandal product, each with one week of sales and eight weeks to forecast. The catalogue is simulated, so the future is known.

What the public models can do

Cross-learning

We tested three public foundation models, Chronos-2, TimesFM 3 and Timestral, and the public release of our own model, t0-gamma. None of them has to read a product’s sales alone. They accept extra rows of inputs known in advance, and they can forecast several series together, each able to attend to the others, which is called cross-learning. In every forecast here we gave them the day of the week and the time of year as extra rows. What none of them has is an input for a fixed fact about a product, such as its category.

The simulated catalogue

In our experiment, each simulated product has its own usual sales, the amount it sells on a normal day outside its season, with a small weekly rhythm and some day-to-day noise: a third are slow sellers at about 3 pairs a day, a third sell about 10 and a third about 30. A product’s seasonality depends on its category: gloves climb to about three times their usual sales around New Year, sandals around early July, and both are back to normal about a month either side of the peak. The seasons are the same every year.

Established product: over a year of sales, so at least one past peak.

We simulated 400 established products, half gloves and half sandals, and 200 new ones: 50 new glove products and 50 new sandal products launched in late November, and as many launched in late May, with slow, medium and fast sellers in equal shares in every group.

Two jobs

A new product’s first week shows its usual level, but nothing about its season. So the forecaster has two jobs: read the level from that first week, then multiply it by the seasonal curve its category follows over the coming weeks. The first job only needs the sales. The second needs the category.

From a week of sales and the calendar, all four models get the first job right and miss the second. They forecast a flat line at each product’s first-week level for the next eight weeks, for new glove and sandal products alike (Figure 5). Around the peak, customers buy three to four times that.

The same holds across all 200 new products. Over the peak weeks, the four models forecast about a third of what products heading into their season actually sell, for slow and fast sellers alike.

That is a reasonable answer to the question these models were asked. In our catalogue the only difference between a glove and a sandal is when its season peaks, and a week of sales cannot show that. The date alone does not say which season this product follows either, so a sensible forecast stays near the level it has seen. Any better answer has to come from somewhere else.

Adding category rows

Cross-learning suggests a workaround. Put established products from the catalogue in the same forecast, and add each product’s category as one more row.

Simply adding static rows does not work: these models rescale every row by its own average before reading it, so a category repeated on every day becomes a row of zeros. To give the idea a fair chance, we also encoded each category as a row that alternates between two values, which survives the rescaling. We then forecast each of the 200 new products together with 8 established gloves and 8 established sandals, every one of them carrying its category row.

How we score

To score a forecast, we take how far its median falls from actual sales over the product’s peak weeks, as a share of what the product sold, and average that over products so that slow and fast sellers count the same.

02 / Category rows or same-category products
Category rows added to the mixed catalogueOnly same-category products, picked by us
t0-gamma
Category rows0.3%
Same category0.4%
Chronos-2
Category rows0.0%
Same category0.3%
TimesFM 3
Category rows1.1%
Same category0.8%
Timestral
Category rows-0.2%
Same category2.7%
Touch or hover a bar for its value and 95% interval.
Error reduction on the peak weeks, % · whiskers: 95% interval over 200 new products · scale −1% to +10%
Figure 2. Change in forecast error over each product's peak weeks, against forecasting the same new product with the same 16 established products and no category rows. Grey: category rows added for all 17 products. Green: the 16 products replaced by 16 of the new product's own category, chosen by us. Whiskers show 95% intervals over 200 new products, half gloves and half sandals, launched in late May or late November, each with a week of sales. Compare bars within a model, not across models.

The category rows barely changed anything: t0-gamma, Chronos-2 and Timestral moved by 0.3% or less, and TimesFM 3 improved by 1.1%.

The reason lies in how cross-learning works. Every row in a joint forecast can attend to every other row, and nothing marks which rows belong together. The model sees 17 sales histories and 17 category rows, but no part of its input says that this category row describes that history.

Grouping by hand

The obvious workaround is to do the matching for the model, and forecast each new product only with 16 products of its own category. That barely helps either: error fell 0.4% for t0-gamma, 0.3% for Chronos-2, 0.8% for TimesFM 3 and 2.7% for Timestral. With or without the right products beside them, the forecasts stay flat near the usual level (Figure 5). Timestral widens its range toward the peak, but its median stays at the usual level, about a third of the true peak. With 16 products picked this way, the season still does not show up in the forecast.

The workaround also assumes that the other products’ histories line up with the new product’s calendar. In this simulation they do by construction: the established products sold over the same dates, so their last peak sits exactly one year before the coming one. With products from earlier seasons, someone would first have to shift their histories by the right amount, which means knowing the length and timing of the season in advance.

More products of the right category

Adding more products of the right category keeps helping only Timestral (Figure 3). With all 200 established products of its category in the forecast, its error is 22% below forecasting the new product alone, and its forecast for the peak weeks rises to about half of actual sales. t0-gamma and Chronos-2 gain less than 1%. TimesFM 3 gains about 6% as soon as any two products join, and little more after that.

03 / More same-category products
t0-gammaChronos-2TimesFM 3TimestralInternal t0-gamma, reads the category
Error reduction on the peak weeksinternal t0-gamma: 73.6%alone248163264128200
Touch or hover for each model's gain and 95% interval.
Error reduction on the peak weeks vs the same model forecasting the new product alone · x: same-category established products in the forecast · bands: 95% interval over 199 new products
Figure 3. Change in forecast error over each product's peak weeks as more established products of the new product's category join its forecast, against the same model forecasting the new product alone. Each set contains the smaller ones. Bands show 95% intervals over 199 new products; one product is left out because TimesFM 3's forecast for it breaks down when it is forecast alone. Dashed: internal t0-gamma, which reads each product's category.

Timestral’s gain comes at a price. It needs dozens to hundreds of products that someone has already grouped by the right attribute, and even then it reaches about a third of what one label per product achieves. Real catalogues also rarely split along a single attribute. Price sensitivity may depend on brand and price tier together, and the weekly pattern on the store, so no single grouping of the catalogue serves every effect. Each attribute added also splits the catalogue into smaller groups, until few products share every attribute with the new one. In practice, gathering hundreds of established products that share the right pattern, just so the model can learn that this product is a glove, is rarely an option.

Each product carries its own label

Internal t0-gamma, the version of t0 we are working on now, gives every series its own input for static attributes. Each product’s category is attached to the sales history it describes before any series attends to another, so a label cannot drift to the wrong product. To measure what that is worth, we compare internal t0-gamma, reading the sales and the category, with public t0-gamma reading the same sales, on the same products and dates.

04 / Reading the category
Public t0-gamma, sales onlyInternal t0-gamma, sales and category
All 200 new products74% less error
Public40%
Internal11%
Slow sellers, about 3 a day75% less error
Public40%
Internal10%
Medium sellers, about 10 a day73% less error
Public41%
Internal11%
Fast sellers, about 30 a day73% less error
Public39%
Internal11%
Heading into their season84% less error
Public69%
Internal11%
Heading out of their season7% less error
Public11%
Internal10%
Touch or hover a bar for its exact value.
Forecast error on the peak weeks, % of sales · lower is better · internal t0-gamma: average of three runs · simulated products
Figure 4. Forecast error over each product's peak weeks, as a share of sales, for public t0-gamma, from sales only, and internal t0-gamma, from sales and category, on the same 200 new products with a week of sales. Internal t0-gamma is the average of three runs. Lower is better.

Same week of sales. With the category, every new product’s forecast climbs to its peak from its own level.

Internal t0-gamma does both jobs. For products heading off season, its forecast stays flat at each product’s own level, within 2% of actual sales for slow, medium and fast sellers. For products heading into their season, it rises and falls in the right weeks and reaches about 95% of the true peak, where public t0-gamma stays at the usual level. Across the 200 new products, error falls 74% against public t0-gamma: 84% for products heading into their season, 8% for those heading out of it, and 73 to 75% for slow, medium and fast sellers alike.

05 / Every model's forecast
Observed salesWhat customers boughtt0-gammaChronos-2TimesFM 3TimestralInternal t0-gamma, category read
Slow-selling new glove product · late November
Daily units soldForecast →launch + 7 days+56 days
Touch or hover for daily sales and each model's median forecast.
Fast-selling new glove product · late November
Daily units soldForecast →launch + 7 days+56 days
Touch or hover for daily sales and each model's median forecast.
Slow-selling new sandal product · late May
Daily units soldForecast →launch + 7 days+56 days
Touch or hover for daily sales and each model's median forecast.
Fast-selling new sandal product · late May
Daily units soldForecast →launch + 7 days+56 days
Touch or hover for daily sales and each model's median forecast.
Lines are median forecasts. Each panel has its own scale. Internal t0-gamma forecasts each product alone in both views, averaged over three runs of the model.
Figure 5. Every model's median forecast for a slow- and a fast-selling new glove product and new sandal product, against what customers bought. The public models forecast with 16 established products of the right category picked by us, or from sales alone. Internal t0-gamma reads each product's category.

Because each label rides with its own series, it keeps working when other products share the forecast. In the mixed catalogue of Figure 2, with every product carrying its own category, internal t0-gamma’s error is 72% below public t0-gamma’s in the same catalogue, about the same gap as for products forecast alone.

What this means for a merchandiser

The public models we tested can take a catalogue as context, but they cannot tell which description belongs to which product. They help only when someone has already grouped the products by the attribute that matters, which is the knowledge the forecast was meant to supply. Internal t0-gamma keeps each product’s attributes with that product. The aim is that a buyer sends the catalogue as it is, with category, brand and price tier as columns, and the forecast reads them for each new product from its first day.