← 返回 QuantGrowth 首页

Prophet预测方法:把指标拆成增长、周期和节假日

数据
数据数据指标

指标体系搭好之后,"最近数据怎么样"就变成了每天都要回答的问题:下个月 DAU 能做到多少?今天这个下跌算不算异常?靠人肉盯报表既不现实也不可靠,业界通行的做法是基于预测的监控——先让模型预测指标的合理波动范围,实际值一旦跌出这个范围就报警。而提到时间序列预测,几乎绕不开 Facebook 开源的 Prophet。

一、基于预测的监控:从"盯数字"到"盯偏离"

常见的时间序列异常检测方法分为两大类:

  • 基于预测:用 Prophet、ARIMA 等模型拟合历史、预测未来,实际值与预测值的偏离超过阈值即为异常;
  • 基于统计:如 3-sigma 法,假设数据服从正态分布,偏离均值三倍标准差的点判为异常。

两者相比,基于预测的方法有一个本质优势:它给出的阈值是随时间动态变化的。工作日和周末的 DAU 基线天然不同、大促前后的订单量量级悬殊,固定阈值要么误报不断、要么漏掉真正的异常;而预测模型学到了趋势和周期,报警标准会跟着基线一起走。Prophet 正是"基于预测"这一路线里最流行的起点。

二、Prophet 是什么:一个可加的时间序列模型

Prophet 由 Facebook 数据科学团队于 2017 年开源发布(论文《Forecasting at Scale》),是一款时间序列预测的可加模型,具有操作简单、功能丰富、拟合能力强等优势。

它的核心思想是把指标拆解为三个可解释的分量:

y(t) = g(t) + s(t) + h(t) + \varepsilon_t

其中 ​g(t) 是增长项(趋势),​s(t) 是周期项(季节性),​h(t) 是节假日项,​\varepsilon_t 是模型未覆盖的误差项。可加结构的好处是每个分量都能单独拟合、单独可视化、单独调参——预测出问题时,你能直接看出是趋势没学对,还是季节性没拟合住。
截屏2026-08-29 16.00.08

三、增长项 g(t):趋势怎么建模

3.1 饱和增长模型(非线性增长)

很多业务变量的增长存在自然上限(如手机出货量受人口限制、市场渗透率封顶 100%),Prophet 为此引入承载上限 ​C,用 logistic 函数刻画增长:

g(t) = \frac{C}{1 + e^{-k(t-m)}}

其中 ​k 是增长速度,​m 是偏置项(增长的拐点位置)。

3.2 突变点:让增长速度"分段"起来

实际预测时,​k 往往是不稳定的——例如暑假换机潮会突然拉高增速。Prophet 的解法是引入突变点(changepoints):在历史数据中指定 ​s 个时间点,相邻两个突变点之间增长速度保持稳定,突变点处增长速度发生跳变:

g(t) = \frac{C(t)}{1 + e^{-(k + \mathbf{a}(t)^T\boldsymbol{\delta})(t - (m + \mathbf{a}(t)^T\boldsymbol{\gamma}))}}

其中 ​\mathbf{a}(t) 是阶跃函数(突变点之前为 0、之后为 1),​\boldsymbol{\delta} 是各突变点的增速调整量,​\boldsymbol{\gamma} 是补偿偏移——它的作用是让曲线在突变点前后保持连续,不会断开。上限 ​C(t) 可以是常数,也可以是随时间线性变化的函数。

3.3 分段线性模型

如果业务增长没有明显的饱和上限(如用户早期的高速增长阶段),可以退而采用分段线性模型,只保留突变点机制、去掉 logistic 包络:

g(t) = (k + \mathbf{a}(t)^T\boldsymbol{\delta}) \cdot t + (m + \mathbf{a}(t)^T\boldsymbol{\gamma})

实操中还可以通过 changepoint_prior_scale 参数控制趋势的柔性:该值越大,模型越"敢"在历史中识别增速变化,曲线越贴合历史但也越容易过拟合;越小则趋势越平滑,越倾向于把波动交给周期项处理。

四、周期项 s(t):用傅立叶级数拟合季节性

业务指标的周期效应无处不在:一周工作 5 天的影响每周重复一次(本地生活 App 周五日活上涨),每年寒暑假的安排也会产生类似效果。Prophet 用傅立叶级数建立周期模型:

