4. 套利模型数学框架:目标函数构建、约束条件设定、线性规划基础

各位同学,欢迎来到套利模型的核心环节。

前面我们聊了电价预测,那是我们的“眼睛”。现在要讲的,是套利模型的“大脑”——数学框架。说白了,就是怎么把“低买高卖”这个朴素想法,翻译成计算机能听懂的语言。

我个人习惯,在动手写代码之前,一定先把数学逻辑理清楚。否则代码越写越乱,最后自己都看不懂。今天我们就来拆解这个框架。

4.1 目标函数:我们到底要最大化什么?

套利的本质,就是赚取价差。所以目标函数很直接:最大化总收益

但这里有个坑。你想想看,收益 = 收入 - 成本。收入是卖电的钱,成本是买电的钱。但储能系统还有充放电损耗,这部分也要算进去。

标准目标函数(单时段简化版):

Maximize: Σ (P_sell,t × Q_sell,t - P_buy,t × Q_buy,t)

其中:

  • P_sell,t:t时段卖电价格(元/MWh)
  • Q_sell,t:t时段卖电量(MWh)
  • P_buy,t:t时段买电价格(元/MWh)
  • Q_buy,t:t时段买电量(MWh)

我在项目中遇到过一个问题:有些同学直接把充放电功率当成变量,结果模型跑出来总是“边充边放”,白白浪费损耗。为什么?因为目标函数里没有惩罚机制。

所以,我建议在目标函数里加一项“充放电切换惩罚”,或者干脆用约束条件禁止同时充放电。后面我们会细讲。

4.2 约束条件:储能系统的“紧箍咒”

光有目标函数不行,储能系统不是神仙,它有物理限制。这些限制就是约束条件。我把它们分成三类:

4.2.1 能量守恒约束(SOC 变化)

这是最核心的约束。储能系统的电量(State of Charge, SOC)不能凭空产生或消失。

SOC_t = SOC_{t-1} + (η_charge × Q_buy,t - Q_sell,t / η_discharge) × Δt

其中:

  • η_charge:充电效率(比如 0.95)
  • η_discharge:放电效率(比如 0.95)
  • Δt:时间间隔(小时)

嗯,这里要注意:效率系数千万别搞反了。充电时,买进来的电只有一部分存进去;放电时,存进去的电也只有一部分能卖出去。我曾经见过一个模型,效率系数写反了,结果算出来的收益虚高,实际根本达不到。

4.2.2 功率上下限约束

储能系统的充放电功率不是无限的。比如一个 10MW/40MWh 的系统,最大充放电功率就是 10MW。

0 ≤ Q_buy,t ≤ P_max × Δt
0 ≤ Q_sell,t ≤ P_max × Δt

这里有个细节:有些电池支持短时过载,比如 1.2 倍额定功率持续 10 分钟。但在现货市场套利中,我建议保守一点,按额定功率来建模。否则调度中心可能不认。

4.2.3 SOC 上下限约束

为了保护电池寿命,SOC 不能放空,也不能充满。一般锂电池的 SOC 运行范围是 10%~90%。

SOC_min ≤ SOC_t ≤ SOC_max

避坑指南:我曾经在项目里把 SOC_min 设成 0,结果模型为了多赚几块钱,每次都把电池放得干干净净。运维同事找我投诉,说电池寿命缩短了 30%。从那以后,我再也不敢忽略 SOC 上下限了。

4.3 线性规划基础:为什么选它?

你可能会问:为什么非要用线性规划?用神经网络不行吗?

原因很简单:线性规划有全局最优解,而且求解速度快。 现货市场是分时出清的,我们需要在几分钟内算出最优策略。神经网络虽然也能拟合,但没法保证每次都是最优解。

线性规划的标准形式是这样的:

Minimize: c^T x
Subject to: A x ≤ b
            x ≥ 0

其中:

  • x:决策变量(充放电量、SOC 等)
  • c:成本系数(电价)
  • A、b:约束矩阵和边界

说白了,就是把我们的目标函数和约束条件,写成矩阵形式。然后调用求解器(比如 Gurobi、Cplex、或者开源的 PuLP)去算。

注意:线性规划要求所有约束都是线性的。如果你加了“充放电不能同时进行”这种逻辑约束,需要用二进制变量(0-1 变量),那就变成混合整数线性规划(MILP)了。求解难度会上升一个台阶。我建议初学者先做纯线性规划,把基础跑通再说。

4.4 完整数学框架示例

我们把上面所有内容整合起来,看看一个完整的单机储能套利模型长什么样。

# 决策变量
Q_buy,t ≥ 0  # t时段购电量
Q_sell,t ≥ 0 # t时段售电量
SOC_t ≥ 0    # t时段末的荷电状态

# 目标函数
Maximize: Σ (P_sell,t × Q_sell,t - P_buy,t × Q_buy,t)

# 约束条件
1. SOC_t = SOC_{t-1} + (0.95 × Q_buy,t - Q_sell,t / 0.95) × 1h
2. 0 ≤ Q_buy,t ≤ 10 MWh
3. 0 ≤ Q_sell,t ≤ 10 MWh
4. 4 MWh ≤ SOC_t ≤ 36 MWh  (10%~90% of 40MWh)
5. SOC_0 = 20 MWh  (初始SOC设为50%)
6. SOC_T = 20 MWh  (最终SOC回到50%,方便下一轮)

最后一条约束很关键。如果不加,模型可能会在最后一个时段把电全部卖光,导致下一轮没法玩。我习惯加一个“终点 SOC 等于起点 SOC”的约束,这样模型是“日清”的,每天独立优化。

4.5 本章知识体系图

下面这张图,是我自己总结的套利模型数学框架结构。你可以把它当成一个思维导图,方便记忆。

套利模型数学框架 目标函数 最大化总收益 约束条件 物理限制 + 运行规则 求解方法 线性规划 / MILP 售电收入 购电成本 能量守恒 功率限制 SOC 范围 PuLP / Gurobi Cplex / SCIP 核心思路 在物理约束下,寻找最优充放电时序,最大化价差收益

这张图把今天的内容串起来了。你写代码的时候,就照着这个结构来:先定义变量,再写目标函数,然后加约束,最后选求解器。

个人经验:刚开始做模型时,别追求复杂。先跑一个单机、单日、不考虑损耗的简单版本。验证逻辑正确后,再逐步加效率、加多机、加多日。我见过太多人一上来就想搞“全功能版”,结果 debug 到崩溃。

好了,数学框架就讲到这里。下一节我们会用 Python 和 PuLP 库,把这个模型真正实现出来。到时候你就知道,数学公式和代码之间,其实就隔着一层“翻译”而已。


专注资料整理