小P学长
小P学长

风光不确定性场景生成与削减:概率回并、极端保留与下游验收

从历史预测残差、时间/风光相关、距离标准化和概率回并出发,建立能复现、能解释、能经过统计与调度双层验收的风光场景削减流程。

最后更新:2026 年 8 月。本文的目标不是给出一个通用的“最佳代表场景数”,而是把数据口径、削减方法、概率、极端和下游调度验收连成一条可复现链路。不同电站、时间分辨率和约束的误差分布不同,示例阈值不能原样搬到真实项目。

先区分预测曲线、预测残差和场景

一条 24 小时风电或光伏预测曲线只是条件期望或点预测,不是不确定性场景。应用历史上“实际值减当时可用预测值”得到的样本外残差建模,不要用最终修正预测或未来信息制造看起来更平滑的误差。

至少检查四件事:残差是否随时段或预测功率呈现异方差;相邻时段是否有自相关;风光相关是否随天气型与时段变化;加上残差后是否被 0 和装机容量截断。截断会改变边界处的概率质量,所以生成后应重新比较均值、零出力概率、满出力概率和分位数。

怎样避免残差建模中的数据泄漏

按预测发布时间排序,每个残差只能使用当时已知的预测版本。若同一时段有多次滚动预测,必须先选定预报提前量,不能混用离实时 24 小时和 1 小时的预测。标定窗口、验证窗口与最终回放窗口应按时间先后分开,不随机打乱同一天的时段。不能用回放窗口反复调误差参数、代表数或验收阈值,否则“样本外”已被消耗。

输入表必须有明确合同

日前示例可使用 hour, wind_forecast_kw, solar_forecast_kw,但真实项目还应保留预测发布时间、适用时间、时区、单位、电站标识、装机容量和数据版本。每个原始场景还应有稳定 scenario_id 与原始概率,不能在导出 CSV 时丢掉概率后再默认等权。

距离之前先处理量纲和波动尺度

直接对 kW 长向量求欧式距离,往往会让装机更大、方差更大的资源或时段主导代表选择。一个可解释起点是先分别按风光装机容量归一,再按每个时段在全场景集中的波动尺度标准化。对接近零方差的时段必须设置稳定的分母下限,避免把浮点噪声放大成巨大距离。

这个距离仍然只表示输入轨迹相似度。如果业务损失主要由净负荷、最大爬坡、连续低出力或某个机组启停阈值驱动,就需要补充对应特征或在下游模型里评估,不能用输入距离代替业务损失。

代表选择与强制锚点是两层问题

随机抽取容易选中高密度的常规场景,却遗漏低总电量、高总电量、低风、低光和最大爬坡。可在代表名额中明确预留这些业务极端,并加入总电量与爬坡的 P05/P50/P95 分布锚点;剩余名额再用最远点、前向/后向削减或其他已声明的方法选择。

锚点不是越多越好。若代表数只有 10,却声明必须保留 11 个不同场景,任务在数学上就不可行。必须先去重、记录每个标签对应的原场景,并在验收表里报告“要求保留/实际保留”。

删除场景后,概率必须回并

每个未被保留的场景都要对应到一个代表场景,并把自己的原概率加到该代表上。验收时至少确认:概率全部非负、总和在数值容差内等于 1、每个原场景只分配一次、代表自身也被分配到自己,并保留 assignments.csv 作为审计证据。

如果原场景本来不是等概率,距离选择、分配与分布统计都要使用原始权重。把非等权场景强制改成等权,会改变期望、分位数和下游目标。

单阶段场景集不等于多阶段场景树

24 小时完整轨迹可作为两阶段或非预见决策外的情景集,但多阶段模型还需要在各信息节点保持分支概率和非预见结构。把每条日轨迹当成互不相干的场景,再独立删减,可能破坏前几时段共享信息的树结构。如果决策会随时间逐步更新,应明确使用场景树生成与削减方法;本站当前 Python 包处理的是完整日轨迹集,不生成多阶段场景树。

统计验收不能只比均值

建议用同一权重口径比较削减前后:逐时风、光和合计功率的均值与 P95;每个场景合计电量的均值、P05、P50、P95;最大绝对爬坡的同组统计;强制极端是否仍在代表集中。对逐时轮廓可报告容量归一化 RMSE,但要同时保留绝对单位误差,避免归一化掩盖实际偏差。

所有阈值应在看到当次结果前声明,并与业务单位关联。“运行完成”、“代表数正确”或“图形看起来相似”都不是足够验收。也不应运行后再放宽阈值,直到结果显示通过。

怎样选择代表场景数

