☰
新能源与储能的电力市场交易:规则决定收益上限
2026/10/13 11:33:56 网站建设 项目流程

简介:白皮书系统梳理新能源与储能参与电力市场交易的核心概念、市场角色、交易现状与政策展望,适合能源行业研究者、电力市场从业者及高校相关专业学生阅读。文档以PDF形式收录,共1个文件,压缩包大小2.09MB,内容结构清晰,涵盖新能源出力特性、储能调峰调频价值、现货与辅助服务市场机制、投资回报与政策支持等关键模块,帮助读者快速建立电力市场与新能源融合的知识框架。已有97人学习下载,可作为行业入门、课题研究与政策分析的实用参考资料。

1. 新能源及储能参与电力市场交易:规则才是收益的天花板

新能源场站和独立储能真正走出「靠补贴算账」的阶段,是从进入电力市场交易开始的。很多从业者接手交易申报时都有个错觉:发电量高、充放电勤快就能多赚。实际跑完一轮中长期加现货的完整结算之后才发现,收益上限根本不是发电能力,而是市场规则、预测精度和申报边界共同决定的。这份白皮书把新能源出力特性、储能调节能力与交易品种之间的对应关系梳理成了一套可复用的分析框架,从市场架构、申报流程到结算口径都有完整交代。适合正在做新能源项目收益测算的投资分析人员、储能电站的运行负责人,以及刚接手电力交易申报、对偏差考核心里还没底的新手交易员。

2. 市场三层架构:中长期、现货与辅助服务怎么分工

2.1 中长期交易:基础收益的锚,但别把它当保险柜

中长期交易是新能源参与市场的第一道门槛,通常以年、月、周为周期,通过双边协商或集中竞价锁定未来一段时间的电量与价格。它的价值是确定性:签约那一刻,未来收益的底线就锁定了。对新能源项目来说,这部分相当于还贷现金流的安全垫,银行做项目融资时也主要看中长期合约的覆盖比例。

但把中长期合约当成保险柜会出问题。新能源出力本身波动,如果合约电量签得过高,实际发电不足时要去现货市场高价买电来补足合约,这就是「买入平仓」,亏损可能比少卖电还大。反过来签低了,现货价格走高时又只能看着别人吃肉。

我一般建议按保守发电能力签中长期,比例压在年发电量的七成以内,剩下的敞口留给现货。白皮书里对中长期合约的签约窗口、曲线分解方式都有说明,实操中最关键的是曲线分解——把年度合约拆到每个小时的曲线形状要跟预测出力形状尽量贴合,否则同样合约电量,分解不合理会导致日内出现大量正负偏差对冲。

2.2 现货市场:偏差电量才是真正的利润调节阀

现货市场是日前和实时两套价格体系。新能源场站在日前申报预测出力曲线,实际运行偏差进了实时市场。很多刚入场的人只盯着日前价格高低,忽略了日前和实时的价差方向才是利润来源的关键。

一个常见策略逻辑是这样:日前价格高、实时预期走低时,可以在日前多申报一些,实际少发,相当于在高价时段做了「虚拟售电」;反过来日前价格低、实时预期走高,日前少申报,实际多发,等于把电量挪到实时高价时段。这个操作的前提是预测准、并且对实时价格方向有判断,否则就是两头挨打。

储能在这个环节的优势是可以主动制造「可控偏差」。充电时段在日前申报用电,放电时段申报发电,本质上是用申报曲线向系统声明自己的充放电计划。现货市场对储能申报的灵活性,通常比对新能源机组的约束更宽,这也是为什么独立储能参与现货的收益弹性远大于单纯做峰谷套利。

2.3 辅助服务:储能不该只盯峰谷价差

辅助服务市场包括调频、备用、转动惯量等品种。储能参与调频的收益逻辑和现货套利完全不同:调频按调节里程和调节性能付费,不看你发了多少电,而是看你响应速度快不快、调节精度高不高。磷酸铁锂电池的响应时间通常在百毫秒级,天然适合高频次小幅度调节。

