FORECAST.ETS: Time Series Forecasting with Seasonality

FORECAST.ETS Time Series Forecasting with Seasonality Feature Image for the tutorial blog

Most sales data follows a pattern: higher in December, slower in January, up again in spring. A simple average or trend line ignores that rhythm entirely. FORECAST.ETS accounts for it. It uses Exponential Triple Smoothing — an algorithm that separates trend from seasonal cycles and projects both forward. The result is a seasonally-aware forecast — it rises and falls with the cycle, not one that treats every future period as identical.

This guide covers the complete FORECAST.ETS function family: FORECAST.ETS for point forecasts, FORECAST.ETS.CONFINT for confidence intervals, FORECAST.ETS.SEASONALITY to detect cycle length automatically, and FORECAST.ETS.STAT to inspect the model’s internal parameters. Six practical examples cover building a seasonal forecast, adding uncertainty bands, detecting seasonality, validating the model, and handling gaps.

Availability: FORECAST.ETS and its companion functions are available in Excel 2016 and all later versions, including Microsoft 365, Excel 2024, 2021, and 2019. They also work in Google Sheets. These functions are not available in Excel 2013 or earlier.

What Is Exponential Smoothing?

Exponential smoothing is a forecasting method that weights recent observations more heavily than older ones. The “exponential” name refers to how weights decrease as data gets older. Last month matters more than six months ago. Six months ago matters more than two years ago. Simple exponential smoothing handles level only. Double smoothing adds a trend component. Triple smoothing — also called Holt-Winters — additionally adds a seasonal component, and that is exactly what FORECAST.ETS implements.

Excel’s implementation uses the AAA variant: Additive errors, Additive trend, and Additive seasonality. This means the seasonal pattern is added on top of the trend line rather than multiplied by it. The additive model works best when seasonal peaks and troughs are roughly the same size regardless of the trend level. When seasonal swings grow proportionally with the trend, a multiplicative model is more appropriate. However, that requires tools outside Excel.

What Functions Are in the FORECAST.ETS Family?

FunctionWhat it returnsWhen to use it
FORECAST.ETSA point forecast value for a future target datePrimary forecasting function. Use for any date or array of dates beyond the historical data.
FORECAST.ETS.CONFINTThe half-width of the confidence interval at a given target dateAdd and subtract from FORECAST.ETS to get the upper and lower bounds of the forecast range.
FORECAST.ETS.SEASONALITYThe detected season length (e.g. 12 for monthly with annual cycles)Let Excel detect the cycle length automatically, then use the result as the seasonality argument.
FORECAST.ETS.STATA specific statistic about the fitted model (alpha, beta, gamma, MAPE, etc.)Inspect model quality and smoothing parameters after fitting.

What Is the Syntax for FORECAST.ETS?

=FORECAST.ETS(target_date, values, timeline, [seasonality], [data_completion], [aggregation])
ArgumentRequired?What it does
target_dateRequiredThe date or number to forecast. Can be a single date or an array of future dates. Must be consistent with the timeline interval (e.g., monthly if the timeline is monthly).
valuesRequiredThe historical values to fit the model to. A column of numbers — sales, units, revenue, any numeric time series. Cannot be empty.
timelineRequiredThe dates or time steps corresponding to the values. Must be evenly spaced. Excel accepts small gaps and fills them using the data_completion argument.
seasonalityOptionalThe length of one seasonal cycle. 1 = no seasonality. 0 = auto-detect (default). 12 = annual pattern in monthly data. 4 = annual pattern in quarterly data. Maximum value is 8,760.
data_completionOptionalHow to handle missing timeline points. 1 = interpolate missing values (default). 0 = treat missing as zero.
aggregationOptionalHow to aggregate duplicate timestamps. 1 = AVERAGE (default). Other options: 2=COUNT, 3=COUNTA, 4=MAX, 5=MEDIAN, 6=MIN, 7=SUM.
Seasonality argument shortcut: Leave seasonality as 0 (or omit it) to let Excel detect the cycle length automatically. For well-behaved monthly data with annual patterns, auto-detection reliably returns 12. For quarterly data it returns 4. For weekly data it returns 52. You can also use FORECAST.ETS.SEASONALITY to see the detected value before committing it to the main formula.

Examples 1–4: Core Forecasting Patterns

1
Basic seasonal forecast — predict the next 12 months

