Facebook 开源多季节性时间序列数据预测工具:Prophet 乘性季节性 Multiplicative Seasonality
文中内容仅限技术学习与代码实践参考,市场存在不确定性,技术分析需谨慎验证,不构成任何投资建议。
Prophet 是一种基于加法模型的时间序列数据预测程序,在该模型中,非线性趋势与年、周、日季节性以及节假日效应相匹配。它最适用于具有强烈季节效应和多季历史数据的时间序列。先知对缺失数据和趋势变化具有很强的鲁棒性,通常能很好地处理异常值。
Prophet 是 Facebook 核心数据科学团队发布的开源软件。
用 Python 安装
Prophet 位于 PyPI 上,因此可以使用 pip 进行安装。
python -m pip install prophet
- 从 v0.6 起,不再支持 Python 2。
- 自 v1.0 起,PyPI 上的软件包名称为 “prophet”;v1.0 之前为 “fbprophet”。
- 从 v1.1 起,支持的 Python 最低版本为 3.7。
也可以通过 conda-forge 安装。
conda install -c conda-forge prophet
乘性季节性
默认情况下,Prophet 使用加性季节性进行拟合,即季节效应被加到趋势上得到预测值。下面这个航空旅客数量的时间序列就是一个加性季节性不奏效的例子:
# R
df <- read.csv('https://raw.githubusercontent.com/facebook/prophet/main/examples/example_air_passengers.csv')
m <- prophet(df)
future <- make_future_dataframe(m, 50, freq = 'm')
forecast <- predict(m, future)
plot(m, forecast)
# Python
df = pd.read_csv('https://raw.githubusercontent.com/facebook/prophet/main/examples/example_air_passengers.csv')
m = Prophet()
m.fit(df)
future = m.make_future_dataframe(50, freq='MS')
forecast = m.predict(future)
fig = m.plot(forecast)
这个时间序列有明显的年度周期,但预测中的季节性在时间序列起始部分过大,而在末尾部分过小。在这个时间序列中,季节性不是一个恒定的加性因子(如 Prophet 所假设的那样),而是随趋势一起增长。这就是乘性季节性。
Prophet 可以通过在输入参数中设置 seasonality_mode='multiplicative'
来建模乘性季节性:
# R
m <- prophet(df, seasonality.mode = 'multiplicative')
forecast <- predict(m, future)
plot(m, forecast)
# Python
m = Prophet(seasonality_mode='multiplicative')
m.fit(df)
forecast = m.predict(future)
fig = m.plot(forecast)
此时,组件图会将季节性显示为趋势的百分比:
# R
prophet_plot_components(m, forecast)
# Python
fig = m.plot_components(forecast)
当设置 seasonality_mode='multiplicative'
时,节假日效应也将被建模为乘性。任何添加的季节性或额外回归变量默认都会使用 seasonality_mode
所设置的值,但可通过在添加季节性或回归变量时指定 mode='additive'
或 mode='multiplicative'
来覆盖。
例如,以下代码块将内置季节性设为乘性,但包含一个加性的季度季节性以及一个加性回归变量:
# R
m <- prophet(seasonality.mode = 'multiplicative')
m <- add_seasonality(m, 'quarterly', period = 91.25, fourier.order = 8, mode = 'additive')
m <- add_regressor(m, 'regressor', mode = 'additive')
# Python
m = Prophet(seasonality_mode='multiplicative')
m.add_seasonality('quarterly', period=91.25, fourier_order=8, mode='additive')
m.add_regressor('regressor', mode='additive')
加性和乘性的额外回归变量将在组件图中分别显示在不同的面板上。然而,混合使用加性和乘性季节性的情况相当少见,因此通常只有在有明确理由预期会出现这种情况时才会使用。
风险提示与免责声明
本文内容基于公开信息研究整理,不构成任何形式的投资建议。历史表现不应作为未来收益保证,市场存在不可预见的波动风险。投资者需结合自身财务状况及风险承受能力独立决策,并自行承担交易结果。作者及发布方不对任何依据本文操作导致的损失承担法律责任。市场有风险,投资须谨慎。