4、不确定性建模:新能源出力的随机性、负荷预测误差、电价波动的不确定性建模方法

各位同学好,我是老张。今天咱们聊一个让所有虚拟电厂从业者都头疼的话题——不确定性建模。

说实话,我刚入行那会儿,觉得虚拟电厂调度不就是个优化问题嘛,把约束条件列清楚,目标函数写明白,跑个求解器就完事了。结果呢?第一次上线测试,实际收益比预期少了将近30%。为什么?因为现实世界不是理想模型,新能源说变就变,负荷说涨就涨,电价说跳就跳。你想想看,如果连这些不确定性都处理不好,调度策略再漂亮也是纸上谈兵。

核心观点:不确定性建模不是锦上添花,而是虚拟电厂调度的基石。没有它,你的优化模型就是个「睁眼瞎」。

4.1 新能源出力的随机性建模

先说说光伏和风电。我记得有个项目,业主拍着胸脯说他们装了最先进的气象站,预测精度很高。结果连续三天阴雨天,光伏出力直接腰斩,调度策略全乱套了。

新能源出力的随机性,说白了就是老天爷不按剧本走。我们常用的建模方法有几种:

  • 概率分布法:用历史数据拟合出力的概率密度函数。比如光伏出力常用Beta分布,风速常用Weibull分布。
  • 场景生成法:通过蒙特卡洛模拟生成大量可能场景,再通过场景削减技术保留代表性场景。
  • 时间序列模型:ARIMA、GARCH这类模型,能捕捉出力的时序相关性。

我个人习惯用场景生成法。为什么?因为它直观,而且能跟后面的随机优化无缝衔接。给你看段代码:

import numpy as np
from scipy.stats import beta

# 光伏出力场景生成
def generate_pv_scenarios(n_scenarios=1000, n_periods=24):
    scenarios = []
    for _ in range(n_scenarios):
        # 每个时段独立采样Beta分布
        hourly_scenario = beta.rvs(2, 5, size=n_periods) * 100  # 假设装机100MW
        scenarios.append(hourly_scenario)
    return np.array(scenarios)

# 场景削减(简单版)
def scenario_reduction(scenarios, n_keep=10):
    # 用k-means聚类做场景削减
    from sklearn.cluster import KMeans
    kmeans = KMeans(n_clusters=n_keep, random_state=42)
    kmeans.fit(scenarios)
    return kmeans.cluster_centers_

避坑指南:我曾经犯过一个错误——直接用全年数据拟合分布。后来发现,不同季节、不同天气条件下的出力特性差异巨大。建议按季节、按天气类型分别建模,精度能提升不少。

4.2 负荷预测误差建模

负荷预测误差,其实比新能源出力更难搞。为什么?因为负荷受太多因素影响:节假日、气温、经济活动、甚至突发事件。我记得有一次,某个城市搞大型活动,负荷突然飙升,我们的调度策略完全没反应过来。

负荷预测误差通常呈现以下特征:

  • 非对称性:正误差和负误差的概率不一样,尤其在尖峰时段
  • 异方差性:误差的方差随时间变化,高峰时段方差更大
  • 自相关性:前一小时的误差会影响后一小时的误差

常用的建模方法:

方法 适用场景 优点 缺点
正态分布 常规时段 简单易用 无法捕捉厚尾特征
t分布 尖峰时段 能处理厚尾 参数估计复杂
非参数核密度 任意场景 无需假设分布形式 计算量大
分位数回归 风险分析 直接得到分位数 需要大量数据

你想想看,如果只用正态分布去拟合负荷误差,那尖峰时段的极端情况基本就忽略了。但恰恰是这些极端情况,最容易导致调度策略失效。

注意:负荷预测误差建模时,一定要区分工作日和休息日。我见过有人把周末数据跟工作日混在一起建模,结果误差模型完全失真。节假日的影响更大,建议单独处理。

4.3 电价波动的不确定性建模

电价波动,这是虚拟电厂收益最直接的变量。说实话,电价预测比新能源和负荷都难。为什么?因为电价不仅受供需影响,还受市场力、交易策略、甚至政策干预的影响。

我记得2022年欧洲能源危机那会儿,电价一天之内能翻三倍。你如果还用常规的时间序列模型去预测,基本就是刻舟求剑。

电价波动的典型特征:

  • 尖峰和跳变:电价会出现瞬间大幅波动
  • 均值回复:极端电价后通常会回归正常水平
  • 季节性:日内、周内、年内都有明显规律
  • 波动率聚集:高波动时段往往持续一段时间

我个人建议用混合模型来处理电价不确定性:

  1. 基础预测层:用LSTM或XGBoost做点预测
  2. 不确定性量化层:用GARCH模型刻画波动率
  3. 极端事件层:用跳跃扩散模型捕捉电价跳变

来看一个简单的GARCH模型实现:

import arch

# 电价波动率建模
def price_volatility_model(price_series):
    # 计算对数收益率
    returns = np.diff(np.log(price_series))
    
    # 拟合GARCH(1,1)模型
    model = arch.arch_model(returns, vol='Garch', p=1, q=1)
    result = model.fit(disp='off')
    
    # 预测下一期波动率
    forecast = result.forecast(horizon=1)
    next_vol = np.sqrt(forecast.variance.values[-1, 0])
    
    return next_vol, result.params

经验之谈:电价建模时,别忘了加入外生变量。比如天然气价格、碳排放权价格、甚至天气预报。这些变量对电价有显著影响。我曾经在模型里加入了天然气期货价格,预测精度提升了将近15%。

4.4 多源不确定性融合

好了,现在我们有三个不确定性来源:新能源出力、负荷、电价。但虚拟电厂调度需要同时考虑它们。怎么融合?

这里我画了一张图,展示多源不确定性的融合框架:

多源不确定性融合框架 新能源出力 Beta分布/场景生成 负荷预测误差 t分布/分位数回归 电价波动 GARCH/跳跃扩散 场景耦合与相关性建模 Copula函数 / 联合场景生成 / 相关性矩阵 随机优化 / 鲁棒优化 两阶段随机规划 / 分布鲁棒优化 鲁棒调度策略

融合的关键在于相关性。你想想看,新能源出力和负荷之间其实有相关性——比如晴天光伏出力大,但空调负荷也大。电价和新能源出力也有相关性——光伏大发时电价往往走低。如果忽略这些相关性,你的不确定性模型就是割裂的。

常用的融合方法:

  • 联合场景生成:同时采样新能源、负荷、电价,保留它们之间的相关性
  • Copula函数:分别建模边缘分布,再用Copula连接它们
  • 多阶段随机规划:把不确定性按时间顺序展开,逐步决策

核心建议:别想着一次性把所有不确定性都精确建模。先抓住主要矛盾——对收益影响最大的不确定性因素。我一般先做敏感性分析,找出哪些不确定性对收益影响最大,然后重点建模这些因素。

好了,这一章的内容就到这里。不确定性建模是个系统工程,需要你不断迭代和验证。记住,模型再漂亮,也要拿到实际数据上去检验。下一章我们会讲如何把这些不确定性模型嵌入到调度优化框架中。


公众号:蓝海资料掘金营,微信deep3321