老张开了一家小吃店,每天打烊后都要琢磨一个事:明天该备多少货?他手里只有一本账,记录着从开业到今天每一天卖了多少。明天还没发生,账本上不可能有明天的数字——他必须只用“过去”来预测“明天”。备多了浪费,备少了得罪客人,这个问题天天都要答一次,答完又迎来新的一天。 Walk-forward滚动验证,就是老张这套“每天打烊—更新账本—预测明天”的流程在机器学习里的严谨版本。它把时间序列切成一段段:先用过去一段窗口训练,预测下一时刻,再把真实值并入历史,继续往前滚。因为严格保持时间顺序,它能够模拟模型真实上线后的工作方式,避免标准K折交叉验证在时间序列上“偷看未来”的剧透问题。 读完这篇,你会知道如何用老张的方式评估时序模型,并且知道固定窗口、扩展窗口、滚动步长这些旋钮怎么转。

岗位关联

Walk-forward是时序模型上线前的“模拟考”。学会它,你的验证结果才真正对生产有说服力,能避开数据泄漏带来的虚假繁荣。

目录
  1. 可视化演示
  2. 核心思想:时间不可倒流
  3. 训练窗口:固定窗与扩展窗
  4. 滚动流程:一步一滚,拼接评估
  5. 与K折对比:K折会“剧透”
  6. 评估指标:用对尺子量预测
  7. 参数调优:窗口、步长与滚动次数
  8. 应用场景:金融、零售与能源
  9. 注意事项:三个红线
  10. AI 应用场景
  11. Python 演示
  12. 常见误区
  13. 面试题

可视化演示

本节配有交互动效(进入视口后自动加载,约 3KB)。

Walk-forward核心思想 训练窗口滚动前进,每次预测未来 固定窗口策略 固定窗口特点 Walk-forward滚动验证可视化:展示固定/扩展窗口策略、滚动预测流程及与标准CV的差异。

核心思想:时间不可倒流

老张预测明天的铁律是:绝不用明天的数据。哪怕他猜得再准,也绝不会把“明天天气炎热所以生意好”写进昨天的账本,因为明天还没发生。Walk-forward 的第一条铁律就是时间不可倒流——训练模型时永远只能看过去,测试永远面向未来。

这跟标准交叉验证很不一样。标准 K 折把样本随机打乱,默认样本之间相互独立。但时间序列样本天生带前后顺序:今天的销量会影响明天的生意,你不能把数据当一袋珠子随手倒。Walk-forward 把“先后次序”当作最高约束,任何跨越时间顺序的行为都是犯规。

形式化地说,在时刻 $t$,模型能看到的训练集是 $x_1$ 到 $x_t$,测试集是 $x_{t+1}$。训练集中所有时刻都必须严格早于测试集的时刻。这种约束让模型每一次评估都像是真实上线时“用已知推未知”的过程。

老张的账本就算再旧,也不会因为“下周生意肯定更好”而提前多进货。老板和模型都一样:活在当下,只用过去决策。

max⁡(ttrain)<min⁡(ttest)\max(t_{\text{train}}) < \min(t_{\text{test}})
这个式子的意思是:训练数据里最晚的一天,也要早于测试数据里最早的一天。一旦违反,就等于偷看了未来。
  1. 训练集时刻集合$t_{\text{train}}$ 表示训练样本对应的时刻集合,比如老张从开业到今天所有的账目日期。
    ttrain={1,2,…,t}t_{\text{train}} = \{1, 2, \ldots, t\}
  2. 测试集时刻集合$t_{\text{test}}$ 只包含 $t+1$ 这一个未来时刻,用明天来验证今天的判断。
    ttest={t+1}t_{\text{test}} = \{t+1\}
  3. 严格小于约束$\max < \min$ 表示训练集中最晚时刻也要早于测试集最早时刻,从数学上堵死“未来信息泄漏”。
    max⁡(ttrain)<min⁡(ttest)\max(t_{\text{train}}) < \min(t_{\text{test}})

训练窗口:固定窗与扩展窗

老张有两种记账习惯。第一种只翻最近七天的账,叫“近一周法则”;第二种从开业第一天翻到今天,叫“完整账本法则”。两种习惯各有拥趸——有人觉得新鲜数据才管用,有人觉得历史越厚越靠谱。

