<?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>Sat, 26 Sep 2026 09:05:08 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.2</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>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>
		<item>
		<title>On differencing of ARIMA in state space</title>
		<link>https://openforecast.org/2026/09/12/on-differencing-of-arima-in-state-space/</link>
					<comments>https://openforecast.org/2026/09/12/on-differencing-of-arima-in-state-space/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Sat, 12 Sep 2026 11:25:01 +0000</pubDate>
				<category><![CDATA[ARIMA]]></category>
		<category><![CDATA[smooth for Python]]></category>
		<category><![CDATA[ADAM]]></category>
		<category><![CDATA[extrapolation methods]]></category>
		<category><![CDATA[theory]]></category>
		<category><![CDATA[time series]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=4641</guid>

					<description><![CDATA[<p>A reader left a comment under the MSARIMA post on LinkedIn saying that in order to compare ARIMAs via information criteria, we need to make sure that the candidate models have the same order of differencing. They are right — for the conventional ARIMA. BUT! In the state space formulation, the problem disappears. Here is ... <a title="On differencing of ARIMA in state space" class="read-more" href="https://openforecast.org/2026/09/12/on-differencing-of-arima-in-state-space/" aria-label="Read more about On differencing of ARIMA in state space">Read more</a></p>
<p>Message <a href="https://openforecast.org/2026/09/12/on-differencing-of-arima-in-state-space/">On differencing of ARIMA in state space</a> first appeared on <a href="https://openforecast.org">OpenForecast</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>A reader left a comment under the <a href="https://openforecast.org/2026/09/10/smooth-in-python-multiple-seasonal-arima/">MSARIMA post</a> on LinkedIn saying that in order to compare ARIMAs via information criteria, we need to make sure that the candidate models have the same order of differencing. They are right — for the conventional ARIMA. BUT! In the state space formulation, the problem disappears. Here is why.</p>
<p>In the conventional ARIMA, taking differences is treated as a pre-processing step, where we switch from, for example, the sales of a product to the sales increase/decrease. If you had a sample of 100 observations, after first differences you are left with 99 &#8211; the first observation has nothing to be subtracted from. So yes, with the conventional approach, ARIMA(1,0,1) and ARIMA(1,1,1) are estimated on different sample sizes, and their information criteria are not directly comparable.</p>
<p>But! MSARIMA (and ADAM in general) is a state space model, and this pre-processing step is not needed. The differences are embedded in the model as additional components: ARIMA(0,1,1) has one, ARIMA(0,2,1) has two. The sample stays the same; what changes is the number of estimated parameters &#8211; each new component needs its initial value, and the information criterion penalises that. So the comparison stays fair: same sample, same likelihood basis, different number of parameters. I have <a href="/adam/StateSpaceARIMA.html#ADAMARIMAExamplesModels">several examples of how ARIMA is formulated in the ADAM SSOE framework</a>.</p>
<p>What this implies: any ARIMA model of any orders (non-seasonal, seasonal, or multiseasonal) can be compared with other ARIMA models directly via information criteria, on the same sample of data.</p>
<p>This is not a new idea, by the way. I used this approach in the ARIMA algorithm I developed for the DemandWorks company (now part of Netstock) more than ten years ago, and John Boylan and I later built the State Space ARIMA on the same principle (<a href="https://doi.org/10.1080/00207543.2019.1600764">the paper</a>).</p>
<p>So, yes: if you use the conventional ARIMA (auto_arima from pmdarima, ARIMA from aeon or statsforecast in Python; stats or forecast implementations in R), you NEED to make sure that you compare models with the same order of differencing. But if you use the smooth implementation, you don&#8217;t need to worry &#8211; everything is already taken care of for you. This comes as a bonus from the specific formulation of the model.</p>
<p>Message <a href="https://openforecast.org/2026/09/12/on-differencing-of-arima-in-state-space/">On differencing of ARIMA in state space</a> first appeared on <a href="https://openforecast.org">OpenForecast</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/2026/09/12/on-differencing-of-arima-in-state-space/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 fetchpriority="high" 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="(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>Demand Forecasting Principles training moved to November</title>
		<link>https://openforecast.org/2026/09/07/demand-forecasting-principles-training-moved-to-november/</link>
					<comments>https://openforecast.org/2026/09/07/demand-forecasting-principles-training-moved-to-november/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Mon, 07 Sep 2026 08:07:12 +0000</pubDate>
				<category><![CDATA[Training]]></category>
		<category><![CDATA[announcement]]></category>
		<category><![CDATA[training]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=4630</guid>

					<description><![CDATA[<p>This is a public service announcement! We had to shift things around, and our open course, Demand Forecasting Principles, now runs in November. Eight live sessions over four weeks, every Tuesday and Thursday from 3pm to 5pm UK time, starting 3 November. Nikos Kourentzes and I will deliver it together. The course is built around ... <a title="Demand Forecasting Principles training moved to November" class="read-more" href="https://openforecast.org/2026/09/07/demand-forecasting-principles-training-moved-to-november/" aria-label="Read more about Demand Forecasting Principles training moved to November">Read more</a></p>
<p>Message <a href="https://openforecast.org/2026/09/07/demand-forecasting-principles-training-moved-to-november/">Demand Forecasting Principles training moved to November</a> first appeared on <a href="https://openforecast.org">OpenForecast</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>This is a public service announcement! We had to shift things around, and our open course, Demand Forecasting Principles, now runs in November.</p>
<p>Eight live sessions over four weeks, every Tuesday and Thursday from 3pm to 5pm UK time, starting 3 November. Nikos Kourentzes and I will deliver it together.</p>
<p>The course is built around one idea: you cannot defend a forecast you do not understand. So we teach how the models actually work, starting from the time series components, moving to simple methods, exponential smoothing, the ETS framework, intermittent demand, forecast evaluation, judgemental adjustments, and finishing with combinations. We focus on the understanding instead of how to call specific function, so that you can use that knowledge in any support system you work with (SAP, SAS, Excel etc). Workshops between sessions come in both R and Python, and we review them together at the start of the next session.</p>
<p>The training is for demand planners, forecasting analysts, data scientists moving into demand forecasting, and supply chain professionals who need forecasts they can trust and challenge. No prior forecasting or statistics knowledge is assumed.</p>
<p>£750 per person, £600 each for two or more, £500 for students.</p>
<p>Details and booking can be found <a href="/training/demand-forecasting-principles/">here</a>.</p>
<p>Message <a href="https://openforecast.org/2026/09/07/demand-forecasting-principles-training-moved-to-november/">Demand Forecasting Principles training moved to November</a> first appeared on <a href="https://openforecast.org">OpenForecast</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/2026/09/07/demand-forecasting-principles-training-moved-to-november/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>
		<item>
		<title>smooth in python: Multistep losses</title>
		<link>https://openforecast.org/2026/08/31/smooth-in-python-multistep-losses/</link>
					<comments>https://openforecast.org/2026/08/31/smooth-in-python-multistep-losses/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Mon, 31 Aug 2026 08:47:20 +0000</pubDate>
				<category><![CDATA[Python]]></category>
		<category><![CDATA[smooth for Python]]></category>
		<category><![CDATA[Social media]]></category>
		<category><![CDATA[ADAM]]></category>
		<category><![CDATA[ARIMA]]></category>
		<category><![CDATA[ETS]]></category>
		<category><![CDATA[extrapolation methods]]></category>
		<category><![CDATA[Loss functions]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=4605</guid>

					<description><![CDATA[<p>Why train a forecasting model on one-step-ahead errors when you care about 10-step-ahead accuracy? This is the core motivation behind multistep losses in dynamic models. This has connection with the so-called &#8220;direct forecasting strategy&#8221;. And here what it is and how to work with it in Python. Conventional maximum likelihood estimation minimises one-step-ahead errors. It ... <a title="smooth in python: Multistep losses" class="read-more" href="https://openforecast.org/2026/08/31/smooth-in-python-multistep-losses/" aria-label="Read more about smooth in python: Multistep losses">Read more</a></p>
<p>Message <a href="https://openforecast.org/2026/08/31/smooth-in-python-multistep-losses/">smooth in python: Multistep losses</a> first appeared on <a href="https://openforecast.org">OpenForecast</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>Why train a forecasting model on one-step-ahead errors when you care about 10-step-ahead accuracy? This is the core motivation behind multistep losses in dynamic models. This has connection with the so-called &#8220;direct forecasting strategy&#8221;. And here what it is and how to work with it in Python.</p>
<p>Conventional maximum likelihood estimation minimises one-step-ahead errors. It works well in many standard situations and produces quite robust models. But in practice, you are rarely interested in just the next observation. Supply chains operate on lead times. Budgets are planned quarterly. The model you trained on one-step-ahed forecast is not the model that minimises your actual decision-relevant error.</p>
<p><strong>Multistep losses address this directly</strong>. Instead of minimising \(\mathrm{MSE}_1\), they minimise errors computed \(h\) steps ahead from every in-sample point. The key theoretical result (<a href="/2023/08/09/multi-step-estimators-and-shrinkage-effect-in-time-series-models/">Svetunkov et al., 2023</a>) is that this implies *shrinkage* of smoothing parameters towards zero — the model becomes less stochastic, less reactive to noise, and more stable across longer horizons. Shrinkage strength grows with \(h\) and weakens as sample size increases.</p>
<p>ADAM supports several multistep losses, each with a different trade-off:</p>
<ul>
<li><strong>MSEh</strong> — minimises the \(h\)-step-ahead variance only; strongest shrinkage, simplest interpretation;</li>
<li><strong>TMSE</strong> — sums \(\mathrm{MSE}_j\) for \(j=1,&#8230;,h\), i.e. sum of the MSEs between 1 and h steps ahead; balances all horizons but is dominated by longer-horizon errors;</li>
<li><strong>GTMSE</strong> — takes the log of each \(\mathrm{MSE}_j\) before summing; equalises the influence of short and long horizons, milder shrinkage;</li>
<li><strong>MSCE</strong> — minimises cumulative forecast error; directly relevant for inventory decisions with lead time \(h\);</li>
<li><strong>GPL</strong> — the full General Predictive Likelihood; accounts for the entire covariance structure of multistep errors and encompasses all the above.</li>
</ul>
<p>All of these are accessible in the Python <code>smooth</code> package with a single parameter change. Here is an example of the code with GTMSE:</p>
<pre class="decode">from fcompdata import AirPassengers
from smooth import ADAM

model = ADAM(model="AAA", lags=12, loss="GTMSE", h=12)
model.fit(AirPassengers.y)
model.predict(h=10)</pre>
<p>The <code>h</code> parameter sets the horizon over which multistep errors are evaluated during estimation. This allows connecting the loss with the specific decision horizon better. The image in the post shows the ETS model fit and forecasts, when estimated with several different losses, including the conventional one.</p>
<p>One practical note: on small samples, MSEh and MSCE can produce noticeably biased parameter estimates (closer to zero) due to strong shrinkage. GTMSE tends to be a safer default for small samples.</p>
<p>Read more about these and other losses in the <a href="/adam/multistepLosses.html">ADAM monograph</a> or in the <a href="https://github.com/openforecast-org/smooth/wiki">wiki of the package</a>.</p>
<p>Message <a href="https://openforecast.org/2026/08/31/smooth-in-python-multistep-losses/">smooth in python: Multistep losses</a> first appeared on <a href="https://openforecast.org">OpenForecast</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/2026/08/31/smooth-in-python-multistep-losses/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Why Naïve is popular and important</title>
		<link>https://openforecast.org/2026/08/27/why-naive-is-popular-and-important/</link>
					<comments>https://openforecast.org/2026/08/27/why-naive-is-popular-and-important/#respond</comments>
		
		<dc:creator><![CDATA[Ivan Svetunkov]]></dc:creator>
		<pubDate>Thu, 27 Aug 2026 09:03:02 +0000</pubDate>
				<category><![CDATA[Simple Methods]]></category>
		<category><![CDATA[Social media]]></category>
		<category><![CDATA[Theory of forecasting]]></category>
		<category><![CDATA[Competitions]]></category>
		<category><![CDATA[extrapolation methods]]></category>
		<category><![CDATA[theory]]></category>
		<guid isPermaLink="false">https://openforecast.org/?p=4599</guid>

					<description><![CDATA[<p>There is one forecasting method that appears more often than any other in competitions and evaluations. An experienced forecaster will always use it as a benchmark. This method is called &#8220;Naïve&#8221;, and here is why it is popular and important. Naïve is a very simple forecasting method: the forecast equals to the last observed value. ... <a title="Why Naïve is popular and important" class="read-more" href="https://openforecast.org/2026/08/27/why-naive-is-popular-and-important/" aria-label="Read more about Why Naïve is popular and important">Read more</a></p>
<p>Message <a href="https://openforecast.org/2026/08/27/why-naive-is-popular-and-important/">Why Naïve is popular and important</a> first appeared on <a href="https://openforecast.org">OpenForecast</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>There is one forecasting method that appears more often than any other in competitions and evaluations. An experienced forecaster will always use it as a benchmark. This method is called &#8220;Naïve&#8221;, and here is why it is popular and important.</p>
<p>Naïve is a very simple forecasting method: the forecast equals to the last observed value. So, for example, if the room temperature at 12pm was 20 degrees Celsius, then Naive will forecast exactly the same temperature for 1pm, and it will usually be roughly right. That is what makes it dangerous to sophisticated models: it is often surprisingly hard to beat. If your model cannot beat Naïve, it is not worth deploying, no matter how sophisticated and beautiful it is.</p>
<p>This is why there is a well-established rule in forecasting: any proper evaluation should include simple benchmarks, and Naïve is the easiest one to implement, because it does not have any parameters to estimate and can work with the sample of one observation. This is why you will find it in every decent forecasting competition.</p>
<p>This is not a new finding, by the way. Back in 1979, Spyros Makridakis and Michèle Hibon <a href="https://doi.org/10.2307/2345077">published a paper</a>, showing on a set of 111 real time series that simple methods were often at least as accurate as the sophisticated statistical ones. The audience did not take it well: the discussion that followed was openly hostile, with eminent statisticians suggesting that the results said more about the authors&#8217; skills than about the methods. Spyros&#8217; response was to test the claim at a much larger scale, which is how the M-competitions were born. <a href="/2024/03/14/the-role-of-m-competitions-in-forecasting/">I wrote a post</a> about that some time ago. But the lesson survived the criticism: always compare your approach with the simple forecasting methods.</p>
<p>In our training course on Demand Forecasting Principles, we discuss this and other simple methods in more detail, showing where they work and where they fail. They are all building blocks for understanding applied forecasting.</p>
<p>The next course runs online in October, over Zoom. <a href="https://openforecast.org/training/demand-forecasting-principles/">Details and booking can be found here</a>.</p>
<p>P.S. There is one case where Naïve is not a good benchmark, read <a href="/2024/12/02/why-naive-is-not-a-good-benchmark-for-intermittent-demand/">this post</a>.</p>
<p>Message <a href="https://openforecast.org/2026/08/27/why-naive-is-popular-and-important/">Why Naïve is popular and important</a> first appeared on <a href="https://openforecast.org">OpenForecast</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://openforecast.org/2026/08/27/why-naive-is-popular-and-important/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>