不要从“论文用了 10 个”或“电脑能跑 50 个”直接得出结论。建议先定义一组候选数,例如 10、20、30、50,对每个数重复多随机种子的生成与削减,记录运行时间、统计偏差、下游目标偏差、违约率和尾部风险。从满足所有预声明阈值的候选中选求解成本较低者,并保留整条数量—误差—时间曲线,而不只报告最终一点。

验收失败时按症状定位

  • 均值与电量偏差大:检查概率是否丢失、非等权场景是否被强制等权,以及标准化是否过度降低了高概率区域的影响。
  • 爬坡或尾部偏差大:检查距离是否只看功率水平,而没有表示差分、连续低出力或业务尾部;必要时增加锚点或调整距离特征。
  • 不同种子结果波动大:增加原始场景数、检查残差生成稳定性,并报告分布而非挑选最好种子。
  • 输入指标通过但调度失败:说明输入距离没有捕捉约束切换或成本非线性;需要用下游损失重新设计代表方法。

最终证据必须来自下游决策模型

输入分布接近,不代表调度决策一定接近。应分别用全场景集和代表场景集重跑同一个下游模型,比较加权总成本、购售电、储能 SOC、弃风弃光、短缺、启停状态和约束违例。对风险厌恶模型还要比较 CVaR 或自定义尾部损失。

更稳妥的方式是把一批未参与生成和削减的样本外场景留作回放集:先用代表集产生决策,再在回放集上评估违约率和成本。当季节、预测模型或装机容量改变后,历史残差分布也会漂移,需要重新标定而不是永久复用旧代表集。

可复现不只是固定一个随机种子

应保存数据版本、预测残差窗口、随机种子、容量、相关参数、原始/代表数、距离标准化、锚点规则、阈值、Python 和依赖版本。固定种子只能证明同一配置能复跑,不能证明对其他种子稳定。建议用多种子重复生成与削减,报告验收指标的分布。

每次运行还应写入一份决策记录:谁在什么时间使用哪个数据版本,为什么选择该代表数与阈值,哪些验收通过或失败,失败后改了哪个参数。交付时将配置、摘要 JSON、验收 CSV 和软件版本一起归档,才能区分真正复现与“恰好留下了一张图”。

一条免费的实操路径

  1. 免费规划器计算压缩比、锚点名额和验收项;
  2. 查看削减前后统计样例极端保留样例9 项验收样例
  3. 按本文自建生成、分配、概率回并与下游回放;
  4. 只有需要已连通的 Python 脚本、配置、自动测试与完整输出时,再核对原创包的交付清单。

示例结果与适用边界

本站公开样例使用合成预测与合成残差,从 500 个 24 小时场景削减为 20 个,强制保留 11 个极端/分布锚点。当前固定配置下,概率和为 1,合计电量均值偏差为 2.504%,合计电量 P95 偏差为 0%,最大爬坡 P95 偏差为 8.641%,逐时合计均值 NRMSE 为 1.929%。这些数字只是当前合成例的可复跑证据,不是对真实电站的性能承诺。

原创包实现的是“强制极端保留+标准化最远点贪心+最近代表概率回并”透明启发式方法,不是 Dupačová、Gröwe-Kuska、Römisch 或 Heitsch、Römisch 论文中概率度量削减算法的精确复现。Dupačová 等的原始研究入口将问题表述为:在给定基数下选择场景子集及其概率测度,使之在概率度量意义下尽量接近初始分布;也可核对 Heitsch、Römisch(2003)

语言与旧资料边界:当前交付是独立编写的 Python 实现,不包含任何旧站 Matlab 商品的代码、数据、论文或历史购买权益,也不是旧 Matlab 项目的等价替代。旧页面连到本指南或工具,只表示任务方法相关。

风光场景削减常见问题

代表场景数是越少越好吗?

不是。数量越少通常求解越快,但更容易损失尾部、爬坡和逐时轮廓。应通过预先声明的统计阈值和下游调度结果选择,不能用通用固定数代替。

为什么删除场景后还要回并概率?

未保留场景的概率质量不能凭空消失。将它分配给某个代表并累加概率,才能保持总和为 1 并为加权统计和随机优化提供可审计权重。

强制保留极端场景就足够了吗?

不足够。极端标签只覆盖你预先定义的风险;还需要检查逐时分布、电量、爬坡、代表概率,并在下游模型中重新评估成本、弃电、短缺和约束违例。

公开样例可以直接用于真实风场或光伏站吗?

不可以。它是固定种子的合成数据,只证明字段、算法流程和验收输出可复跑。真实项目必须用自己的样本外预测残差重新标定相关、方差、容量边界和阈值。

这个 Python 包是否等价于旧站的 Matlab 场景削减资料?

不是。它是独立编写、独立计算销量的 Python 启发式实现,不包含旧 Matlab 代码、数据、论文或历史购买权益。需要 Matlab 工程时不应购买它。