<?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>Archives Social media - OpenForecast</title>
	<atom:link href="https://openforecast.org/category/social-media/feed/" rel="self" type="application/rss+xml" />
	<link>https://openforecast.org/category/social-media/</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>Archives Social media - OpenForecast</title>
	<link>https://openforecast.org/category/social-media/</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>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>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>
		<item>
		<title>smooth in python: Multiple Seasonal ARIMA</title>
		<link>https://openforecast.org/2026/09/10/smooth-in-python-multiple-seasonal-arima/</link>
					<comments>https://openforecast.org/2026/09/10/smooth-in-python-multiple-seasonal-arima/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Thu, 10 Sep 2026 08:01:44 +0000</pubDate>
				<category><![CDATA[ARIMA]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[smooth for Python]]></category>
		<category><![CDATA[Social media]]></category>
		<category><![CDATA[ADAM]]></category>
		<category><![CDATA[Seasonality]]></category>
		<category><![CDATA[smooth]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=4632</guid>

					<description><![CDATA[<p>ARIMA has been a workhorse for decades. But the standard implementations quietly hard-code assumptions: one seasonal cycle, Gaussian errors, regressors handled separately etc. This is fine for textbook well-behaved data. But what do you do when you face real data? The conventional implementations (statsmodels or pmdarima in Python, stats in R) do their job well: ... <a title="smooth in python: Multiple Seasonal ARIMA" class="read-more" href="https://openforecast.org/2026/09/10/smooth-in-python-multiple-seasonal-arima/" aria-label="Read more about smooth in python: Multiple Seasonal ARIMA">Read more</a></p>
<p>Message <a href="https://openforecast.org/2026/09/10/smooth-in-python-multiple-seasonal-arima/">smooth in python: Multiple Seasonal ARIMA</a> first appeared on <a href="https://openforecast.org">OpenForecast</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>ARIMA has been a workhorse for decades. But the standard implementations quietly hard-code assumptions: one seasonal cycle, Gaussian errors, regressors handled separately etc. This is fine for textbook well-behaved data. But what do you do when you face real data?</p>
<p>The conventional implementations (statsmodels or pmdarima in Python, stats in R) do their job well: they estimate SARIMA via likelihood, select orders automatically, and produce sensible forecasts for series with trend and one seasonality. Monthly or quarterly demand data is their home ground. The problems start when the data has more than one cycle: the classical SARIMA formulation has a slot for exactly one seasonal lag, so for the half-hourly electricity demand you would have to pick either the hour-of-day or the day-of-week cycle and discard the other.</p>
<p>MSARIMA (Multiple Seasonal ARIMA) solves this by reformulating ARIMA in the Single Source of Error (SSOE) state space form. Each AR, I, and MA element becomes a state in the model, so nothing restricts you to one seasonal lag: you can have as many as you want. In the smooth package, orders are specified per lag, matched to a lags list. Here is an example on the classical taylor series (half-hourly electricity demand in England and Wales), with two seasonal cycles:</p>
<p><code>from fcompdata import taylor<br />
from smooth import MSARIMA</p>
<p># MSARIMA(3,0,1)(0,1,1)[48](0,1,1)[336]
model = MSARIMA(<br />
    orders={"ar": [3, 0, 0], "i": [0, 1, 1], "ma": [1, 1, 1]},<br />
    lags=[1, 48, 336],<br />
    h=336, holdout=True<br />
)<br />
model.fit(taylor.y)<br />
model.predict(h=336, interval="prediction", level=0.95)</code></p>
<p>In Python, it takes only 1.5 seconds for the function to fit the model to the data and estimate its parameters, which is fast for a double-seasonal model fit to roughly four thousand observations:</p>
<figure id="attachment_4634" aria-describedby="caption-attachment-4634" style="width: 290px" class="wp-caption aligncenter"><a href="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2026/09/2026-04-30-smooth-posts-07-msarima.png&amp;nocache=1"><img loading="lazy" decoding="async" src="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2026/09/2026-04-30-smooth-posts-07-msarima-300x207.png&amp;nocache=1" alt="Python/R output of the double seasonal ARIMA" width="300" height="207" class="size-medium wp-image-4634" srcset="https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2026/09/2026-04-30-smooth-posts-07-msarima-300x207.png&amp;nocache=1 300w, https://openforecast.org/wp-content/webpc-passthru.php?src=https://openforecast.org/wp-content/uploads/2026/09/2026-04-30-smooth-posts-07-msarima.png&amp;nocache=1 632w" sizes="auto, (max-width: 300px) 100vw, 300px" /></a><figcaption id="caption-attachment-4634" class="wp-caption-text">Python/R output of the double seasonal ARIMA</figcaption></figure>
<p>But the smooth implementation brings several additional practical benefits.</p>
<p>First, model.fit() accepts a matrix of external regressors via xreg, estimated jointly with the ARIMA components &#8211; no separate pre-filtering step. The logic and the code are identical to ETSX, <a href="/2026/05/05/smooth-in-python-ets-with-explanatory-variables/">which I covered earlier</a>.</p>
<p>Second, you can swap the loss: loss=&#8221;GTMSE&#8221; or &#8220;MSEh&#8221; optimises the model directly on multistep errors, with the same shrinkage mechanism I discussed in <a href="/2026/08/31/smooth-in-python-multistep-losses/">the post on multistep losses</a>.</p>
<p>Third, you don&#8217;t need to stick with the Gaussian distribution &#8211; you can choose other ones if you think that, for example, Laplace is more suitable for the data (<a href="/2026/05/27/smooth-in-python-non-normal-distributions-in-ets-arima/">this post</a>).</p>
<p>And there is one more thing. Because MSARIMA now lives in the same state space framework as ETS, the two models can be combined into one and compared with each other directly via information criteria. But that deserves a post of its own, so stay tuned.</p>
<p>Read <a href="/adam/ADAMARIMA.html">Chapter 9 on ADAM ARIMA</a>.<br />
Or check out the documentation in <a href="https://github.com/openforecast-org/smooth/wiki/MSARIMA">smooth wiki</a>.</p>
<p>An why not try it yourself? <code>pip install smooth</code></p>
<p>Message <a href="https://openforecast.org/2026/09/10/smooth-in-python-multiple-seasonal-arima/">smooth in python: Multiple Seasonal ARIMA</a> first appeared on <a href="https://openforecast.org">OpenForecast</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/2026/09/10/smooth-in-python-multiple-seasonal-arima/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Another important Naïve method</title>
		<link>https://openforecast.org/2026/09/03/another-important-naive-method/</link>
					<comments>https://openforecast.org/2026/09/03/another-important-naive-method/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Thu, 03 Sep 2026 09:05:47 +0000</pubDate>
				<category><![CDATA[Simple Methods]]></category>
		<category><![CDATA[Social media]]></category>
		<category><![CDATA[Theory of forecasting]]></category>
		<category><![CDATA[Seasonality]]></category>
		<category><![CDATA[theory]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=4614</guid>

					<description><![CDATA[<p>There is another forecasting method that is extremely popular, hard to beat, and has no parameters to estimate. It also has &#8220;Naïve&#8221; in its name. Do you know what I&#8217;m talking about? It is called &#8220;Seasonal Naïve&#8221;. While the simple Naïve copies the last observed actual into the future as a forecast, the seasonal one ... <a title="Another important Naïve method" class="read-more" href="https://openforecast.org/2026/09/03/another-important-naive-method/" aria-label="Read more about Another important Naïve method">Read more</a></p>
<p>Message <a href="https://openforecast.org/2026/09/03/another-important-naive-method/">Another important Naïve method</a> first appeared on <a href="https://openforecast.org">OpenForecast</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>There is another forecasting method that is extremely popular, hard to beat, and has no parameters to estimate. It also has &#8220;Naïve&#8221; in its name. Do you know what I&#8217;m talking about?</p>
<p>It is called &#8220;Seasonal Naïve&#8221;. While the simple Naïve copies the last observed actual into the future as a forecast, the seasonal one copies the whole seasonal shape of the data and uses it as a forecast. The logic is straightforward: if you see an increase in sales every January, why not use the actual sales of January 2025 as the forecast for January 2026? Simple, easy to do, and hard to beat in some cases, especially when your demand does not have high variability.</p>
<p>What this method doesn&#8217;t do is filter out the noise in the data. This means that if you had a promotion-driven spike this February, Seasonal Naïve will happily copy it into next February&#8217;s forecast. So, if you have some distinct components in your time series and/or effects of explanatory variables on sales, Seasonal Naïve might not be a good choice. But it remains an essential benchmark for any seasonal data.</p>
<p>I actually have an anecdote related to the Seasonal Naïve. Yves Sagaert and I were working on a paper, and we decided to apply our new method to data with multiple seasonality. It worked great, better than the double seasonal exponential smoothing and ARIMA. I was really hyped and was ready to celebrate, when Yves suggested trying the Seasonal Naïve as well. It&#8217;s good that he did, because it turned out that Seasonal Naïve beat them all, including our new method, without even blinking. This was a great demonstration of a principle I had been preaching to others: if you have seasonal data, always use Seasonal Naïve as a benchmark.</p>
<p>In the Demand Forecasting Principles course in November, we cover simple methods like this one properly, including when to stop trusting them. Details and booking can be found <a href="/training/demand-forecasting-principles/">here</a>.</p>
<p>Message <a href="https://openforecast.org/2026/09/03/another-important-naive-method/">Another important Naïve method</a> first appeared on <a href="https://openforecast.org">OpenForecast</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/2026/09/03/another-important-naive-method/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