但调频收益有天花板。储能容量固定,频繁充放会快速消耗循环寿命,调频里程上去了,电池衰减也上去了,这是很多电站运营方没算进去的隐性成本。我见过的做法是把储能容量做功能分区:一部分用于调频,一部分用于现货套利,比例根据市场品种收益和电池寿命折损动态调整。白皮书里对不同品种的收益特征做了对比分析,实操中建议先把本省辅助服务市场的补偿规则拿到手,算清楚每次调节里程对应的电池损耗成本,再决定要不要把容量切给调频。

下表是三类交易品种的特征对比,适合做收益优先级判断:

交易品种收益确定性对预测精度要求对储能寿命损耗适合的角色
中长期合约高低无收益底线
现货日前/实时中高中利润调节
辅助服务调频中高低高增量收益

2.4 三层之间的衔接:申报流程先算清楚再动手

三层市场不是孤立申报,而是共用一套机组运行边界。典型流程分四步:第一步,根据短期预测出力确定中长期合约需要买入或卖出的电量;第二步,在日前市场申报发电曲线或充放电曲线;第三步,实时运行中跟踪偏差;第四步,月度结算时核对三块费用——中长期合约结算、现货偏差结算、辅助服务考核费用。

常见做法是用一张 Excel 或者一个小脚本把这四步串起来,输入预测出力、合约分解曲线、日前价格、实时价格四个数据集,输出当月预计收益。很多团队把精力全放在报价策略上,反而忽略了流程里的数据口径对齐,后面第 5 章会专门展开讲。

3. 出力预测与申报策略:从气象数据到报价曲线的完整链路

3.1 短期功率预测:数值天气预报加统计修正的常见组合

新能源出力预测是整个交易策略的地基。目前主流做法是数值天气预报(NWP)驱动功率预测模型,再用场站历史实际出力做统计修正。NWP 提供风速、辐照度、温度等气象要素,功率预测模型把它们映射成出力,这一步的误差来源很多:NWP 本身的空间分辨率不够、场站局部 microclimate 影响、风机或光伏组件的实际运行状态和老化程度。

我常用的修正方法是滚动误差反馈:把过去 30 天同一预报时效的预测值与实际值做对比,算出平均偏差和标准差,然后对新的预测结果做线性修正。这一步看似简单,但很多新手直接跳过,导致申报曲线系统性偏高或偏低。

# 滚动偏差修正:对功率预测结果做系统性校正 import pandas as pd import numpy as np # df 包含三列:forecast(模型原始预测)、actual(实际出力)、hour(预测时刻) # 窗口取过去 30 天同一小时的数据 df = pd.read_csv('wind_farm_power.csv', parse_dates=['time']) df['hour'] = df['time'].dt.hour # 计算每个小时的历史平均偏差 correction = {} for h in range(24): hist = df[(df['hour'] == h) & df['actual'].notna()].tail(30 * 24) if len(hist) > 0: bias = (hist['actual'] - hist['forecast']).mean() correction[h] = bias else: correction[h] = 0.0 # 应用修正 df['forecast_corrected'] = df.apply( lambda row: row['forecast'] + correction.get(row['hour'], 0.0), axis=1) print(df[['forecast', 'forecast_corrected']].describe())

这段代码的核心是分小时统计系统性偏差。风电和光伏的偏差特征差异很大,光伏在中午辐照度稳定时段偏差小,日出和日落时段偏差大,风电则随天气过程变化,分小时建模比不分时段直接校正更合理。

参数说明:tail(30 * 24)取的是过去 30 天的逐小时样本,如果你的场站刚并网、运行数据不足 30 天,可以把窗口缩到 15 天,但对应偏差修正的稳定性也会下降。bias是平均偏差,正值说明模型系统性低估,负值说明高估。

3.2 从预测曲线到申报曲线:要过三道手

预测曲线不能直接拿去申报,至少还要过三道处理。第一道是限电约束检查,新能源场站的送出通道可能存在断面约束,预测出力超出通道上限的部分必须剔除,否则申报电量无法被市场接受。第二道是爬坡约束检查,部分省份对场站申报曲线的爬坡率有限制,尤其是光伏在早晨和傍晚的剧烈波动,需要在申报前做平滑处理。第三道是风险偏好调整,预测曲线本身是一个期望值,你可以选择按期望值申报,也可以按 P90 或 P10 的分位数申报,取决于你对考核风险的承受能力。

