☰
【老计带你懂AI算法】10:经典时间序列预测,从移动平均到ARIMA和Prophet
2026/9/28 4:37:23 网站建设 项目流程

【老计带你懂AI算法】10:经典时间序列预测,从移动平均到ARIMA和Prophet

开头:带时间顺序的数据,是另一个物种

前面讲的所有模型,处理的数据有个共同特点,样本之间是独立的、没有先后顺序。这套房和那套房、这封邮件和那封邮件,谁先谁后无所谓,打乱顺序不影响。

可现实里有一大类数据,顺序至关重要,打乱了就全毁了,这就是时间序列。每天的股价、每月的销量、每秒的服务器负载、每小时的网站流量,它们都带着时间戳,一个接一个,昨天影响今天、今天影响明天。时序预测要干的,就是根据过去的走势,预测未来会怎样。

这类任务太常见了:电商要预测下个月销量好备货,运维要预测未来流量好扩容,金融要预测价格走势。因为时间这个维度的加入,时序数据成了一个需要专门方法来对付的物种。这一篇讲经典的时序方法,下一篇讲用机器学习和深度学习做时序。

先看懂时序数据的三大成分

对付时序数据之前,得先学会"看"它。一条时序曲线,通常可以拆成三个成分,理解了这三样,后面所有方法都好懂了:

  • 趋势:长期的大方向,是一路往上、往下,还是平着走。比如一家增长中的公司,销量总体是上升趋势。
  • 季节性:周期性的规律波动。比如冰淇淋销量夏天高冬天低(一年一个周期),网站流量白天高深夜低(一天一个周期),这种"到点就重复"的规律就是季节性。
  • 噪声(残差):去掉趋势和季节性后,剩下的那些随机的、说不清道不明的波动。

打个比方:一条时序曲线就像一个人爬楼梯还带着呼吸起伏。楼梯的整体高度变化是趋势(长期在往上走),每一步的规律起伏是季节性(周期性重复),而他偶尔的踉跄晃动是噪声(随机的)。时序预测的核心,就是把趋势和季节性这两个有规律的部分抓准、外推到未来,噪声则是没法预测、只能承认的部分。

移动平均与指数平滑:最朴素的思路

最简单的时序预测,就是用过去的平均值来猜未来。

移动平均:拿最近N天的平均值,作为对下一天的预测。比如用最近7天的平均销量预测明天。它的作用主要是抹平短期波动、看清趋势,像给毛糙的曲线做了平滑。缺点也明显,它对所有历史一视同仁地平均,反应比较迟钝,遇到转折跟不上。

指数平滑:对移动平均的一个聪明改进。它的想法是,越近的数据越重要,权重越高;越老的数据越不重要,权重指数级衰减。这更符合直觉,毕竟预测明天,昨天肯定比一个月前更有参考价值。指数平滑还有能同时处理趋势和季节性的高级版本(叫Holt-Winters),能应对更复杂的情况。

这两种方法的共同气质是简单、快、好理解,适合快速出一个基线预测,或者做数据平滑。但它们对复杂规律的刻画能力有限,于是有了更强的ARIMA。

ARIMA:经典时序的集大成者

ARIMA是经典统计时序方法里最有名、最强的一个,很多人一提时序预测就想到它。名字看着吓人,拆开看其实是三个部件的组合,我用大白话讲清每个部件在干嘛:

  • AR(自回归):假设今天的值,和过去几天的值有关系,用过去的值来预测今天。就像"看前几天的走势外推"。
  • I(差分):这是ARIMA处理趋势的手段。很多时序带着明显的上升或下降趋势,不平稳,不好直接建模。差分就是用今天减去昨天,把"绝对值"变成"变化量",一趟下来往往就把趋势去掉、让序列变平稳了,方便建模。

这里要补一个时序里绕不开的核心概念,平稳性。啥叫平稳?大白话就是这条序列的统计特性(比如平均水平、波动幅度)不随时间变化,看上去从头到尾都"差不多稳",没有明显的一路上涨或波动越来越大。ARIMA这类经典方法有个前提,它们要求序列是平稳的才好建模。为什么?因为如果序列一直在涨、水平一直在变,模型就抓不住一个稳定的规律来外推。而现实数据大多不平稳(销量在涨、股价在飘),所以才需要前面说的差分,把不平稳的序列(带趋势的)转成平稳的(变化量),这就是ARIMA里那个字母I的使命。理解了平稳性,你就明白为什么时序建模第一步常常是先检验和处理平稳性,这是经典时序方法一个和别的模型很不一样的必修课。

  • MA(移动平均):这里的MA和前面说的移动平均不完全是一回事,它是用过去的预测误差来修正当前预测,相当于从自己以前犯的错里学习。

把这三样组合起来,ARIMA就能同时刻画时序的自相关性和趋势,是很强的经典方法。它还有个加强版叫SARIMA(Seasonal ARIMA),专门多处理了季节性,能应对冰淇淋销量那种带明显周期的数据。

ARIMA的门槛在于,它有三个参数(对应AR、I、MA各用几阶)需要你去定,传统上要看一些统计图来判断,有点专业。好在现在有自动定阶的工具(如pmdarima的auto_arima)能帮你自动搜出合适的参数,降低了使用门槛。

Prophet:为工程而生的好用工具

ARIMA强但用起来有门槛,于是有了Prophet,这是一个工程上特别好用的时序工具,主打一个傻瓜好用、还能处理现实里的各种幺蛾子。

