回测

回测用给定模型获得的历史上的模拟预测,是用来评测模型预测准确率的重要工具。


fig_1

回测是一个迭代过程,回测用固定预测窗口在数据集上进行重复预测,然后通过固定步长向前移动到训练集的末尾。如上图所示,桔色部分是长度为3的预测窗口。在每次迭代中,预测窗口会向前移动3个长度,同样训练集也会向后扩张三个长度。这个过程会持续到窗口移动到数据末尾。

示例

1)数据准备

from paddlets.datasets.repository import get_dataset
dataset = get_dataset('WTH')
train_dataset, val_test_dataset = dataset.split(0.8)
val_dataset, test_dataset = val_test_dataset.split(0.5)
train_dataset.plot(add_data=[val_dataset,test_dataset],labels=["val","test"])

fig_2

2)模型拟合

from paddlets.models.forecasting import MLPRegressor
mlp = MLPRegressor(
    in_chunk_len = 7 * 96,
    out_chunk_len = 96,
    max_epochs=100
)
mlp.fit(train_dataset, val_dataset)

3)回测

下面举了5个关于回测的例子,如果需要更多关于回测的信息请阅读 Backtesting API doc

  • 回测示例1

默认情况下回测在模型input_chunk_length的位置开始并返回一个MSE评估指标。

from paddlets.utils import backtest
score= backtest(
    data=test_dataset,
    model=mlp
)
print(score)
#{'WetBulbCelsius': 14.125747060941888}
  • 回测示例2

自定义指标

from paddlets.utils import backtest
from paddlets.metrics import MAE
mae = MAE()
score = backtest(
    data=test_dataset,
    model=mlp,
    metric = mae)
print(score)

  • 回测示例3

如果设置 return_predicts 为True,回测函数会返回指标结果和预测值 。

from paddlets.utils import backtest
score, preds_data= backtest(
    data=test_dataset,
    model=mlp,
    return_predicts = True)

val_test_dataset.plot(add_data=preds_data,labels="backtest")

fig_3

  • 回测示例4

start 可以控制回测的起始点如果设置 start 为0.5,那么回测将会在数据的中间位置开始。

from paddlets.utils import backtest
score, preds_data= backtest(
    data=test_dataset,
    model=mlp,
    start =0.5,
    return_predicts = True)
test_dataset.plot(add_data=preds_data,labels="backtest")

fig_5

  • 回测示例5

predict_window 是每次预测的窗口长度。stride 是两次连续预测之间的移动步长。在大多数情况下我们需要自定义这两个参数来模拟真实的预测场景。

from paddlets.utils import backtest
score, preds_data = backtest(
    data=test_dataset,
    model=mlp,
    start =0.5,
    predict_window=1,
    stride=1,
    return_predicts = True)
test_dataset.plot(add_data=preds_data,labels="backtest")

fig_4

  • 回测示例6

如果设置 predict_window != stride 并且 return_predicts = True ,回测函数会返回指标结果和一个TSdataset 的list。 因为预测结果相互重叠或相互间隔无法组成完整TSDataset。

from paddlets.utils import backtest
score, preds_data = backtest(
    data=test_dataset,
    model=mlp,
    predict_window=24,
    stride=12,
    return_predicts = True)
type(preds_data)
#list[TSdataset]