在 Walk-forward 里,这两种习惯对应固定窗口与扩展窗口。固定窗口每轮训练都只用最近 $w$ 个样本,窗口起点随着滚动不断右移;扩展窗口则从第一个样本出发,终点不断右移,训练数据越滚越长。

如何用数学区分这两种窗口?设 $i$ 是第 $i$ 次滚动,$w$ 是窗口长度:

固定窗口的优势是快速适应近期模式漂移,缺点是旧规律被彻底遗忘;扩展窗口充分利用全部历史,在平稳序列上更稳,但在非平稳序列里可能被陈旧的模式拖累,训练成本也随时间线性增长。老张最终明白了:没有绝对好的习惯,只有适配自己店铺变化速度的记账法则。

Wfix(i)={xi,xi+1,…,xi+w−1},Wexp(i)={x1,x2,…,xi+w−1}\mathcal{W}_{\text{fix}}(i) = \{x_i, x_{i+1}, \ldots, x_{i+w-1}\},\quad\mathcal{W}_{\text{exp}}(i) = \{x_1, x_2, \ldots, x_{i+w-1}\}
固定窗口每轮都用长度 $w$ 的最近数据;扩展窗口永远从 $x_1$ 开始,只增长不回头。
  1. 固定窗口的起点$i$ 表示当前滚动到第几个位置,窗口从 $x_i$ 开始取长度为 $w$ 的一段。
    Wfix(i)={xi,xi+1,…,xi+w−1}\mathcal{W}_{\text{fix}}(i) = \{x_i, x_{i+1}, \ldots, x_{i+w-1}\}
  2. 扩展窗口的起点固定扩展窗口无论滚到第几轮,都从第一个样本 $x_1$ 开始取到 $x_{i+w-1}$。
    Wexp(i)={x1,x2,…,xi+w−1}\mathcal{W}_{\text{exp}}(i) = \{x_1, x_2, \ldots, x_{i+w-1}\}
  3. 训练样本量对比固定窗口每轮样本数恒为 $w$,扩展窗口为 $i+w-1$,随滚动次数增长。
    ∣Wfix∣=w,∣Wexp∣=i+w−1|\mathcal{W}_{\text{fix}}| = w,\quad |\mathcal{W}_{\text{exp}}| = i+w-1

滚动流程:一步一滚,拼接评估

老张每天打烊后的流程固定不变:把今天真实销量记入账本,更新历史;翻看过去的数据琢磨规律;估算明天的备货量。太阳升起,明天变成今天,他又重复一遍。这套日复一日的流程,就是“一步一滚”。

落到 Walk-forward 上,这是一个清晰的循环。从第 $w+1$ 个时刻开始,先用当前窗口内的历史训练模型,预测下一时刻;然后把下一时刻的真实值并入历史,继续向前滚。每一轮只产生一个预测点,所有预测点按时间顺序拼接成一条完整的预测序列,最后统一计算误差。

单步预测可以写成:给定历史 $x_1, \ldots, x_t$ 和模型参数 $\theta_t$,预测 $\hat{y}_{t+1}$。把所有预测值连成向量并与真实值比较:

就像老张把每天估算的数字贴在本子上,一张贴着一张连成线,月底回看才知道自己到底估得准不准。滚动预测的价值不在单日,而在整条预测长廊的稳定性。

y^t+1=fθt(x1,x2,…,xt),MAE=1T−w∑t=wT−1∣yt+1−y^t+1∣\hat{y}_{t+1} = f_{\theta_t}(x_1, x_2, \ldots, x_t),\quad\text{MAE} = \frac{1}{T-w}\sum_{t=w}^{T-1}\left|y_{t+1} - \hat{y}_{t+1}\right|
第一个式子描述“一步一滚”的预测过程;第二个式子把所有滚动预测拼起来,统一算平均绝对误差。
  1. 单步预测模型参数 $\theta_t$ 是在时刻 $t$ 用历史数据重新训练得到的,预测目标是下一时刻的值。
    y^t+1=fθt(x1,x2,…,xt)\hat{y}_{t+1} = f_{\theta_t}(x_1, x_2, \ldots, x_t)
  2. 滚动拼接每一轮产生一个 $\hat{y}$,从 $t=w$ 到 $t=T-1$ 全部按时间顺序排成一个向量。
    y^=[y^w+1,y^w+2,…,y^T]\hat{\mathbf{y}} = [\hat{y}_{w+1}, \hat{y}_{w+2}, \ldots, \hat{y}_T]
  3. 统一评估将拼接好的预测与真实值逐点求绝对差,再除以预测总数 $T-w$。
    MAE=1T−w∑t=wT−1∣yt+1−y^t+1∣\text{MAE} = \frac{1}{T-w}\sum_{t=w}^{T-1}|y_{t+1} - \hat{y}_{t+1}|