Prophet的思路很直接,它不搞ARIMA那套,而是把时序显式地拆成趋势、季节性、节假日效应几个部分分别建模,再加起来。这个思路和我们前面讲的"三大成分"完全对得上,所以特别好理解。它的几个突出优点:

  • 能自动处理季节性(年、周、天的周期都能抓),不用你操心。
  • 能吃进节假日信息,这在现实中太重要了,双十一、春节的销量暴增,普通模型会当成异常,Prophet可以让你告诉它这些特殊日子,预测就准多了。
  • 对缺失数据和异常点比较鲁棒,现实数据总是脏的,它容忍度高。
  • 参数直观、几乎开箱即用,业务人员也能上手。

Prophet牺牲了一点理论上的精细,换来了工程上的极大便利,特别适合业务场景里那些带明显季节性和节假日效应的预测(销量、流量),是很多公司做时序预测的顺手工具。

输入和输出长什么样

  • 输入:一条按时间排好序的数值序列(比如每天一个销量数字,带着日期)。注意时序数据绝对不能打乱顺序,这是它和前面所有模型最大的不同。
  • 输出:未来若干个时间点的预测值。好的时序工具(如Prophet)还会给出预测的置信区间(未来值大概在哪个范围内),这比一个孤零零的预测数字有用得多,因为它告诉你预测有多大的不确定性。

上代码:用Prophet预测未来趋势

Prophet接口友好,适合演示。输入:一段带日期的历史数据。输出:未来的预测值和置信区间。

# 依赖:pip install prophet pandas numpyimportpandasaspdimportnumpyasnpfromprophetimportProphet# 造一份带趋势+周季节性的数据:两年的每日数据dates=pd.date_range("2023-01-01",periods=730,freq="D")trend=np.linspace(10,30,730)# 缓慢上升的趋势weekly=5*np.sin(np.arange(730)*2*np.pi/7)# 每周一个周期的季节性noise=np.random.randn(730)*2# 随机噪声y=trend+weekly+noise# Prophet要求列名固定为 ds(日期) 和 y(数值)df=pd.DataFrame({"ds":dates,"y":y})model=Prophet(weekly_seasonality=True,yearly_seasonality=False)model.fit(df)# 训练:自动拆解趋势和季节性# 预测未来30天future=model.make_future_dataframe(periods=30)# 生成含未来30天的日期表forecast=model.predict(future)# 看最后5天的预测:yhat是预测值,yhat_lower/upper是置信区间print(forecast[["ds","yhat","yhat_lower","yhat_upper"]].tail())

运行输出(示例,数值仅为示意,因数据含随机噪声每次运行会有差异):

ds yhat yhat_lower yhat_upper 755 2025-01-25 32.451209 28.617334 36.104290 756 2025-01-26 31.087540 27.301923 34.976311 757 2025-01-27 30.213996 26.351467 34.028755 758 2025-01-28 33.760182 29.914521 37.585049 759 2025-01-29 34.128905 30.315874 38.010223

运行你会得到未来30天的预测值yhat,以及每个预测的上下界(置信区间)。Prophet自动从数据里学出了上升趋势和每周的周期波动,把它们外推到未来,这就是"拆解三大成分再外推"的思路在起作用。拿到的置信区间在实际决策里很有价值,比如备货时可以按预测上界备,避免缺货。

关键参数与注意点

  • 季节性设置(Prophet的weekly/yearly_seasonality):告诉模型数据有哪些周期,这是用好Prophet的关键。
  • 节假日:可以传入节假日表,让模型专门处理特殊日子。
  • ARIMA的三个阶数:如果用ARIMA,这三个参数最关键,建议用auto_arima自动搜。
  • 通用注意点:时序预测越往远预测越不准(误差会累积),所以别指望它精确预测很久以后;同时要警惕数据里的结构突变(比如疫情让所有历史规律失效),历史规律不成立时,任何时序模型都会失灵。

优缺点与适用场景

经典时序方法(ARIMA/Prophet等)优点:可解释性好(能看清趋势、季节性各是什么)、需要的数据量不算大、成熟稳定、Prophet还特别好上手。缺点:主要擅长刻画趋势和季节性这类相对规整的规律,对特别复杂的非线性模式、或者需要用很多外部特征(不只是历史值)来预测的场景,就力不从心了,那时要请出机器学习和深度学习方法。

适合场景:有明显趋势和季节性的业务预测(销量、流量、负载)、数据量中等、需要可解释、需要置信区间。不适合:规律高度非线性、要融合大量外部特征、超大规模多序列联合预测,这些是下一篇主角的舞台。

小结与承上启下

  • 时序数据:带时间顺序,不能打乱,核心是抓住趋势、季节性两个规律成分,噪声无法预测。
  • 移动平均/指数平滑:最朴素,平滑和快速基线,指数平滑让近处数据权重更高。
  • ARIMA/SARIMA:经典集大成者,自回归+差分去趋势+误差修正,SARIMA加季节性。
  • Prophet:工程好用,显式拆解趋势季节性节假日,傻瓜好上手、给置信区间,是业务预测的顺手工具。

经典方法擅长规整的趋势和季节性,可如果时序里藏着复杂的非线性规律、或者你想用一堆额外特征(天气、促销、节假日)来帮助预测,就得换思路了。下一篇我们讲怎么用机器学习的树模型和深度学习的LSTM来做时序预测,看看它们各自的长处。

我们下一篇见。

延伸阅读

  • statsmodels 官方文档:时间序列分析(含ARIMA、SARIMA):https://www.statsmodels.org/stable/tsa.html
  • Prophet 官方文档:https://facebook.github.io/prophet/

(说明:以上为官方公开文档地址,可能随版本调整,如打不开可用标题搜索。)

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询