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年欧洲能源危机那会儿,电价一天之内能翻三倍。你如果还用常规的时间序列模型去预测,基本就是刻舟求剑。
电价波动的典型特征:
- 尖峰和跳变:电价会出现瞬间大幅波动
- 均值回复:极端电价后通常会回归正常水平
- 季节性:日内、周内、年内都有明显规律
- 波动率聚集:高波动时段往往持续一段时间
我个人建议用混合模型来处理电价不确定性:
- 基础预测层:用LSTM或XGBoost做点预测
- 不确定性量化层:用GARCH模型刻画波动率
- 极端事件层:用跳跃扩散模型捕捉电价跳变
来看一个简单的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 多源不确定性融合
好了,现在我们有三个不确定性来源:新能源出力、负荷、电价。但虚拟电厂调度需要同时考虑它们。怎么融合?
这里我画了一张图,展示多源不确定性的融合框架:
融合的关键在于相关性。你想想看,新能源出力和负荷之间其实有相关性——比如晴天光伏出力大,但空调负荷也大。电价和新能源出力也有相关性——光伏大发时电价往往走低。如果忽略这些相关性,你的不确定性模型就是割裂的。
常用的融合方法:
- 联合场景生成:同时采样新能源、负荷、电价,保留它们之间的相关性
- Copula函数:分别建模边缘分布,再用Copula连接它们
- 多阶段随机规划:把不确定性按时间顺序展开,逐步决策
核心建议:别想着一次性把所有不确定性都精确建模。先抓住主要矛盾——对收益影响最大的不确定性因素。我一般先做敏感性分析,找出哪些不确定性对收益影响最大,然后重点建模这些因素。
好了,这一章的内容就到这里。不确定性建模是个系统工程,需要你不断迭代和验证。记住,模型再漂亮,也要拿到实际数据上去检验。下一章我们会讲如何把这些不确定性模型嵌入到调度优化框架中。
公众号:蓝海资料掘金营,微信deep3321