The fundamental use is passing historical dates and values to FORECAST.ETS with a future target date. The function fits a seasonal model to the history and returns the predicted value for the requested period. Using an array of future dates in target_date produces a full forecast column automatically — no copy-paste required in Excel 365.

Month (A)
Sales (B)
Forecast date (D)
Forecast (E)
Jan 2022 – Dec 2023
Historical
Jan 2024
1,842
Feb 2024
1,610
Dec 2024
2,204
Historical data: A2:A25 = dates (Jan 2022 – Dec 2023), B2:B25 = monthly sales. Future dates to forecast: D2:D13 = Jan 2024 – Dec 2024. Single point forecast — one future date in D2: =FORECAST.ETS(D2, $B$2:$B$25, $A$2:$A$25) → Predicted sales for January 2024 Array of 12 future forecasts — enter in E2 in Excel 365 and spill: D2:D13 = Jan 2024 – Dec 2024. Results spill into E2:E13 automatically. =FORECAST.ETS(D2:D13, $B$2:$B$25, $A$2:$A$25) → Full 12-month forecast column in one formula With explicit seasonality = 12 (annual cycle in monthly data): Omit seasonality or use 0 to auto-detect. Use 12 to force annual cycles. =FORECAST.ETS(D2, $B$2:$B$25, $A$2:$A$25, 12) → Same result as auto-detect when history has clear annual patterns
2
Confidence intervals — upper and lower forecast bounds

A point forecast alone is incomplete. Every prediction carries uncertainty, and that uncertainty grows with distance from the last observation. FORECAST.ETS.CONFINT returns the half-width of the confidence interval. Add it for the upper bound, subtract it for the lower bound. The confidence level argument controls how wide the interval is.

Date
Point forecast
Lower bound (95%)
Upper bound (95%)
Jan 2024
1,842
1,620
2,064
Jun 2024
1,975
1,688
2,262
Dec 2024
2,204
1,842
2,566
E2 = point forecast = FORECAST.ETS(D2, $B$2:$B$25, $A$2:$A$25). CONFINT returns the half-width — not the full interval. confidence_level = 0.95 means 95% confidence (the standard choice). Half-width of the 95% confidence interval: =FORECAST.ETS.CONFINT(D2, $B$2:$B$25, $A$2:$A$25, 0.95) → 222 (the interval extends 222 units above and below the point forecast) Lower bound — point forecast minus half-width: E2 - =FORECAST.ETS.CONFINT(D2, $B$2:$B$25, $A$2:$A$25, 0.95) → 1,620 Upper bound — point forecast plus half-width: E2 + =FORECAST.ETS.CONFINT(D2, $B$2:$B$25, $A$2:$A$25, 0.95) → 2,064 Use 0.80 for a tighter interval. Use 0.99 for a wider one. The interval grows for dates further into the future — this is expected.
3
Detecting seasonality — FORECAST.ETS.SEASONALITY

Before committing to a seasonality value, use FORECAST.ETS.SEASONALITY to let Excel report what it detects in the data. The function returns the length of one seasonal cycle as an integer. For monthly retail data this is typically 12. For quarterly revenue data it is typically 4. You can then pass this result directly as the seasonality argument in FORECAST.ETS to ensure consistency.

A2:A25 = dates, B2:B25 = values (2 years of monthly data). Detect the seasonal cycle length automatically: =FORECAST.ETS.SEASONALITY(B2:B25, A2:A25) → 12 (annual cycle detected in monthly data) Store the result in D2. Then reference D2 in FORECAST.ETS: This keeps the seasonality consistent across the whole forecast sheet. =FORECAST.ETS(E2, $B$2:$B$25, $A$2:$A$25, $D$2) → Forecast using the auto-detected season length stored in D2 Common detected values and their meaning: • 12 → annual pattern in monthly data • 4 → annual pattern in quarterly data • 52 → annual pattern in weekly data • 7 → weekly pattern in daily data • 1 → no seasonality detected (trend only)
4
Model statistics — FORECAST.ETS.STAT for validation

FORECAST.ETS.STAT exposes the model’s internal parameters and accuracy metrics. The statistic_type argument selects which value to return. Alpha controls how fast the model responds to level changes. Beta controls trend sensitivity. Gamma controls seasonal adjustment speed. MAPE — Mean Absolute Percentage Error — is the most useful accuracy metric for business reporting.

