如果你还没有读过第一部分和第二部分,你可能应该读,否则下面的内容很难理解。
在第一部分中,我们学习了如何强制一个点,在第二部分中,我们学习了如何预测两个点。在这一部分中,我们将学习如何预测多个点。
更多术语
季节
如果一个序列以固定的间隔出现重复,那么这个间隔被称为季节,而这个序列被称为季节性的。Holt-Winters方法需要季节性,非季节性序列(如股票价格)不能用这种方法预测(如果可以的话会更好)。
季节长度
季节长度是新季节开始后的数据点数量。我们用L来表示季节长度。
季节性成分
季节性因素是一个额外的偏离水平+趋势,在相同的偏移量重复到季节。一个季节的每个点都有一个季节性成分,即如果你的季节长度是12,那么就有12个季节性成分。我们用s来表示季节性成分。
三指数平滑a.k.a Holt-Winters方法
三指数平滑背后的理念是,除了水平和趋势之外,还将指数平滑应用于季节性成分。平滑是跨季节应用的,例如,进入季节的第3个点的季节分量将与上一个季节的第3个点的季节分量、两个季节前的第3个点的季节分量等指数平滑。在数学符号中,我们现在有四个方程(见脚注):
新功能:
现在我们有了第三个希腊字母,γ(gamma),它是季节分量的平滑因子。
- 期望值指数是x+m,其中m可以是任意整数,这意味着我们可以预测未来的任意点数(呜呼!)
- 预测方程由水平、趋势和季节组成。
- 预测sx-L+1+(m-1)modL的季节成分指数可能看起来有点令人难以置信,但它只是从观测数据中最后一组季节成分列表的偏移量。(也就是说,如果我们预测的是未来45个季节的第3个点,那么我们就不能使用第44个季节的季节成分,因为这个季节也是预测的,我们必须使用观测点的最后一组季节成分,或者从“过去”开始,如果你愿意的话。)它在Python中看起来要简单得多,很快你就会看到。
初始值
在我们讨论初始值之前,让我向您介绍一个新的小系列(好的,不要太小):
其看起来像
你可以看到这个系列是季节性的,有6个季节清晰可见。虽然从图片上看不太明显,但这个系列的季节长度是12,即每12个点“重复”。为了应用三指数平滑,我们需要知道季节长度是多少。(确实存在检测序列季节性的方法,但这远远超出了本文的范围)。
初始趋势
对于双指数平滑,我们只使用前两点作为初始趋势。有了季节性数据,我们可以做得更好,因为我们可以观察到许多季节,并且可以推断出更好的开始趋势。最常见的做法是计算跨季节趋势平均值的平均值。
看其在Python中的实现
初始季节性成分
当涉及到季节性成分的初始值时,情况更加复杂。简单地说,我们需要计算每个观测季节的平均水平,将每个观测值除以它所在季节的平均值,最后将每个观测季节的平均值。如果你想要更多的细节,这里有一个完整的描述这个过程。
我将放弃最初季节性组件的数学表示法,但这里是用Python编写的。其结果是季节性成分的季节长度数组。
算法
最后,这里是Python中的additive Holt Winters方法。函数的参数是一系列观测值、季节长度、α、β、γ和我们希望预测的点数
如果我们要绘制原始序列,然后是三重指数平滑()调用结果的最后24点,则如下所示:
关于α,β和γ的注记
你可能想知道我是怎么得出α、β和γ分别为0.716、0.029和0.993的。长话短说,它是通过反复试验来实现的:只需反复运行算法并选择给您最小SSE的值。正如我之前提到的,这个过程被称为拟合。
要将烟雾因子计算到小数点后三位,我们可能需要运行100000000次迭代,但幸运的是,在放大最佳值方面有更有效的方法。不幸的是,这将需要一个很长的帖子来描述这个过程。一个很好的算法是Nelder Mead,这是tgres使用的。
脚注
三指数平滑加性方法公式如Makridakis、Wheelwright和Hyndman(1998)在“预测方法和应用,第三版”中所述。维基百科对季节性成分有不同的公式(我不知道哪个更好):