首页 / 交易学院 / 用指数平滑做时间序列预测:从 SES 到带趋势与季节的加法模型
用指数平滑做时间序列预测:从 SES 到带趋势与季节的加法模型
📈

用指数平滑做时间序列预测:从 SES 到带趋势与季节的加法模型

量化评估 难度 · 高阶 2011 14 分钟阅读
指数平滑时间序列预测ARIMAMQL5预测评估

技术分析里大量方法本质上是对过去价格的“外推”——假设未来和过去、现在遵循同一套规律。最出名的当然是 ARIMA,但在 Box-Jenkins 之前,Holt 和 Brown 就已经提出了更简单的指数平滑模型。本文不堆公式,而是讲清楚它到底在做什么、什么时候好用、在 MQL5 里怎么落地。

一、为什么用指数平滑而不是 ARIMA

指数平滑其实是 ARIMA 的特例:每种指数平滑模型都能找到一个对等的 ARIMA 模型。区别在于,指数平滑参数少、计算快、对短样本更友好,在小样本上得到的结果往往和 ARIMA 差不多。对交易者而言,真正要的是“提前一步/两步的预测区间”,而不是教科书上的统计显著性,所以轻量模型反而更实用。

它也不是银弹。指数平滑同样建立在“过程稳定”的假设上:它假定序列的水平、趋势在观测区间内缓慢变化、可忽略。一旦市场结构突变(跳空、政策、流动性枯竭),模型会滞后,这是所有外推法的共性弱点。

预测区间越长,序列特性变异对误差的影响越强。所以指数平滑只适合做“短期预测”——提前 1、2 个或多个时间区间,而不是经济学里“短于一年”那种 long-term 含义。把预测视野压短,是控制误差的第一原则。

二、简单指数平滑 SES:alpha 的取舍

最简单的模型认为过程由一个缓慢变化的“水平”分量加随机噪声构成。用平滑系数 alpha(0~1)对过去值做指数加权:alpha=0 时新数据完全不影响结果,序列被压成一条水平直线,随机分量被完全抑制;alpha=1 时完全不平滑,水平分量不失真但噪声也全保留。

这里有个天然矛盾:要抑制噪声希望 alpha 接近 0,要保真水平分量希望 alpha 接近 1。解决办法是把“预测”本身当目标——用提前一步预测误差的平方和作为优化标准,在整个样本上求使误差最小的 alpha。对真实外汇报价,最优 alpha 常常偏高(0.8 左右),说明单纯的水平模型不足以描述报价,过程里藏着趋势。

// AdditiveES.mqh 核心参数(节选)
class AdditiveES : public CObject {
  protected:
    double Alpha;  // 水平平滑参数 [0:1]
    double Gamma;  // 趋势平滑参数 [0:1]
    double Phi;    // 衰减参数 [0:1]
    double Delta;  // 季节指数平滑参数 [0:1]
    int    nSes;   // 季节周期长度
};

三、加入趋势:线性增长模型

当序列出现趋势,简单指数平滑会明显“跟不上”,预测持续落后。解决办法是再加一个线性趋势分量,用双平滑(对水平做一次、对趋势做一次)同时估计水平与斜率。这就是线性增长(linear growth)模型,MetaTrader 5 里的 DEMA 指标就是它的近亲——只不过 DEMA 只输出 a1 系数对应的值,不输出预测,也不算 a2。

实践中,用 USDJPY M1 片段找最优 alpha,线性增长模型的最优值会降到 0.4 左右,比简单模型更克制,说明趋势分量确实吸收了一部分序列的动态。如果趋势频繁切换,线性增长模型仍会落后;若趋势是平方增长,它则彻底追不上——这时才需要上更复杂的模型。

四、参数与初始值的优化

指数平滑当前值由前一个值递推而来,时间零点没有初值,所以初始值(S、S1、S2)要单独给定。样本很长时,粗略给个初值、在目标点前多跑 200~300 个周期就能收敛;样本短时初始值选择的影响很大,文献建议用序列前几个元素的平均。更稳妥但费力的做法是把初始值也放进优化:在合理范围内搜索使预测误差最小的初值组合。