与K折对比:K折会“剧透”

如果老张把“下周某天实际卖出 300 份”提前写进今天的账本,再用它推测明天,这叫作弊。标准 K 折交叉验证对时间序列做的事,恰好就是这种无意中的作弊——它把时间轴打乱,让未来混进过去。

标准 K 折先把样本随机分成 K 份,轮流拿一份当测试、其余当训练。对独立同分布数据这没问题;但时间序列有依赖关系,某折训练集里很可能藏着比测试集晚得多的样本。模型提前看到未来答案,验证分数自然虚高,上线后一塌糊涂。

用一个指示函数来刻画泄漏:若训练集中最大时刻大于测试集中最小时刻,则发生泄漏:

老张绝不会把倒着排的账本当依据。Walk-forward 就是给模型安装了一道“时间闸门”,让未来永远无法提前渗入训练。

I(max⁡ttrain>min⁡ttest)=1⇒数据泄漏\mathbb{I}\bigl(\max t_{\text{train}} > \min t_{\text{test}}\bigr) = 1 \quad\Rightarrow\quad \text{数据泄漏}
指示函数 $\mathbb{I}(\cdot)$ 里面条件成立时为 1。只要训练集里存在比测试集更晚的数据,泄漏就发生了。
  1. 指示函数$\mathbb{I}(\text{条件})$ 在条件成立时等于 1,否则等于 0,用来标记泄漏事件。
    I(max⁡ttrain>min⁡ttest)\mathbb{I}(\max t_{\text{train}} > \min t_{\text{test}})
  2. 泄漏条件$\max t_{\text{train}} > \min t_{\text{test}}$ 说明训练集中至少有一个样本的时间晚于测试集最早时间。
    max⁡ttrain>min⁡ttest\max t_{\text{train}} > \min t_{\text{test}}
  3. Walk-forward 的反向保证前向滚动验证要求严格小于,即训练集所有时刻都早于测试集。
    max⁡ttrain<min⁡ttest\max t_{\text{train}} < \min t_{\text{test}}

评估指标:用对尺子量预测

判断预测准不准,老张会问两个问题:差多少?方向对不对?哪怕预测量和真实值只差 5 份,如果趋势判断反了——该多备货时少备、该少备时多备——生意照样受影响。

误差量化最常用的是 MAE 和 RMSE。MAE 是平均绝对误差,RMSE 因为先平方再开方,会把较大的误差放大惩罚。方向判断用方向准确率,看预测变化方向与真实变化方向是否一致。

老张最后会同时看“平均差多少份”和“涨跌方向对不对”,两把尺子合在一起,才敢说这家店的预测能力到底行不行。

RMSE=1n∑i=1n(yi−y^i)2,Accdir=1n∑i=1nI[(y^i−yi−1)(yi−yi−1)>0]\text{RMSE} = \sqrt{\frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2},\quad\text{Acc}_{\text{dir}} = \frac{1}{n}\sum_{i=1}^{n}\mathbb{I}\bigl[(\hat{y}_i - y_{i-1})(y_i - y_{i-1}) > 0\bigr]
左边是 RMSE,右边是方向准确率:括号内乘积大于 0,说明预测的涨跌方向和真实一致。
  1. MAE 与 RMSE 的关系MAE 对每个误差取绝对值后平均;RMSE 先平方、求平均、再开方,让大误差的影响被放大。
    MAE=1n∑i=1n∣yi−y^i∣,RMSE=1n∑i=1n(yi−y^i)2\text{MAE} = \frac{1}{n}\sum_{i=1}^{n}|y_i - \hat{y}_i|,\quad \text{RMSE} = \sqrt{\frac{1}{n}\sum_{i=1}^{n}(y_i - \hat{y}_i)^2}
  2. 方向变化的差$(y_i - y_{i-1})$ 是真实值从上一时刻到当前时刻的变化量,$\hat{y}_i - y_{i-1}$ 是预测的变化量。
    (y^i−yi−1)(yi−yi−1)>0(\hat{y}_i - y_{i-1})(y_i - y_{i-1}) > 0
  3. 方向准确率对所有测试点统计乘积大于 0 的比例,值越高代表模型的涨跌方向判断越准。
    Accdir=1n∑i=1nI[(y^i−yi−1)(yi−yi−1)>0]\text{Acc}_{\text{dir}} = \frac{1}{n}\sum_{i=1}^{n}\mathbb{I}\bigl[(\hat{y}_i - y_{i-1})(y_i - y_{i-1}) > 0\bigr]