# 申报曲线生成:预测值 + 风险系数 + 爬坡平滑 def build_bid_curve(forecast, risk_factor=1.0, max_ramp=0.1): """ forecast: 修正后的预测出力数组,单位 MW risk_factor: 风险系数,<1.0 保守,>1.0 激进 max_ramp: 最大爬坡率 MW/min """ bid = np.array(forecast) * risk_factor # 爬坡平滑:确保相邻时段出力变化不超过限值 # 假设时间间隔为 15 分钟,则爬坡限制为 max_ramp * 15 ramp_limit = max_ramp * 15 for i in range(1, len(bid)): diff = bid[i] - bid[i-1] if diff > ramp_limit: bid[i] = bid[i-1] + ramp_limit elif diff < -ramp_limit: bid[i] = bid[i-1] - ramp_limit return bid

逻辑说明:risk_factor是最直接的风险调节旋钮。如果这个月已经产生了较大偏差考核费用,下一轮申报适当降低系数,牺牲一些收益弹性换考核安全。爬坡平滑的循环判断保证了申报曲线在实际运行中「可执行」,申报做得到但设备跑不到,是交易部门和生产部门最常吵架的地方。

参数说明:max_ramp=0.1表示每分钟最多 0.1MW 的变化率,具体要根据风机或光伏电站的实际调节能力来定,一般风电场的小时级爬坡能力在装机容量的 5%-10% 之间,光伏在云层快速移动时会更大。

3.3 储能现货申报的时段拆解:充电、放电、备用三个身份分开算

独立储能在现货市场的申报和新能源场站不同,它可以在同一个运行日里既申报充电用电、又申报放电发电,还能部分容量参与备用。很多交易员把储能当成一个大号的「可调度负荷」,申报时只报一条充放电曲线,其实应该拆成三个身份分别计算。

充电时段的选择逻辑很简单:在日前预测价格低的时段申报充电,放电时段则选价格高的时段,两者之间的价差就是毛收益。真正需要精细计算的是充放电切换的边界条件——储能不能在同一时刻既充电又放电,而且从充电到放电的转换需要考虑 PCS 的响应时间。

# 储能日前充放电申报:基于日前预测价格的时段优化 prices = [0.35, 0.28, 0.22, 0.19, 0.20, 0.24, 0.58, 0.72, 0.65, 0.55, 0.42, 0.38, 0.41, 0.62, 0.88, 0.91, 0.74, 0.52, 0.45, 0.49, 0.53, 0.47, 0.39, 0.33] # 假设储能参数:容量 100MWh,功率 50MW # 充电效率 0.92,放电效率 0.92,则综合效率约 0.85 # 约束:夜间低价的连续 6 小时充电,午后高价的连续 3 小时放电 charge_hours = [2, 3, 4, 5, 6, 7] # 凌晨低价时段 discharge_hours = [13, 14, 15] # 午后高峰时段 charge_energy = 50 * len(charge_hours) * 0.92 # 充电侧计入效率 discharge_energy = 50 * len(discharge_hours) # 实际充入电量要除以充电效率,放出电量要乘以放电效率 net_energy = discharge_energy * 0.92 - charge_energy / 0.92 revenue_charge = sum(prices[h] for h in charge_hours) * 50 revenue_discharge = sum(prices[h] for h in discharge_hours) * 50 * 0.92 profit = revenue_discharge - revenue_charge print(f"充电成本: {revenue_charge:.2f} 元") print(f"放电收入: {revenue_discharge:.2f} 元") print(f"日内套利利润: {profit:.2f} 元")

逻辑说明:充电和放电不能机械地只看价差。充电侧电流经过变压器和 PCS 有损耗,实际从电网吸收的电量大于充入电池的电量,所以充电成本要除以充电效率;放电侧同样要乘以放电效率。这套脚本里net_energy变量算的是电池侧实际的能量变化。

参数说明:效率值 0.92 是磷酸铁锂储能电站的典型端到端效率,实际项目要参照 PCS 说明书和并网测试报告。建议留一个效率参数的变量位,因为低温环境下电池效率会下降,冬夏两季要分别取值。

4. 储能收益测算模型:容量租赁、峰谷套利与调频的优先级排序

