跳到主要内容

二次指数平滑

一、直观理解:水平会变,斜率也要更新​

当序列呈现持续上升或下降趋势时,一次指数平滑的预测会滞后。二次指数平滑(Holt 线性趋势法)同时维护:

  • 水平 ltl_t
  • 趋势(斜率)btb_t
lt=αyt+(1−α)(lt−1+bt−1)bt=β(lt−lt−1)+(1−β)bt−1y^t+h∣t=lt+hbt\begin{aligned} l_t&=\alpha y_t+(1-\alpha)(l_{t-1}+b_{t-1})\\ b_t&=\beta(l_t-l_{t-1})+(1-\beta)b_{t-1}\\ \hat y_{t+h|t}&=l_t+h b_t \end{aligned}

未来 hh 步 = 当前水平 + hh 倍当前斜率。这像用一条“局部直线”顺着最近趋势往前推。

若趋势会逐渐减弱,可引入阻尼系数 ϕ∈(0,1)\phi\in(0,1):

y^t+h∣t=lt+(ϕ+ϕ2+⋯+ϕh)bt\hat y_{t+h|t}=l_t+(\phi+\phi^2+\cdots+\phi^h)b_t

阻尼 Holt 常比永不阻尼的线性外推更稳,尤其是中长期预测。

二、适用场景与优缺点​

类型说明
适用场景有趋势、无季节;需要比 ARIMA 更轻量的趋势外推;短中期预测。
核心优点两参数直观;对局部趋势适应快;实现简单;阻尼版可抑制过度外推。
局限与缺点无季节;线性趋势假设在长期会失真;突变后需适应时间;参数网格需防过拟合。

有季节时用三次指数平滑(Holt-Winters)。

三、核心原理​

Holt 法是局部水平+局部斜率的状态更新。α\alpha 控制水平追踪速度,β\beta 控制斜率更新速度。β\beta 过大时斜率被噪声带着跑,预测呈锯齿;过小则趋势迟钝。

初始化:

  • l0=y1l_0=y_1
  • b0=y2−y1b_0=y_2-y_1 或前若干点回归斜率

加性趋势假设每期增减一个近似常数;若增长是百分比型,可对 yy 取对数后再 Holt,或使用乘性趋势变体。

四、参数选择​

在训练期对 (α,β)(\alpha,\beta) 做网格搜索,目标为一组一步预测误差;若做多步,可用验证窗口的多步 RMSE。引入阻尼时增加 ϕ∈[0.8,0.98]\phi\in[0.8,0.98] 等候选。

务必对比:

  • 一次指数平滑;
  • 带漂移的随机游走 y^t+h=yt+hμ^\hat y_{t+h}=y_t+h\hat\mu;
  • 线性回归对时间 tt。

五、MATLAB 示例​

rng(6);
n = 100;
t = (1:n)';
y = 10 + 0.4*t + randn(n,1)*2; % 线性趋势 + 噪声
T0 = 80;
yTrain = y(1:T0); yTest = y(T0+1:end);

alphas = 0.1:0.1:0.9;
betas = 0.05:0.05:0.5;
best = struct("sse",Inf);
for a = alphas
for b = betas
l = yTrain(1);
tr = yTrain(2)-yTrain(1);
sse = 0;
for i = 2:numel(yTrain)
yhat = l + tr;
sse = sse + (yTrain(i)-yhat)^2;
lNew = a*yTrain(i) + (1-a)*(l+tr);
tr = b*(lNew-l) + (1-b)*tr;
l = lNew;
end
if sse < best.sse
best = struct("sse",sse,"a",a,"b",b,"l",l,"tr",tr);
end
end
end
fprintf("最优 alpha=%.2f beta=%.2f\n", best.a, best.b);

% 多步预测
h = numel(yTest);
yf = best.l + (1:h)'*best.tr;
rmse = sqrt(mean((yTest-yf).^2));

% 阻尼版(phi=0.9)示意
phi = 0.9;
w = cumsum(phi.^(1:h)');
yf_d = best.l + w*best.tr;
rmse_d = sqrt(mean((yTest-yf_d).^2));

% 基线:时间线性回归
mdl = fitlm((1:T0)', yTrain);
yf_lr = predict(mdl, (T0+1:n)');
rmse_lr = sqrt(mean((yTest-yf_lr).^2));

fprintf("测试 RMSE Holt=%.3f, 阻尼Holt=%.3f, 线性t=%.3f\n", ...
rmse, rmse_d, rmse_lr);

figure;
plot(1:T0,yTrain,"k"); hold on;
plot(T0+1:n,yTest,"k");
plot(T0+1:n,yf,"r","LineWidth",1.2);
plot(T0+1:n,yf_d,"b--","LineWidth",1.2);
xline(T0,"k--");
legend("训练","测试","Holt","阻尼Holt");
title("二次指数平滑(Holt)");

六、如何解释结果​

报告:

  1. 趋势存在的图形证据;
  2. α,β\alpha,\beta(及 ϕ\phi)的选择方式;
  3. 期末水平与斜率的数值含义(每期平均增长多少);
  4. 测试误差与 SES/线性趋势/漂移 RW 对比;
  5. 是否采用阻尼及原因;
  6. 长期外推风险说明。

七、常见误区​

1. 把短期斜率无限延长到很远未来​

线性外推最危险的地方是 hh 很大。优先阻尼或限制视野。

2. β\beta 过大​

斜率噪声化,预测不稳。

3. 有季节仍用 Holt​

残差会呈周期,应 Holt-Winters/SARIMA。

4. 混淆“拟合平滑值”与“预测协议”​

评价必须按时间外推,不能把用了 yt+1y_{t+1} 的平滑态当预测。

八、小结​

二次指数平滑(Holt)的核心是:

同时更新水平与斜率,让预测沿局部线性趋势前进;必要时用阻尼抑制长期过度外推。

它是有趋势、无季节序列的标准轻量方法,也是 ARIMA 的重要对照基线。验收看训练期外 RMSE/MAE 与残差是否仍隐藏季节,而不是只看曲线是否顺滑。