Skip to main content

Forecast Algorithms

Tether generates demand forecasts using 11 statistical algorithms, each designed for different demand patterns and business requirements. Every algorithm operates on individual SKU-channel combinations independently, using only the historical sales data for that specific pair.
All algorithms support runtime parameter configuration. Seven of the 11 algorithms also support automatic parameter optimization to find the best settings for each SKU-channel combination.

Algorithm overview

In addition, the Consensus Model is a special model type where forecast values are entirely user-defined rather than algorithm-generated.

Rolling Average

The Rolling Average computes the simple arithmetic mean of daily sales over a historical window. It produces a flat forecast value that reflects average recent demand. How it works:
  1. Look back over the configured window (e.g., 90 days before the forecast date).
  2. Sum all sales quantities within that window — days with no sales count as zero.
  3. Divide by the window size to get the average daily demand.
When to use it: Products with stable, predictable demand that does not exhibit strong trends or seasonality.

Implementations

The default general-purpose algorithm. Computes a non-recursive average — each forecast date receives the same value based on the historical window.Type ID: rolling_average Supports optimization: No
Window size trade-off: Larger windows (120+ days) produce more stable forecasts but react slowly to demand shifts. Smaller windows (30–60 days) are more responsive but more volatile.

Exponentially Weighted Moving Average (EWMA)

EWMA applies exponential weighting to historical data, giving more importance to recent observations while still considering the full window. The most recent day always has the highest weight (1.0), and each day further back is weighted by a decay factor. How it works:
  1. Look back over the configured window (default 60 days).
  2. Assign each day a weight: decay_factor^(distance_from_most_recent_day).
  3. Multiply each day’s sales by its weight, sum the weighted values, and divide by the total weight sum.
When to use it: Products experiencing trend shifts or where recent sales are a better indicator of future demand than older data. Type ID: weighted_recent Supports optimization: Yes (Nelder-Mead)
A weight_factor of 0.7 emphasizes the last 2–3 weeks heavily. A value of 0.9 spreads weight more evenly across the window.

Linear Trend

Uses least-squares linear regression over a historical window to project a growth or decline trend forward. How it works:
  1. Fit a straight line (slope + intercept) through the daily sales data in the window.
  2. Project the trend line to the forecast date.
  3. If the projected value is negative, clamp it to zero.
When to use it: Products with a consistent upward or downward trajectory — for example, a product gaining market share steadily over time. Type ID: simple_trend Supports optimization: No
Linear Trend assumes demand follows a straight line. It is sensitive to outliers and can produce unrealistic projections if demand is cyclical rather than linear.

Simplified Seasonal

Combines monthly and weekly seasonal patterns with configurable weights to capture recurring demand cycles. This algorithm uses a streamlined approach — it does not model day-of-week patterns, which reduces noise and improves stability. How it works:
  1. Extract monthly seasonal patterns (same month-of-year across prior years).
  2. Extract weekly seasonal patterns (same ISO week-of-year across prior years).
  3. Blend the two components: forecast = (weekly × weight) + (monthly × weight).
If fewer than 365 days of history are available, the algorithm automatically falls back to a 90-day Rolling Average. Weights are normalized to sum to 1.0 during optimization. Type ID: seasonal_moving_average Supports optimization: Yes (Nelder-Mead) Minimum history: 365 days (falls back to Rolling Average with less)

Simple Seasonal with Trend Adjustment

Builds on Simplified Seasonal by adding a growth factor that blends observed year-over-year trends with a planned growth assumption. Near-term forecasts emphasize observed performance, while longer-horizon forecasts shift toward the planned growth rate. How it works:
  1. Calculate the seasonal baseline using monthly (50%) and weekly (50%) components.
  2. Compute the observed year-over-year trend from the recent observation window.
  3. Blend the observed trend with the configured planned growth rate, adjusting the blend based on how far into the forecast horizon each date falls.
  4. Apply a confidence scale based on history length:
    • Less than 365 days → falls back to Rolling Average
    • 365–729 days → 50% confidence
    • 730+ days → full confidence
Type ID: simple_seasonal_with_trend Supports optimization: Yes (Nelder-Mead) Minimum history: 365 days

Seasonal Year-over-Year Growth

Combines seasonal patterns with the observed year-over-year growth rate. Similar to Simplified Seasonal in its use of weekly and monthly components, but it also calculates and applies the actual YoY growth factor from historical data. How it works:
  1. If only 1–2 years of data exist, synthesize a “year 0” by duplicating the first year backward.
  2. Calculate the seasonal baseline using weekly (80%) and monthly (20%) pattern averages.
  3. Calculate the year-over-year growth factor for the forecast period.
  4. Apply growth: forecast = seasonal_baseline × (1 + growth_rate).
Weights are normalized to sum to 1.0 during optimization. Type ID: seasonal_yoy_growth Supports optimization: Yes (Nelder-Mead) Minimum history: 365 days

Rolling Momentum

Detects acceleration or deceleration in demand by comparing short-term performance against long-term performance, then projects that momentum forward. How it works:
  1. Calculate the trailing 30-day average (short-term) and the trailing 90-day average (long-term).
  2. Compute a momentum ratio: M = short-term average / long-term average.
    • M > 1.0 → demand is accelerating.
    • M < 1.0 → demand is decelerating.
    • M = 1.0 → demand is stable.
  3. Convert the momentum ratio into a daily compound growth rate.
  4. Apply a sensitivity factor to control how strongly to react to the detected momentum.
  5. Project forward using exponential growth: forecast = long_term_avg × (1 + adjusted_growth)^days_ahead.
  6. Cap the daily growth rate to prevent unrealistic projections.