参数调优:窗口、步长与滚动次数

老张的记账习惯有三个旋钮:看多少天的账(窗长 $w$)、每天记还是每周记(步长 $s$)、最多试多少轮(滚动预算)。旋钮转法不同,评估结论也不同。

Walk-forward 的参数同样是这三样。窗长 $w$ 决定模型记忆范围;步长 $s$ 决定两次评估之间的推进量;滚动次数则由总样本长度 $T$、$w$ 和 $s$ 共同决定。步长选得越小,相邻窗口重叠越高,计算越贵但评估越平滑。

用公式表达滚动次数与重叠率:

老张发现,小步快跑虽然看着细致,但相邻两天账本几乎一样,反复训练更像是自我安慰。合理的步长要在平滑与真实之间找到平衡。

Nroll=⌊T−ws⌋+1,overlap=w−swN_{\text{roll}} = \left\lfloor \frac{T - w}{s} \right\rfloor + 1,\quad\text{overlap} = \frac{w - s}{w}
左边是滚动轮数,右边是相邻训练窗口的重叠比例。$s=w$ 时重叠为 0,$s=1$ 时几乎完全重叠。
  1. 总滚动次数$T$ 是总样本数,$w$ 是窗口长度,$s$ 是每次前进的步长,向下取整保证不超过数据范围。
    Nroll=⌊T−ws⌋+1N_{\text{roll}} = \left\lfloor \frac{T - w}{s} \right\rfloor + 1
  2. 窗口重叠率相邻两次训练窗口共用的样本比例,等于窗口长度减去步长再除以窗口长度。
    overlap=w−sw\text{overlap} = \frac{w - s}{w}
  3. 两个极端步长等于窗口时完全无重叠,各轮训练集独立;步长为 1 时训练集高度相似,评估结果平滑但计算量巨大。
    s=w⇒overlap=0,s=1⇒overlap=w−1ws = w \Rightarrow \text{overlap} = 0,\quad s = 1 \Rightarrow \text{overlap} = \frac{w-1}{w}

应用场景:金融、零售与能源

天气预报、备货决策、电网调度,凡是“结果要等明天才知道”的行业,都在用滚动验证。老张的小吃店只是其中一员。

在金融领域,研究员每天收盘后更新模型,预测下一个交易日的收益率;在零售行业,算法每周滚动预测未来七天的销量;在能源行业,调度系统根据过去 24 小时的负荷预测未来一小时的电量。这些场景有一个共同点:预测目标有明确的提前量 $h$。

老张后来才知道,自己每天纠结的备货问题,背后是一整套行业级的科学评估流程。滚动验证让这些决策从“拍脑袋”变成了“可核算”。

y^t+h=fθt(x1,x2,…,xt),h∈{1,7,24,30}\hat{y}_{t+h} = f_{\theta_t}(x_1, x_2, \ldots, x_t),\quad h \in \{1, 7, 24, 30\}
模型在 $t$ 时刻用历史数据预测 $t+h$ 时刻的值,$h$ 是提前多少步的“距离”。
  1. 提前量 $h$$h$ 表示预测未来第几个时刻,$h=1$ 是明日预测,$h=7$ 是七日预测。
    y^t+h\hat{y}_{t+h}
  2. 训练时间点$\theta_t$ 表示只用 $t$ 及之前的样本训练,模型参数随滚动不断更新。
    fθt(x1,x2,…,xt)f_{\theta_t}(x_1, x_2, \ldots, x_t)
  3. 每个场景固定 $h$金融常用 1 个交易日、零售常用 7 天、能源常用 24 小时,所有滚动轮次使用同一个 $h$ 才能保证指标可比。
    h∈{1,7,24,30}h \in \{1, 7, 24, 30\}