这种多变量函数最小化的活,交给数值优化算法最合适。MQL5 示例用 Powell 法(无约束方向加速)同时优化 alpha、gamma、phi 等参数,配合 AdditiveES 类的 Calc 方法读取 CSV 报价、算 RelMAE。对交易者来说,重点是理解“参数不是拍脑袋定的,是拿历史误差喂出来的”。

// OptimizeES.mqh:把指数平滑参数优化封装成可调用类
class OptimizeES : public PowellsMethod {
  protected:
    double Dat[];   // 输入数据
    int    Dlen;
    double Par[5];  // 优化得到的参数
  public:
    int Calc(string fname);  // 读 CSV 并优化
};

五、怎么评估预测准不准

光看一条预测线没意义,必须量化“准”。最常用的是均方误差 MSE 和平均绝对误差 MAE,但二者都只适合比较同一序列上的不同模型,而且绝对值本身不说明好坏(0.03 的 MAE 是好是坏?不知道)。

要跨序列比较,得用相对指标:RelMSE 和 RelMAE。它们把你的预测误差除以“朴素法”(假设未来值=当前值)的误差。比值<1 说明你比朴素法准,>1 说明还不如不预测。作者用线性增长模型测了一批外汇序列,结果 RelMAE 全部>1——也就是说,在测试样本上,这些简单模型连朴素法都没超过。这本身就是重要结论:别迷信模型,先和基线比。

六、加法模型族与季节分量

把水平、趋势、随机项之外再加一个“季节/周期”分量,就得到加法模型族。文章给了从简单到带季节的完整清单:简单加法、线性增长加法、带衰减的增长加法(趋势斜率随衰减系数逐步减弱),以及它们各自加上季节指数后的版本。公式中还能看到六个变量(alpha/gamma/phi/delta + 水平/趋势/季节平滑值)的全貌。

衰减系数(damping)很关键:值越小,趋势在后续预测步里衰减越快,线性增长逐渐“熄火”。很多真实序列的趋势不是永续的,带衰减的模型反而更贴近现实。

七、小结

指数平滑不是 ARIMA 的廉价替代品,而是一套参数少、可解释、易落地的短期预测工具。在 MQL5 里,AdditiveES + Powell 优化 + RelMAE 评估已经形成闭环:读报价→优化参数→出预测与区间→和朴素法比基线。记住三件事:只做短期预测、alpha/初值要优化不要拍脑袋、永远先和朴素法比。把它当“下一根 K 线大概率在哪”的辅助判断,而不是自动交易信号本身。

常见问题

指数平滑是 ARIMA 的特例,每种指数平滑模型都有对等的 ARIMA 模型。区别在工程层面:指数平滑参数少、计算快、对小样本友好,适合做短期点预测;ARIMA 更通用但更重、对平稳性和定阶更敏感。交易者做短期外推,指数平滑通常够用且更稳。
不要拍脑袋。用“提前一步预测误差平方和”作为目标,在整个样本上求使误差最小的 alpha。对真实外汇报价,最优 alpha 常在 0.4~0.8 之间,偏高说明序列里藏着趋势,单纯水平模型不够。样本短时,初始值也要一起优化。
不是。EMA/DEMA 指标是用来“平滑序列值”的,只输出平滑后的水平(DEMA 输出 a1 对应值),不算预测、也不输出趋势系数 a2。而指数平滑预测模型在平滑基础上还给出“提前一步/多步预测值”和预测区间,用途不同。
用 RelMAE 或 RelMSE 和“朴素法”(未来=当前)比基线。比值小于 1 才算真有预测力,大于 1 说明不如不预测。同时要给出预测区间(置信带),而不是单点预测,这样才知道误差范围。
只适合短期(提前 1~几步)。预测区间越长,序列特性变异对误差影响越强,外推法假设越不成立。把它用于“下一根/几根 K 线”的辅助判断即可,不要拿去做长周期宏观预测。