4. 收益模型V1.0:单日充放策略建模
好,咱们今天来点真家伙。
前面几章我们把储能系统的硬件、电价机制、政策背景都捋了一遍。说实话,那些都是铺垫。真正让储能系统产生价值的,就是今天要讲的——充放策略。
我个人习惯,做任何模型之前,先画一张图。把脑子里那团乱麻理清楚,再动手写代码。不然写着写着就迷路了。
核心逻辑一句话:在电价低的时候充电,电价高的时候放电,赚取差价。
听起来简单?嗯,但实际落地时坑不少。咱们一步步来。
4.1 单日充放策略的核心逻辑
先看一个典型的工业用户日负荷曲线。早上8点到12点、下午2点到6点,这两个时段电价最高。凌晨0点到8点,电价最低。
你想想看,如果我们在凌晨把电池充满,然后在上午高峰时段放掉,是不是就赚了一笔?下午再来一轮,一天就能做两次套利。
这就是所谓的“两充两放”策略。当然,具体能不能实现,还得看电池容量、功率限制、以及你的负荷曲线。
我给大家总结一下单日充放策略的四个关键步骤:
- 识别电价峰谷时段 — 找到一天中电价最高和最低的时间窗口
- 确定充放电功率 — 根据电池PCS(储能变流器)的额定功率来定
- 计算充放电量 — 考虑电池容量限制,不能过充过放
- 核算收益 — 放电收入减去充电成本,就是毛利润
避坑指南:我曾经在一个项目里,光看电价曲线就定了策略,结果忽略了变压器的容量限制。充放电功率太大,直接把变压器干跳闸了。嗯,从那以后我每次建模都会加上设备约束检查。
4.2 理想收益计算模型
什么叫“理想收益”?说白了,就是不考虑任何损耗的情况下的收益。
现实中,电池有充放电效率(一般在90%-95%之间),PCS有转换损耗,线缆有线路损耗。但咱们做V1.0版本,先把这些复杂因素放一边,只看最纯粹的价差收益。
理想收益的计算公式其实很简单:
单次充放收益 = 放电量 × 高峰电价 - 充电量 × 低谷电价
如果一天做两次充放,那就是:
日收益 = 上午放电收益 + 下午放电收益 - 两次充电成本
举个例子:
| 参数 | 数值 |
|---|---|
| 电池容量 | 1 MWh |
| 充放电功率 | 500 kW |
| 低谷电价(0:00-8:00) | 0.25 元/kWh |
| 高峰电价(10:00-12:00) | 1.05 元/kWh |
| 高峰电价(16:00-18:00) | 0.95 元/kWh |
计算一下:
- 凌晨充电:500 kW × 2小时 = 1000 kWh,成本 = 1000 × 0.25 = 250元
- 上午放电:500 kW × 2小时 = 1000 kWh,收入 = 1000 × 1.05 = 1050元
- 下午放电:500 kW × 2小时 = 1000 kWh,收入 = 1000 × 0.95 = 950元
- 日收益 = 1050 + 950 - 250 = 1750元
注意:这里假设电池在上午已经放空了,下午需要再充电。但下午的电价可能不是最低的,所以实际策略中需要权衡。这个我们后面会讲到。
4.3 代码实现
好了,理论讲完了,咱们上代码。
我习惯用Python来做这类建模,因为它的数据处理库太强了。pandas处理时间序列数据,matplotlib画图,简直绝配。
先看核心代码:
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 定义参数
battery_capacity = 1000 # kWh
charge_power = 500 # kW
discharge_power = 500 # kW
# 电价数据(元/kWh)
price_data = {
'00:00-08:00': 0.25, # 低谷
'08:00-10:00': 0.65, # 平段
'10:00-12:00': 1.05, # 高峰
'12:00-14:00': 0.65, # 平段
'14:00-16:00': 0.65, # 平段
'16:00-18:00': 0.95, # 高峰
'18:00-24:00': 0.65 # 平段
}
# 充放策略
strategy = {
'charge_1': {'start': '00:00', 'end': '02:00', 'energy': 1000},
'discharge_1': {'start': '10:00', 'end': '12:00', 'energy': 1000},
'discharge_2': {'start': '16:00', 'end': '18:00', 'energy': 1000}
}
# 计算收益
charge_cost = 1000 * 0.25 # 250元
discharge_revenue_1 = 1000 * 1.05 # 1050元
discharge_revenue_2 = 1000 * 0.95 # 950元
daily_profit = discharge_revenue_1 + discharge_revenue_2 - charge_cost
print(f"单日理想收益:{daily_profit:.2f} 元")
运行结果:
单日理想收益:1750.00 元
小技巧:实际项目中,我不会把电价写死在代码里。我会从电网API实时获取,或者读一个CSV文件。这样模型才能适应不同地区、不同季节的电价变化。
4.4 结果可视化
光看数字不够直观。咱们画个图,把一天的充放过程、电价变化、电池SOC(荷电状态)都展示出来。
# 创建时间轴(每15分钟一个点)
time_slots = pd.date_range('00:00', '23:45', freq='15min')
soc = np.zeros(len(time_slots))
price = np.zeros(len(time_slots))
# 模拟充放过程
for i, t in enumerate(time_slots):
hour = t.hour
minute = t.minute
# 电价赋值
if 0 <= hour < 8:
price[i] = 0.25
elif 8 <= hour < 10:
price[i] = 0.65
elif 10 <= hour < 12:
price[i] = 1.05
elif 12 <= hour < 16:
price[i] = 0.65
elif 16 <= hour < 18:
price[i] = 0.95
else:
price[i] = 0.65
# SOC模拟
if 0 <= hour < 2:
soc[i] = (hour * 60 + minute) / 120 * 100 # 充电到100%
elif 10 <= hour < 12:
soc[i] = 100 - ((hour - 10) * 60 + minute) / 120 * 100 # 放电到0%
elif 16 <= hour < 18:
soc[i] = 100 - ((hour - 16) * 60 + minute) / 120 * 100 # 放电到0%
else:
soc[i] = soc[i-1] if i > 0 else 0
# 绘制双轴图
fig, ax1 = plt.subplots(figsize=(12, 6))
ax1.plot(time_slots, price, 'b-', label='电价', linewidth=2)
ax1.set_xlabel('时间')
ax1.set_ylabel('电价 (元/kWh)', color='b')
ax1.tick_params(axis='y', labelcolor='b')
ax2 = ax1.twinx()
ax2.plot(time_slots, soc, 'r-', label='SOC', linewidth=2)
ax2.set_ylabel('SOC (%)', color='r')
ax2.tick_params(axis='y', labelcolor='r')
plt.title('单日充放策略:电价与SOC变化')
fig.tight_layout()
plt.show()
这张图能很清楚地看到:
- 凌晨电价最低时,SOC从0%升到100%
- 上午电价最高时,SOC从100%降到0%
- 下午电价次高时,SOC再次从100%降到0%
嗯,这就是典型的“两充两放”策略的可视化表现。
4.5 知识体系总览
最后,我用一张SVG图把本章的知识结构串起来。这样你复习的时候,一眼就能看到全貌。
重要提醒:这个V1.0版本是理想模型,实际项目中的收益会比这个低15%-25%。原因包括:电池充放电效率(约92%)、PCS损耗(约3%)、电池老化导致的容量衰减等。这些我们会在后面的章节中逐步加入。
但别小看这个理想模型。它是所有复杂模型的起点。没有这个基准,你后面加再多优化参数,都不知道自己优化了多少。
好了,今天的内容就到这。代码我已经上传到课程配套的GitHub仓库了,文件名是chapter4_ideal_profit_model.py。建议你下载下来,把电价数据换成你自己所在地区的,跑一遍看看收益是多少。
下一章,我们会在这个模型基础上,加入充放电效率、电池SOC约束等实际因素。到时候你会发现,理想很丰满,现实...嗯,也挺有意思的。
公众号:蓝海资料掘金营,微信deep3321