用 Python 轻松实现时间序列预测:Darts 协变量 Covariates
文中内容仅限技术学习与代码实践参考,市场存在不确定性,技术分析需谨慎验证,不构成任何投资建议。
Darts 是一个 Python 库,用于对时间序列进行用户友好型预测和异常检测。它包含多种模型,从 ARIMA 等经典模型到深度神经网络。所有预测模型都能以类似 scikit-learn 的方式使用 fit()
和 predict()
函数。该库还可以轻松地对模型进行回溯测试,将多个模型的预测结果结合起来,并将外部数据考虑在内。Darts 支持单变量和多变量时间序列和模型。基于 ML 的模型可以在包含多个时间序列的潜在大型数据集上进行训练,其中一些模型还为概率预测提供了丰富的支持。
协变量
Covariates
与 past 和 future covariates 相关的章节适用于 darts 0.15.0
及以后版本。与 static covariates 相关的章节适用于 darts 0.20.0
及以后版本。
摘要
在 Darts 中,协变量(covariates)指可作为模型输入的外部数据,用于提升预测效果。在预测模型语境下,目标(target)是需要预测的序列,而协变量本身并不会被预测。我们区分三种协变量:
- past covariates:按定义,仅已知过去值的协变量(如测量值)
- future covariates:按定义,已知未来值的协变量(如天气预报)
- static covariates:按定义,在时间轴上保持不变的协变量(如产品 ID)。更多信息请查看静态协变量示例 notebook。
Darts 的预测模型在其 fit()
与 predict()
方法中接受 past_covariates
和/或 future_covariates
,具体取决于模型能力(某些模型不接受任何协变量)。目标与协变量必须都是 TimeSeries
对象。如果使用了不被支持的协变量,模型将报错。
# 创建 Darts 预测模型之一
model = SomeForecastingModel(...)# 使用 past 与 future covariates 训练模型
model.fit(target=target,past_covariates=past_covariates_train,future_covariates=future_covariates_train)# 预测未来 n=12 步
model.predict(n=12,series=target, # 仅 Global Forecasting Models 需要past_covariates=past_covariates_pred,future_covariates=future_covariates_pred)
不同于 past 与 future covariates,static covariates 必须嵌入到 目标 序列中。因此,使用 static covariates 的方法略有不同,可参考该示例了解用法。
如需将多个协变量作为 past(或 future)covariates 使用,需用 stack()
将它们合并为单个 past_covariates
(或 future_covariates
)对象:
# 使用 stack() 合并两个 TimeSeries
past_covariates = past_covariates.stack(other_past_covariates)# 或使用 concatenate()
from darts import concatenate
past_covariates = concatenate([past_covariates, other_past_covariates], axis=1)
Darts 的预测模型期望每个目标序列对应一个 past 和/或 future covariate 序列。若使用 Darts 的 Global Forecasting Models 训练多个目标序列,则必须向 fit()
提供相同数量的专用协变量:
# 使用两个目标序列训练
model.fit(target=[target, target_2],past_covariates=[past_covariates, past_covariates_2],# 可选 future_covariates,)# 预测时必须指定要预测的目标序列及其对应协变量
model.predict(n=12,series=target_2,past_covariates=past_covariates_2,# 可选 future_covariates,)
如果训练时使用了 past_covariates
,预测时也必须在 predict()
中提供这些 past_covariates
;future_covariates
同理,但需注意预测时 future_covariates
必须延伸到足够远的未来(直至预测期长 n
)。如下图所示,past_covariates
至少需要与 target
相同的时间跨度,future_covariates
则需至少覆盖与 target
相同时间跨度外加 n
步未来。
只要时间跨度满足要求,你可在训练与预测阶段使用同一 *_covariates
。
图 1:预测期长 n=2 时,目标与协变量在预测模型中的顶层概览
另需注意,Darts 的深度学习模型通常每次预测 output_chunk_length
个时间点。然而,若模型训练时使用了 past covariates,且这些 past covariates 在未来也足够长,则可预测 n > output_chunk_length
的期长。此时通过消耗 past covariates 的未来值并对目标序列自回归完成预测。欲了解更多细节,请继续阅读。
简介 - Darts 中的协变量是什么?
Past、future 与 static covariates 提供额外信息/上下文,有助于提升对 target
序列的预测效果。target
序列是我们希望预测未来的变量;协变量本身不会被预测,仅用于预测 target
。
Past 与 future covariates 分别包含过去(含当前)或未来的信息,相对于我们未来预测时刻而言。
在 Darts 中,我们称这两种类型为 past_covariates
与 future_covariates
。
Static covariates 包含与 target
序列无关时间(恒定/静态)的信息,称为 static_covariates
,必须嵌入在 target
序列中。使用 static covariates 的方式与 past/future covariates 略有不同,可查看相关 notebook 了解更多。
Darts 的预测模型对 *_covariates
的支持各异:有些不支持任何协变量,有些仅支持 past 或 future,有些支持全部三种(详见后文小节)。
以下是 past、future 与 static covariates 的示例:
-
past_covariates
:通常为测量值(历史数据)或时间属性- 每日平均实测气温(仅过去已知)
- 星期几、月份、年份……
-
future_covariates
:通常为预报值(未来已知数据)或时间属性- 每日平均预报气温(未来已知)
- 星期几、月份、年份……
-
static_covariates
:与target
无关时间/恒定/静态的特征- 类别型:
target
的位置(国家、城市……名称)target
的标识符(产品 ID、门店 ID……)
- 数值型:
target
所在国家/市场区域的人口(假设预测期内恒定)target
所在地区的平均气温(假设预测期内恒定)
- 类别型:
时间属性因其提前已知,可帮助模型捕捉 target
序列的趋势与/或季节性模式,效果显著。
静态属性在同时处理多个 target
(多个 TimeSeries
或多变量序列)时尤为有效;这些与时间无关的信息可帮助模型识别底层序列的性质/环境,从而在不同 target
间提升预测效果。
本指南主要聚焦 past 与 future covariates。判断序列是 past 还是 future covariates 的简单经验法则:
如果数值提前已知,则为 future covariates(或可作为 past covariates);否则 必须 是 past covariates。
例如,若模型仅支持 past_covariates
(如 TCNModel
,见表 1),你仍可把预报的温度作为 past covariate 使用,即便你同时也拥有未来的温度预报。了解这些“past covariates 的未来值”可让你预测更远的未来(对 Darts 深度学习模型,当预测期长 n > output_chunk_length
时)。同样,大多数使用 future covariates 的模型也可使用“future covariates 的历史值”。
旁注:若你没有未来值(如实测气温的未来值),你完全可以用 Darts 的预测模型先对未来气温建模,再将其作为 future_covariates
。Darts 不会替你预测协变量,因为这会引入一个额外的“隐藏”建模步骤,我们认为最好由用户自行处理。
预测模型协变量支持
Darts 的预测模型在其 fit()
与 predict()
方法中可选地接受 past_covariates
和/或 future_covariates
(以及嵌入在 target
序列中的 static_covariates
),具体取决于模型能力。表 1 列出各模型支持的协变量类型;若使用了不被支持的协变量,模型将报错。
局部预测模型(LFMs)
LFMs 仅能在单个目标序列上训练。Darts 中此类模型多为简单统计模型(如 ETS、ARIMA)。LFMs 仅接受单个 target
(及协变量)序列,通常在调用 fit()
时一次性在整个序列上训练,并可在训练序列结束后一次性预测任意步长 n
。
全局预测模型(GFMs)
GFMs 可在多个目标(及协变量)序列上训练。与 LFMs 不同,GFMs 以固定长度的子样本(chunks)进行训练与预测。在 Darts 中,这些模型包括全局(朴素)基线模型、回归模型、基于 PyTorch(Lightning)的模型(神经网络)以及部分集成模型(取决于其内部模型及/或参与集成的预测模型)。
Model | Past Covariates | Future Covariates | Static Covariates |
---|---|---|---|
Local Forecasting Models (LFMs) | |||
Naive Baselines (a) | |||
ARIMA | ✅ | ||
VARIMA | ✅ | ||
ExponentialSmoothing | |||
TBATS | ✅ | ||
Theta 与 FourTheta | |||
Prophet | ✅ | ||
FFT (快速傅里叶变换) | |||
KalmanForecaster | ✅ | ||
Croston 方法 | ✅ | ||
StatsForecastModel | ✅ | ||
AutoARIMA | ✅ | ||
AutoETS | ✅ | ||
AutoCES | ✅ | ||
AutoMFLES | ✅ | ||
AutoTBATS | ✅ | ||
AutoTheta | ✅ | ||
全局预测模型(GFMs) | |||
Global Naive Baselines (b) | |||
Regression Models © | ✅ | ✅ | ✅ |
RNNModel (d) | ✅ | ||
BlockRNNModel (e) | ✅ | ||
NBEATSModel | ✅ | ||
NHiTSModel | ✅ | ||
TCNModel | ✅ | ||
TransformerModel | ✅ | ||
TFTModel | ✅ | ✅ | ✅ |
DLinearModel | ✅ | ✅ | ✅ |
NLinearModel | ✅ | ✅ | ✅ |
TiDEModel | ✅ | ✅ | ✅ |
TSMixerModel | ✅ | ✅ | ✅ |
Ensemble Models (f) | ✅ | ✅ | ✅ |
Conformal Prediction Models (g) | ✅ | ✅ | ✅ |
表 1:Darts 预测模型及其协变量支持
- Naive Baselines 包括 NaiveDrift、NaiveMean、NaiveMovingAverage 与 NaiveSeasonal。
- Global Naive Baselines 包括 GlobalNaiveAggregate、GlobalNaiveDrift 与 GlobalNaiveSeasonal。
- Regression Models 包括 SKLearnModel、LinearRegressionModel、RandomForestModel、LightGBMModel、XGBModel 与 CatBoostModel。SKLearnModel 是一种特殊的 GFM,可使用任意滞后协变量(past 和/或 future)与过去目标值进行预测。
- RNNModel 包括
LSTM
与GRU
;其概率版等价于 DeepAR。 - BlockRNNModel 包括
LSTM
与GRU
。 - Ensemble Model 包括 RegressionEnsembleModel 与 NaiveEnsembleModel。其协变量支持取决于被集成模型的协变量支持。
- Conformal Prediction Model 包括 ConformalNaiveModel 与 ConformalQRModel。其协变量支持取决于底层预测模型。
在 Darts 预测模型中使用 past 和/或 future covariates 的快速指南
使用协变量非常简单,只需满足若干要求即可。
与 target
序列一样,每个 past 和/或 future covariate 序列必须是 TimeSeries
对象。当你用 fit()
训练模型并使用了 past 和/或 future covariates 时,在 predict()
中也必须提供相同类型的协变量。根据模型选择与预测期长 n
,协变量时间跨度要求可能不同,详见下一小节。
只要时间跨度满足要求,你甚至可以在训练与预测阶段使用同一 *_covariates
,因为 Darts 会基于目标时间轴“智能”切片。
# 创建 Darts 预测模型之一
model = SomeForecastingModel(...)# 训练模型
model.fit(target,past_covariates=past_covariate,future_covariates=future_covariates)# 用相同类型协变量进行预测
pred = model.predict(n=1,series=target, # 仅 GFMs 需要past_covariates=past_covariates,future_covariates=future_covariates)
如需对 target
使用多个 past 和/或 future covariates,需将它们全部合并成一个专用 TimeSeries
:
# 使用 stack() 合并时间序列
past_covariates = past_covariates.stack(past_covariates2)# 或使用 concatenate()
from darts import concatenate
past_covariates = concatenate([past_covariates, past_covariates2, ...], axis=1)
GFMs 可在多个 target
序列上训练。你需为每个 fit()
使用的 target
TimeSeries 提供一份对应的 covariate TimeSeries。预测时,需指定要预测的 target
序列并提供相应协变量:
from darts.models import NBEATSModel# 多个时间序列
all_targets = [target1, target2, ...]
all_past_covariates = [past_covariates1, past_covariates2, ...]# 创建 GFM 模型,训练并预测
model = NBEATSModel(input_chunk_length=1, output_chunk_length=1)model.fit(all_targets,past_covariates=all_past_covariates)pred = model.predict(n=1,series=all_targets[0],past_covariates=all_past_covariates[0])
局部与全局预测模型的协变量时间跨度要求
Darts 的“局部”与“全局”预测模型在训练与预测时提取/使用所提供数据的方式有所不同。
根据所用模型与预测期长 n
,协变量时间跨度要求可能不同。
局部预测模型(LFMs)
LFMs 通常在你调用 fit()
时一次性在整个 target
与 future_covariates
(若支持)序列上训练,并可在训练序列结束后一次性预测期长 n
。
若要在 ``fit()`` 与 ``predict()`` 中使用同一 future covariates 序列,其时间跨度要求:
future_covariates
:至少与target
相同的时间跨度,外加target
结束后接下来的n
个时间点。
全局预测模型(GFMs)
GFMs 在固定长度的 chunks(子样本)上训练与预测,每个 chunk 包含输入块(样本过去)与输出块(样本未来)。创建模型时通过 input_chunk_length
与 output_chunk_length
指定块长度(RNNModel
例外,始终使用 output_chunk_length=1
)。
根据预测期长 n
,模型可一次性预测,或通过多步预测(未来多个 chunks)自回归完成。因此,当使用 past_covariates
预测时,你需提供其“未来值”。
若要在 ``fit()`` 与 ``predict()`` 中使用同一 past 和/或 future covariates 序列,其时间跨度要求:
-
当
n <= output_chunk_length
时:past_covariates
:至少与target
相同的时间跨度future_covariates
:至少与target
相同的时间跨度,外加target
结束后的output_chunk_length
个时间点
-
当
n > output_chunk_length
时:past_covariates
:至少与target
相同的时间跨度,外加target
结束后的n - output_chunk_length
个时间点future_covariates
:至少与target
相同的时间跨度,外加target
结束后的n
个时间点
如需了解 GFMs 内部如何使用协变量的更多细节,请阅读我们的 Torch Forecasting Models(基于 PyTorch 的 GFMs)指南,其中逐步解释了训练与预测流程。
示例
以下是若干展示如何在 Darts 预测模型中使用协变量的示例:
- 静态协变量教程(含 TFTModel 示例)
- 与 GFMs 使用 past covariates
- 与 TFTModel 使用 past 与 future covariates
- 与 SKLearnModels(原 RegressionModel)使用 past 与 future covariates
风险提示与免责声明
本文内容基于公开信息研究整理,不构成任何形式的投资建议。历史表现不应作为未来收益保证,市场存在不可预见的波动风险。投资者需结合自身财务状况及风险承受能力独立决策,并自行承担交易结果。作者及发布方不对任何依据本文操作导致的损失承担法律责任。市场有风险,投资须谨慎。