为什么要做一个电力市场出清仿真模型

从一个实际困惑说起:能用的出清模型几乎找不到,于是动手搭建了一个辽宁 49 节点电力市场出清仿真系统。

从一个实际困惑说起

做电力市场咨询这几年,有一个感受越来越强烈:我们大部分的工作停留在定性层面。

规则解读、机制设计、政策建议 — 这些当然重要。但很多问题的答案,光靠定性分析是不够的。比如:

  • 某发电企业调整报价策略后,出清结果到底会怎么变?
  • 一条关键线路发生阻塞,节点电价会拉开多大差距?
  • 储能配置到多大规模,才能对电价产生实质性影响?
  • 新能源渗透率提高到某个水平,系统调峰压力到底有多大?

这些问题,不跑一遍出清模型,很难给出有说服力的回答。

但问题在于:能用的出清模型,几乎找不到。

为什么没有现成的工具

这不是一个容易解决的”工具缺口”,背后有三层现实约束。

第一,生产系统涉密。 真实的出清引擎、网架结构、机组参数、报价数据,都属于调度机构和电网公司的核心资产。不要说外部人员,即便是系统内部的非核心岗位,也很难接触到完整的出清模型。这是安全要求,无可厚非。

第二,公开算例太老。 学术界广泛使用的 IEEE 39 节点系统,设计于上世纪 70 年代。那个年代没有风电、没有光伏、没有储能,也没有分段报价机制。拿它来研究今天的电力市场问题,就像用一张 50 年前的地图导航今天的高速公路 — 骨架还在,但细节已经完全对不上。

第三,商业软件门槛太高。 PLEXOS、PROMOD 这类商业仿真工具功能强大,但许可费用动辄几十万,对个人研究者和小型团队来说并不现实。

所以现状是:想做电力市场的量化研究,要么用涉密的真系统(不可能),要么用过时的老算例(不够用),要么花大价钱买商业软件(不划算)。

我需要一个中间地带:足够真实,能反映现代电力市场的核心特征;足够开放,可以自由修改和扩展;足够简化,个人能理解和掌控。

这就是我动手做这个模型的起因。

出清到底在做什么

在展开模型之前,有必要先说清楚”出清”这件事的本质。

电力市场和其他市场有一个根本区别:电不能大规模存储,发多少就得用多少,而且必须在物理电网上实时平衡。 这意味着,电力交易不能简单地”价低者得”,还必须满足一系列物理约束:

  • 功率平衡:每一时刻,所有发电机组的出力之和必须等于系统总负荷
  • 网络约束:每条输电线路有传输极限,不是想送多少就能送多少
  • 机组约束:火电机组不能瞬间启停,不能无限快速升降出力,有最小运行时间和最小停机时间

所以,出清的本质是一个带约束的优化问题:

在满足所有物理约束的前提下,找到总成本最低的调度方案,并据此确定每个节点的电价。

这不是一个简单的排序问题,而是一个需要数学规划求解器来处理的优化问题。

两阶段出清:先排班,再分工

国际上主流的日前市场出清采用两阶段框架:SCUC + SCED。这个设计很自然,因为它把一个复杂问题拆成了两个逻辑上先后衔接的子问题。

第一阶段:SCUC — 谁开机

安全约束机组组合(Security-Constrained Unit Commitment)要回答的核心问题是:在未来 24 小时内,哪些机组需要开机,什么时候开,什么时候停?

这之所以是一个难题,是因为火电机组的启停不是”按一下开关”那么简单:

  • 启动成本:一台大型火电机组冷启动的成本可以达到几十万元
  • 最小运行时间:机组一旦启动,通常需要连续运行至少 24 小时
  • 最小停机时间:停机后也需要等待足够长的时间才能再次启动
  • 爬坡约束:机组出力不能瞬间变化,每 15 分钟最多升降一定的功率

这些约束引入了整数决策(开还是关),使得 SCUC 成为一个混合整数规划问题(MIP),求解难度较高。

第二阶段:SCED — 发多少

安全约束经济调度(Security-Constrained Economic Dispatch)在 SCUC 确定了机组开停状态之后启动。此时,整数变量已经固定,问题退化为一个线性规划(LP),求解速度快得多。

SCED 要做的事情是:在已知谁在运行的前提下,精确分配每台机组的出力,使总发电成本最低,同时满足所有网络约束和机组约束。

更重要的是,SCED 的求解结果中隐含了一个关键信息 — 节点边际电价(LMP)。

LMP:每个节点的电价为什么不同

LMP 的经济学含义是:在某个节点增加 1 MW 负荷,系统总成本会增加多少。

如果电网没有阻塞(所有线路都够用),全系统各节点的 LMP 应该相同 — 因为增加任何地方的负荷,都可以由最便宜的机组多发 1 MW 来满足。

但现实中,线路传输能力有限。当某条线路达到极限时,便宜的电送不过去,只能调用负荷侧更贵(但物理上可达)的机组。这时,不同节点的电价就会拉开差距 — 这个差距就是阻塞成本。