s(t) = \sum_{n=1}^{N} \left( a_n \cos\frac{2\pi n t}{P} + b_n \sin\frac{2\pi n t}{P} \right)

​P 指周期:​P=365.25 时即年季节性(yearly_seasonality),​P=7 时即周季节性(weekly_seasonality)。傅立叶级数的好处是用少量参数就能拟合任意形状的周期曲线——季节性不一定是标准的正弦波,周末的"双峰效应"、春节前的持续爬坡,都可以通过足够多的谐波项逼近。年季节性默认取 ​N=10 阶,周季节性取 ​N=3 阶,且支持自动从数据中推断周期是否存在。

五、节假日项 h(t):把先验知识录进模型

国内用户在春节期间的使用时长、消费额度与其他日期有明显差异,而各个国家的假日安排差异更大——这类效应靠周期项很难覆盖(春节在公历上的日期每年漂移)。Prophet 的做法是直接提供一张节假日表,将这些回归项提前录入模型:

节日 国家 年份 时间
感恩节 美国 2015 2015.11.26
感恩节 美国 2016 2016.11.24
春节 中国 2021 2021.2.11
春节 中国 2022 2022.2.1

节假日项的形式为:

h(t) = Z(t)\mathbf{\kappa}, \quad \mathbf{\kappa} \sim Normal(0, \nu)

​Z(t) 是指示函数矩阵(当天是否为某节日、或处于节日前后窗口),​\mathbf{\kappa} 是每个节日的效应系数,服从正态先验——先验方差 ​\nu 默认取 10,意味着允许较大的节日效应,也可以调小来收缩极端假日的拟合空间。节日前后的影响(如大促预热期)还可以通过 lower_window/upper_window 参数额外建模。

一个实战中的坑值得单独记录:调休和"996"式的非常规工作安排会显著拉低预测准确度。Prophet 的周季节性默认按标准"工作五天、休息两天"学习,而五一调休把周末变成工作日、周末前后拼接错乱,模型无法自动识别——这类日期需要手工加入节假日表或单独处理。

六、模型结构:分析师参与的建模循环

Prophet 论文里最有价值的一张图,是它对预测工作流的定义。整个过程是一个分析师介入的循环(analyst-in-the-loop),而不是一次性的自动训练:
截屏2026-08-29 16.01.10

  1. 建模(Modeling):分析师根据预测问题建立合适的时间序列模型;
  2. 模型评估(Forecast Evaluation):用模型对历史数据做仿真回测,在参数不确定的情况下进行多种尝试,根据仿真效果评估哪种模型更合适;
  3. 暴露问题(Surface Problems):多次调参后效果仍差的(如一个未被录入的节日造成整段预测偏移),把问题暴露出来——有时问题不在模型,而在数据或业务流程;
  4. 可视化检查(Visually Inspect Forecasts):将预测结果可视化反馈,分析师根据经验进一步调整优化模型。

这个循环里,一部分工作由分析师完成(建模、解释、录入业务先验),一部分可以自动化(评估、回测、报警),Prophet 的设计目标正是让分析师把经验花在业务判断上,而不是花在调模型超参上。

七、落地建议:用预测区间做监控阈值

把 Prophet 用于指标监控的典型落地方式:

  1. 拟合 + 预测:用近 12 年的历史数据拟合,预测未来 714 天,得到预测均值和不确定性区间(默认 80%);
  2. 动态阈值报警:实际值落在区间外即触发报警——区间随趋势和季节性逐日变化,天然解决了"周末基线低、工作日基线高"的固定阈值难题;
  3. 定期重训:每天滚动加入最新数据重训模型,让趋势和突变点及时更新;
  4. 监控模型本身:长期连续误报/漏报时优先怀疑突变点设置和节假日表缺失,而不是盲目调参。

选型上的经验法则:Prophet 在周期性强的数据上表现更好。业务指标通常带明显的周/年季节性和节假日效应,这正是 Prophet 的主场;而 ARIMA 系模型更依赖序列平稳性,适合周期性弱、自相关强的数据。

参考资料

  • Taylor S J, Letham B. Forecasting at Scale. PeerJ Preprints / The American Statistician, 2017(论文地址即 PPT 引用的 https://peerj.com/preprints/3190.pdf)
  • Prophet 官方文档与开源实现(Python/R):https://facebook.github.io/prophet/