注意事项:三个红线

老张总结了三个坑:用未来账目作弊(泄漏)、天天重复差不多的事情导致过度自信(重叠)、开店才三天就想总结规律(小样本)。Walk-forward 也有同样的红线。

第一条红线是泄漏,训练集绝不能包含测试时刻之后的数据;第二条是重叠陷阱,步长太小会让相邻测试段高度相关,评估结果的方差被低估;第三条是小样本局限,滚动次数太少时,评估指标波动极大,结论不可信。实践中建议至少滚动 3 次以上,总样本量要能覆盖一个完整训练窗口加三个步长。

老张的生意经验是:顺时守纪律,难时重常识。Walk-forward 也一样——守住时间顺序,留足滚动轮次,模型才能真正让人信得过。

T≥w+3s,Nroll≥3T \ge w + 3s,\quad N_{\text{roll}} \ge 3
这是一条经验法则:数据长度至少能支撑窗口训练之外再留下 3 个滚动步长的测试空间,滚动次数至少 3 次。
  1. 最小数据长度$T \ge w + 3s$ 表示除了训练窗口 $w$,还要预留至少 $3s$ 的测试区间。
    T≥w+3sT \ge w + 3s
  2. 最少滚动次数$N_{\text{roll}} \ge 3$ 保证评估结果不是靠一两次运气说话,减少小样本导致的偶然性。
    Nroll≥3N_{\text{roll}} \ge 3
  3. 重叠带来的自相关当 $s \ll w$ 时重叠率很高,相邻测试点高度相关,会让人误以为模型很稳定。
    s≪w⇒overlap→1s \ll w \Rightarrow \text{overlap} \to 1

AI 应用场景

金融量化回测:告别“未来函数”

阶段:模型评估与回测

解决的问题:传统回测常因数据穿越(在未来数据上训练)导致策略表现虚高。Walk-forward 严格分段,模拟实盘每天收盘后重新训练、次日交易的真实流程,从根源上消除未来函数。

具体案例:某量化私募在做股票次日收益率预测时,用 250 天固定窗口训练 XGBoost,每日收盘后滚动重训一次,预测次日收益方向,最后把所有日频预测拼接统计胜率与夏普比率。上线后回测与实盘差异明显缩小。

零售供应链:每周滚动重训

阶段:模型训练与验证

解决的问题:门店 SKU 多达数千个,季节性和促销波动强。一次性训练很难覆盖全年模式,滚动验证能持续跟踪模型在真实上新计划中的表现。

具体案例:一家连锁超市用 Walk-forward 评估周销量预测模型:每周用过去 12 周数据训练 LightGBM,预测下一周各 SKU 销量,滚动 26 轮后统一计算 MAE。结果显示比随机划分交叉验证的误差高出约 15%,团队据此意识到原来的评估严重乐观。

电网负荷:小时级漂移监测

阶段:模型迭代与监控

解决的问题:电网负荷受天气、节假日影响有明显概念漂移。Walk-forward 可以在不重放历史实验的前提下,持续评估新数据上的预测误差,及时发现模型衰退。

具体案例:某省级电网调度中心对负荷预测模型做滚动验证:每小时用过去 72 小时数据重训模型,预测未来 1 小时负荷,实时计算 MAPE。在春夏季交替时,滚动误差曲线明显抬升,团队据此触发模型重新训练和特征调整。

Python 演示

