用指数平滑做时间序列预测:从 SES 到带趋势与季节的加法模型
技术分析里大量方法本质上是对过去价格的“外推”——假设未来和过去、现在遵循同一套规律。最出名的当然是 ARIMA,但在 Box-Jenkins 之前,Holt 和 Brown 就已经提出了更简单的指数平滑模型。本文不堆公式,而是讲清楚它到底在做什么、什么时候好用、在 MQL5 里怎么落地。
一、为什么用指数平滑而不是 ARIMA
指数平滑其实是 ARIMA 的特例:每种指数平滑模型都能找到一个对等的 ARIMA 模型。区别在于,指数平滑参数少、计算快、对短样本更友好,在小样本上得到的结果往往和 ARIMA 差不多。对交易者而言,真正要的是“提前一步/两步的预测区间”,而不是教科书上的统计显著性,所以轻量模型反而更实用。
它也不是银弹。指数平滑同样建立在“过程稳定”的假设上:它假定序列的水平、趋势在观测区间内缓慢变化、可忽略。一旦市场结构突变(跳空、政策、流动性枯竭),模型会滞后,这是所有外推法的共性弱点。
二、简单指数平滑 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——也就是说,在测试样本上,这些简单模型连朴素法都没超过。这本身就是重要结论:别迷信模型,先和基线比。
- MSE:误差平方平均,对极端值敏感,适合同序列模型对比
- MAE:误差绝对值平均,比 MSE 稳健,仍无法跨序列比较
- RelMAE / RelMSE:除以朴素法基线,<1 才说明预测有用
- 预测区间:用样本误差方差推导置信带,看清“预测不是点而是带”
六、加法模型族与季节分量
把水平、趋势、随机项之外再加一个“季节/周期”分量,就得到加法模型族。文章给了从简单到带季节的完整清单:简单加法、线性增长加法、带衰减的增长加法(趋势斜率随衰减系数逐步减弱),以及它们各自加上季节指数后的版本。公式中还能看到六个变量(alpha/gamma/phi/delta + 水平/趋势/季节平滑值)的全貌。
七、小结
指数平滑不是 ARIMA 的廉价替代品,而是一套参数少、可解释、易落地的短期预测工具。在 MQL5 里,AdditiveES + Powell 优化 + RelMAE 评估已经形成闭环:读报价→优化参数→出预测与区间→和朴素法比基线。记住三件事:只做短期预测、alpha/初值要优化不要拍脑袋、永远先和朴素法比。把它当“下一根 K 线大概率在哪”的辅助判断,而不是自动交易信号本身。