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 首年衰减大,后面逐年递减
我的经验:PR 别取太高。我在西北某项目上,业主非要按 0.85 算,结果实际跑下来只有 0.78。为什么?沙尘暴比预想的频繁,清洗又跟不上。保守一点,对大家都好。

更精确的做法,是用逐小时气象数据做仿真。我常用 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)
注意:低辐照度下的效率下降,很多人会忽略。我曾经有个项目,阴天多的月份,实际发电量比模型预测低了 12%。查了半天,发现是模型里没考虑低辐照度修正。

4.2 储能充放电策略模型

储能策略,说白了就是「什么时候充,什么时候放」。但这里面的门道,比你想象的多。

我把它分成三层:

  1. 时间层 — 峰谷时段怎么切
  2. 功率层 — 充放功率怎么分配
  3. 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
避坑指南:我曾经在一个项目里,把 SOC 下限设到了 10%。结果冬天连续阴天,光伏发不出电,电池又放空了,整个系统直接停机。后来我把 SOC 下限改成了 20%,并加了一个「保底电量」的逻辑——不管电价多高,SOC 低于 30% 就不再放电。

4.3 电价套利模型

电价套利,是储能最直接的收益来源。说白了就是「低买高卖」。

但这里有个关键问题:你怎么知道明天的电价曲线?

国内大部分地区是分时电价,时段是固定的。但有些省份已经开始试点「现货市场」,电价每 15 分钟变一次。这时候就需要预测模型了。

我常用的套利模型分三步:

  1. 识别套利窗口 — 找到价差最大的时段对
  2. 计算最优充放电量 — 考虑电池容量和效率约束
  3. 评估套利收益 — 扣除充放电损耗后的净收益

看一个简化版的套利计算:

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
    }
关键点:别只看价差,还要看「可套利深度」。有些时段价差很大,但持续时间短,电池根本来不及充满。我一般要求价差至少持续 2 小时以上,才值得做一次完整充放。

另外,别忘了考虑充放电损耗。锂电池的 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
我的经验:需量管理最怕「误触发」。有一次,系统把一台电机的启动电流误判为需量高峰,结果电池频繁放电,一天循环了十几次。后来我加了一个「持续 15 分钟以上」的判定条件,才解决这个问题。

算一下需量管理的收益:

# 假设:
# 原需量: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 四个模型的协同

单独看每个模型都不难,难的是让它们协同工作。

我画了一张图,展示这四个模型之间的关系:

收益模型协同框架 光伏发电量模型 辐照度 · 温度 · PR 储能充放电策略 SOC · 功率 · 效率 电价套利模型 价差 · 时段 · 损耗 需量管理模型 功率限制 · 削峰 发电量输入 电价信号 充放电指令 功率约束 综合收益最大化

这张图想表达的核心思想是:光伏发电量决定了「有多少电可以玩」,电价套利决定了「什么时候玩最赚钱」,需量管理决定了「不能玩过头」,而储能策略就是那个「怎么玩」的执行者。

四个模型不是孤立的。光伏发得多,储能就可以多充一些;电价高的时候,储能就少充多放;需量要超了,储能优先保需量,套利先放一放。

最终目标:在满足负载需求和需量约束的前提下,最大化电价套利收益,同时考虑电池寿命成本。这是一个多目标优化问题,我一般用「分层优化 + 滚动时域」的方法来解决。

好了,模型讲完了。记住一句话:模型是工具,不是真理。再好的模型,也要用实际数据去验证和修正。我每个项目都会留 3 个月的「模型校准期」,跑完数据再调参数,这样出来的收益预测才靠谱。


公众号:蓝海资料掘金营,微信deep3321