statistic_type
What it returns
Typical range
1 (Alpha α)
Level smoothing. Higher = responds faster to recent changes
0 to 1
2 (Beta β)
Trend smoothing. Higher = reacts faster to trend shifts
0 to 1
3 (Gamma γ)
Seasonal smoothing. Higher = seasonal pattern updates faster
0 to 1
6 (RMSE)
Root Mean Square Error — in original data units
Lower is better
7 (MAE)
Mean Absolute Error — average absolute forecast miss
Lower is better
8 (MAPE)
Mean Absolute Percentage Error — error as % of actual
<10% = good fit
Retrieve model accuracy (MAPE = statistic_type 8): MAPE below 10% indicates a well-fitting model for most business datasets. =FORECAST.ETS.STAT(B2:B25, A2:A25, 8) → 0.047 (4.7% average error — good fit) Format MAPE as a readable percentage: =TEXT(=FORECAST.ETS.STAT(B2:B25, A2:A25, 8), "0.0%") → "4.7%" Alpha — how responsive the model is to level changes: =FORECAST.ETS.STAT(B2:B25, A2:A25, 1) → Alpha near 1 = model updates quickly (volatile data). Alpha near 0 = model relies heavily on history (stable data). RMSE — error in original units (useful for comparing models): =FORECAST.ETS.STAT(B2:B25, A2:A25, 6)

Examples 5 and 6: Applied Forecasting Scenarios

Forecast Charts and Missing Data Handling

5
Forecast chart — historical data plus forecast with confidence band

A forecast is most useful when visualised alongside the historical data it was fitted to. The standard layout uses three forecast columns (point forecast, lower bound, upper bound) alongside the historical values in a line chart. Excel’s built-in Forecast Sheet (Data tab → Forecast Sheet) generates this layout automatically. Building it manually gives more control over the date range and confidence level.

Layout for a forecast chart: Column A = all dates (historical + future). Column B = historical values (blank for future rows). Column C = forecast values (blank for historical rows). Column D = lower bound (blank for historical rows). Column E = upper bound (blank for historical rows). Historical rows (A2:B25 filled, C2:E25 blank): B2:B25 = actual sales data. C2:E25 = left empty. Forecast rows (A26 onwards, B blank, C/D/E filled): Point forecast in C26: =FORECAST.ETS(A26, $B$2:$B$25, $A$2:$A$25) Lower bound in D26: C26 - =FORECAST.ETS.CONFINT(A26, $B$2:$B$25, $A$2:$A$25, 0.95) Upper bound in E26: C26 + =FORECAST.ETS.CONFINT(A26, $B$2:$B$25, $A$2:$A$25, 0.95) Copy rows 26–37 down for a 12-month forecast. Select all five columns (A2:E37) and insert a Line chart. Format the confidence band columns as dashed lines or an area fill.
Excel’s built-in Forecast Sheet (Data → Forecast Sheet) automates this entire layout. It lets you set the end date, confidence level, and seasonality in a dialog, then inserts the chart and data table automatically. Use the manual approach when you need custom confidence levels or want to integrate the forecast into an existing dashboard.
6
Handling missing data — gaps and irregular timelines

Real datasets often have missing months, skipped periods, or irregular gaps. FORECAST.ETS handles minor gaps automatically when data_completion = 1 (the default). It interpolates the missing values internally before fitting the model. For intentionally excluded periods, set data_completion = 0 to treat missing points as zero. Note that this usually degrades forecast quality.

A2:A24 = dates with a gap (March 2023 is missing from the timeline). B2:B24 = values (23 rows instead of 24). Default handling — data_completion = 1 (Excel interpolates the gap): This is the recommended approach for single missing periods. =FORECAST.ETS(D2, B2:B24, A2:A24, 0, 1) → Excel fills the gap and fits the model as if the data were complete Treat missing as zero — data_completion = 0: Use this only when zero is genuinely the right value for the missing period. For example, a store that was closed for a month legitimately had zero sales. =FORECAST.ETS(D2, B2:B24, A2:A24, 0, 0) Better practice for larger gaps — fill the timeline first: Add the missing date rows to the dataset with the value column blank. Then use data_completion = 1 to interpolate. This keeps the timeline regular and the model better specified. Quarterly data with missing quarter: Seasonality = 4 for annual cycle in quarterly data. Data_completion = 1 to interpolate the missing quarter. =FORECAST.ETS(D2, B2:B15, A2:A15, 4, 1)

Common Issues and How to Fix Them

#VALUE! error from FORECAST.ETS

