You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何复现时间序列STS变换滚动窗口训练测试选择动画?

固定训练集滚动原点回测动画复现方案

核心逻辑

要复现skforecast同款动画,需精准模拟固定窗口训练集滚动、每次重新拟合模型、单步/多步预测的完整流程,用matplotlib动画模块逐帧渲染关键环节。

Google Colab适配代码

1. 依赖准备

!pip install pandas numpy matplotlib scikit-learn
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.animation import FuncAnimation
from sklearn.linear_model import LinearRegression

2. 生成模拟时间序列

np.random.seed(42)
time_idx = pd.date_range(start='2020-01-01', periods=100, freq='D')
y = np.cumsum(np.random.randn(100)) + 100
df = pd.DataFrame({'value': y}, index=time_idx)

3. 回测参数配置

fixed_train_size = 20  # 固定训练集大小
n_in = 9  # STS变换回溯步长
n_out = 1  # 单步预测,需多步可修改对应数值
total_test_steps = len(df) - fixed_train_size

4. 动画核心实现

# 初始化画布
fig, ax = plt.subplots(figsize=(10, 6))
ax.set_xlabel('时间')
ax.set_ylabel('序列值')
ax.set_title('固定训练集滚动原点回测')

# 初始化绘图元素
train_line, = ax.plot([], [], 'b-', label='训练集')
actual_line, = ax.plot([], [], 'r-', label='真实测试值')
pred_line, = ax.plot([], [], 'g--', label='预测值')
ax.legend()

# 固定坐标轴范围,避免动画跳变
ax.set_xlim(df.index[0], df.index[-1])
ax.set_ylim(df['value'].min()-5, df['value'].max()+5)

# 存储预测结果
preds = []

def update(frame):
    # 划分当前训练/测试集
    train_end = fixed_train_size + frame
    train_data = df.iloc[:train_end]
    test_data = df.iloc[train_end:train_end+n_out]
    
    # 实现STS变换(series_to_supervised逻辑)
    def series_to_supervised(data, n_in, n_out):
        cols = []
        # 输入特征:回溯n_in步
        for i in range(n_in, 0, -1):
            cols.append(data.shift(i))
        # 目标值:未来n_out步
        for i in range(0, n_out):
            cols.append(data.shift(-i))
        agg = pd.concat(cols, axis=1)
        agg.dropna(inplace=True)
        return agg.values
    
    # 处理训练数据
    train_sts = series_to_supervised(train_data[['value']], n_in, n_out)
    X_train, y_train = train_sts[:, :n_in], train_sts[:, n_in:]
    
    # 拟合模型
    model = LinearRegression()
    model.fit(X_train, y_train)
    
    # 生成预测输入(训练集最后n_in个值)
    last_window = train_data['value'].values[-n_in:].reshape(1, -1)
    current_pred = model.predict(last_window)
    
    # 更新预测列表
    if frame < total_test_steps:
        preds.extend(current_pred.flatten())
    
    # 更新绘图数据
    train_line.set_data(train_data.index, train_data['value'])
    actual_line.set_data(df.index[:train_end+len(test_data)], df['value'][:train_end+len(test_data)])
    pred_idx = df.index[fixed_train_size : fixed_train_size+len(preds)]
    pred_line.set_data(pred_idx, preds)
    
    return train_line, actual_line, pred_line

# 创建并显示动画
ani = FuncAnimation(fig, update, frames=total_test_steps, interval=500, blit=True)
from IPython.display import HTML
HTML(ani.to_jshtml())

动画效果优化点

  • 固定坐标轴范围:提前锁定x/y轴极限,避免帧渲染时坐标轴频繁缩放
  • 启用Blit模式:blit=True仅更新变化区域,大幅提升流畅度
  • 调整帧间隔:interval=500控制每帧停留时长,可根据需求修改为300-1000毫秒
  • 多步预测适配:修改n_out参数即可切换多步预测可视化,STS变换会自动生成对应目标序列

内容的提问来源于stack exchange,提问作者Mario

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 03:05:33