时间序列预测:ARIMA/LSTM/Prophet 实战
1. 时间序列基础
时间序列成分:
├── 趋势(Trend):长期变化方向
├── 季节性(Seasonality):周期性变化
├── 周期性(Cyclical):非固定周期波动
└── 噪声(Noise):随机波动
2. ARIMA
python
from statsmodels.tsa.arima.model import ARIMA
from statsmodels.tsa.stattools import adfuller
# 平稳性检验
result = adfuller(data)
print(f'ADF Statistic: {result[0]}')
print(f'p-value: {result[1]}')
# 差分使数据平稳
data_diff = data.diff().dropna()
# ARIMA 模型
model = ARIMA(data, order=(1, 1, 1))
model_fit = model.fit()
print(model_fit.summary())
# 预测
forecast = model_fit.forecast(steps=30)
3. LSTM
python
import torch
import torch.nn as nn
class LSTMModel(nn.Module):
def __init__(self, input_size, hidden_size, num_layers, output_size):
super().__init__()
self.lstm = nn.LSTM(input_size, hidden_size, num_layers, batch_first=True)
self.fc = nn.Linear(hidden_size, output_size)
def forward(self, x):
lstm_out, _ = self.lstm(x)
out = self.fc(lstm_out[:, -1, :])
return out
# 数据准备
def create_sequences(data, seq_length):
X, y = [], []
for i in range(len(data) - seq_length):
X.append(data[i:i+seq_length])
y.append(data[i+seq_length])
return np.array(X), np.array(y)
4. Prophet
python
from prophet import Prophet
# 数据格式:ds(日期), y(值)
df = pd.DataFrame({'ds': dates, 'y': values})
model = Prophet(
yearly_seasonality=True,
weekly_seasonality=True,
daily_seasonality=False
)
model.fit(df)
# 预测
future = model.make_future_dataframe(periods=30)
forecast = model.predict(future)
# 可视化
model.plot(forecast)
model.plot_components(forecast)
总结
| 方法 | 适用场景 | 优势 |
|---|---|---|
| ARIMA | 线性/平稳序列 | 统计理论完善 |
| LSTM | 非线性/复杂模式 | 捕捉长期依赖 |
| Prophet | 有季节性的业务数据 | 自动处理节假日 |