FORECAST.ETS returns #VALUE! when the timeline is uneven, when values and timeline have different lengths, or when target_date does not match the timeline type. Check that every row in the timeline column follows the same interval. Also confirm that text-formatted dates in the timeline are converted to genuine date values — =DATEVALUE(A2) converts a text date to a serial number Excel recognises.

The forecast ignores seasonality despite setting seasonality = 12

FORECAST.ETS needs at least two complete seasonal cycles to detect and model the pattern reliably. With 12 months of monthly data, the model has only one cycle and cannot establish a seasonal pattern. Consequently, the forecast falls back to trend-only behaviour. Provide at least two full cycles: 24 months for monthly seasonality, or eight quarters for quarterly seasonality.

Forecast values seem too low or too high overall

Check the MAPE from FORECAST.ETS.STAT(values, timeline, 8). A MAPE above 20% suggests the model is fitting poorly. This often happens because of a structural break — a sudden level change from a product launch, price change, or external event. In that case, trim the history to start after the break and refit the model on the more recent data.

FORECAST.ETS assumes the future resembles the past: The model extrapolates the patterns it finds in the historical data. It has no awareness of future events, price changes, market shifts, or promotional plans. Consequently, forecasts from FORECAST.ETS are baselines — they reflect what would happen if historical patterns continued unchanged. Treat them as a starting point, then apply judgement adjustments for known future events.

Frequently Asked Questions

  • What is the difference between FORECAST.ETS and FORECAST.LINEAR?+
    FORECAST.LINEAR fits a straight trend line through the historical data and projects it forward. It is fast and simple, but it has no seasonal component — it cannot capture the recurring peaks and troughs that most business data exhibits. FORECAST.ETS fits an exponential smoothing model with separate level, trend, and seasonal components. It produces a curved, seasonally adjusted forecast. Use FORECAST.LINEAR for data with a clear trend but no seasonality. Use FORECAST.ETS whenever the data shows repeating seasonal patterns.
  • How much historical data does FORECAST.ETS need?+
    FORECAST.ETS requires at least two full seasonal cycles for reliable seasonal modelling. For monthly data with annual seasonality, that means at least 24 months of history. For quarterly data, at least eight quarters. With less than two cycles, the function can still return a result but it falls back to trend-only behaviour — the seasonal component is unreliable with too few cycles. More history generally improves accuracy, though very old data from a structurally different period can degrade the fit.
  • What does the MAPE statistic tell me and what is a good value?+
    MAPE — Mean Absolute Percentage Error — is the average percentage by which the model’s in-sample predictions differed from actual values. A MAPE of 0.05 means the model was off by 5% on average during the fitting period. For most business forecasting, a MAPE below 10% indicates a good fit. Between 10% and 20% is acceptable but worth investigating. Above 20% suggests the model may not be suitable for the data — check for structural breaks, insufficient history, or missing seasonality specification.

More Questions About FORECAST.ETS

  • Can FORECAST.ETS forecast weekly or daily data?+
    Yes. FORECAST.ETS works with any evenly spaced numeric timeline, including daily and weekly data. For daily data with a weekly cycle, set seasonality = 7. For weekly data with an annual cycle, set seasonality = 52. Auto-detection (seasonality = 0) also works for these frequencies when enough history is available. Be aware that daily data requires at least 14 days of history for weekly seasonality, and weekly data requires at least 104 weeks for annual seasonality detection.
  • What is the aggregation argument and when do I need it?+
    The aggregation argument handles duplicate timestamps in the timeline — for example, if the same date appears twice because two transactions were recorded on that day. The default is 1 (AVERAGE), which averages the values for duplicate timestamps before fitting. Other options are 2 (COUNT), 3 (COUNTA), 4 (MAX), 5 (MEDIAN), 6 (MIN), and 7 (SUM). For most business datasets where data is already aggregated to monthly or quarterly periods, duplicates do not appear and the default is fine. Set aggregation = 7 (SUM) if your data has daily transactions that need summing to a monthly timeline.
  • Is there a way to adjust the forecast for known future events?+
    FORECAST.ETS has no built-in mechanism for adding known future adjustments. The standard approach is to run the baseline forecast and then apply manual adjustments in a separate column. For example, if a promotional campaign is planned for March that typically boosts sales by 15%, multiply the March forecast by 1.15 in a separate adjusted-forecast column. This keeps the statistical baseline clean while allowing judgement-based overlays. Some analysts also reserve the most recent periods as a hold-out set to measure how accurately the model predicts known past data before trusting its future projections.