Double Exponential Smoothing Calculator
This double exponential smoothing calculator applies Holt's additive level-and-trend method to an ordered numeric series.
Run — free
Supply observations, a level smoothing constant, a trend smoothing constant, and the number of future periods you need. The result includes fitted values, the evolving level and trend components, and a forward forecast. It is useful when data has a changing baseline and a roughly linear trend but no seasonal cycle, and it makes every intermediate estimate available for review rather than returning only a final prediction.
Choose data suited to Holt's method
Holt's double exponential smoothing is designed for observations recorded at regular intervals when both the local level and a persistent trend matter. Examples include weekly orders, monthly subscriptions, daily ticket volume, or annual production totals. Put the values in chronological order, oldest first, and keep the spacing consistent because the algorithm treats every step as one equal period. The method does not model seasonality, so a series with strong weekday, monthly, or quarterly repetition should normally be seasonally adjusted first or analyzed with a seasonal method. At least two observations are necessary because the calculator initializes trend from the difference between the first two values. More history usually gives the recursive estimates more opportunity to adapt, although a structural break can make distant history less representative. Inspect the plotted or tabulated series before accepting a forecast. Missing observations should be resolved deliberately rather than silently converted to zero, and the calculator therefore requires every supplied item to be a finite number. This keeps the statistical meaning of the time sequence explicit.
Set the level and trend constants
The level constant, commonly written as alpha, controls how strongly the latest observation changes the estimated baseline. A value near one responds quickly to new data, while a value near zero preserves more of the prior level-plus-trend projection. The trend constant, commonly written as beta, controls how quickly the estimated slope changes. A high beta follows recent acceleration or deceleration closely; a low beta produces a steadier trend. Both constants must be between zero and one, inclusive, and the calculator rejects values outside that range instead of extrapolating an undefined weighting rule. There is no universally best pair. You can compare plausible combinations against held-out observations and choose constants that reduce forecast error for the horizon that matters. Avoid selecting parameters solely because they make the in-sample line look smooth: an extremely responsive model may chase noise, while an extremely slow model may miss a genuine shift. The returned levels and trends expose the effect of each choice at every observation, making parameter comparisons auditable and easier to explain.
Interpret fitted values and forecasts
For the first observation, the calculator reports that observation as the initial fitted value. It initializes level from the first value and trend from the first difference. For each later position, the fitted value is the one-step-ahead estimate available immediately before seeing that observation. The algorithm then updates level by blending the new observation with the preceding level-plus-trend estimate, and updates trend by blending the newest level change with the preceding trend. Future forecasts extend the final level by one, two, or more multiples of the final trend. This is a point forecast, not a confidence interval, and uncertainty generally grows as the requested horizon increases. Compare fitted values with actual observations to identify persistent bias, unusual shocks, or a changing pattern that the model cannot capture. Also review the level and trend arrays when reproducing results in another system: they document every recursive state after each observation. API automation costs $0.002 per request, while the browser implementation uses the same deterministic calculation. Repeated calls with identical inputs therefore produce identical numeric output, rounded consistently for portable comparisons.
What you can do with it
Forecast short-term demand
Estimate the next several regular periods of demand when recent level and trend are more relevant than a long-run average.
Monitor operational growth
Separate an evolving baseline from its estimated slope for tickets, signups, throughput, or another nonseasonal operating metric.
Compare smoothing settings
Run candidate alpha and beta values and examine their fitted values, level paths, trend paths, and holdout forecasts.
FAQ
What is double exponential smoothing?
It is Holt's recursive method for estimating a time series level and linear trend, then extending those components into future periods.
What ranges are allowed for the constants?
The level and trend constants must each be finite numbers from 0 through 1, including both endpoints. Values outside that range return an invalid-input error.
How are the initial level and trend chosen?
The initial level is the first observation. The initial trend is the second observation minus the first observation.
Does this calculator handle seasonality?
No. It models a changing level and an additive linear trend only. Use a seasonal method or adjust the series first when repeating cycles are important.
What does the forecast contain?
It contains one point estimate per requested future period, computed by extending the final estimated level with the final estimated trend.
What does API use cost?
Each API request costs $0.002. The calculation is also available in the browser through the generated tier-A widget.
For developers — API access
Everything on this page is available programmatically. This section is for teams who want to wire it into their own systems; everyone else can just use the tool above.
API endpoint
Prefer to automate it? One authenticated POST creates the task; the result comes back by webhook or a signed link. The same capability also runs here on the web, by email and from Telegram — and soon from our app too.
Call it from your stack
curl -X POST https://api.kit.forhosting.com/stat/double-exponential-smoothing \
-H "Authorization: Bearer $KIT_KEY" \
-H "Content-Type: application/json" \
-d '{"series":[10,12,13,16,18],"level_constant":0.4,"trend_constant":0.3}'const res = await fetch("https://api.kit.forhosting.com/stat/double-exponential-smoothing", {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.KIT_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
"series": [
10,
12,
13,
16,
18
],
"level_constant": 0.4,
"trend_constant": 0.3
})
});
const { task_id } = await res.json();import os, requests
res = requests.post(
"https://api.kit.forhosting.com/stat/double-exponential-smoothing",
headers={"Authorization": f"Bearer {os.environ['KIT_KEY']}"},
json={
"series": [
10,
12,
13,
16,
18
],
"level_constant": 0.4,
"trend_constant": 0.3
},
)
task_id = res.json()["task_id"]<?php
$res = file_get_contents("https://api.kit.forhosting.com/stat/double-exponential-smoothing", false, stream_context_create([
"http" => [
"method" => "POST",
"header" => "Authorization: Bearer " . getenv("KIT_KEY") . "\r\nContent-Type: application/json",
"content" => '{"series":[10,12,13,16,18],"level_constant":0.4,"trend_constant":0.3}',
],
]));
$task = json_decode($res, true);body := bytes.NewBufferString(`{"series":[10,12,13,16,18],"level_constant":0.4,"trend_constant":0.3}`)
req, _ := http.NewRequest("POST", "https://api.kit.forhosting.com/stat/double-exponential-smoothing", body)
req.Header.Set("Authorization", "Bearer "+os.Getenv("KIT_KEY"))
req.Header.Set("Content-Type", "application/json")
res, _ := http.DefaultClient.Do(req)Example request
{
"series": [
10,
12,
13,
16,
18
],
"level_constant": 0.4,
"trend_constant": 0.3
}Example response
{
"task_id": "tsk_a1b2c3d4e5f6a1b2c3d4e5f6",
"type": "stat.double_exponential_smoothing",
"status": "queued",
"_links": {
"result": "/tasks/tsk_…/result"
}
}The API is asynchronous: the call returns a task_id immediately and the result arrives by webhook. Polling is capped at 1 req/s per task.
Pricing
Published price — no tokens, no invented credits. A failed task is never charged.
Limits
max_items | 10000 |
max_forecast_periods | 1000 |
Errors
| HTTP | Code | Meaning |
|---|---|---|
401 | unauthorized | Missing or invalid API key. |
402 | insufficient_balance | Your balance doesn't cover the task price. |
404 | unknown_type | That task type doesn't exist. |
429 | rate_limited | Too many requests. Use the webhook instead of polling. |