Type ID: rolling_momentum Supports optimization: Yes (Nelder-Mead) Minimum history: 90 days
Given a 90-day average of 1.22 units/day and a 30-day average of 1.67 units/day with sensitivity at 0.5:

Holt-Winters (Triple Exponential Smoothing)

A classic time series method that decomposes demand into three components — level, trend, and seasonality — and updates each independently. Tether uses the multiplicative seasonal variant with a 52-week seasonal period. How it works:
  1. Initialize level, trend, and 52 weekly seasonal factors from historical data.
  2. For each period, update:
    • Level: the baseline demand value, smoothed by α.
    • Trend: the rate of growth/decline per period, smoothed by β.
    • Seasonality: weekly multiplicative factors, smoothed by γ.
  3. Project forward: forecast = (level + horizon × trend × φ^h) × seasonal_factor.
  4. The damping factor (φ) prevents unrealistic long-term trend extrapolation.
If only 1–2 years of data exist, the algorithm synthesizes a “year 0” by duplicating the first year backward to initialize seasonal factors. Type ID: holt_winters Supports optimization: Yes (Nelder-Mead) Minimum history: 365 days

SARIMA

Seasonal AutoRegressive Integrated Moving Average. A powerful statistical method that models both trend and seasonal patterns through differencing and autoregressive/moving-average components. Model notation: SARIMA(p, d, q)(P, D, Q)[s] How it works:
  1. Apply seasonal differencing to remove yearly patterns.
  2. Apply non-seasonal differencing to remove trends.
  3. Fit an ARIMA model to the differenced series.
  4. Generate forecasts and integrate back to the original scale.
  5. Apply trend dampening to prevent unrealistic long-term extrapolation.
Type ID: sarima Supports optimization: Yes (Grid Search — because ARIMA orders must be integers) Minimum history: 365 days
SARIMA uses Grid Search optimization instead of Nelder-Mead because the order parameters (p, d, q, P, D, Q) are discrete integers. Grid Search tests all combinations within the allowed ranges to find the best fit.

Static Baseline

Static Baseline directly uses uploaded forecast values without any calculation or algorithmic adjustment. It is not a forecasting algorithm in the traditional sense — it is a mechanism for importing external forecasts into Tether. How it works:
  1. Look up the uploaded baseline data for the specified label.
  2. For each forecast date, return the baseline value for that SKU-channel-date combination.
  3. No calculations, transformations, or adjustments are applied.
  4. Dates without uploaded baseline data produce no forecast output.
Type ID: static Supports optimization: No Parameters: None Use cases:
  • Import forecasts from external systems or spreadsheets
  • Use forecast data provided by customers or partners
  • Upload manually curated values for specific products or time periods
  • Bring in historical forecast data from legacy systems
The Static Baseline model requires uploaded baseline data. You must set input_source_type to baseline and specify a baseline_label when creating the model. Forecasts are only generated for dates where baseline data has been uploaded.

Consensus Model

The Consensus Model is a special model type where all forecast values are entered directly by users. Unlike the other algorithms, it does not perform any statistical calculations — it serves as a manual-input forecast that you can edit, adjust, and compare alongside algorithm-generated forecasts. The Consensus Model is typically used for collaborative demand planning where human judgment drives the final forecast numbers. You can enter values at any level of the product or time hierarchy, and the system distributes edits to individual SKU-time cells following the edit distribution rules. For details on how to enter and adjust Consensus Model values, see Forecast editing.

Parameter optimization

Tether can automatically find the best parameter values for each algorithm by testing them against historical data. This process is called parameter optimization (or auto-tune).

How optimization works

1

Split historical data

Historical sales data is split into a training set (80%) and a validation set (20%).
2

Search for best parameters

The optimizer adjusts algorithm parameters to minimize forecast error on the training data.Two optimization methods are used depending on the parameter type:
  • Nelder-Mead Simplex — for algorithms with continuous parameters (floats). Iteratively adjusts parameters to converge on the minimum error.
  • Grid Search — for algorithms with discrete parameters (integers). Tests all combinations within specified ranges. Currently used only by SARIMA.
3

Validate and store

The best parameters are evaluated against the validation set to confirm they generalize well. Optimized parameters are stored per SKU-channel combination.

Error metrics

The optimizer can minimize any of three error metrics:

Which algorithms support optimization?


Algorithm selection guide

Use this guide to choose the right algorithm based on your data patterns.
Start with Simplified Seasonal for straightforward seasonal products. If your products also exhibit year-over-year growth, use Seasonal YoY Growth or Simple Seasonal with Trend Adjustment. For complex patterns with both trend and seasonality, Holt-Winters offers the most flexibility.
Use Rolling Momentum for products experiencing demand acceleration (e.g., viral products) or deceleration (e.g., declining items). Tune the sensitivity parameter to control how aggressively the forecast reacts to momentum.
Use SARIMA for data with complex autoregressive and seasonal patterns. SARIMA is the most powerful algorithm but requires at least one year of history and is computationally intensive. Use Grid Search optimization to find the best order parameters.
Use Static Baseline to import forecasts from external systems, spreadsheets, or partner-provided data. Use the Consensus Model when human judgment should drive the forecast entirely.

Parameter tuning tips

Next steps

Forecast Admin

Configure model selection and parameters

Forecast Comparison

Compare algorithm performance side by side

Forecast Editing

Edit forecast values and work with the Consensus Model

Forecast Dashboard

View your forecasts and track accuracy