4.1 收入结构先拆开:哪些是确定项,哪些是概率项

储能电站的收益来源往往被宣传材料写成四项:容量租赁、峰谷套利、调频辅助服务、容量补偿。但做投资测算是另一个视角,要看每一项的确定性。

容量租赁是最确定的收入,合同签了、容量占用了,每月租金固定到账。缺点在于租赁价格高度依赖当地新能源配储政策,有些市场供大于求,租金被压得很低。峰谷套利是概率项,依赖现货价格日内波动,每个月行情不同。调频收益最不稳定,跟系统调频需求紧密相关,冬天和夏天负荷高峰时段调频需求大,春秋季可能整月都没多少调用。容量补偿要看当地有没有建立容量机制,目前多数市场还在探索期。

我给客户做测算时习惯把四项收入拆成两层:确定项做估值底线,概率项做弹性空间。容量租赁覆盖运营成本,峰谷套利和调频决定项目 IRR 能不能达标。如果一个项目算下来全靠套利撑收益,那打包方案时一定要做压力测试。

4.2 用 Python 搭一个可复现的收益测算脚本

收益测算模型的第一版不用做复杂,核心是让参数可调、逻辑透明。我通常先搭月度收益框架,再扩展成 10 年生命周期模型。

# 独立储能电站月度收益测算(简化版) # 适用场景:50MW/100MWh 磷酸铁锂独立储能电站 class StorageRevenueModel: def __init__(self, capacity_mwh=100, power_mw=50, efficiency=0.85): self.capacity = capacity_mwh # 额定容量 MWh self.power = power_mw # 额定功率 MW self.efficiency = efficiency # 综合充放电效率(含损耗) def calc_monthly_revenue(self, lease_price, peak_valley_spread, freq_revenue, capacity_compensation): # 1. 容量租赁收入:按 MW 月租金计算 lease = self.power * lease_price # 2. 峰谷套利:假设每天 1 个完整循环,可放电容量按 90% DOD 计 daily_discharge = self.capacity * 0.9 # 放电量为充入电量乘效率,实际充电成本要折算 daily_profit = daily_discharge * (peak_valley_spread * self.efficiency - peak_valley_spread * (1 - self.efficiency)) monthly_arbitrage = daily_profit * 30 # 3. 调频里程收入:按日结算 monthly_freq = freq_revenue * 30 # 4. 容量补偿:按月和 MW 结算 monthly_capacity = self.power * capacity_compensation total = lease + monthly_arbitrage + monthly_freq + monthly_capacity return { 'rental': lease, 'arbitrage': monthly_arbitrage, 'frequency': monthly_freq, 'capacity': monthly_capacity, 'total': total } # 参数输入 model = StorageRevenueModel() result = model.calc_monthly_revenue( lease_price=30000, # 元/MW/月 peak_valley_spread=0.5, # 元/kWh,高峰放电和低谷充电的价差 freq_revenue=8000, # 元/日,调频里程折算日均收入 capacity_compensation=0 # 容量补偿,元/MW/月,暂按 0 ) print(result)

逻辑说明:这个脚本把四类收入分拆,方便你逐项填真实数据。lease_price单位是元/月/MW,50MW 电站每月租赁收入就是50 * lease_price。peak_valley_spread是现货市场高峰放电时段与低谷充电时段的价差,注意套利利润是用放电量乘以价差再乘效率折算,这里的效率处理做了简化,精细模型应该把充电损耗和放电损耗分开。

参数说明:capacity * 0.9代表按 90% 放电深度(DOD)运行。磷酸铁锂电池推荐 DOD 在 90%-95% 之间,但实际运行为了延长寿命,很多电站控制在 85%-90%。freq_revenue是日均调频收益的折算值,实际应按里程单价乘日均可调用里程计算,这里为了方便观察启动了简化入口。

4.3 敏感性参数:循环寿命、衰减率和放电深度是三个黑匣子

收益测算里最容易翻车的是电池衰减参数。很多测算模型假设电池 10 年 6000 次循环容量保持 80%,实际运行中温度控制、充放电倍率、DOD 设置都会显著影响衰减速度。放电深度越高,单次循环的容量衰减越大,这是电池电化学特性决定的,但收益模型里经常被忽略。