python29 行
import numpy as npfrom sklearn.linear_model import LinearRegression def generate_series(n=120, seed=42):    rng = np.random.default_rng(seed)    t = np.arange(n)    return 10 * np.sin(0.25 * t) + 0.05 * t + rng.normal(0, 0.5, n) def walk_forward_predict(y, window=30):    y = np.asarray(y, dtype=float)    T = len(y)    preds, truths = [], []    for s in range(window, T):        seg = y[s - window: s]        X = np.column_stack([seg[:-2], seg[1:-1]])        target = seg[2:]        model = LinearRegression().fit(X, target)        last = np.array([[seg[-2], seg[-1]]])        preds.append(model.predict(last)[0])        truths.append(y[s])    return np.array(preds), np.array(truths) if __name__ == "__main__":    y = generate_series()    preds, truths = walk_forward_predict(y, window=30)    mae = np.mean(np.abs(truths - preds))    rmse = np.sqrt(np.mean((truths - preds) ** 2))    print(f"Walk-forward 评估: 滚动 {len(preds)} 次")    print(f"MAE = {mae:.3f}, RMSE = {rmse:.3f}")
目的:这段代码演示了完整的 Walk-forward 滚动验证流程。它用固定窗口训练一个线性自回归模型,每次只预测下一个时刻,然后滚动向前,最后拼接所有预测并计算 MAE / RMSE。
  1. def walk_forward_predict(y, window=30):定义核心函数:输入时间序列和窗口长度,输出滚动预测结果。
  2. for s in range(window, T):从第 window 个点开始,一个时刻一个时刻往前滚。
  3. seg = y[s - window: s]截取最近 window 个样本作为本轮训练数据,绝不包含未来。
  4. model = LinearRegression().fit(X, target)每个窗口重新训练一个线性模型,体现“每日更新账本”。
  5. last = np.array([[seg[-2], seg[-1]]])用窗口内最后两个观测作为特征,代表“当下的最新信息”。
  6. preds.append(model.predict(last)[0])预测下一个时刻并存入拼接预测列表。
  7. truths.append(y[s])记录该时刻的真实值,用于最后统一评估。
  8. mae = np.mean(np.abs(truths - preds))拼接后统一计算 MAE,对应正文中的统一评估环节。

常见误区

误区我平时都用 K 折交叉验证选模型,时间序列也可以直接打乱数据来做,只要折数够多结果就靠谱。

正解时间序列就像老张的账本,今天的销量会影响明天的生意。K 折随机打乱会把未来数据塞进训练集,模型等于偷看了答案,验证分数虚高。上线后模型面对真正的未来表现会差很多。Walk-forward 不改变时间顺序,才是时序数据的正确评估方式。

为何常见:标准 K 折在非时序任务上太普及,默认“数据是独立的”,容易忽略时序样本的先后依赖关系。

误区数据越多越好,扩展窗口能用全部历史数据,所以训练出来的模型一定比固定窗口更准。

正解数据不是越多越好。老张如果把开业第一年的火爆行情永远当参考,今年生意已变淡时备货就会过度。固定窗口能快速适应近期出现的新模式,扩展窗口则在平稳序列上更有优势。两者没有绝对优劣,要在具体数据上滚动对比。

为何常见:“数据越多越好”是机器学习里的常见直觉,但忽略了时间序列的非平稳性和概念漂移。

误区一步一滚太慢了,我让模型直接预测未来 30 天,一步到位多省事。

正解多步预测的误差会随着步数累积,第一步的偏差会被后续步不断放大。Walk-forward 的核心优势就是“只预测最近的一步”,然后滚动前进。即使需要 30 天预测,也应该用滚动或多步专用策略分别评估,而非一步登天。

为何常见:从直觉上“少训练几次更省事”,但忽略了误差累积和训练分布的变化。

面试题

Q1. Walk-forward 滚动验证的核心思想是什么?

单选题 · easy

  • A.随机打乱数据后反复评估
  • B.严格保持时间先后顺序验证← 正确答案
  • C.用未来数据预测过去的数据
  • D.只使用一个固定训练集评估

答案:B。Walk-forward 的核心是严格保持时间顺序,训练集永远在测试集之前,模拟真实上线滚动预测的过程。A 是标准 K 折的做法,C 是泄漏,D 缺少滚动机制。

Q2. 关于固定窗口训练,下列说法正确的是?

单选题 · easy

  • A.每次训练样本量逐渐增大
  • B.窗口长度恒定且起点不断右移← 正确答案
  • C.训练时可以直接使用未来数据
  • D.每次都需要重新收集全部历史数据

答案:B。固定窗口每轮都用长度一致的最近数据训练,窗口起点随滚动右移。A 描述的是扩展窗口,C 是数据泄漏,D 误把固定窗口当成全量数据重训。

