本文系统整理随机规划从两阶段补救、风险度量与样本平均近似,到多阶段策略、场景生成和电力交易教学实验框架的完整主线。
文中的电价、负荷、结算价差和概率均为教学算例,不代表任何地区的实际市场规则。
整条学习主线
随机规划可以沿着下面这条主线理解:
这条主线最终把研究问题从:
“电价和负荷能不能预测准?”
升级成:
“在决策时点只能看到当时信息的情况下,怎样把预测分布转成可执行决策,并在样本外证明决策有经济价值?”
随机规划到底解决什么问题
随机规划不是主要解决:
“未来到底是多少?”
而是解决:
“未来还不知道是多少时,我现在应该怎么做;未来信息揭晓后,我还能怎样补救?”
最基本的时间结构:
其中:
- \(x\):第一阶段决策,必须在不确定性揭晓前做;
- \(\xi\):未来才揭晓、无法由交易员控制的随机信息;
- \(y\):信息揭晓后的第二阶段补救决策或结算变量。
判断变量身份时,先问:
- 这个量能不能由我控制?
- 它是在随机信息揭晓前还是之后确定?
- 它是动作,还是动作和随机结果共同产生的成本?
Two-stage Stochastic Programming
教学版电力采购问题
设:
- 提前采购价格:400 元/MWh;
- 实际负荷:
- 少买后补购价格:700 元/MWh;
- 多买后卖回价格:200 元/MWh。
第一阶段:
第二阶段变量:
电量平衡:
等价地:
其中:
- \(\xi-x\) 是第一阶段留下的净缺口;
- \(y\) 是第二阶段如何处理缺口。
Recourse 与 Recourse Cost
Recourse 是动作:
Recourse cost 是动作产生的净成本:
卖出项为负,是因为卖出产生收入、抵减成本。
\(Q(x,\xi)\) 是什么
给定 \(x\) 和某个已经发生的 \(\xi\),第二阶段会在所有可行补救方案中寻找成本最低的方案:
因此:
不是某一个任意 \(y\) 的成本。
例如:
最优补购:
所以:
而:
最优卖出:
所以:
负数表示第二阶段净收入 4000 元。
完整 Two-stage 目标
第一阶段也有成本,因此:
在教学算例中:
它同时比较:
为什么最优采购量不等于平均负荷
假设:
但:
- 少买 1 MWh 的边际代价:
- 多买 1 MWh 的边际代价:
因为少买更疼,所以最优采购量可能高于均值。
因此:
而不是只由:
决定。
Newsvendor / 提前采购模型
Newsvendor 是 Two-stage simple recourse 的经典特例。
设:
- \(c\):提前采购价;
- \(q\):需求发生后卖出的收入,或缺货时避免的高成本;
- \(r\):卖不掉后的回收价;
- \(\xi\):随机需求;
- \(x\):提前采购量。
多买一单位的两种结果:
- 若 \(\xi>x\),该单位能发挥作用,收益为:
发生概率:
- 若 \(\xi\le x\),该单位买多了,损失为:
发生概率:
最优点满足边际收益与边际损失平衡:
整理得到:
因此:
也可以写成:
其中:
最重要的直觉:
这也说明:即使两个分布均值和方差相同,只要关键分位数不同,最优决策仍可能不同。
有限 Scenario 与 Extensive Form
若随机变量只有有限场景:
概率:
则:
每个场景有自己的第二阶段变量:
但所有场景共享同一个第一阶段决策:
因为做 \(x\) 时尚不知道最终是哪一个场景。
Scenario Tree 与 Non-anticipativity
Scenario Tree 的核心不是“画很多未来”,而是:
若两个完整场景到阶段 \(t\) 为止拥有相同的信息历史,那么:
这就是 Non-anticipativity:
判断方法:
- 站在决策时点;
- 只看当时已经可见的信息;
- 按可见信息把 scenarios 分组;
- 同组决策必须相同;
- 信息历史不同后,决策才允许分开。
Stage 不等于 Period
Stage 的边界是:
而不是每过一个时间点就增加一个 stage。
因此一天有 96 个价格交割点,并不自动意味着 96-stage。
若一天开始前只做一次申报,中途没有主动调整机会,则可以仍然是:
即:
EVPI 与 VSS
定义三个世界。
Wait-and-See
提前知道真实未来后,每个场景分别优化:
Recourse Problem
不知道真实未来,但正确使用概率分布:
Expected Value Solution 的真实表现
先把随机变量替换为均值:
得到均值问题最优解:
再把 \(\bar x\) 放回真实随机世界评价:
对于成本最小化问题:
于是:
表示完美信息的价值上限。
而:
表示使用完整随机分布做决策,相比只用均值决策的价值。
最重要的区分:
风险中性、Chance Constraint、VaR 与 CVaR
风险中性模型:
只关心平均成本,可能看不见尾部损失。
Chance Constraint:
表示成本超过风险红线 \(\tau\) 的概率不能高于 \(\alpha\)。
VaR 关心:
CVaR 进一步关心:
对随机损失 \(Z\):
其中:
- \(Z\):某策略在不同场景下的潜在损失;
- \(t\):候选 VaR 门槛;
- \((Z-t)^+\):超过门槛后的超额损失;
- \(\alpha\):尾部概率。
CVaR 如何嵌入随机规划
风险硬约束
Mean-CVaR
其中:
- \(\lambda=0\):风险中性;
- \(\lambda\) 增大:更愿意牺牲平均表现换取尾部安全。
有限场景下,引入:
并约束:
则:
因此很多线性随机规划加入 CVaR 后仍然可以保持线性规划结构。
Efficient Frontier 与 Dominance
Mean-CVaR 实际上是两个目标的权衡:
若策略 D 相比策略 C:
同时:
则 D 被 C 支配。
无论 \(\lambda\) 如何变化,D 都不可能成为最优策略。
扫描不同 \(\lambda\),可以得到:
Scenario Generation 与 SAA
Scenario Generation 回答:
例如:
- 历史路径;
- Monte Carlo;
- 预测模型;
- 条件相似日;
- Markov 状态转移;
- 聚类和场景压缩。
SAA 回答:
二者不是同一件事。
SAA:Sample Average Approximation
真实问题:
真实期望难以直接计算时,使用 \(N\) 个样本:
构造经验目标:
再求:
在标准等权经验分布中:
固定 \(x\) 只计算均值是 Evaluation:
让 \(x\) 变化并挑选最优,才是 SAA Optimization。
SAA 不是 Solver
SAA 负责:
它只是把真实随机问题变成有限场景优化问题。
之后仍需要:
- LP Solver;
- MILP Solver;
- L-shaped / Benders;
- 其他分解或优化算法。
因此:
Scenario 的正确粒度
若随机对象是一天完整的 96 点价格路径,则一个 scenario 更自然地是:
而不是把 \(200\times96\) 个价格点全部打散。
如果策略同时依赖日前和实时,则应尽量保留:
或价差路径:
原因是日前和实时之间的联合关系本身就是交易风险的一部分。
SAA 稳定性与样本量
对固定 \(x\):
有:
标准误差大约按:
下降。
但:
若样本分布系统性偏离真实未来,样本量再大也可能稳定地错。
OOS、Walk-forward 与 Optimality Gap
不能用同一批数据既寻找最优策略,又证明该策略优秀。
应当:
对时间序列,更适合 Walk-forward:
候选策略真实 optimality gap:
其中:
固定候选 \(\hat x\) 后,\(g(\hat x)\) 相对容易用大量 OOS 场景评价;真正的 \(v^*\) 更难估。
SAA 的一个重要结论是:
不是每一次都保证 \(\hat v_N\le v^*\),而是期望意义下样本内最优值具有乐观偏差。
统计上下界的严格推导需要结合 SAA 统计推断进一步展开。
Rolling Window、Conditional Scenario 与 Markov
Rolling Window
使用最近 \(W\) 天:
构造当前经验分布:
Rolling Window 主要解决:
窗口太长:稳定但可能混入旧 regime。
窗口太短:贴近当前但估计噪声大。
Conditional Scenario
真正决策需要的可能是:
而不是无条件:
Conditional Scenario 可以根据:
- 天气预测;
- 负荷预测;
- 新能源预测;
- 系统供需状态;
- 近期价格状态;
选择更相似的历史日,或给历史日不同权重。
Markov Model
若存在足够好的状态 \(s_t\),使得:
则完整过去可以被当前 state 压缩。
三状态教学例子:
分别表示:
- \(T\):偏紧;
- \(N\):正常;
- \(L\):宽松。
转移矩阵每一行表示:
Markov 模型的关键不是“电价一定是一阶 Markov”,而是:
Multistage Stochastic Programming
Two-stage:
Multistage:
真正的解不是一串提前写死的数字,而是一套 Policy:
即:
未来看到什么信息,就采取什么动作。
State 是什么
State 不是完整历史,而是:
例如:
若两段历史不同,但当前:
- 持仓相同;
- 后续可行域相同;
- 对未来的条件分布相同;
则 optimizer 不需要再区分完整历史。
因此:
Reality Forward,Optimization Backward
现实执行方向:
Scenario 会随着信息揭晓不断收缩到真实路径。
但为了在今天选择 \(a_0\),优化器必须先知道:
当前动作把系统送入的未来状态值多少钱?
因此内部计算从未来向现在进行:
Action Value 与 Value Function
定义某个动作的总价值:
其中:
- \(C_t\):当前动作成本;
- \(V_{t+1}\):从下一状态开始的最优未来成本。
状态价值:
最优动作:
所以:
Backward Recursion 的核心
Value Function 表示:
最后阶段先生成一个函数:
并不需要提前知道上层最终会留下哪个状态。
上一阶段的动作决定把哪个状态代入:
于是:
Ex-Ante Optimal 与 Ex-Post Optimal
Ex-Ante:
Ex-Post / Oracle:
因此:
一个决策可能事后亏损,但在当时的信息分布下仍然合理;也可能事后碰巧赚钱,但当时是一个高风险错误决策。
Scenario Tree Explosion
若每次信息揭晓都有 \(b\) 个分支,共有 \(T\) 次分叉:
若各阶段分支数不同:
场景树规模随阶段指数增长。
但当历史样本只有约 200 个完整日时:
- 若每一天完整路径作为一个 Two-stage scenario,则只有约 200 条场景;
- 并不等于 \(3^{96}\);
- 此时主要问题可能是条件样本不足,而不是算力不足。
Scenario Reduction 与 Aggregation
Scenario Reduction 的目标:
不能简单删除低概率极端场景,因为它们可能决定 CVaR 和对冲策略。
更合理的做法是合并对决策影响相近的场景,并重新分配概率。
对约 200 条历史路径,第一版实验通常没有必要为了算力立即做压缩;更适合把压缩作为敏感性实验:
比较:
- 最优策略变化;
- OOS 成本变化;
- CVaR 变化;
- 决策是否稳定。
Moment Matching
Moment Matching 的思想是:
场景压缩后,尽量保持原分布的重要统计特征。
一阶矩
表示分布的平均水平。
二阶矩与方差
二阶原点矩:
方差:
若压缩前后均值相同,但方差从很大变成 0,就说明风险结构被抹掉了。
三阶中心矩与偏度
保留正负方向,可以反映分布往高价或低价一侧拖尾。
标准化偏度:
电价经常存在“平时正常、偶尔尖峰”的右尾结构,因此偏度和尾部信息对交易决策很重要。
Moment Matching 的局限
即使两个分布:
- 均值相同;
- 方差相同;
- 甚至部分高阶矩相似;
也不代表它们的关键分位数、尾部形状和最优决策一定相同。
Newsvendor 的最优解依赖:
所以 moment 相同但分位数不同,仍然可能产生不同的最优采购量。
因此:
Wasserstein / Optimal Transport
Wasserstein 是 Moment Matching 之后的现代扩展工具。
它要解决:
给定原分布 \(P\) 和压缩分布 \(Q\),用新场景代表旧场景时,最佳概率匹配下仍然剩下多少分布误差?
离散形式的 1-Wasserstein:
其中:
表示原场景 \(x_i\) 有多少概率质量由新场景 \(y_j\) 代表。
约束:
表示每个原场景的概率都必须被完整分配。
表示每个新场景最终承接规定的概率。
Scenario Reduction 可抽象为:
即只能留下 \(K\) 个代表场景时,让压缩分布尽可能接近原分布。
对当前 200 天数据,Wasserstein 主要是后续研究工具,不是第一版实验必须使用的组件。
历史路径与 Multistage Tree 的区别
Two-stage 中:
可以直接使用。
但 Multistage 中,不能简单让每条连续历史路径在第一步后就独立分叉,因为连续价格前缀几乎不会完全相同,这会让模型通过“路径身份”隐蔽地知道未来。
正确节点应该表示:
例如:
- 偏紧;
- 正常;
- 宽松。
同一节点下的历史路径必须共享当前决策,直到新的信息真正揭晓。
电力交易教学实验框架
一个完整的教学实验框架可以采用以下主链:
主引擎采用:
而不是在没有真实中间交易机会的情况下强行伪造 Multistage。
场景可包含:
第一阶段申报:
第二阶段 simple recourse:
风险中性:
Mean-CVaR:
实验台可比较:
- Mean-value;
- Risk-neutral SP;
- Mean-CVaR SP;
- Actual / Historical;
- Oracle;
- EVPI;
- VSS;
- Regret。
教学实验框架的边界
教学原型中的:
- 偏差结算;
- 申报上下限;
- 正负偏差价差;
- 爬坡约束;
- 合成数据;
均属于教学占位。
接入江苏真实数据前必须先完成:
第一步应当是单时点人工对账:
确认后再扩展到 96 点和 Walk-forward。
总公式速查
Two-stage
Recourse
Finite scenarios
Non-anticipativity
EVPI / VSS
CVaR
SAA
Policy
Action value
Value function
Markov
Scenario explosion
Wasserstein
复习题
A. 基础建模
- 为什么实际负荷不能是第一阶段决策变量?
- Recourse 和 Recourse Cost 有什么区别?
- 为什么 \(Q(x,\xi)\) 里面存在一个 \(\min\)?
- 为什么最优采购量不一定等于平均负荷?
- Newsvendor 最优分位数由哪些成本决定?
B. Scenario 与信息结构
- 为什么 finite-scenario 模型中可以有多个 \(y_s\),但第一阶段只能有一个共同 \(x\)?
- Non-anticipativity 最核心的一句话是什么?
- Stage 与 period 有什么区别?
- 为什么 96 个交割点不一定是 96-stage?
- 为什么连续历史路径不能直接自动变成可实施的 Multistage Tree?
C. 价值评估
- WS、RP、EEV 分别代表什么世界?
- EVPI 和 VSS 分别衡量哪一层价值?
- 为什么 Oracle 不能直接用来评价交易员绩效?
- 为什么事后亏损不能直接证明事前决策错误?
D. 风险
- VaR 看见了什么,没看见什么?
- CVaR 为什么比 VaR 更能区分极端尾部?
- Mean-CVaR 中 \(\lambda\) 的经济含义是什么?
- 什么叫一个策略被另一个策略支配?
E. SAA 与回测
- Scenario Generation 和 SAA 有什么区别?
- 固定 \(x\) 求样本均值为什么不等于 SAA Optimization?
- 为什么 SAA 不是 Solver?
- 为什么 DA 和 RT 不应独立随机拼接?
- 为什么不能在同一批数据上既找最优又证明最优?
- Rolling Window 和 Walk-forward 分别在解决什么?
- 为什么“稳定”不等于“正确”?
- 为什么只能说 \(E[\hat v_N]\le v^*\),而不是每次都 \(\hat v_N\le v^*\)?
F. Multistage
- Policy 为什么不是一串提前写死的数字?
- State 为什么不是完整历史?
- Action 和下一状态有什么区别?
- \(J_t\) 与 \(V_t\) 有什么区别?
- \(\min\) 与 \(\arg\min\) 分别返回什么?
- 为什么现实向前运行,而优化内部向后递归?
- Value Function 如何压缩未来整棵 Scenario Subtree?
G. Scenario Reduction 与 Markov
- 为什么低概率极端场景不能简单删除?
- 一阶矩、方差和偏度分别描述什么?
- 为什么 Moment Matching 不等于完整分布匹配?
- Wasserstein 在 Scenario Reduction 中解决什么问题?
- Rolling Window、Conditional Scenario 和 Markov Model 有什么区别?
- 为什么 Markov 模型最关键的是 state 设计,而不是“价格满足马尔科夫”这句话?
- 对约 200 天数据,为什么第一版更适合保留所有场景,而不是立即压缩?
进阶主题导航
掌握主干后,可以沿以下方向继续扩展。
数学最优性
- 为什么线性 recourse 的 value function 是凸函数?
- 为什么有限场景 deterministic equivalent 是全局可解的 LP?
- Primal、Dual、KKT、Complementary Slackness 如何提供最优性证书?
- Solver optimality gap 与 SAA statistical gap 有什么区别?
求解算法
- L-shaped / Benders;
- Feasibility Cut;
- Optimality Cut;
- Multicut;
- Complete / Relatively Complete Recourse。
多阶段风险
- Nested CVaR;
- Dynamic Risk Measure;
- Time Consistency。
分布不确定性
- DRO;
- Wasserstein Ambiguity Set;
- 场景概率估计误差。
江苏业务落地
- 真实结算公式;
- 真实决策机会;
- 中长期、日前、实时之间的业务映射;
- 可用负荷和价格预测;
- 交易量上下限和市场流动性。
推荐的建模实施顺序
实际建模可优先按照:
基础模型跑通后,再逐步加入:
最后才进入:
最小记忆版
如果隔一段时间忘了,只先恢复这十句话。
- 随机规划研究的是:未来不知道时,现在怎么决策。
- Two-stage 是:
- \(Q(x,\xi)\) 是给定 \(x,\xi\) 后第二阶段最优成本。
- Scenario Tree 描述信息何时揭晓。
- Non-anticipativity 是:同一信息历史必须同一决策。
- EVPI 是信息价值,VSS 是随机优化价值。
- SAA 用有限样本均值近似真实期望,再对 \(x\) 优化。
- Multistage 的解是一套 Policy,不是一串提前写死的数。
- Value Function 是:从当前状态往后能达到的最小期望成本。
- 电力市场第一版应先做真实结算对账和 Walk-forward Two-stage,而不是先追求复杂模型。
资料依据与边界
主要教材依据
John R. Birge & François Louveaux,Introduction to Stochastic Programming:
- Chapter 1:Farming、Newsvendor、Financial Planning、Power Capacity Expansion;
- Chapter 2:Decisions and Stages、Two-stage Fixed Recourse、Risk Aversion;
- Chapter 3:Two-stage Properties、Chance Constraints、Multistage Recourse;
- Chapter 4:EVPI、VSS;
- Chapter 5:L-shaped Method;
- Chapters 9–11:Approximation、Monte Carlo、Multistage Approximation。
Alexander Shapiro & Andy Philpott,A Tutorial on Stochastic Programming:
- SAA;
- Candidate Solution Evaluation;
- Multistage Policy;
- Risk-Averse Optimization。
Alexander Shapiro、Darinka Dentcheva、Andrzej Ruszczyński,Lectures on Stochastic Programming:
- SAA 统计推断;
- Risk-Averse Stochastic Programming;
- Scenario Reduction 文献框架。
现代扩展
Wasserstein / Optimal Transport 不是 Birge & Louveaux 1997 版在当前章节直接展开的核心内容;它是在 Scenario Reduction 和 Distributionally Robust Optimization 中常用的现代分布距离工具。
教学边界
本文中所有简化电价、负荷、偏差价差和概率示例,只用于帮助理解数学结构。接入江苏真实数据前,必须以正式市场规则和公司结算结果为准。
本文为教学与研究笔记。简化价格、负荷、概率和结算结构仅用于解释模型;实际市场建模必须重新核验决策时点、可见信息集和正式结算规则。