搞新能源的人,尤其是做风光功率预测的,应该都体会过那种无奈:数据拿到手,曲线跟过山车似的,上午还是大晴天,中午一片云飘过来,光伏出力直接给你表演“高台跳水”。风电更不用说,阵风一来,功率曲线抖得跟心电图似的。调度要考核你预测准确率,考核不过就罚钱,所以风光出力预测这事,不是发篇论文就完事,是真金白银的硬需求。
我试过不少模型,单一的ARMA、单一的神经网络,各有各的脾气。后来接触了EMD-ARMA这种组合思路,算是把问题理顺了不少。这套方法的核心逻辑不复杂:EMD负责把乱七八糟的非平稳信号拆成一堆相对平稳的分量,ARMA再对这些分量逐个建模预测,最后叠加回真实出力值。听起来像流水线作业,但每一步都有坑,今天就把我这段时间的探索过程、实操细节和踩坑记录完整分享出来,适合正在做新能源功率预测、或者对信号分解建模感兴趣的同行参考。
1. 为什么风光预测需要“组合拳”
1.1 单一模型在风光数据面前的无力感
先说说为什么单一模型撑不住。风电场和光伏电站的出力序列,本质上是一个强非平稳、强非线性的随机过程,受气象因素(风速、辐照度、温度、云量)和地理因素双重影响。ARMA这类线性时间序列模型,核心假设是序列平稳——均值和方差不随时间变化。但风功率序列今天均值是30MW,明天可能是5MW,方差更是随着阵风强度剧烈波动,直接把ARMA的核心假设给踩碎了。
有人会说你先把数据做差分、取对数、归一化,强行让它“看起来平稳”。但问题在于,风光出力里存在大量多时间尺度的叠加成分:短周期的高频随机扰动(秒级到分钟级的阵风、云团遮挡)、中周期的气象过程(小时级的风速变化、云层过境)、长周期的趋势性变化(昼夜循环、季节变换)。差分只能消除趋势,对多尺度混叠无能为力。我见过不少同行拿原始数据硬怼ARMA,预测结果里那些高频毛刺完全学不到,低频趋势又滞后明显,MAPE能做到25%以上就算烧高香了,考核根本过不去。
神经网络的思路是让模型自己学非线性映射,理论上能拟合任意复杂函数。但实际使用中,LSTM这类模型对数据量和调参很敏感,风光数据的强随机性经常让网络学到一堆噪声特征而不是真实物理规律。再加上风电场的数据往往存在大量的限功率运行点(弃风时段),样本分布极度不均匀,网络很容易在这种数据上过拟合,拿到新数据上就崩。
1.2 EMD与ARMA的分工逻辑
EMD-ARMA组合方法的思想很朴素:既然序列是多尺度混叠的,那就先把它拆开,拆成一个个相对单一尺度的分量,再对每个分量分别建模。EMD做的事情就是自适应分解——它不像傅里叶变换那样预设一堆正弦波,也不像小波变换那样需要提前选小波基函数,而是完全依据数据本身的极值点时间尺度来分解,把原序列拆成若干个本征模函数(IMF)和一个残差项。
拆完之后每个IMF就温和多了。高频IMF反映的是快速的波动细节,中低频IMF和残差反映的是趋势和周期主体。对这些分量分别做ARMA建模,每个分量都更容易满足平稳性要求,预测精度自然就上去了。这就是组合拳的本质:EMD负责“分而治之”,ARMA负责“各个击破”。听起来是不是有点像做菜先切菜再下锅?数据先切块,分段处理,最后再拼回一盘完整的菜。
这里还要多说一句:为什么选ARMA而不是都扔给神经网络?因为ARMA有完整的统计学理论支撑,定阶、参数估计、残差白噪声检验都有成熟方法论,可解释性强,算力要求低。对于风电光伏这种需要频繁滚动预测、每15分钟就要跑一遍的场景,ARMA的速度优势很明显。而且分量被EMD拆完之后,绝大多数都近似平稳,ARMA这套经典工具恰好够用,杀鸡没必要上牛刀。
2. EMD分解实操:把复杂信号拆成看得懂的分量
2.1 EMD的直观原理与“剥洋葱”类比
EMD的全称是经验模态分解,自带“经验”二字,说明它更依赖数据本身说话。算法流程说起来不复杂,但每一步都有讲究。先找出原始信号的全部局部极大值点和极小值点,分别用三次样条曲线把所有极大值点包起来形成上包络,极小值点包起来形成下包络,求上下包络的均值作为“均值包络”,原始信号减去这个均值包络,得到一个新的序列。检查这个新序列是否满足IMF的两个条件:一是极值点个数和过零点个数相等或最多相差1,二是上下包络的均值在任意点都接近于0。如果不满足,就把这个新序列当作新的原始信号,重复上述过程,直到满足条件。第一个IMF就出来了,原信号减去它,对剩余部分继续重复上述分解,直到剩余信号单调或幅值小于设定阈值为止。
可以想象成剥洋葱:每次剥掉一层代表一个时间尺度的复杂波动,剩下的越来越光滑,最后剥到一个无法再分的核心(残差)。如果说傅里叶变换是拿固定尺寸的筛子筛信号,EMD就是根据信号自己长什么样来定制筛子孔径,灵活度完全不同。
2.2 IMF筛选的细节与停止条件
实际操作中,EMD最容易翻车的地方是筛选停止条件。筛选次数太少,IMF不纯净;筛选次数太多,IMF会被过度平滑,变成纯调频信号,丢失幅值包络信息。常用的判断方式是计算SD阈值,也就是相邻两次筛选结果之间的相对差,一般取0.2到0.3。但在我的实际测试里,固定SD阈值在不同风况下表现不稳定——晴天数据波动小,SD很快收敛;大风天数据毛刺多,SD振荡剧烈,算法容易卡在局部循环里。建议在工程实现中加一个最大迭代次数限制(比如100到200次),防止死循环。
判断IMF质量还有一个实用技巧:看每个分量的瞬时幅值包络是否平滑、是否出现剧烈突变。如果某个IMF的包络出现“锯齿状”跳变,多半是模态没拆干净。这时候可以回溯检查这一层分解的极值点筛选是否合理,比如是否存在局部密集的极值点导致三次样条过冲。我踩过的坑之一就是三次样条在数据边界处产生严重的过冲振荡,直接导致第一个IMF的头部和尾部幅值异常放大,后面做ARMA预测时这些位置的误差会被成倍放大。
2.3 端点效应与模态混叠:EMD的两大天坑
端点效应是所有EMD使用者绕不过去的第一道坎。因为三次样条插值需要用到序列两端的极值点信息,而端点外的数据是未知的,样条在边界处会产生虚假的摆动,这个摆动会随着迭代筛选逐步向内污染数据。体现在预测上就是你明明前面预测得挺好,越往后越离谱,尾部直接翘起来或者掉下去。解决办法常见的有镜像延拓法(把端点附近的波形对称镜像延展出去给样条提供虚拟极值点)、特征波延拓法(在历史数据中寻找与端点波形相似片段拼上去)、以及基于AR模型外推几个点的做法。个人实测下来,镜像延拓对风光数据稳定性不错,特征波延拓计算量稍大但对周期性明显的序列效果更好,光伏数据用特征波延拓能明显改善早晚时段的预测误差。
模态混叠是第二个大坑,表现为一个IMF里同时掺杂了差异很大的时间尺度成分。典型场景是风电场在一个平稳的日均风速变化过程中突然来一阵阵风,阵风的局部高频波动会被算法误认为独立尺度的极值点,导致高频成分跑进低频IMF里。模态混叠的经典解决方案有EEMD(集合经验模态分解),原理是给原序列多次添加不同的白噪声,分别做EMD分解,最后把所有分解结果按IMF序号取平均。白噪声的均匀频谱会把不同尺度的信号“逼”到各自正确的IMF频带上,混叠问题显著缓解。再进化一点是CEEMDAN(自适应完备集合经验模态分解),它在每一层分解时只加一次自适应噪声,重构完备性比EEMD更好,而且迭代次数少很多。现在我做风光出力预测,如果数据里明显存在间歇性扰动,基本直接上CEEMDAN,迭代次数控制在500次左右,噪声幅值取原序列标准差的0.2倍,实测效果比裸EMD稳不少。
3. ARMA建模的核心细节与调参经验
3.1 平稳性检验与差分策略
EMD分解完成后,下一步是对每个IMF分量做ARMA建模。但能不能直接用ARMA,先看序列是否平稳。常用的ADF检验(增广迪基-富勒检验)可以快速判断是否满足单位根平稳。绝大多数IMF分量拆完以后ADF检验的p值都能压到0.05以下,直接满足了平稳性要求,这也是为什么EMD-ARMA组合框架能成立的根本原因。
残差分量有时候仍然会呈现缓变趋势,ADF检验过不了。这时候可以考虑做一阶差分再建模,预测完再还原差分。但差分操作要非常克制,切记不要过差分。我见过有人对所有分量不分青红皂白全部先差分再建模,结果高频IMF本来已经是平稳序列,差分后反而引入了负的自相关性,预测结果出现大量高频震荡伪影。经验是只在ADF检验明确拒绝平稳性时才做差分,并且差分阶数到1就够了,如果一阶差分后还不平稳,大概率是这个分量本身信息质量有问题,建议回头检查分解参数而不是继续加差分阶数。
3.2 定阶策略:ACF/PACF与AIC/BIC的配合
ARMA模型有两个关键参数:自回归阶数p和移动平均阶数q。定阶的常规操作是看自相关函数ACF和偏自相关函数PACF的截尾和拖尾特征。ACF呈拖尾、PACF在p阶后截尾,选AR(p);ACF在q阶后截尾、PACF拖尾,选MA(q);两者都拖尾就用ARMA(p,q),具体阶数结合AIC或BIC赤池/贝叶斯信息准则来挑。
但实际数据没有教科书那么乖巧,尤其高频IMF分量,ACF和PACF经常出现多处长尾小值,截尾特征不明显。我的处理策略是设定搜索范围p∈[0,5]、q∈[0,5],遍历所有组合,按AIC最小选阶,同时加一个残差白噪声检验(Ljung-Box检验)兜底。为什么搜索范围设小一点?因为风光序列即使分解后,样本量也有限,比如15分钟分辨率的数据一天才96个点,预测未来4小时也就是16个点,模型阶数设太高会引入大量待估参数,有效样本不够,参数方差会剧增,反倒不如小阶数模型稳。让模型太“聪明”有时候并不划算。
还有一个容易被忽略的点:不同IMF的分量适合的模型可能完全不同。高频IMF序列波动剧烈、均值接近零,移动平均项主导,MA类模型往往就够用;低频趋势分量有强自相关,AR阶数要求高一些。实务中最好对每个IMF单独跑一遍定阶流程,而不是统一用同样的p、q。虽然计算量上稍微多点,但换来的是精度提升,值得花这个成本。
3.3 分量预测与重构的操作逻辑
所有分量都建模完成后,预测流程是这样的:对每个IMF分别做超前多步预测(比如未来16个点,对应4小时),然后把所有分量的预测值逐点相加,再加上残差预测,还原得到最终的风光出力预测值。整个过程相当于把一个大任务拆成多个小任务,每个小任务只处理相对平稳的序列,最后再拼装回去。
重构过程中我发现一个工程细节:高频IMF的预测误差天然比低频分量大,因为高频分量本身就是高随机性成分,再优秀的ARMA也难以精确预测。这会导致一个问题——如果把所有分量的预测误差等权叠加,最终结果的高频部分会出现明显偏差,表现为预测曲线比实际曲线“多毛刺”或者“平滑失真”。对策是在重构后加一道后处理:对预测值为负的物理不可行数据直接截断为0,风电出力不可能小于0;对超出发电装机容量的预测值做上限截断。这一步看起来简单,但不做的话,考核平台直接判定异常数据,扣分没商量。
另外,对预测效果的评价,我习惯同时看MAPE(平均绝对百分比误差)、RMSE(均方根误差)和NMAE(归一化平均绝对误差)。MAPE在低出力时段容易虚高(分母太小),所以还得辅助看RMSE。你做预测评估时千万别只盯一个指标,调度考核经常用综合精度打分,多个维度一起看才靠谱。
4. 完整预测流程与案例复盘
4.1 数据准备与异常值处理
再好的模型也架不住脏数据。风光出力数据常见的脏问题包括:通信中断导致的长时间零值或恒定值、传感器故障导致的跳变异常值、风机检修或限功率导致的非正常出力、光伏夜间零值。数据处理的第一步是筛掉明显异常值——出力在装机容量范围之外的点、出力突变量超过合理阈值(比如15分钟内变化超过装机容量50%)的点,都要标记出来做插补。
插补方式我建议用线性插值处理短时缺失,因为风光出力短时连续性尚可;超过1小时以上的长时缺失,用同时间段历史均值插补,注意区分晴天和阴天。夜间光伏出力恒为0是正常的,但在做EMD分解时要特别小心,因为夜间大量零值会形成“平台”,平台边缘的极值点分布严重不均匀,容易诱发端点效应和过冲。一个有效的处理是分离日间和夜间的数据分别建模,或者用气象辐照度数据辅助判断“日出前/日落后的零值不参与建模”。我推荐后者,简单直接,保留24小时完整性,也不会因为硬拆昼夜导致样本量不足。
4.2 案例:一个风电场出力预测的完整过程
以我做过的一个49.5MW风电场项目为例,数据为15分钟分辨率,单机容量1.5MW,33台风机,装机总容量49.5MW,取连续90天数据作为训练集,预测未来4小时(16个点)。第一步对历史功率序列做CEEMDAN分解,设置噪声幅值0.2倍标准差、集成次数500次,得到6个IMF分量加1个残差。分解后观察各IMF物理含义:IMF1到IMF2对应分钟级的风速湍流扰动,波动剧烈;IMF3到IMF4对应小时级的风速过程(如天气系统过境);IMF5到IMF6对应日尺度及以上的周期变化;残差反映总体功率水平趋势。
第二步逐个对IMF建模。细节上,IMF1和IMF2因为高频特性,ARMA定阶结果多为MA(1)或ARMA(1,1);IMF3和IMF4表现出明显自回归特性,阶数多为AR(2)或ARMA(2,1);IMF5和IMF6序列平滑,AR(1)就能吃得很透。残差一阶差分后做AR(1)建模,预测后再还原。这里有个实操细节:每个分量训练时,我滑动窗口长度取720个点(5天),预测一次以后就把最新实测数据滚动加入训练集,保证模型能跟上风况变化。
预测结果的MAPE做到约12%,RMSE为4.8MW,NMAE约9.6%。对比直接用原始功率序列跑ARMA,MAPE从22%压到12%;对比LSTM基线(同样数据、8层结构),误差略低一点,但推理速度快得多:单次预测全流程跑完不到0.3秒,LSTM要秒级起步。而且ARMA每个分量输出还带着置信区间,在调度交互时能给出预测的波动范围,这是黑箱模型学不来的。
后来我把同一个流程也套在了一个30MW光伏电站上,处理夜间零值后,预测晴天的MAPE约8%,多云天约18%。光伏的主要误差来源是云团遮挡的随机性,这部分高频波动,EMD拆开后依然预测不了。于是我又尝试把数值天气预报中的云量信息作为外生变量引入低频分量的ARMAX模型中,多云天误差又降了几个点。当然这就是后话了,但思路是通用的:如果某些物理量对出力有明显影响,不要把它们扔在EMD里被动分解,主动建联效果更好。
4.3 组合策略变体:EEMD和CEEMDAN的选择建议
做这套流程时,会看到很多文献用EMD、EEMD或者CEEMDAN做分解,到底怎么选?我的建议:
- 如果你的数据相对规整、波动模式稳定(比如光伏晴天数据),直接用EMD就够,速度快,参数少。
- 如果数据间歇性强、受阵风或云团影响显著,用EEMD,集成次数100-300次,噪声幅值0.1-0.2倍标准差。
- 如果追求更高的重构精度,用CEEMDAN,但要注意它的迭代次数和噪声幅值需要更多调试,计算量明显增大。在风电场预测这种要求实时性的场景,我建议用CEEMDAN离线训练好模型参数,在线预测时分解参数固定使用,速度可以接受。
需要特别注意的是,不管用哪种分解,EMD家族的算法都受“新数据尾端效应”影响——在线预测时,你只有历史实测数据,未来16个点是未知的,分解窗口边界就在当前时刻,端点效应会直接影响最新一个IMF的取值。这个位置正好是你要预测的起点,误差传递效应非常棘手。我的对策是:在线预测时,在窗口末尾拼一段下一时段的NWP预测值或持续法外推值作为虚拟拓展,把端点挪到虚拟区里,这样真实边界处就不会被样条摆动污染。处理前后对比,尾部误差能有可感知的改善。
5. 常见问题与避坑清单
5.1 高频误差传导、负值越界与耗时膨胀
高频IMF预测误差大是这套方法被诟病最多的地方。前述案例里IMF1和IMF2的单分量预测准确率可能只有60%到70%,因为阵风本身就是混沌过程,谁也没法精确预测。你不能指望ARMA把随机扰动学出来。策略上要么接受这部分误差,要么想办法从源头削减——比如用更高频率的风速实测数据做外推。但一刀切把高频IMF扔掉也不可取,虽然RMSE会降低,但预测曲线的动态细节会失真,调度看着反而别扭。我一般保留高频分量的预测,但不再等权叠加而是按方差倒数加权重构,信噪比高的低频分量获得更大权重,高频分量被适度压制,整体误差更稳。
预测值为负是重构后常见的物理越界问题,尤其当原始出力在零附近时,高频分量小幅波动叠加后很容易变负。处理不复杂:直接截断,风电出力小于0就置0,同时检查是否和其他时段的预测值产生衔接跳变。如果连续滚动预测中出现前一帧预测是3MW,下一帧突然跳到0,这种跳变在考核中会被识别为异常,需要做平滑过渡处理,取相邻两帧预测值的滑动平均来衔接。
算力问题也不容小觑。每15分钟滚动预测一次,每个分量重新定阶、重新估计、重新预测,6个分量加残差就是7个模型。如果采用网格搜索定阶,每轮要遍历36组参数组合,程序跑在工控机上时间会吃紧。优化方案是:模型定阶不必每次滚动都重新搜索,可以每1小时甚至每4小时做一次全量定阶,正常15分钟滚动只是增量更新参数,这样既保证模型适应性,又大幅降低算力开销。工程上的本质矛盾是精度和时延,从系统设计上分层应对,而不是把所有任务都堆在每个15分钟里。
5.2 异常现象速查与处置建议
| 异常现象 | 可能原因 | 处置建议 |
|---|---|---|
| 预测曲线尾部大幅偏离 | 端点效应污染 | 加镜像延拓或NWP虚拟延展 |
| 一个IMF内出现多尺度混叠 | 模态混叠 | 改用EEMD或CEEMDAN |
| 某些IMF定阶后残差非白噪声 | 分量信息提取不充分 | 增加分解迭代次数或换分解变量输入 |
| 光伏夜间时段预测波动大 | 零值平台诱发边界效应 | 结合辐照度分离日/夜建模 |
| 低出力时段MAPE异常偏高 | 百分比误差分母过小 | 辅助RMSE评估,对出力阈值以下时段的误差加权 |
| 高频分量滞后明显 | 定阶偏低或模型拟合不足 | 提高p阶数范围并检查数据分辨率和截止周期带宽 |
| 滚动预测出现相邻帧跳变 | 归一化处理不一致 | 统一历史窗口处理方法,增加相邻帧平滑 |
这套速查表是我反复调试多次后总结出来的,不敢说覆盖了所有坑,但主流问题基本都能命中。你在自己的数据上跑流程时,先把这几类问题提前想好处置预案,会比出了问题再排查省很多时间。
最后再分享一个个人经验:不要迷信任何单一模型是“最优解”。EMD-ARMA这套组合方法,本质上是把复杂问题拆解成一系列简单子问题再逐个解决。它胜在结构清晰、物理可解释、算力友好,但每一个环节都有自身的边界——分解的端点效应、高频分量的不可预测性、对气象突变的无感知,都是绕不过去的坎。我自己在项目中是把它当成一个高精度的基准模型来用:总是先跑通这套流程,拿到确定性的性能底数,再叠加其他信息(NWP外推、气象实况、场站状态)做增量优化。这样既能保证预测精度的基本盘,又能在不断试错中积累对不同算法特性的直观认知。做预测的核心不是找一个万能公式,而是搞清楚每一类误差从哪里来,再针对性杀灭它。