LMP 从 SCED 的功率平衡约束的对偶变量中提取,是市场定价的核心依据。

两阶段的关系

输入数据(网架、机组、负荷、报价)
    |
    v
[SCUC] -- 混合整数规划 -- 决定谁开机
    |
    v
[SCED] -- 线性规划 -- 决定发多少 + 提取 LMP
    |
    v
输出结果(调度计划 + 节点电价)

SCUC 定框架,SCED 做精细化。这是目前全球大多数电力现货市场采用的标准架构。

这个模型长什么样

基于以上思路,我搭建了一个辽宁 49 节点电力市场出清仿真系统。选择辽宁电网作为原型,是因为它的电源结构比较典型:火电为主,同时有核电、水电、风电、光伏、储能和跨省联络线,能够覆盖现代电力市场的主要元素。

系统规模

维度数据
节点数49 个(覆盖沈阳、大连、鞍山、营口等主要地区)
支路数74 条
时段数96 个(15 分钟 x 24 小时)
总装机38,243 MW
火电14 台(聚合模型)
核电2 台
水电1 台
风电9 台
光伏3 台
储能5 台
联络线6 条(含省间直流/交流通道)

运行结果一览

以下是模型一次完整运行的输出,展示各类核心结果。

发电出力堆叠图 — 96 个时段内各类电源的出力时序分布:

发电出力堆叠图

机组组合甘特图 — 14 台火电机组的启停计划,深色表示运行,浅色表示停机:

机组组合甘特图

LMP 热力图 — 49 个节点 x 96 个时段的节点边际电价分布,颜色越深电价越高:

LMP热力图

储能 SOC 曲线 — 5 台储能设备的荷电状态与充放电策略:

储能SOC曲线

成本分解 — 系统总成本的构成:

成本分解

这些图表背后是大量可追溯的数据。所有调度计划和电价数据都以 CSV 格式输出,方便进一步分析和二次加工。

技术选型

简要交代一下技术栈,给有技术背景的读者一个快速印象:

层面选型理由
建模框架Pyomo 6.xPython 生态,学术友好,求解器无关
求解器HiGHS开源,性能优秀,MIT 许可,无需额外配置
网络模型DC-OPF + PTDF直流潮流,用功率转移分布因子替代相角变量,减少变量规模
数据处理pandas + numpy标准数值计算栈
可视化matplotlib8 种图表自动生成
配置管理Pydantic Settings统一参数管理,支持环境变量覆盖

当前版本在普通笔记本上,全流程求解耗时约 22 秒(SCUC 约 10 秒,SCED 约 12 秒)。对于一个 49 节点 x 96 时段的系统来说,这个速度完全够用。

与生产系统的差距

需要坦诚说明的是,这个模型和生产级出清系统之间有明显差距:

  • 计算效率:生产系统需要在几分钟内求解数千节点的大规模问题,通常依赖高度优化的商业求解器和定制化的算法策略
  • 数据精度:本模型使用的是聚合参数,不是逐台机组的真实数据
  • 工程化程度:生产系统有完善的数据校验、异常处理、热备切换、审计追踪等工程能力
  • 市场规则:实际的市场规则远比本模型复杂,包括各种辅助服务、容量补偿、偏差考核等

但基本原理是相通的。生产系统解决的核心数学问题 — 带安全约束的机组组合和经济调度 — 和这个模型是一样的。差别更多在工程层面,而非原理层面。

这也是这个模型的定位:不是一个生产工具,而是一个学习和研究工具。 用它来理解出清机制、验证市场规则、分析参数敏感性、测试新想法,是它最适合的场景。

这个系列会写什么

这个模型会作为一个系列专题持续更新,后续计划覆盖以下主题:

  1. 数据架构设计 — 输入数据的三层结构和 CSV 格式设计
  2. SCUC 数学建模 — 机组组合的决策变量、目标函数和约束条件详解
  3. SCED 与 LMP 定价 — 经济调度模型和节点边际电价的提取机制
  4. DC-OPF 网络模型 — 从 B-theta 到 PTDF 的演进
  5. Pyomo 代码架构 — 基类设计、配置管理和工程实践
  6. 仿真结果分析 — 从运行数据中提取洞察
  7. 场景实验 — 修改参数观察系统响应
  8. 求解器选型与调优 — 不同求解器的性能对比
  9. 扩展方向 — 辅助服务、多区域联合出清等

每一篇会聚焦一个具体主题,尽量做到独立可读。

写在最后

做这个模型的初衷很简单:作为一个电力市场从业者,想有一个自己能完全理解、自由修改的出清模型,用来把平时咨询中遇到的定性问题,转化成可以量化验证的命题。

它不完美,但够用。而且因为足够简化,每一行代码、每一个约束都能说清楚为什么这么写。这本身就是一种学习。

项目代码已开源,仓库地址见页面侧栏。


这是「电力市场出清仿真实战」系列的第一篇。