4. 收益模型构建:光伏发电量计算模型、储能充放电策略模型、电价套利模型、需量管理模型
做光伏储能系统,说到底就一件事:算清楚钱从哪来。
我见过太多项目,设备装得漂亮,但收益算得稀里糊涂。最后发现,不是设备不行,是模型没搭对。今天咱们就把这四个核心模型掰开揉碎了讲。
4.1 光伏发电量计算模型
发电量是收益的源头。源头算不准,后面全是白搭。
我个人习惯用这个公式打底:
E = A × r × H × PR
其中:
- E — 年发电量(kWh)
- A — 组件总面积(m²)
- r — 组件转换效率(%)
- H — 年峰值日照小时数(h)
- PR — 系统综合效率系数
PR 这个系数,很多人直接取 0.8。但我建议你拆开算:
| 损耗项 | 典型值 | 说明 |
|---|---|---|
| 逆变器效率 | 0.97 ~ 0.98 | 现在好的逆变器能到 98.5% |
| 线损 | 0.97 ~ 0.99 | 直流侧线损往往被低估 |
| 温度损耗 | 0.92 ~ 0.96 | 夏天组件温度高,功率会掉 |
| 灰尘遮挡 | 0.93 ~ 0.97 | 看当地空气质量,我见过最差的只有 0.85 |
| 组件衰减 | 0.98 ~ 0.99 | 首年衰减大,后面逐年递减 |
更精确的做法,是用逐小时气象数据做仿真。我常用 PVsyst 或 SAM,但自己写个简化版也不难:
# 简化版逐时发电量计算
def calc_hourly_power(ghi, temp, wind_speed, panel_spec):
"""
ghi: 水平面总辐照度 (W/m²)
temp: 环境温度 (°C)
"""
# 1. 计算组件温度
NOCT = panel_spec['NOCT'] # 标称工作温度
T_cell = temp + (NOCT - 20) * ghi / 800
# 2. 温度修正
gamma = panel_spec['temp_coeff'] # 温度系数,通常 -0.0035 ~ -0.0045
temp_factor = 1 + gamma * (T_cell - 25)
# 3. 辐照度修正
irrad_factor = ghi / 1000 # 低辐照度下效率会下降
# 4. 输出功率
P_dc = panel_spec['P_max'] * irrad_factor * temp_factor
return max(P_dc, 0)
4.2 储能充放电策略模型
储能策略,说白了就是「什么时候充,什么时候放」。但这里面的门道,比你想象的多。
我把它分成三层:
- 时间层 — 峰谷时段怎么切
- 功率层 — 充放功率怎么分配
- SOC 层 — 电池电量怎么管理
先看一个最简单的两段式策略:
def two_period_strategy(soc, price, pv_power, load, battery_cap):
"""
谷时充电,峰时放电
"""
if price == 'valley':
# 谷时:能充就充
charge_power = min(battery_cap * 0.2, # 0.2C 充电
(1 - soc) * battery_cap)
return -charge_power # 负值表示充电
elif price == 'peak':
# 峰时:能放就放
discharge_power = min(battery_cap * 0.2, # 0.2C 放电
soc * battery_cap,
load - pv_power) # 不超过负载需求
return discharge_power
else:
return 0 # 平时不动作
但实际项目中,我很少用这么简单的策略。为什么?因为光伏出力是波动的,负载也是波动的。你想想看,如果下午突然来一片云,光伏出力骤降,这时候电池还在傻乎乎地充电,那负载怎么办?
我分享一个我在项目中用过的策略框架:
class BatteryStrategy:
def __init__(self, forecast, realtime):
self.forecast = forecast # 日前预测
self.realtime = realtime # 实时数据
def decide(self, t, soc, pv_now, load_now):
# 1. 根据预测确定基准策略
base_action = self.forecast.get_plan(t)
# 2. 根据实时数据做修正
delta_pv = pv_now - self.forecast.pv[t]
delta_load = load_now - self.forecast.load[t]
# 3. 如果光伏超发,优先充电
if delta_pv > 0.2 * self.forecast.pv[t]:
return min(base_action + delta_pv,
self.realtime.max_charge(soc))
# 4. 如果负载超预期,优先放电
if delta_load > 0.2 * self.forecast.load[t]:
return max(base_action - delta_load,
-self.realtime.max_discharge(soc))
return base_action
4.3 电价套利模型
电价套利,是储能最直接的收益来源。说白了就是「低买高卖」。
但这里有个关键问题:你怎么知道明天的电价曲线?
国内大部分地区是分时电价,时段是固定的。但有些省份已经开始试点「现货市场」,电价每 15 分钟变一次。这时候就需要预测模型了。
我常用的套利模型分三步:
- 识别套利窗口 — 找到价差最大的时段对
- 计算最优充放电量 — 考虑电池容量和效率约束
- 评估套利收益 — 扣除充放电损耗后的净收益
看一个简化版的套利计算:
def arbitrage_profit(price_series, battery, cycles=1):
"""
price_series: 24小时电价序列
battery: 电池参数(容量、效率、寿命)
"""
# 1. 找到最低价和最高价时段
buy_idx = np.argmin(price_series[:12]) # 假设白天充
sell_idx = np.argmax(price_series[12:]) + 12
buy_price = price_series[buy_idx]
sell_price = price_series[sell_idx]
# 2. 计算可套利电量
charge_energy = battery.capacity * 0.9 # 90% DOD
discharge_energy = charge_energy * battery.round_trip_efficiency
# 3. 计算单次套利收益
revenue = discharge_energy * sell_price
cost = charge_energy * buy_price
profit = revenue - cost
# 4. 考虑电池寿命损耗
cycle_cost = battery.replacement_cost / battery.cycle_life
net_profit = profit - cycle_cost * charge_energy
return {
'gross_profit': profit,
'net_profit': net_profit,
'spread': sell_price - buy_price,
'roi': net_profit / cost * 100
}
另外,别忘了考虑充放电损耗。锂电池的 round-trip 效率一般在 85%~92% 之间。也就是说,你充 100 度电,放出来只有 85~92 度。这 8~15 度的损耗,就是你的隐形成本。
| 电池类型 | 充放电效率 | 循环寿命 | 建议 DOD |
|---|---|---|---|
| 磷酸铁锂 | 90%~92% | 4000~6000 次 | 80%~90% |
| 三元锂 | 88%~90% | 2000~4000 次 | 70%~80% |
| 铅炭 | 80%~85% | 1000~2000 次 | 50%~60% |
4.4 需量管理模型
需量管理,是很多工商业项目的「隐藏金矿」。
什么是需量?简单说,就是你一个月内,用电功率的最高点。电网公司按这个最高点收「容量费」。比如你工厂某天下午开了台大机器,功率飙到 1000kW,那这个月就得按 1000kW 交钱,哪怕其他时间只有 500kW。
储能的逻辑就是:在功率要冲高的时候,电池放电把它压下来。
我常用的需量管理算法:
def demand_management(load_15min, battery, demand_limit):
"""
load_15min: 15分钟间隔的负载数据
demand_limit: 需量目标值 (kW)
"""
actions = []
current_demand = 0
for t, load in enumerate(load_15min):
# 1. 预测未来15分钟的负载
load_forecast = predict_next_15min(load)
# 2. 如果负载超过需量限制
if load_forecast > demand_limit:
# 计算需要放电的功率
discharge_needed = load_forecast - demand_limit
# 检查电池能否提供
if battery.soc > 0.2: # 保留20% SOC
discharge_power = min(discharge_needed,
battery.max_discharge)
actions.append(-discharge_power) # 放电
battery.soc -= discharge_power * 0.25 / battery.capacity
else:
actions.append(0) # 电池没电,没办法
else:
# 3. 如果负载低于限制,可以考虑充电
if battery.soc < 0.9 and load_forecast < demand_limit * 0.7:
charge_power = min(demand_limit * 0.3,
battery.max_charge)
actions.append(charge_power)
else:
actions.append(0)
return actions
算一下需量管理的收益:
# 假设:
# 原需量:800 kW
# 目标需量:600 kW
# 容量电价:40 元/kW·月
original_demand = 800 # kW
target_demand = 600 # kW
capacity_price = 40 # 元/kW·月
monthly_saving = (original_demand - target_demand) * capacity_price
annual_saving = monthly_saving * 12
print(f"每月节省:{monthly_saving} 元")
print(f"每年节省:{annual_saving} 元")
# 输出:每月节省:8000 元
# 输出:每年节省:96000 元
你看,光需量管理这一项,一年就能省近 10 万。这还没算电价套利的收益。
4.5 四个模型的协同
单独看每个模型都不难,难的是让它们协同工作。
我画了一张图,展示这四个模型之间的关系:
这张图想表达的核心思想是:光伏发电量决定了「有多少电可以玩」,电价套利决定了「什么时候玩最赚钱」,需量管理决定了「不能玩过头」,而储能策略就是那个「怎么玩」的执行者。
四个模型不是孤立的。光伏发得多,储能就可以多充一些;电价高的时候,储能就少充多放;需量要超了,储能优先保需量,套利先放一放。
好了,模型讲完了。记住一句话:模型是工具,不是真理。再好的模型,也要用实际数据去验证和修正。我每个项目都会留 3 个月的「模型校准期」,跑完数据再调参数,这样出来的收益预测才靠谱。
公众号:蓝海资料掘金营,微信deep3321