我一般做三档敏感性分析:乐观档按 DOD 90%、每年衰减 2%;基准档按 DOD 85%、每年衰减 3%;悲观档按 DOD 80%、每年衰减 4%。每档对应一个 IRR,向决策层汇报时三档全展示,而不是只报基准档。

另一个黑匣子是现货价格的长期走势。做 10 年测算时,很多人直接把当前峰谷价差线性外推,这在电力现货市场建设初期特别危险。随着新能源渗透率提升,午间光伏大发时段价格可能趋近于零甚至负值,但晚间高价时段价格也可能因为系统净负荷曲线变陡而抬升,峰谷价差短期看扩大、长期看受储能竞争影响可能收窄。白皮书里对市场演进方向的判断值得仔细读,测算模型中至少要做「价差持稳」和「价差缩减 20%」两组场景。

5. 避坑与常见问题:申报偏差、结算口径与数据不一致

5.1 预测偏差考核费:最隐蔽的一笔隐性成本

现象:月度结算单出来,预测偏差考核费占到了总收益的 8% 到 15%,很多刚入场的团队完全没想到会有这笔费用。

原因:省间现货和省内现货普遍对新能源申报出力和实际出力的偏差设置考核机制。预测偏差超过一定阈值后,超出部分按实时市场价格的一定比例扣罚。很多电站只知道要申报,没人研究考核细则的阈值和计算方式。

解决:第一步,从交易中心拿到偏差考核的完整计算公式,把阈值、考核系数、豁免条款逐项看明白。第二步,申报策略上留安全边际——预测曲线按 P90 区间申报,而不是按期望值申报。第三步,建立逐日偏差台账,每周复盘偏差率和考核费用趋势,出现连续超标马上调整风险系数。

注意:部分省份对极端天气(台风、寒潮)期间的预测偏差有豁免机制,但需要提前向调度报备,错过报备窗口就只能硬扛考核。

5.2 储能 SOC 申报与实际运行状态不一致

现象:储能电站申报了 50MW 调频容量,实际调用时只能出 30MW,导致调频里程收入被考核扣减。

原因:申报时按 SOC 90% 乐观估计可调功率,实际运行中电池温度偏高、BMS 限功率保护触发,可调功率打了折扣。SOC 和可调功率不是线性关系,尤其在 SOC 低于 30% 或高于 90% 时,内阻增大、限功率明显。

解决:申报前用实测数据建立「SOC-可调功率」对照表,每 10% SOC 间隔标定一次实际可出力的功率值。申报容量按对照表保守取值,宁可在申报时少报,不在调用时少出。另外在交易系统中申报储能运行参数时,把最大充放电倍率按厂家推荐值再乘一个 0.95 的安全系数。

5.3 节点电价与系统边际电价:结算口径没对齐

现象:内部测算按系统边际电价算的收益是正数,实际结算却亏了,差在小数点后两位的结算电价上。

原因:电力现货市场普遍采用节点电价机制,新能源场站和储能电站所在节点的电价可能和系统边际电价有较大偏差,尤其在送出断面受限时,节点电价可能被压低甚至变为负值。交易员如果拿错价格口径,所有测算全部失真。

解决:结算分析一律以交易中心发布的节点电价结算单为准。做日内策略时,如果市场发布的是系统边际电价,要额外关注本节点与系统边际价格的差价历史规律,建一个「节点价格差」的时间序列,申报前先判断今天的价差方向。

5.4 中长期持仓比例过高:现货优化空间被自己锁死

现象:某月现货价格持续走高,但电站收益率反而低于上月,因为中长期合约锁定的售电价格远低于现货价格,少赚了。

原因:签约时为了保障收益确定性,把中长期合约比例提到了九成以上。现货市场一旦出现高价时段,可用敞口太小,现货利润无法弥补中长期的低价损失。

解决:中长期持仓比例按季节动态调整。来水丰、风光大发、现货价格大概率走低的季节,提高中长期比例;极端天气频发、现货价格大概率波动的季节,降低到五成左右。每月做一次持仓复盘,对比中长期合约均价和现货价格走势,超过两个月的趋势背离就要调整下月签约策略。

5.5 关口计量与并网点口径不一致

