共计 2125 个字符,预计需要花费 6 分钟才能阅读完成。
时间序列预测的业务价值与 ARIMA 适用场景
时间序列预测在零售销量预估、电力负荷预测、金融指标分析等领域具有核心价值。当数据具有明显时间依赖特征时(如昨日销量影响今日销量),传统回归模型往往难以捕捉这种自相关性。ARIMA 模型通过差分处理非平稳性,并分别用自回归(AR)和移动平均(MA)组件建模时序依赖关系,成为处理此类问题的经典方法。

技术原理精要
模型公式分解
ARIMA(p,d,q)模型由三个部分组成:
-
自回归部分(AR):用历史值预测当前值
$$ y_t = c + \phi_1 y_{t-1} + … + \phi_p y_{t-p} + \epsilon_t $$ -
差分部分(I):通过 d 阶差分消除趋势
$$ \Delta^d y_t = (1-L)^d y_t $$ -
移动平均部分(MA):用历史预测误差改进当前预测
$$ y_t = \mu + \epsilon_t + \theta_1 \epsilon_{t-1} + … + \theta_q \epsilon_{t-q} $$
平稳性检验实战
# 使用 ADF 检验判断是否需要差分(statsmodels 0.13.5+)from statsmodels.tsa.stattools import adfuller
def check_stationarity(series):
result = adfuller(series.dropna())
print(f'ADF Statistic: {result[0]:.4f}')
print(f'p-value: {result[1]:.4f}')
return result[1] < 0.05 # p 值小于 0.05 视为平稳
# 示例:原始数据通常不平稳,差分后可能变平稳
print("原始数据平稳性:", check_stationarity(raw_data))
print("一阶差分平稳性:", check_stationarity(raw_data.diff().dropna()))
参数选择可视化
# 绘制自相关 (ACF) 和偏自相关 (PACF) 图
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
plot_acf(diff_data, lags=20) # q 值看 ACF 截尾位置
plot_pacf(diff_data, lags=20) # p 值看 PACF 截尾位置
完整建模流程代码示例
基础 ARIMA 实现
# 1. 导入库(行号 1 -5)import pandas as pd
from statsmodels.tsa.arima.model import ARIMA
from pmdarima import auto_arima # 自动定阶库
# 2. 数据预处理(行号 7 -12)data = pd.read_csv('sales.csv', parse_dates=['date'], index_col='date')
data = data.asfreq('D').fillna(method='ffill') # 处理缺失值为前向填充
# 3. 自动定阶模型(行号 14-20)model = auto_arima(data,
seasonal=False, # 非季节性数据
stepwise=True, # 加速搜索
trace=True) # 打印搜索过程
print(model.summary())
# 4. 手动指定参数建模(行号 22-28)manual_model = ARIMA(data, order=(2,1,1)) # p=2,d=1,q=1
fitted_model = manual_model.fit()
print(fitted_model.summary())
# 5. 预测未来 7 天(行号 30-33)forecast = fitted_model.get_forecast(steps=7)
print(forecast.predicted_mean) # 点预测值
print(forecast.conf_int()) # 置信区间
异常值处理技巧
# 使用滚动标准差检测异常值(行号 35-45)window_size = 30
rolling_std = data.rolling(window_size).std()
threshold = rolling_std.mean() * 3 # 3 倍标准差作为阈值
# 标记异常值(行号 47-50)outliers = data[(data - data.mean()).abs() > threshold]
data_clean = data.mask(data.isin(outliers),
other=data.rolling(7).mean()) # 用 7 天均值替换异常值
生产环境关键考量
- 模型更新策略
- 每周全量重新训练(数据量小时)
- 增量更新(数据量大时使用 online learning)
-
监控预测误差,超出阈值时触发重新训练
-
缺失数据处理
- 前向填充(适合缓慢变化数据)
- 线性插值(适合有趋势数据)
-
季节性插值(适合周期性数据)
-
评估指标选择
- MAE:对异常值不敏感
- RMSE:惩罚大误差
- MAPE:相对误差度量(数据非零时)
延伸思考方向
- 当数据同时存在趋势和季节性时,如何改进为 SARIMA 模型?
- 多个相关时间序列(如气温与电力负荷)如何用 VARIMA 建模?
- 实时预测场景下,怎样平衡模型复杂度和计算延迟?
正文完
