季节性+趋势的预测
时间序列可以分解为水平部分(平均值)、趋势部分(上升或下降)和季节性部分(周期性的重复),剩余的就是随机变动,即前三者都没法解释的“杂音”。我们常见的时间序列,根据复杂度的不同,一般是上述三种成分中的一种、两种或三种组合而成。当然,你也可以把水平部分当成趋势的特例,或者趋势的一部分。那么,时间序列就可简化为趋势和季节性,以及两者之外的随机变动。下面这个例子就是这样分解的。[1]
图1-16所示是5年间(60个月)国际航班的每月乘客总数,单位是千人。图1-16最上方的是实际乘客数,你能看到整体乘飞机的人数在上升,你也能看到有一定的季节性变化。我们进一步分解实际值,发现乘飞机的人一年比一年多,呈现明显的趋势,这就是趋势部分;季节性也很明显(这也符合常识:西方众多的节日在下半年,相应地,乘客也更多);剩余的是随机成分,也就是难以系统地预测的部分[2]。
图1-16 时间序列的分解
资料来源:How to Decompose Time Series Data into Trend and Seasonality,作者Jason Brownlee,machinelearningmastery.com。
在实践中,符合季节性趋势的情况很多,比如城市的用电量、商用车的销量,甚至治疗糖尿病的药物销量,都呈现出趋势加季节性的特点。就拿商用车来说,某公司的商用车销量呈现明显的上升趋势,一直到2015年达到顶峰。其每年的销量有季节性,比如3月份一般是销售旺季——春节过完了,许多公司对新的一年信心满满,纷纷添置商用车这样的固定资产加油干,然后需求就缓慢降下来,在6、7月降到谷底后就开始反弹,在9月份又达到一个高点。
时间序列的可分解性,有着极其重要的实践意义。它让我们从貌似纷繁复杂的世界里,提炼出我们能够理解的,即趋势、季节性等有重复性、延续性的成分,把未知留给那些随机变动的部分。经过分解,我们会发现,大部分变动其实是可知的,也就是说,数据是可以解释的;未知的只是很小一部分,需要数据外的判断。
那些未知的随机变动中,有相当一部分是管理行为导入的变动,不是客户就是我们自己,或者是竞争对手的管理行为,比如促销、活动、降价等。如果找到那些导入此类变动,或者熟悉竞品、客户行为的市场人员、销售人员、门店经理,让他们及早帮助判断的话,这些其实有一定的可预见性。剔除这些管理行为导入的变动,剩下的才是真正的随机变动,需要交给数理统计,设置安全库存来应对;或者依靠供应链执行,通过赶工加急来对付。
就这样,我们把需求分解成了三大块:①历史数据完全可以揭示的趋势、季节性变动,只要我们分析历史数据,就能很好地预知,这就是“从数据开始”;②管理行为导入的变动,比如促销、活动、新品导入和老品下市,只要我们更好地对接市场、销售等职能,“由判断结束”,就可以大幅降低大错特错的概率;③数据没法解释,判断没法预计的随机变动,我们要通过设置安全库存和依靠供应链执行来应对。
现在你知道,需求预测之所以主要是个计划行为,是因为:计划的数据分析不到位,没法把有规律的可知部分提炼出来,就把所有的变动都当作不可知,于是就不可避免地依赖销售“提需求”,走上一条不归路。数据驱动的计划都没有能力分析数据,经验主义的销售、市场就更分析不了,企业在需求预测上就不得不“从判断开始,由判断结束”,靠“拍脑袋”,在粗放管理的泥淖里打滚。
即便是随机部分,也不是完全不可知的——小概率事件一旦发生了,就不再是小概率事件了。也就是说,凡是发生了的,其实都有其必然性。任何可预知的东西,比如趋势、季节性,最初也往往是以“随机”的面目出现。比如原来的需求很稳定,业务开始增长时,增长部分是水平部分没法解释的,就被归到随机部分;业务继续增长,你会发现随机变动中,有了趋势的成分,变成了可以预测的。季节性变动也是。
我们的解决方案一方面是尽快滚动预测,纳入最新的需求历史和职业判断;另一方面是选择、配置合适的模型,通过模型更好地“规律”化这些“随机”因素。
比如在前面谈到的简单指数平滑法中,我们可以通过调整平滑系数,决定把多大比例的随机变动当成规律性的变动——平滑系数越大,我们认为随机变动中的规律性比例就越高。在霍尔特法中,我们通过增加趋势的平滑系数,能更好、更快、更系统地把这些“随机”成分趋势化。而霍尔特–温特模型则在霍尔特模型的基础上,增加了季节性参数,把那些“随机”成分中的季节性因素也给规律化了。
既然对历史需求可以自上而下地分解,那么对需求的预测也可分别预测,自下而上地汇总。这也正是人们应对复杂预测问题的方法。比如对于趋势,我们可用霍尔特法来应对,分别预测水平和趋势两部分;而对于水平、趋势、季节性三者的组合,我们可用霍尔特–温特模型来应对,分别预测三部分后叠加。
相比霍尔特模型的双参数,霍尔特–温特模型增加了季节性参数,变成了三参数:水平部分对应的α平滑系数,趋势部分对应的β平滑系数,季节性部分对应的γ平滑系数。霍尔特–温特模型是一个很好的模型,因为我们可以通过合理设置三个平滑系数,来优化趋势加季节性的预测模型。
不过,优点也是缺点:霍尔特–温特模型的公式相对复杂,优化起来更加困难,大部分人难以熟练驾驭这三个参数——用不好的话,预测准确度可能反倒更低。我想了许久,决定在此只做基本的介绍,点到为止,给感兴趣的读者开个头。如果你们有具体的案例,我们也可以一起研究,在本书的后续版本中补齐。
对于有趋势的季节需求,我们这里介绍一下常用的方法,准确度不是最高,但相对简单易行。
我们先看一下季节性和周期性的区别。周期性是时间序列呈现波浪形起伏,一般由商业和经济活动引起。它不同于趋势变动,不是朝着单一方向的持续运动,而是涨落相间的交替波动;它也不同于季节变动,季节变动有比较固定的规律,而循环波动则无固定规律。可以说,周期性和季节性都有波峰和波谷,前者缺乏规律性,可预见性低;后者规律性强,容易预见。
提到季节性,人们想到的就是一年四季。这没错,不过季节性不一定非得要一年,一天、一周、一个月,甚至一个小时、一分钟,都可以有季节性。比如你开了一家餐馆,早餐、午餐和晚餐的需求量不同,对店面人工的需求情况是:早晨少,中午和晚上多,这是一天的季节性。同样,餐馆在周五、周六的生意一般最忙,而周二一般最清闲(这也是在美国很多餐馆周二有特价的原因),这是一周的季节性。电商也类似,在一周里跟餐馆的季节性正好相反:周末的时候,消费者都出去吃饭逛街,没有多少人网购;周二的时候,消费者窝在家里不出去或在上班,网购的量会很高。我在分析一个电商的业务时,看到类似的模式,可参考后文的图3-21。
如果是单纯的季节性,季度与季度之间没有趋势的话,我们可以求出每个季节的需求,跟平均值比较,用来预测下一年各季度的需求。就如下面的例子中,上年四个季度的平均值已知(2500个),根据每个季度的需求,就可求出每个季度对应的季节指数。
季度 需求(个) 季节指数
春季 2000 2000/2500=0.8
夏季 3500 3500/2500=1.4
秋季 3000 3000/2500=1.2
冬季 1500 1500/2500=0.6
假定这个产品每年以30%的趋势增长,那么下一年的总预测就是13000个,每个季度的平均预测是13000/4=3250(个),相应地可以预测每个季度的需求如下:
季度 预测(个)
春季 3250×0.8=2600
夏季 3250×1.4=4550
秋季 3250×1.2=3900
冬季 3250×0.6=1950
这其实也不难。有趣的是,读英特尔前CEO安迪·格鲁夫的书,其中提到,照相机用的胶卷就是这样的季节性产品,即便在每年的需求量变化不大的情况下,在匈牙利的计划经济时代(格鲁夫是匈牙利裔),那些国有企业还是没法生产出合适的量来。计划经济之“计划”性,可见一斑。
我们下面看一下季节性、趋势并存的情况。[3]如图1-17所示,这个产品的销量具有季节性,每4期是一个周期;同时,需求也呈现出趋势。我们的任务是预测第13期到第16期的需求。这里的“期”可以理解为季度、月度、周、天等任何时间单元(案例中的期其实是季度)。
我们先求每一期的季节指数。如表1-3所示,鉴于季节性每4期循环一次,我们把12期的数据分为3轮(可以理解为3年),求出每期的3轮平均值。每期的平均值与12期的总平均值相除,就得到该期的季节指数。比如第二期的平均值为176.7,12期的总平均值为190.8,两者相除,得到第二期的季节指数为0.93,意味着第二期是平均需求的93%(低于100%的话,可以理解为淡季;高于100%,可以理解为旺季)。
图1-17 季节性和趋势并存的时间序列
表1-3 季节性指数的计算
接着我们求趋势。在求趋势前,我们先得去季节化,也就是用每期的需求除以季节指数。如表1-4所示,第④列就是假定没有季节性时每期的需求。围绕第①列和第④列的数据,我们来运用线性回归法(具体的做法后文会详细谈到),得出线性回归方程为需求预测=152.44+5.91×期数。这里的5.91就是我们说的“趋势”,也就是说,每期比上期增加5.91个。这样,我们就能够求出不包含季节性的线性预测,见第⑤列。比如第13期的线性预测等于152.44+5.91×13=229.27,四舍五入为229。
最后一步,就是把季节指数反算进去,求得季节性调整后的预测,亦即我们最终需要的预测。这是把线性预测(第⑤列)与季节指数(第③列)相乘。比如第14期的最终预测就是235×0.93=219。
第②列的实际值和第⑥列的预测值相减,就得到第⑦列的预测误差。围绕该误差,我们可以设置一定的安全库存,来应对预测的不准确,也是需求的不确定性,计算的详情见“第二章库存计划和库存的优化”中的“量化不确定性,设立安全库存”部分。
表1-4 预测趋势和季节性并存的情况
注:数据有四舍五入。
实践者问
这里介绍的“季节性+趋势”的模型,跟霍尔特–温特模型有什么区别?
刘宝红答
这里的模型简单,但能够优化的地方很有限,比如趋势和季节指数都没法调整,所以模型比较“僵硬”,预测的准确度也受影响。在霍尔特–温特模型中,我们可以调整三个平滑系数,提高模型的拟合度,也提高预测的准确度。
看到这里,有些人或许会问,现在的产品生命周期都这么短,哪能有两年、三年、四年的需求历史,让我们来求这些季节指数、趋势预测未来的需求?从具体的成品来说,这或许没错;但对半成品、原材料、产能来说,却未必。比如热饮就是季节性非常明显的产品(天气冷了需求量大,热了需求量小),热饮的包装就如快时尚,更新频次相当高。但热饮本身(半成品)和原材料的变化就没那么大,生产线和工艺也是年复一年差不多,我们在半成品、原材料、产能层面还是可以做类似的预测,指导整个供应链更加有序地响应。
再如,在有些行业,压货行为非常普遍,人为制造了季节性。比如在图1-18中,某工业品企业的销售人员习惯性地向渠道压货,1月份没什么生意,2月份也没多少生意,3月份是季末,考核时间到了,就拼命向渠道压货,需求大增;季度考核完了,4月份就没多少生意,5月份稍微增长点,6月份是季末和半年考核,销售冲量就更厉害。就这样,三个月一个周期,业务上下起伏,多年来都是如此。除了季节性,该企业的业务整体上一直在增长,是典型的“季节性+趋势”。
销售的压货行为,背后有深刻的绩效考核、组织行为和产品竞争力等原因,这里不细讲。[4]对于供应链,我们除了抱怨,还可以用这里讲的方法,预测销售人员的压货行为,尽量来驱动供应链有序应对。当然,我说这些并不是说“金有狼牙棒,宋有天灵盖”,提倡供应链逆来顺受:当产品的竞争力有限,绩效考核短期难以改变的时候,相同的外界约束下,计划和供应链还是有可作为的。只要做了我们可作为的,我们就可以做得比以前好,比同行好。这就是竞争优势。
图1-18 销售人员压货冲量,人为造成业务的周期性起伏
我们再回到图1-17的例子。这是一个完美的季节性带趋势的例子,我们可以相当准确地预测出来(从第⑦列的预测误差即可看出)。实践中,我们很少会有这样的完美情况。我们的应对方案还是一样。其一,尽量作准。寻找更合适的预测方法,比如霍尔特–温特模型,通过优化各参数来尽量提高预测准确度。其二,尽快纠偏。有了一点实际销售数据,要尽早分析,与原来的预测比较,与历史数据比较,再结合市场、销售、产品管理等人员的职业判断,尽快调整预测。这样做,至少可以避免大错特错。
此外,不管是季节性、周期性,还是趋势,都是相对特定的供应链响应周期、响应能力而言的。当供应链的响应周期很短,响应能力无限的时候,对这些变动性的预测就不那么重要。比如这是个前置仓或者门店,补货周期就那么几个小时或几天,反映不出来多少季节性、趋势,你也就用不着采取复杂的方法——移动平均法、简单指数平滑法来预测,甚至卖一补一的“幼稚预测”,八成就能够很好地应对。但是,如果你要规划前置仓、门店的规模,决定是否扩容的话,那就是长周期行为,我们得预测未来几个季度甚至几年的需求,这时,季节性、趋势等更复杂的情形预测就更有必要。产线的产能、供应商的产能、长周期物料的备料也是同理。
资源
上面介绍的简单指数平滑法、霍尔特法、霍尔特–温特模型等一系列时间序列预测,都可以登录http://www.real-statistics.com/free-download/real-statistics-examples-workbook/点击链接“Real Statistics Examples:Time Series”,下载成套的模板和公式。这个网站是Charles Zaiontz博士开发的。Charles Zaiontz博士堪称极客般的存在,能把复杂的数理统计解释得非常清楚。
[1] 案例来自How to Decompose Time Series Data into Trend and Seasonality,作者Jason Brownlee,https://machinelearningmastery.com。
[2] Excel可以帮助我们把时间序列分解为趋势和季节性,可以百度“运用Excel分解时间序列”。SPSS软件也有这个功能,详情请参考“用SPSS进行时间序列分析”一文(https://www.cnblogs.com/114811yayi/p/5661817.html)。
[3] 这部分参考了内华达大学雷诺分校罗恩·伦布克(Ron Lembke)博士的文章“Forecasting with Seasonality”,business.unr.edu。
[4] 对于销售人员压货的原因和解决方案,可以参考我和赵玲所著的《供应链的三道防线:需求预测、库存计划、供应链执行》一书,第110~111页。