现象:内部统计的发电量、充放电量和交易中心的结算电量对不上,差距在 1% 到 2%。

原因:交易结算以并网点关口表为准,而场站内部统计很多用的是升压变高压侧或低压侧的表计数据。线损、厂用电、变压器损耗导致两侧电量不一致。

解决:在收益台账中单独建立「关口电量」和「关口内电量」两个字段,所有交易相关的计算一律用关口电量口径。每个月结算单出来后,主动跟交易中心核对关口表读数,偏差超过 0.5% 就申请重新核验表计。这个过程很琐碎,但结算底数错了后面所有分析都白做。

6. 用历史数据回测申报策略:一套六个步骤的验证流程

策略好不好,不能靠感觉,要靠历史数据回测。我给自己定了一套固定流程,每次调整申报策略都强制走一遍,包括六个步骤。

第一步,准备数据。至少取三个月的日前价格、实时价格、新能源预测出力和实际出力,数据颗粒度要跟市场申报周期一致,15 分钟或 1 小时。数据质量是第一位的,缺失率超过 5% 的数据段直接剔除,不要用插值硬补。第二步,定义策略。把策略写成可量化的规则,比如「预测出力乘 0.95 申报,实时价格高于日前价格 20% 时主动增发」。第三步,搭建回测框架。每一小时根据当时可得的预测数据和价格数据生成申报值,再拿实际出力和实时价格计算结算结果。

# 回测框架核心:逐小时模拟申报与结算 def backtest_strategy(forecast, actual, day_ahead_price, realtime_price, risk_factor=0.95): """ forecast: 预测出力数组 (MW) actual: 实际出力数组 (MW) day_ahead_price: 日前节点电价 (元/MWh) realtime_price: 实时节点电价 (元/MWh) """ # 申报量 = 预测值 * 风险系数 bid = forecast * risk_factor # 偏差 = 实际出力 - 申报量 deviation = actual - bid # 收入 = 申报量按日前价结算 + 偏差量按实时价结算 revenue = bid * day_ahead_price + deviation * realtime_price # 偏差考核:按当地规则简化处理,超过阈值部分扣罚 penalty_rate = 0.2 # 考核系数 threshold = 0.08 # 偏差阈值 ±8% penalty = 0.0 for i in range(len(deviation)): dev_ratio = abs(deviation[i]) / max(actual[i], 1) if dev_ratio > threshold: over = dev_ratio - threshold penalty += over * bid[i] * day_ahead_price[i] * penalty_rate return revenue.sum() - penalty

逻辑说明:这套回测把结算过程简化成了两个价格口径,申报量按日前价结算,偏差量按实时价结算,这是国内现货市场通行的双结算模式。penalty部分做了简化,实际市场规则更复杂,通常对正偏差和负偏差适用不同考核公式,建议结合当地规则把罚函数替换成真实公式。

参数说明:risk_factor=0.95是策略参数,回测时应该循环遍历一组值(比如 0.85 到 1.10),画出收益和考核费用的曲线,找到最优平衡点。第四步,设置对比基准。没有基准的回测没有意义,基准建议用「全额按预测申报」的零策略,也就是风险系数等于 1.0 的原始方案。第五步,分批回测。三个月数据分成前两个月训练、后一个月验证,不要在全部数据上反复调参。

第六步最关键:看结果不能只看总收益,要看逐日收益分布。一个策略总收益高但某几天巨亏,实际运行中心理压力和执行连贯性都会出问题。我会额外统计三个指标:日均收益、最大单日亏损、收益为正的天数占比。三个指标组合起来,才是一套策略能否落地的依据。

另外建议做一次「相似日复盘」。回测期结束后,找出回测期内价格形态和最近一周最相似的几日样本,用那几天的策略表现来推断最近一周的适用性。这个习惯帮我避免过拟合,也比全样本收益更有参考价值。

这些方法都不是什么先进算法,就是一线做下来最扎实的路子。从那以后我每次做策略调整都强制走一遍这六步,哪怕市场规则没大变也不跳过,因为吃过太多「感觉差不多」的亏。交易这行,玄学只存在结算之前,结算之后全是数字。希望帮到你。

本文还有配套的精品资源,点击获取

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询