<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>OpenForecast</title>
	<atom:link href="https://openforecast.org/feed/" rel="self" type="application/rss+xml" />
	<link>https://openforecast.org/</link>
	<description>How to look into the future</description>
	<lastBuildDate>Mon, 09 Nov 2026 10:30:16 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.4</generator>

<image>
	<url>https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2026/07/cropped-of-logo-short-1-32x32.png&amp;nocache=1</url>
	<title>OpenForecast</title>
	<link>https://openforecast.org/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>The problem with weekly seasonality</title>
		<link>https://openforecast.org/2026/11/09/the-problem-with-weekly-seasonality/</link>
					<comments>https://openforecast.org/2026/11/09/the-problem-with-weekly-seasonality/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Mon, 09 Nov 2026 10:30:16 +0000</pubDate>
				<category><![CDATA[Social media]]></category>
		<category><![CDATA[Theory of forecasting]]></category>
		<category><![CDATA[Seasonality]]></category>
		<category><![CDATA[theory]]></category>
		<category><![CDATA[time series]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=4712</guid>

					<description><![CDATA[<p>About a year and a half ago, I wrote a post about the challenges of seasonal data, focusing on daylight saving time and leap years. Since then, I’ve been asked about weekly data, which is what we typically have in supply chains. So, here is a short follow-up. A year has 365.25/7 ≈ 52.18 weeks ... <a title="The problem with weekly seasonality" class="read-more" href="https://openforecast.org/2026/11/09/the-problem-with-weekly-seasonality/" aria-label="Read more about The problem with weekly seasonality">Read more</a></p>
<p>Message <a href="https://openforecast.org/2026/11/09/the-problem-with-weekly-seasonality/">The problem with weekly seasonality</a> first appeared on <a href="https://openforecast.org">OpenForecast</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>About a year and a half ago, <a href="/2025/04/07/challenges-related-to-seasonal-data/">I wrote a post</a> about the challenges of seasonal data, focusing on daylight saving time and leap years. Since then, I’ve been asked about weekly data, which is what we typically have in supply chains. So, here is a short follow-up.</p>
<p>A year has 365.25/7 ≈ 52.18 weeks on average. This is typically resolved by having 53 weeks in some years (roughly once every five to six years). If you just use a seasonal model with 52 weeks, the pattern drifts by about a day every year, and after five or six years, your Christmas peak is a whole week off.</p>
<p>And there is a twist. Many tools do not use ISO weeks. Some count seven-day blocks from the 1st of January (e.g. lubridate::week() in R), so the last one or two days of the year form a &#8220;week 53&#8221;. Others follow the weekdays but cut the weeks at the start of the year (e.g. WEEKNUM() in Excel by default), so the first and last weeks may contain only a few days. If weekly demand is the sum of daily sales, these short weeks show sharp drops, although nothing has happened to demand. A rough fix is to model the average daily demand per week and scale the forecast back. A better one is to aggregate daily data into ISO weeks in the first place (e.g. with lubridate::isoweek() in R or ISOWEEKNUM() in Excel), which are always full seven-day weeks.</p>
<p>This leaves us with the 52/53 weeks, for which there are several options, each with its own assumptions:</p>
<ol>
<li>Shift the seasonal lag from 52 to 53 in years with the extra week. No additional parameters, but it assumes that week 53 behaves like week 52, which is not true if Christmas falls into it.</li>
<li>Use categorical variables for weeks of the year. This avoids that assumption, but you need to estimate the effect of week 53, which you observe once every five to six years, if at all.</li>
<li>Use fractional seasonality, e.g. TBATS (De Livera, Hyndman &#038; Snyder, 2011: https://doi.org/10.1198/jasa.2011.tm09771), which models seasonality with harmonics and accepts the period of 52.18. This handles the drift elegantly, but you need to select the number of harmonics, and the harmonics might miss sharp peaks, like Black Friday.</li>
<li>Pre-process the data, e.g. merge week 53 with week 52. This assumes that the merged week does not matter, while it often contains the peak you care about the most.</li>
</ol>
<p>So, which one to use? There is no universal answer. In practice, it often depends on your software and its restrictions, e.g. if it does not support categorical variables, the second option is gone. But whatever you choose, be aware of the assumptions behind it.</p>
<p>In the next post, I’ll tell you about the new TBATS implementation in the smooth package, which handles fractional seasonality and has some features that other implementations don’t. Stay tuned!</p>
<p>Message <a href="https://openforecast.org/2026/11/09/the-problem-with-weekly-seasonality/">The problem with weekly seasonality</a> first appeared on <a href="https://openforecast.org">OpenForecast</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/2026/11/09/the-problem-with-weekly-seasonality/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>smooth in Python: iETS and the Croston&#8217;s Method</title>
		<link>https://openforecast.org/2026/11/02/smooth-in-python-iets-and-the-croston-s-method/</link>
					<comments>https://openforecast.org/2026/11/02/smooth-in-python-iets-and-the-croston-s-method/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Mon, 02 Nov 2026 09:00:52 +0000</pubDate>
				<category><![CDATA[ETS]]></category>
		<category><![CDATA[Intermittent demand]]></category>
		<category><![CDATA[smooth for Python]]></category>
		<category><![CDATA[Social media]]></category>
		<category><![CDATA[ADAM]]></category>
		<category><![CDATA[intermittent demand]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[smooth]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=4706</guid>

					<description><![CDATA[<p>Is there a statistical model underlying Croston’s method? This question has been bothering researchers for decades. Croston proposed his method back in 1972, and some even argued that there is no sensible model behind it (Shenstone &#038; Hyndman, 2005). Yet there is one! Let me explain. But first, why bother? Because a method just gives ... <a title="smooth in Python: iETS and the Croston&#8217;s Method" class="read-more" href="https://openforecast.org/2026/11/02/smooth-in-python-iets-and-the-croston-s-method/" aria-label="Read more about smooth in Python: iETS and the Croston&#8217;s Method">Read more</a></p>
<p>Message <a href="https://openforecast.org/2026/11/02/smooth-in-python-iets-and-the-croston-s-method/">smooth in Python: iETS and the Croston&#8217;s Method</a> first appeared on <a href="https://openforecast.org">OpenForecast</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Is there a statistical model underlying Croston’s method? This question has been bothering researchers for decades. Croston proposed his method back in 1972, and some even argued that there is no sensible model behind it (<a href="https://doi.org/10.1002/for.963">Shenstone &#038; Hyndman, 2005</a>). Yet there is one! Let me explain.</p>
<p>But first, why bother? Because a method just gives you a number, while a model gives you a likelihood, and with it flexibility: you can select components and features via information criteria, get predictive distributions, and extend the model however you like. So, if you derive a model underlying a method, you bring that method to another level.</p>
<p>A quick recap. <a href="/2026/10/14/the-main-idea-behind-the-croston-s-method/">Croston split intermittent demand into two parts</a>: how often the product sells (demand intervals) and how much it sells when it does (demand sizes), and applied Simple Exponential Smoothing (SES) to each of them. <a href="/2026/10/26/smooth-in-python-fixed-probability-model-for-demand-occurrence/">In my previous post</a>, I showed the simplest model for the &#8220;how often&#8221; part, which assumes that the chance of a sale does not change over time.</p>
<p>A more complicated statistical model was proposed by John Boylan and me in <a href="/2023/09/08/iets-state-space-model-for-intermittent-demand-forecasting/">our iETS paper</a>. It assumes that the occurrence of sales follows a Bernoulli distribution with a time-varying probability. In the “inverse-odds-ratio” version of the model, we track the expected number of periods without sales: if the gap between sales is 4 periods then the probability of a sale is 1/4. Every new zero or one is converted into an error term, and this expected number is updated via ETS(M,N,N), the model underlying SES. When the probability does not change much over time, this model can be estimated with Croston’s method, which is why it can be considered as the model underlying it.</p>
<p>In Python, the basic model is done like this:</p>
<pre class="decode">from smooth import OM, ADAM

occ = OM(model="MNN", occurrence="inverse-odds-ratio")
occ.fit(y)
model = ADAM(model="MNN")
model.fit(y, occurrence=occ)
model.predict(h=10, interval="prediction")</pre>
<p>In the paper, we also showed that this model is especially suitable for new products with demand building up. This means that the gaps between sales become shorter and shorter, i.e. the demand transforms from intermittent to regular. If you expect this to continue in the holdout period, you can use the trend model, and here how to do that in Python:</p>
<pre class="decode">occ = OM(model="MMN", occurrence="inverse-odds-ratio")</pre>
<p>This way, the expected gap between sales would decline in the holdout period, and the probability of a sale would grow. The image in this post shows how this works on an artificial example.</p>
<p>And if you know what drives sales (e.g. promotions or price changes), you can include this information in the occurrence model as well.</p>
<p>So, yes, there is a model underlying Croston’s method, and it allows doing things that the method itself cannot do.</p>
<p>Try smooth for Python: <code>pip install smooth</code><br />
<a href="https://github.com/openforecast-org/smooth/wiki/OM">Occurrence model on wiki</a></p>
<p>Message <a href="https://openforecast.org/2026/11/02/smooth-in-python-iets-and-the-croston-s-method/">smooth in Python: iETS and the Croston&#8217;s Method</a> first appeared on <a href="https://openforecast.org">OpenForecast</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/2026/11/02/smooth-in-python-iets-and-the-croston-s-method/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>smooth in Python: fixed probability model for demand occurrence</title>
		<link>https://openforecast.org/2026/10/26/smooth-in-python-fixed-probability-model-for-demand-occurrence/</link>
					<comments>https://openforecast.org/2026/10/26/smooth-in-python-fixed-probability-model-for-demand-occurrence/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Mon, 26 Oct 2026 08:48:42 +0000</pubDate>
				<category><![CDATA[Intermittent demand]]></category>
		<category><![CDATA[smooth for Python]]></category>
		<category><![CDATA[Social media]]></category>
		<category><![CDATA[ADAM]]></category>
		<category><![CDATA[ETS]]></category>
		<category><![CDATA[intermittent demand]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[smooth]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=4695</guid>

					<description><![CDATA[<p>When demand is intermittent, one of the most useful forecasts you can produce is not &#8220;how much will we sell&#8221;, but &#8220;how likely are we to sell anything at all&#8221;. And this probability can be modelled, just like demand itself. This idea goes back to Croston, who suggested splitting intermittent demand into demand occurrence and ... <a title="smooth in Python: fixed probability model for demand occurrence" class="read-more" href="https://openforecast.org/2026/10/26/smooth-in-python-fixed-probability-model-for-demand-occurrence/" aria-label="Read more about smooth in Python: fixed probability model for demand occurrence">Read more</a></p>
<p>Message <a href="https://openforecast.org/2026/10/26/smooth-in-python-fixed-probability-model-for-demand-occurrence/">smooth in Python: fixed probability model for demand occurrence</a> first appeared on <a href="https://openforecast.org">OpenForecast</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>When demand is intermittent, one of the most useful forecasts you can produce is not &#8220;how much will we sell&#8221;, but &#8220;how likely are we to sell anything at all&#8221;. And this probability can be modelled, just like demand itself.</p>
<p>This idea goes <a href="/2026/10/14/the-main-idea-behind-the-croston-s-method/">back to Croston</a>, who suggested splitting intermittent demand into demand occurrence and demand sizes. The main image in the post shows a typical intermittent demand series, and the one below shows its occurrence part: &#8220;1&#8221; when someone bought the product, and &#8220;0&#8221; otherwise.</p>
<figure id="attachment_4697" aria-describedby="caption-attachment-4697" style="width: 1014px" class="wp-caption aligncenter"><a href="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2026/10/2026-10-02-smooth-posts-11-occurrence-model-02.png&amp;nocache=1"><img fetchpriority="high" decoding="async" src="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2026/10/2026-10-02-smooth-posts-11-occurrence-model-02-1024x474.png&amp;nocache=1" alt="Demand occurrence part of the data" width="1024" height="474" class="size-large wp-image-4697" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2026/10/2026-10-02-smooth-posts-11-occurrence-model-02-1024x474.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2026/10/2026-10-02-smooth-posts-11-occurrence-model-02-300x139.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2026/10/2026-10-02-smooth-posts-11-occurrence-model-02-768x356.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2026/10/2026-10-02-smooth-posts-11-occurrence-model-02.png&amp;nocache=1 1080w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption id="caption-attachment-4697" class="wp-caption-text">Demand occurrence part of the data</figcaption></figure>
<p>We now have a series that can be modelled on its own, and there are many ways to do that, which come down to your preferences and experience: ETS, ARIMA, logistic regression, GBM, Neural Network &#8211; you name it!</p>
<p>One thing to avoid, though, is trying to predict the exact periods when sales will happen: when demand is truly intermittent, you can’t. What you can forecast is the probability. <a href="/2024/12/11/intermittent-demand-don-t-try-to-predict-when-it-will-happen/">I had a post on that topic</a>.</p>
<p>In the smooth package, there is a separate function for this, OM, which allows using ETS, ARIMA and regression elements to model demand occurrence. It supports several types of occurrence, including the odds-ratio, the inverse-odds-ratio (related to Croston&#8217;s method) and the direct one (similar to TSB). But the simplest of all is the fixed probability, which assumes that the probability of sale does not change over time. It simply takes the share of periods with sales: if the product sold in 30 out of 100 weeks, the probability is 0.3. If you read my previous post, you might notice that <a href="/2026/10/19/what-the-average-demand-interval-adi-hides/">this is essentially 1/ADI</a> turned into a forecast, with the same limitation of ignoring how demand evolves. Still, it is a good benchmark and a starting point for intermittent demand forecasting.</p>
<p>In Python, this is done like this:</p>
<pre class="decode">from smooth import OM, ADAM

model = OM(occurrence="fixed")
model.fit(y)
fc = model.predict(h=10)</pre>
<p>The resulting probability forecast is shown in the following image:</p>
<figure id="attachment_4698" aria-describedby="caption-attachment-4698" style="width: 1014px" class="wp-caption aligncenter"><a href="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2026/10/2026-10-02-smooth-posts-11-occurrence-model-03.png&amp;nocache=1"><img decoding="async" src="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2026/10/2026-10-02-smooth-posts-11-occurrence-model-03-1024x474.png&amp;nocache=1" alt="Forecast for the demand occurrence" width="1024" height="474" class="size-large wp-image-4698" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2026/10/2026-10-02-smooth-posts-11-occurrence-model-03-1024x474.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2026/10/2026-10-02-smooth-posts-11-occurrence-model-03-300x139.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2026/10/2026-10-02-smooth-posts-11-occurrence-model-03-768x356.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2026/10/2026-10-02-smooth-posts-11-occurrence-model-03.png&amp;nocache=1 1080w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption id="caption-attachment-4698" class="wp-caption-text">Forecast for the demand occurrence</figcaption></figure>
<p>We can also use this directly in ADAM, which splits the demand into two parts on its own. Here is the model with ETS(M,N,N) for demand sizes and the fixed probability of occurrence, iETS(M,N,N)_F:</p>
<pre class="decode">model = ADAM(model="MNN", occurrence="fixed")
model.fit(y)
model.predict(h=10)</pre>
<p>The last command takes the probability from the occurrence model and multiplies it by the forecast of demand sizes. The result is the mean demand per period, just like from any other forecasting method.</p>
<p>Next time, I&#8217;ll tell you about the more advanced occurrence models, where the probability changes over time. So, stay tuned!</p>
<p>Try smooth for Python: <code>pip install smooth</code><br />
<a href="https://github.com/openforecast-org/smooth/wiki/OM">Occurrence model on wiki</a>.</p>
<p>Message <a href="https://openforecast.org/2026/10/26/smooth-in-python-fixed-probability-model-for-demand-occurrence/">smooth in Python: fixed probability model for demand occurrence</a> first appeared on <a href="https://openforecast.org">OpenForecast</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/2026/10/26/smooth-in-python-fixed-probability-model-for-demand-occurrence/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>What the Average Demand Interval (ADI) hides</title>
		<link>https://openforecast.org/2026/10/19/what-the-average-demand-interval-adi-hides/</link>
					<comments>https://openforecast.org/2026/10/19/what-the-average-demand-interval-adi-hides/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Mon, 19 Oct 2026 08:30:20 +0000</pubDate>
				<category><![CDATA[Intermittent demand]]></category>
		<category><![CDATA[Social media]]></category>
		<category><![CDATA[Theory of forecasting]]></category>
		<category><![CDATA[EDA]]></category>
		<category><![CDATA[intermittent demand]]></category>
		<category><![CDATA[theory]]></category>
		<category><![CDATA[time series]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=4685</guid>

					<description><![CDATA[<p>Have you used the Average Demand Interval (ADI) for analysis or classification? Do you know that it has some issues? Let me explain. I don&#8217;t know when specifically ADI was proposed, but it was popularised by Syntetos, Boylan &#38; Croston (2005), yes, the same Croston from this post. A demand interval is the number of ... <a title="What the Average Demand Interval (ADI) hides" class="read-more" href="https://openforecast.org/2026/10/19/what-the-average-demand-interval-adi-hides/" aria-label="Read more about What the Average Demand Interval (ADI) hides">Read more</a></p>
<p>Message <a href="https://openforecast.org/2026/10/19/what-the-average-demand-interval-adi-hides/">What the Average Demand Interval (ADI) hides</a> first appeared on <a href="https://openforecast.org">OpenForecast</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Have you used the Average Demand Interval (ADI) for analysis or classification? Do you know that it has some issues? Let me explain.</p>
<p>I don&#8217;t know when specifically ADI was proposed, but it was popularised by <a href="https://doi.org/10.1057/palgrave.jors.2601841">Syntetos, Boylan &amp; Croston (2005)</a>, yes, the same Croston from <a href="/2026/10/14/the-main-idea-behind-the-croston-s-method/">this post</a>. A demand interval is the number of periods between consecutive non-zero demands, and ADI is just their mean. It lies between one (demand in every period) and, theoretically, infinity (no demand at all). But why would anyone need it?</p>
<p>Originally, it was used together with the coefficient of variation \(CV^2 \) to classify demand into four types (<a href="/2025/06/04/sbc-is-not-for-you/">the SBC classification</a>) and to choose between Croston’s method and SBA. The authors compared the theoretical MSE of the methods and found cut-off points: Croston does better only when \(ADI &lt; 1.32\) and \(CV^2 &lt; 0.49\). Otherwise, SBA wins.</p>
<p>My interpretation of the \(ADI &lt; 1.32\) (this is not in the paper): SBA fixes the bias of Croston’s method, which matters most for very slow-moving products. But it does that at a cost. SBA multiplies Croston’s forecast by \( (1 − \alpha /2) \), which just lowers probability of occurrence. If demand becomes less sporadic, SBA underestimates it (e.g. 0.85 instead of 0.9 with \(\alpha = 0.1\)).</p>
<p>But why ADI in the first place? Because historically the main academic work on intermittent demand was carried out in spare parts and similar domains, where sales are rare even at the monthly level (the 2005 paper used 3000 series from the automotive industry). When the probability of occurrence is low, demand does not evolve much over time, so averaging the demand intervals is acceptable.</p>
<p>Nowadays, we face intermittent demand everywhere: in retail, energy, healthcare and other areas. The data is often collected at a more granular level (weekly or daily), and intermittent demand comes in more complex shapes than in spare parts. Averaging the intervals then hides important information. For example, if your product becomes obsolete halfway through the sample and the probability of occurrence drops from 0.5 to 0.1, ADI will be around 3.3. That corresponds to a probability of 0.3: neither the 0.5 you had nor the 0.1 you have now. It is like judging a hospital by the average temperature of all its patients.</p>
<p>So, ADI is a fine measure for its original purpose. But time has passed, use cases have changed, and nowadays instead of averaging the intervals, I recommend looking at how the probability of occurrence evolves over time, for example, by smoothing it (see the image in the post) or with a model that has a time-varying probability (<a href="https://doi.org/10.1016/j.ijpe.2023.109013">like iETS</a>). A plot of demand occurrence over time tells you more than ADI ever will.</p>
<p>We have a separate session on intermittent demand in our <a href="https://openforecast.org/training/demand-forecasting-principles/">Demand Forecasting Principles course</a>, where we cover this and other topics in detail.</p>
<p>Message <a href="https://openforecast.org/2026/10/19/what-the-average-demand-interval-adi-hides/">What the Average Demand Interval (ADI) hides</a> first appeared on <a href="https://openforecast.org">OpenForecast</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/2026/10/19/what-the-average-demand-interval-adi-hides/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>The main idea behind the Croston’s method</title>
		<link>https://openforecast.org/2026/10/14/the-main-idea-behind-the-croston-s-method/</link>
					<comments>https://openforecast.org/2026/10/14/the-main-idea-behind-the-croston-s-method/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Wed, 14 Oct 2026 09:28:42 +0000</pubDate>
				<category><![CDATA[Intermittent demand]]></category>
		<category><![CDATA[Social media]]></category>
		<category><![CDATA[Theory of forecasting]]></category>
		<category><![CDATA[ETS]]></category>
		<category><![CDATA[extrapolation methods]]></category>
		<category><![CDATA[intermittent demand]]></category>
		<category><![CDATA[theory]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=4680</guid>

					<description><![CDATA[<p>Have you heard of Croston’s method for intermittent demand forecasting? Some modern data scientists dislike it because it is too simple and not as accurate as some modern forecasting approaches. And they have a point. But here is why it is worth keeping Croston in mind. Back in 1972, John Croston, who worked on stock ... <a title="The main idea behind the Croston’s method" class="read-more" href="https://openforecast.org/2026/10/14/the-main-idea-behind-the-croston-s-method/" aria-label="Read more about The main idea behind the Croston’s method">Read more</a></p>
<p>Message <a href="https://openforecast.org/2026/10/14/the-main-idea-behind-the-croston-s-method/">The main idea behind the Croston’s method</a> first appeared on <a href="https://openforecast.org">OpenForecast</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Have you heard of Croston’s method for intermittent demand forecasting? Some modern data scientists dislike it because it is too simple and not as accurate as some modern forecasting approaches. And they have a point. But here is why it is worth keeping Croston in mind.</p>
<p>Back <a href="https://doi.org/10.1057/jors.1972.50">in 1972, John Croston</a>, who worked on stock control systems relying on Simple Exponential Smoothing (SES), noticed that SES forecasts were biased exactly when ordering decisions were made: right after a demand occurred. The following image shows why.</p>
<figure id="attachment_4681" aria-describedby="caption-attachment-4681" style="width: 1014px" class="wp-caption aligncenter"><a href="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2026/10/2026-10-02-intermittent-demand-croston-01.png&amp;nocache=1"><img decoding="async" src="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2026/10/2026-10-02-intermittent-demand-croston-01-1024x580.png&amp;nocache=1" alt="SES on Intermittent demand" width="1024" height="580" class="size-large wp-image-4681" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2026/10/2026-10-02-intermittent-demand-croston-01-1024x580.png&amp;nocache=1 1024w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2026/10/2026-10-02-intermittent-demand-croston-01-300x170.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2026/10/2026-10-02-intermittent-demand-croston-01-768x435.png&amp;nocache=1 768w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2026/10/2026-10-02-intermittent-demand-croston-01.png&amp;nocache=1 1378w" sizes="(max-width: 1024px) 100vw, 1024px" /></a><figcaption id="caption-attachment-4681" class="wp-caption-text">SES on Intermittent demand</figcaption></figure>
<p>Intermittent demand consists mostly of periods with no sales, and SES treats each of them as a sale of size zero rather than as the absence of a sale. So, its forecast goes down with every zero, as if people wanted the product less and less. Then a customer buys 5 units, and SES immediately becomes optimistic. But in intermittent demand, sales rarely happen in consecutive periods, so this optimism leads to wrong ordering decisions.</p>
<p>The problem is not SES itself, but that it does not distinguish demand occurrence from demand sizes. Croston split the series into two parts (see the main image of the post): demand intervals (the number of periods between non-zero demands) and demand sizes (the non-zero values). He applied SES to each of them separately, and defined the final forecast as the ratio of the smoothed sizes to the smoothed intervals, i.e. the expected demand per period. Both parts are updated only when a demand happens, so the method does not change its mind with every zero, giving more stable forecasts and more reasonable ordering decisions.</p>
<p>Nowadays, we have many great forecasting approaches, from simple ones like TSB to more advanced ones like LightGBM. Croston’s method itself turned out to be biased (<a href="https://doi.org/10.1016/j.ijforecast.2004.10.001">Syntetos &#038; Boylan proposed a correction for that</a>). Still, it works fine for manufacturers of large expensive items, with low volumes and long gaps between orders, where a stable forecast matters more than a quick reaction. I am not a big fan of the method, but I really like Croston’s original idea: split intermittent demand into demand occurrence and demand sizes. More than half a century later, this idea still works. <a href="https://doi.org/10.1016/j.ijpe.2023.109013">My iETS paper used it</a>, outperforming other simple forecasting methods on the M5 data. <a href="https://doi.org/10.1371/journal.pone.0259764">Türkmen et al. (2021)</a> used the same idea with deep neural networks. <a href="/2025/03/20/why-do-zeroes-happen-a-model-based-view-on-demand-classification/">The paper with Anna Sroginis</a> showed that it also works with LightGBM, leading to substantial accuracy improvements that translate into inventory savings. So, even if you dislike Croston’s method, I bet you can improve your approach by using his original idea.</p>
<p>We will cover intermittent demand and the methods built on Croston’s idea in our <a href="/training/demand-forecasting-principles/">Demand Forecasting Principles course in November</a>.</p>
<p>Message <a href="https://openforecast.org/2026/10/14/the-main-idea-behind-the-croston-s-method/">The main idea behind the Croston’s method</a> first appeared on <a href="https://openforecast.org">OpenForecast</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/2026/10/14/the-main-idea-behind-the-croston-s-method/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Simple Exponential Smoothing: one parameter instead of many weights</title>
		<link>https://openforecast.org/2026/10/05/simple-exponential-smoothing-one-parameter-instead-of-many-weights/</link>
					<comments>https://openforecast.org/2026/10/05/simple-exponential-smoothing-one-parameter-instead-of-many-weights/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Mon, 05 Oct 2026 07:43:56 +0000</pubDate>
				<category><![CDATA[ETS]]></category>
		<category><![CDATA[Simple Methods]]></category>
		<category><![CDATA[Social media]]></category>
		<category><![CDATA[extrapolation methods]]></category>
		<category><![CDATA[theory]]></category>
		<category><![CDATA[time series]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=4674</guid>

					<description><![CDATA[<p>In one of the comments to my previous post about the Simple Moving Average on LinkedIn, a reader mentioned that they use a Weighted Moving Average with their own weighting scheme. This can work well although defining the weights can be a nuisance: a Weighted Moving Average of order 12 needs 12 weights that someone ... <a title="Simple Exponential Smoothing: one parameter instead of many weights" class="read-more" href="https://openforecast.org/2026/10/05/simple-exponential-smoothing-one-parameter-instead-of-many-weights/" aria-label="Read more about Simple Exponential Smoothing: one parameter instead of many weights">Read more</a></p>
<p>Message <a href="https://openforecast.org/2026/10/05/simple-exponential-smoothing-one-parameter-instead-of-many-weights/">Simple Exponential Smoothing: one parameter instead of many weights</a> first appeared on <a href="https://openforecast.org">OpenForecast</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>In one of the comments to my previous <a href="/2026/09/21/simple-moving-average/">post about the Simple Moving Average</a> on LinkedIn, a reader mentioned that they use a Weighted Moving Average with their own weighting scheme. This can work well although defining the weights can be a nuisance: a Weighted Moving Average of order 12 needs 12 weights that someone has to choose. But what if one number could define them all?</p>
<p>First, why would we want non-equal weights in the first place? Demand evolves over time, and recent sales might reflect its current level better than the sales we had several years ago. So, it is only natural to give higher weights to recent observations and lower ones to older ones. Can we do that in a simple and principled way? Yes, and there is a forecasting method that does exactly that!</p>
<p>I&#8217;m talking about Simple Exponential Smoothing (SES), proposed by <a href="https://www.industrydocuments.ucsf.edu/docs/jzlc0130">Robert Goodell Brown back in 1956</a> and independently by <a href="https://doi.org/10.1016/j.ijforecast.2003.09.015">Charles Holt in 1957</a>. It is yet another simple forecasting method, suitable for data without trend, seasonality or features. Mathematically, it is written like this:</p>
<p>\begin{equation}<br />
F_{t+1} = \alpha A_{t} + (1−\alpha) F_{t}<br />
\end{equation}</p>
<p>where \(F_t\) is the one-step-ahead forecast, \(A_t\) is the actual value, \(t\) is the time index, and \( \alpha \) is the smoothing parameter. Roughly speaking, \( \alpha \) defines how the weight is split between the most recent actual value and the previous forecast. If \( \alpha=0 \), the forecast ignores all new information and stays at its starting value, which could be, for example, the global average. With \( \alpha=1 \), it ignores all previous forecasts and becomes <a href="/2026/08/27/why-naive-is-popular-and-important/">Naïve</a>. The nice thing about SES is that \( \alpha \) also regulates how the weights are distributed over time, because the method can be rewritten as (see <a href="/adam/SES.html#whyExponential">derivations here</a>):</p>
<p>\begin{equation}<br />
F_{t+1} = \alpha A_{t} + \alpha (1−\alpha) A_{t−1} +  \alpha (1−\alpha)^2 A_{t−2} +  \alpha (1−\alpha)^3 A_{t−3} + &#8230;<br />
\end{equation}</p>
<p>Take \(\alpha=0.5\). The most recent observation gets the weight of 0.5, the one before it 0.5 × 0.5 = 0.25, the one before that 0.5 × 0.5² = 0.125, and so on. The weights decay exponentially. So, instead of 12 parameters, we define just one, and it determines how fast the weights decay. The chart in this post compares the equal weights of SMA(12) with SES for \( \alpha=0.2 \) and \( \alpha=0.5 \): the closer α is to zero, the more evenly the weights are spread; the closer it is to one, the more weight goes to the most recent observation, and the faster the older ones are forgotten.</p>
<p>There are tons of papers discussing SES, its modifications and extensions. Gardner (<a href="https://doi.org/10.1002/for.3980040103">1985</a> and <a href="https://doi.org/10.1016/j.ijforecast.2006.03.005">2006</a>) is the best review on the topic. And finally, SES is a predecessor of ETS, and its mechanism is used in TBATS.</p>
<p>How do you choose α in practice, and what do you do when SES is not enough? This is what we discuss in our <a href="/training/demand-forecasting-principles/">Demand Forecasting Principles course</a>.</p>
<p>Message <a href="https://openforecast.org/2026/10/05/simple-exponential-smoothing-one-parameter-instead-of-many-weights/">Simple Exponential Smoothing: one parameter instead of many weights</a> first appeared on <a href="https://openforecast.org">OpenForecast</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/2026/10/05/simple-exponential-smoothing-one-parameter-instead-of-many-weights/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>smooth for Python: Automatic order selection for MSARIMA</title>
		<link>https://openforecast.org/2026/09/28/smooth-for-python-automatic-order-selection-for-msarima/</link>
					<comments>https://openforecast.org/2026/09/28/smooth-for-python-automatic-order-selection-for-msarima/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Mon, 28 Sep 2026 08:00:04 +0000</pubDate>
				<category><![CDATA[ARIMA]]></category>
		<category><![CDATA[smooth for Python]]></category>
		<category><![CDATA[ADAM]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[smooth]]></category>
		<category><![CDATA[theory]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=4654</guid>

					<description><![CDATA[<p>Have you ever tried to identify ARIMA for your data? The old school Box-Jenkins methodology implies analysing ACF/PACF plots and selecting the orders iteratively. This approach has a fundamental flaw I discussed in one of my earlier posts. Brute force does not help either: even p ≤ 3, d ≤ 2, q ≤ 3 gives ... <a title="smooth for Python: Automatic order selection for MSARIMA" class="read-more" href="https://openforecast.org/2026/09/28/smooth-for-python-automatic-order-selection-for-msarima/" aria-label="Read more about smooth for Python: Automatic order selection for MSARIMA">Read more</a></p>
<p>Message <a href="https://openforecast.org/2026/09/28/smooth-for-python-automatic-order-selection-for-msarima/">smooth for Python: Automatic order selection for MSARIMA</a> first appeared on <a href="https://openforecast.org">OpenForecast</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Have you ever tried to identify ARIMA for your data? The old school Box-Jenkins methodology implies analysing ACF/PACF plots and selecting the orders iteratively. This approach has a fundamental flaw I discussed in one of <a href="/2025/05/13/fundamental-flaw-of-the-box-jenkins-methodology/">my earlier posts</a>. Brute force does not help either: even p ≤ 3, d ≤ 2, q ≤ 3 gives 48 candidates, and seasonal lags push it into the thousands. So, smart people came up with great heuristics that allow identifying the orders in a short period of time. Let me explain.</p>
<p>One of the widely used approaches was developed by <a href="https://doi.org/10.18637/jss.v027.i03">Hyndman &#038; Khandakar (2008)</a>. It is implemented in auto.arima in R (and in StatsForecast for Python). It mixes two frameworks: stationarity tests (KPSS or ADF) to select the order of differencing d, and then information criteria for p and q. The tests are needed because, in the conventional formulation, models with different d are estimated on different sample sizes, so their information criteria cannot be compared (I explained <a href="/2026/09/12/on-differencing-of-arima-in-state-space/">this here</a>). Although the algorithm works well and showed good performance in several competitions, it mixes hypothesis testing with information theory. The former tests the differences between samples, but assumes that you can make a mistake (based on your significance level), while the latter simply selects the most plausible model given data.</p>
<p>AutoMSARIMA does the selection differently. Because it is formulated in state space, the sample stays the same for any d, so the algorithm can compare all orders directly via information criteria, including the differencing. This follows the approach of <a href="https://doi.org/10.1080/00207543.2019.1600764">Svetunkov &#038; Boylan (2020)</a>, which treats order selection as a component selection problem rather than hypothesis testing. No ADF test, no KPSS test, no pre-screening for stationarity. The IC decides everything. And because nothing in this logic is tied to a specific seasonal period, it extends naturally to multiple seasonalities: each seasonal lag simply adds its own components to the model, and the same criterion decides which of them to keep, with the seasonality remaining stochastic rather than fixed.</p>
<p>The search itself is stepwise: the algorithm inspects the ACF/PACF of the residuals to propose a candidate order, adds it, and keeps it only if the information criterion decreases. When done, it also tries several simple SARIMA models to check whether any of them beats the selected one. The algorithm is explained <a href="/adam/ARIMASelection.html">in detail here</a>.</p>
<p>In Python:</p>
<pre class="decode">from fcompdata import AirPassengers
from smooth import AutoMSARIMA

# Monthly data, automatic order selection up to SARIMA(3,2,3)(3,1,3)[12]
model = AutoMSARIMA(lags=[1, 12])
model.fit(AirPassengers.y)
print(model)</pre>
<p>The same algorithm works for the multiple seasonal ARIMA. The only thing to specify explicitly is the maximum orders to check:</p>
<pre class="decode">from fcompdata import taylor

model = AutoMSARIMA(
lags=[1, 48, 336],
orders={"ar": [3, 2, 2],
"i": [2, 1, 1],
"ma": [3, 2, 2]}
)
model.fit(taylor.y)</pre>
<p>The selected model returns the same attributes and supports the same methods as ADAM.</p>
<p>Does it actually work? I benchmarked AutoMSARIMA against statsforecast AutoARIMA, skforecast and R&#8217;s auto.arima on 5,315 series from the M1, M3 and Tourism datasets. The honest summary: point accuracy is a tie &#8211; RMSSE differs in the third decimal place across all implementations. But smooth produces the best-calibrated prediction intervals of the pack and is 3–5 times faster than the alternatives. <a href="https://github.com/openforecast-org/smooth/blob/master/python/tests/notebooks/2026-09-21-smooth-1-0-8-benchmark_auto_arima.ipynb">Here is the full notebook</a>.</p>
<p>Try smooth now: <code>pip install smooth</code><br />
<a href="https://github.com/openforecast-org/smooth/wiki">smooth wiki</a>.</p>
<p>Message <a href="https://openforecast.org/2026/09/28/smooth-for-python-automatic-order-selection-for-msarima/">smooth for Python: Automatic order selection for MSARIMA</a> first appeared on <a href="https://openforecast.org">OpenForecast</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/2026/09/28/smooth-for-python-automatic-order-selection-for-msarima/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>The Menace of ML: Simple Moving Average</title>
		<link>https://openforecast.org/2026/09/21/simple-moving-average/</link>
					<comments>https://openforecast.org/2026/09/21/simple-moving-average/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Mon, 21 Sep 2026 09:01:58 +0000</pubDate>
				<category><![CDATA[Simple Methods]]></category>
		<category><![CDATA[Social media]]></category>
		<category><![CDATA[extrapolation methods]]></category>
		<category><![CDATA[SMA]]></category>
		<category><![CDATA[theory]]></category>
		<category><![CDATA[time series]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=4648</guid>

					<description><![CDATA[<p>And here is another forecasting method that is hard to beat in practice. In a recent competition, it gave data scientists huge headaches and even outperformed some powerful ML methods. What&#8217;s the name of this beast?! Simple Moving Average! The idea behind the Simple Moving Average (SMA) is to take the average of the last ... <a title="The Menace of ML: Simple Moving Average" class="read-more" href="https://openforecast.org/2026/09/21/simple-moving-average/" aria-label="Read more about The Menace of ML: Simple Moving Average">Read more</a></p>
<p>Message <a href="https://openforecast.org/2026/09/21/simple-moving-average/">The Menace of ML: Simple Moving Average</a> first appeared on <a href="https://openforecast.org">OpenForecast</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>And here is another forecasting method that is hard to beat in practice. In a recent competition, it gave data scientists huge headaches and even outperformed some powerful ML methods. What&#8217;s the name of this beast?! Simple Moving Average!</p>
<p>The idea behind the Simple Moving Average (SMA) is to take the average of the last few observations and use it as a forecast for the next several steps ahead. Very crude and very simple. In fact, it has Naive (from <a href="/2026/08/27/why-naive-is-popular-and-important/">this post</a>) as a special case if you take the average of one most recent observation. On the other hand, if you increase the order to include all the observations, you will end up with the Global Mean. And this simple method works quite well if you have level data, i.e. no apparent strong trend, no obvious seasonality, and no other important elements of structure.</p>
<p>The only thing that makes it a bit harder to use in practice is the choice of the order, i.e. the number of observations to average over. Unfortunately, there is no universal answer here. But people report that the order of 12 or 13 is fine for weekly data, although it&#8217;s not completely clear why. In the academic literature, <a href="https://doi.org/10.1016/j.ijforecast.2004.10.001">Aris Syntetos &#038; John Boylan (2005)</a> found that SMA(13) performed quite well on intermittent demand data, which was unexpected given the nature of the data (lots of zeroes). And almost 10 years ago, <a href="/2017/09/20/old-dog-new-tricks-a-modelling-view-of-simple-moving-averages/">Fotios Petropoulos and I proposed a model</a> underlying SMA with automatic order selection. We showed that it outperforms other simple benchmarks on supply chain data.</p>
<p>There is also some evidence from the VN2 inventory competition by Nicolas Vandeput. The benchmark there was built around a 13-week moving average with a simple seasonal adjustment, and only 25 out of 180+ participants <a href="https://nicolas-vandeput.medium.com/my-learning-points-from-vn2-the-first-inventory-competition-a4bffcc92856">managed to beat it</a>. Many sophisticated ML pipelines lost to a method that predates computers.</p>
<p>So, if you work, for example, in retail or in supply chain, SMA is a method to consider for your sanity-check pool of models. But don&#8217;t expect miracles from it! It is still a simple method that works for level time series. Use it as a stepping stone to find a better model that has more features.</p>
<p>Anyone else found SMA to be a strong contender? Leave a comment &#8211; it would be interesting to see how many of you have had the same experience.</p>
<p>And yes, we discuss it in our &#8220;Demand Forecasting Principles&#8221; training in more detail. The next one will be held online in November, with live sessions from 2pm to 4pm UK time. We still have a few places left, so <a href="https://openforecast.org/training/demand-forecasting-principles/">register here</a>.</p>
<p>Message <a href="https://openforecast.org/2026/09/21/simple-moving-average/">The Menace of ML: Simple Moving Average</a> first appeared on <a href="https://openforecast.org">OpenForecast</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/2026/09/21/simple-moving-average/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>smooth for Python: ETS+ARIMA</title>
		<link>https://openforecast.org/2026/09/17/smooth-for-python-ets-arima/</link>
					<comments>https://openforecast.org/2026/09/17/smooth-for-python-ets-arima/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Thu, 17 Sep 2026 09:05:42 +0000</pubDate>
				<category><![CDATA[ARIMA]]></category>
		<category><![CDATA[ETS]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[smooth for Python]]></category>
		<category><![CDATA[ADAM]]></category>
		<category><![CDATA[smooth]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=4621</guid>

					<description><![CDATA[<p>ETS is powerful. ARIMA is powerful. But when you need both, you are typically left with fitting ARMA to the residuals of ETS, which biases the parameters. There is a much neater solution: combine them in one state space model to estimate everything jointly&#8230; The standard practice when ETS is not enough to capture the ... <a title="smooth for Python: ETS+ARIMA" class="read-more" href="https://openforecast.org/2026/09/17/smooth-for-python-ets-arima/" aria-label="Read more about smooth for Python: ETS+ARIMA">Read more</a></p>
<p>Message <a href="https://openforecast.org/2026/09/17/smooth-for-python-ets-arima/">smooth for Python: ETS+ARIMA</a> first appeared on <a href="https://openforecast.org">OpenForecast</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p><a href="/2026/04/22/smooth-in-python-ets-with-model-selection/">ETS is powerful</a>. ARIMA is powerful. But when you need both, you are typically left with fitting ARMA to the residuals of ETS, which biases the parameters. There is a much neater solution: combine them in one state space model to estimate everything jointly&#8230;</p>
<p>The standard practice when ETS is not enough to capture the dynamics of real demand is to either switch to ARIMA or apply it to the residuals of the model. But it is possible to join the two models in one by using the Single Source of Error (SSOE) state space framework and to estimate the parameters jointly. This reduces the bias in the parameter estimates, letting the two models work as a team rather than one cleaning up after the other.</p>
<p>In the SSOE form, ETS and ARIMA states are stacked one after another in a large vector. For example, an ETS(A,N,A)+AR(2) model has four states: level, seasonal, and two AR components — each updated independently but responding to the same shock. Structurally, this resembles fitting ETS and then modelling its residuals with ARIMA, but with a critical difference: the parameters are estimated jointly, removing the bias that accumulates from sequential fitting.</p>
<p>But this flexibility comes with constraints. Some ETS and ARIMA combinations are actually redundant — they describe the same process from two angles, producing infinitely many parameter combinations with identical fit. For example, ETS(A,N,N) and ARIMA(0,1,1) are equivalent models, and combining them creates an unidentifiable model with no stable solution. So, I have come up with a few practical guidelines, which you can read about in <a href="/adam/ETSAndARIMA.html">Section 9.4 of ADAM</a>.</p>
<p>Practically speaking, this is all handled under the hood of the ADAM function in Python, so you don&#8217;t need to worry about it. Here is an example:</p>
<pre class="decode">from fcompdata import AirPassengers
from smooth import ADAM

# ETS(A,A,N) + SARIMA(0,0,0)(1,1,1)[12]
model = ADAM(
    model="AAN",
    ar_order=[0, 1],
    i_order=[0, 1],
    ma_order=[0, 1],
    lags=[1, 12],
    h=12, holdout=True
)
model.fit(AirPassengers.y)</pre>
<p>Note how the orders are specified: per lag, with the first element referring to lag 1 and the second to lag 12. The code above fits ETS(A,A,N) + SARIMA(0,0,0)(1,1,1)[12], delegating the seasonality to the ARIMA part. The advantage of doing this via ADAM is that the result can be compared with pure ETS or ARIMA directly using information criteria. And if you don&#8217;t want to choose the orders yourself, AutoADAM will select them for you.</p>
<p>But do you even need the full combination? <a href="https://doi.org/10.1002/for.3980040103">Gardner (1985)</a> and <a href="https://doi.org/10.1016/j.ejor.2009.10.003">Taylor (2010)</a> argued that adding AR(1) tends to improve the accuracy of ETS. So, maybe you can get away with the simple ETS+AR(1) model, which is easy to apply using ADAM.</p>
<p><a href="/adam/ARIMAandETS.html">When to use ETS vs ARIMA</a>.<br />
<a href="/adam/ETSAndARIMA.html">How to combine them</a>.</p>
<p>Try it yourself: <code>pip install smooth</code></p>
<p>Message <a href="https://openforecast.org/2026/09/17/smooth-for-python-ets-arima/">smooth for Python: ETS+ARIMA</a> first appeared on <a href="https://openforecast.org">OpenForecast</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/2026/09/17/smooth-for-python-ets-arima/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Five assumptions behind &#8220;forecastability&#8221;</title>
		<link>https://openforecast.org/2026/09/14/five-assumptions-behind-forecastability/</link>
					<comments>https://openforecast.org/2026/09/14/five-assumptions-behind-forecastability/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Mon, 14 Sep 2026 08:03:00 +0000</pubDate>
				<category><![CDATA[Forecast evaluation]]></category>
		<category><![CDATA[Social media]]></category>
		<category><![CDATA[Theory of forecasting]]></category>
		<category><![CDATA[extrapolation methods]]></category>
		<category><![CDATA[opinion]]></category>
		<category><![CDATA[theory]]></category>
		<category><![CDATA[time series]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=4636</guid>

					<description><![CDATA[<p>Here is a confession. I don&#8217;t like the idea of &#8220;forecastability&#8221;. I think it does not bring value and can be harmful in some cases. Let me explain. One of the definitions I see on the internet: &#8220;A measure of the degree to which something may be forecast with accuracy&#8221;. This definition is so disturbing ... <a title="Five assumptions behind &#8220;forecastability&#8221;" class="read-more" href="https://openforecast.org/2026/09/14/five-assumptions-behind-forecastability/" aria-label="Read more about Five assumptions behind &#8220;forecastability&#8221;">Read more</a></p>
<p>Message <a href="https://openforecast.org/2026/09/14/five-assumptions-behind-forecastability/">Five assumptions behind &#8220;forecastability&#8221;</a> first appeared on <a href="https://openforecast.org">OpenForecast</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Here is a confession. I don&#8217;t like the idea of &#8220;forecastability&#8221;. I think it does not bring value and can be harmful in some cases. Let me explain.</p>
<p>One of the definitions I see on the internet: &#8220;A measure of the degree to which something may be forecast with accuracy&#8221;. This definition is so disturbing that I cannot resist ranting about it. The thing that annoys me the most is the &#8220;with accuracy&#8221;, which is really arbitrary and can mean anything. Your Naive method produces a relative RMSE of 1.0. Is that accurate enough? Does this make the time series forecastable? What if ETS produces 1.2, while LightGBM delivers 0.8? Is the data forecastable now? And when do you say &#8220;this is fine&#8221;?</p>
<p>But let me breathe and take a step back. The thing is, any method of measuring forecastability has assumptions behind it. Here is my list of five (did I miss any?):</p>
<ol>
<li>The models you use: each time series has its own characteristics, so you can only say that the data is &#8220;forecastable&#8221; given the set of models you have. The data with trend might look unforecastable for the model that only has the level component.</li>
<li>The features/indicators that are available: if you do not know when promotions happen, some observations will look unforecastable. It&#8217;s a similar argument to (1), but more about what you include in your model. If you spend more time on feature generation and transformation, then the series that looked very hard might become quite easily forecastable.</li>
<li>The statistic you focus on: this could be the conditional mean, the median, some quantile, or the whole predictive distribution. A model can do great in terms of point forecasts but very poorly when it comes to prediction intervals. Does that make the time series unforecastable? Which one do you care more about?</li>
<li>The forecast horizon: the longer it is, the less accurate the forecasts become. One-step-ahead forecasts are easy, multiple steps ahead are hard. Which one do you use to measure forecastability?</li>
<li>The error measures: I&#8217;ll just leave this here: <a href="/category/forecasting-theory/forecast-evaluation/">https://openforecast.org/category/forecasting-theory/forecast-evaluation/</a></li>
</ol>
<p>Do I hear someone mentioning the coefficient of variation (CoV) as a good measure of forecastability? This is, by the way, what is used in the conventional XYZ classification. Well, let&#8217;s check the five points above against it and see what it assumes: (1) the global mean is suitable and the variance is constant; (2) no features are available; (3) conditional mean as the statistic of interest; (4) 1-step-ahead point forecast; (5) Root Mean Squared Error (the core of the CoV). So, it is suitable for a very small set of time series. If you use it universally, you might decide that some time series with a very clear structure are not forecastable. And the same exercise works for the more sophisticated measures, entropy-based ones included: run them through the five questions and see what they silently assume.</p>
<p>And then we come to the final point: so what? Let&#8217;s say you split your data into the &#8220;forecastable/not&#8221; categories. What are you going to do with that? The intention behind this is legitimate — you cannot babysit ten thousand SKUs equally, so you want to know where to spend your time. But the label &#8220;unforecastable&#8221; answers the wrong question. The right question is why the series is hard to forecast: missing promotion information? Wrong model? Genuinely random demand? Each of these implies a different action. It might well be that your &#8220;unforecastable&#8221; time series just require more time and effort to become forecastable again.</p>
<p>We don&#8217;t teach &#8220;forecastability&#8221; in our Demand Forecasting Principles course — because, as you can see, I don&#8217;t believe in it. What we do teach is everything in the list above: models, their assumptions, features, horizons, and how to evaluate forecasts properly. See details about the next course <a href="/training/demand-forecasting-principles/">here</a>.</p>
<p>This is my personal view. Happy to hear what others have to say.</p>
<p>Message <a href="https://openforecast.org/2026/09/14/five-assumptions-behind-forecastability/">Five assumptions behind &#8220;forecastability&#8221;</a> first appeared on <a href="https://openforecast.org">OpenForecast</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/2026/09/14/five-assumptions-behind-forecastability/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