Q3. 标准 K 折交叉验证用于时间序列时最大的风险是什么?

单选题 · mid

  • A.计算开销明显增大且难以并行
  • B.未来数据混入训练集导致泄漏高估← 正确答案
  • C.样本量不足导致训练集为空
  • D.无法划分训练集与测试集合

答案:B。K 折随机打乱会把时间上更晚的样本放进训练集,使模型提前看到未来,验证误差被乐观估计。A、C、D 都不是时序场景特有风险。

Q4. Walk-forward 中“拼接预测”指的是什么?

单选题 · mid

  • A.把所有预测值连接成向量统一评估← 正确答案
  • B.把多个模型的权重等比例平均
  • C.把训练集与测试集合并重新划分
  • D.把所有预测值相乘得到总误差

答案:A。每轮滚动产生一个预测点,按时间顺序连接成完整预测向量,最后与真实值统一计算误差。B 是模型集成,C 会破坏评估,D 没有意义。

Q5. 与 MAE 相比,RMSE 的特点是什么?

单选题 · mid

  • A.对较小误差更敏感且忽略大误差
  • B.对较大误差更敏感因为平方放大← 正确答案
  • C.无论什么数据 RMSE 都小于 MAE
  • D.RMSE 计算不需要真实标签值

答案:B。RMSE 先平方再平均开方,较大误差经过平方后被显著放大。A 说反了,C 不一定成立,D 错误,RMSE 必须用真实标签。

Q6. 当序列非平稳且存在趋势突变时,通常更推荐哪种窗口?

单选题 · hard

  • A.固定窗更能盯住近期变化模式← 正确答案
  • B.扩展窗包含更多历史数据信息
  • C.标准 K 折避免时序依赖性问题
  • D.一次性长预测减少训练轮次数

答案:A。趋势突变时,遥远的旧数据可能成为噪声。固定窗口只保留最近 w 个样本,能更快适应新模式;扩展窗口会被陈旧数据拖累,C 直接泄漏,D 会累积误差。

Q7. 步长为 $s$、窗口长度为 $w$ 时,相邻窗口重叠率是?

单选题 · easy

  • A.(w - s) / w 表示相邻窗口重叠比例← 正确答案
  • B.w / s 表示窗口扩大的速度倍数
  • C.s / w 表示步长占窗口的比例大小
  • D.(w + s) / s 表示总窗口的速率指标

答案:A。重叠率定义为 $1 - s/w = (w-s)/w$。$s=w$ 时重叠为 0,$s=1$ 时接近 1。其余选项不是重叠率的数学定义。

Q8. 数据泄漏在时间序列评估中会造成哪些后果?

多选题 · mid

  • A.验证分数虚高且上线性能暴跌← 正确答案
  • B.模型偷看未来信息失去泛化能力← 正确答案
  • C.训练时间明显变短反而更加高效
  • D.样本顺序被改变但结果完全等价

答案:AB。泄漏让模型训练时见过测试期的信息,离线验证虚高,上线后真实误差远大于预期。C 所说的训练时间变化并非必然结果,D 说“完全等价”显然是错误的。

Q9. 下列哪些属于 Walk-forward 需要调整的参数?

多选题 · hard

  • A.训练窗口长度 w 控制记忆范围← 正确答案
  • B.滚动步长 s 控制滚动推进节奏← 正确答案
  • C.特征归一化方式使用标准正态处理
  • D.预测提前步数 h 确定预测目标← 正确答案

答案:ABD。Walk-forward 的核心参数是窗口长度 w、步长 s 和提前量 h。特征归一化属于数据预处理,不是 Walk-forward 特有的滚动参数,虽然重要但不属于滚动机制本身。

Q10. 以下哪些场景适合用 Walk-forward 进行评估?

多选题 · mid

  • A.金融日收益率时序预测场景← 正确答案
  • B.零售商品周销量预测场景← 正确答案
  • C.图片分类任务随机划分评估
  • D.电网电力负荷小时级预测场景← 正确答案

答案:ABD。金融、零售、电网负荷都涉及严格的时间先后依赖,适合滚动验证。图片分类中图片样本没有时序依赖,标准交叉验证更合适。