从一个实际困惑说起
做电力市场咨询这几年,有一个感受越来越强烈:我们大部分的工作停留在定性层面。
规则解读、机制设计、政策建议 — 这些当然重要。但很多问题的答案,光靠定性分析是不够的。比如:
- 某发电企业调整报价策略后,出清结果到底会怎么变?
- 一条关键线路发生阻塞,节点电价会拉开多大差距?
- 储能配置到多大规模,才能对电价产生实质性影响?
- 新能源渗透率提高到某个水平,系统调峰压力到底有多大?
这些问题,不跑一遍出清模型,很难给出有说服力的回答。
但问题在于:能用的出清模型,几乎找不到。
为什么没有现成的工具
这不是一个容易解决的”工具缺口”,背后有三层现实约束。
第一,生产系统涉密。 真实的出清引擎、网架结构、机组参数、报价数据,都属于调度机构和电网公司的核心资产。不要说外部人员,即便是系统内部的非核心岗位,也很难接触到完整的出清模型。这是安全要求,无可厚非。
第二,公开算例太老。 学术界广泛使用的 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 个时段的节点边际电价分布,颜色越深电价越高:

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

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

这些图表背后是大量可追溯的数据。所有调度计划和电价数据都以 CSV 格式输出,方便进一步分析和二次加工。
技术选型
简要交代一下技术栈,给有技术背景的读者一个快速印象:
| 层面 | 选型 | 理由 |
|---|---|---|
| 建模框架 | Pyomo 6.x | Python 生态,学术友好,求解器无关 |
| 求解器 | HiGHS | 开源,性能优秀,MIT 许可,无需额外配置 |
| 网络模型 | DC-OPF + PTDF | 直流潮流,用功率转移分布因子替代相角变量,减少变量规模 |
| 数据处理 | pandas + numpy | 标准数值计算栈 |
| 可视化 | matplotlib | 8 种图表自动生成 |
| 配置管理 | Pydantic Settings | 统一参数管理,支持环境变量覆盖 |
当前版本在普通笔记本上,全流程求解耗时约 22 秒(SCUC 约 10 秒,SCED 约 12 秒)。对于一个 49 节点 x 96 时段的系统来说,这个速度完全够用。
与生产系统的差距
需要坦诚说明的是,这个模型和生产级出清系统之间有明显差距:
- 计算效率:生产系统需要在几分钟内求解数千节点的大规模问题,通常依赖高度优化的商业求解器和定制化的算法策略
- 数据精度:本模型使用的是聚合参数,不是逐台机组的真实数据
- 工程化程度:生产系统有完善的数据校验、异常处理、热备切换、审计追踪等工程能力
- 市场规则:实际的市场规则远比本模型复杂,包括各种辅助服务、容量补偿、偏差考核等
但基本原理是相通的。生产系统解决的核心数学问题 — 带安全约束的机组组合和经济调度 — 和这个模型是一样的。差别更多在工程层面,而非原理层面。
这也是这个模型的定位:不是一个生产工具,而是一个学习和研究工具。 用它来理解出清机制、验证市场规则、分析参数敏感性、测试新想法,是它最适合的场景。
这个系列会写什么
这个模型会作为一个系列专题持续更新,后续计划覆盖以下主题:
- 数据架构设计 — 输入数据的三层结构和 CSV 格式设计
- SCUC 数学建模 — 机组组合的决策变量、目标函数和约束条件详解
- SCED 与 LMP 定价 — 经济调度模型和节点边际电价的提取机制
- DC-OPF 网络模型 — 从 B-theta 到 PTDF 的演进
- Pyomo 代码架构 — 基类设计、配置管理和工程实践
- 仿真结果分析 — 从运行数据中提取洞察
- 场景实验 — 修改参数观察系统响应
- 求解器选型与调优 — 不同求解器的性能对比
- 扩展方向 — 辅助服务、多区域联合出清等
每一篇会聚焦一个具体主题,尽量做到独立可读。
写在最后
做这个模型的初衷很简单:作为一个电力市场从业者,想有一个自己能完全理解、自由修改的出清模型,用来把平时咨询中遇到的定性问题,转化成可以量化验证的命题。
它不完美,但够用。而且因为足够简化,每一行代码、每一个约束都能说清楚为什么这么写。这本身就是一种学习。
项目代码已开源,仓库地址见页面侧栏。
这是「电力市场出清仿真实战」系列的第一篇。