STOCHASTIC PROGRAMMING / DECISION UNDER UNCERTAINTY

随机规划系统复习:从 Two-stage 到电力交易实验框架

串联 Two-stage、Scenario Tree、EVPI/VSS、CVaR、SAA、Walk-forward、Multistage、Backward Recursion、Scenario Reduction 与 Wasserstein,并明确电力交易教学实验的适用边界。

随机规划风险优化电力交易2026/08/24 · 系统复习
← 返回全部笔记

本文系统整理随机规划从两阶段补救、风险度量与样本平均近似,到多阶段策略、场景生成和电力交易教学实验框架的完整主线。

文中的电价、负荷、结算价差和概率均为教学算例,不代表任何地区的实际市场规则。


整条学习主线

随机规划可以沿着下面这条主线理解:

\[\boxed{ \text{不确定性} \rightarrow \text{Scenario} \rightarrow \text{Two-stage Recourse} \rightarrow \text{信息与随机解价值} \rightarrow \text{风险厌恶} \rightarrow \text{SAA} \rightarrow \text{OOS验证} \rightarrow \text{Multistage Policy} \rightarrow \text{State} \rightarrow \text{Backward Recursion} \rightarrow \text{Scenario / Markov生成} \rightarrow \text{电力交易实验台} }\]

这条主线最终把研究问题从:

“电价和负荷能不能预测准?”

升级成:

“在决策时点只能看到当时信息的情况下,怎样把预测分布转成可执行决策,并在样本外证明决策有经济价值?”


随机规划到底解决什么问题

随机规划不是主要解决:

“未来到底是多少?”

而是解决:

“未来还不知道是多少时,我现在应该怎么做;未来信息揭晓后,我还能怎样补救?”

最基本的时间结构:

\[\boxed{x\rightarrow\xi\rightarrow y}\]

其中:

  • \(x\):第一阶段决策,必须在不确定性揭晓前做;
  • \(\xi\):未来才揭晓、无法由交易员控制的随机信息;
  • \(y\):信息揭晓后的第二阶段补救决策或结算变量。

判断变量身份时,先问:

  1. 这个量能不能由我控制?
  2. 它是在随机信息揭晓前还是之后确定?
  3. 它是动作,还是动作和随机结果共同产生的成本?

Two-stage Stochastic Programming

教学版电力采购问题

设:

  • 提前采购价格:400 元/MWh;
  • 实际负荷:
\[\xi= \begin{cases} 80,&p=0.5\\ 120,&p=0.5 \end{cases}\]
  • 少买后补购价格:700 元/MWh;
  • 多买后卖回价格:200 元/MWh。

第一阶段:

\[\boxed{x=\text{提前采购电量}}\]

第二阶段变量:

\[y^{buy}\ge0,\qquad y^{sell}\ge0\]

电量平衡:

\[\boxed{ x+y^{buy}-y^{sell}=\xi }\]

等价地:

\[y^{buy}-y^{sell}=\xi-x\]

其中:

  • \(\xi-x\) 是第一阶段留下的净缺口;
  • \(y\) 是第二阶段如何处理缺口。

Recourse 与 Recourse Cost

Recourse 是动作:

\[\boxed{\text{知道随机结果后采取的补买或卖出}}\]

Recourse cost 是动作产生的净成本:

\[\boxed{ 700y^{buy}-200y^{sell} }\]

卖出项为负,是因为卖出产生收入、抵减成本。


\(Q(x,\xi)\) 是什么

给定 \(x\) 和某个已经发生的 \(\xi\),第二阶段会在所有可行补救方案中寻找成本最低的方案:

\[\boxed{ Q(x,\xi) = \min_{y^{buy},y^{sell}\ge0} \left\{ 700y^{buy}-200y^{sell} : y^{buy}-y^{sell}=\xi-x \right\} }\]

因此:

\[\boxed{ Q(x,\xi)=\text{第二阶段小优化问题的最优值} }\]

不是某一个任意 \(y\) 的成本。

例如:

\[x=100,\quad\xi=120\]

最优补购:

\[y^{buy*}=20,\qquad y^{sell*}=0\]

所以:

\[Q(100,120)=14000\]

而:

\[x=100,\quad\xi=80\]

最优卖出:

\[y^{buy*}=0,\qquad y^{sell*}=20\]

所以:

\[Q(100,80)=-4000\]

负数表示第二阶段净收入 4000 元。


完整 Two-stage 目标

第一阶段也有成本,因此:

\[\boxed{ \min_x \left[ c^Tx+E[Q(x,\xi)] \right] }\]

在教学算例中:

\[\boxed{ \min_x \left[ 400x+E[Q(x,\xi)] \right] }\]

它同时比较:

\[\boxed{ \text{当前采购成本} + \text{未来最优补救的期望成本} }\]

为什么最优采购量不等于平均负荷

假设:

\[E[\xi]=100\]

但:

  • 少买 1 MWh 的边际代价:
\[700-400=300\]
  • 多买 1 MWh 的边际代价:
\[400-200=200\]

因为少买更疼,所以最优采购量可能高于均值。

因此:

\[\boxed{ x^* \text{ 由概率分布和不对称成本结构共同决定} }\]

而不是只由:

\[E[\xi]\]

决定。


Newsvendor / 提前采购模型

Newsvendor 是 Two-stage simple recourse 的经典特例。

设:

  • \(c\):提前采购价;
  • \(q\):需求发生后卖出的收入,或缺货时避免的高成本;
  • \(r\):卖不掉后的回收价;
  • \(\xi\):随机需求;
  • \(x\):提前采购量。

多买一单位的两种结果:

  1. \(\xi>x\),该单位能发挥作用,收益为:
\[q-c\]

发生概率:

\[1-F(x)\]
  1. \(\xi\le x\),该单位买多了,损失为:
\[c-r\]

发生概率:

\[F(x)\]

最优点满足边际收益与边际损失平衡:

\[(q-c)[1-F(x)] = (c-r)F(x)\]

整理得到:

\[\boxed{ F(x^*)=\frac{q-c}{q-r} }\]

因此:

\[\boxed{ x^* = F^{-1} \left( \frac{q-c}{q-r} \right) }\]

也可以写成:

\[\boxed{ F(x^*) = \frac{C_u}{C_u+C_o} }\]

其中:

\[C_u=q-c,\qquad C_o=c-r\]

最重要的直觉:

\[\boxed{ \text{缺货代价越高,最优采购分位数越接近 1} }\]

这也说明:即使两个分布均值和方差相同,只要关键分位数不同,最优决策仍可能不同。


有限 Scenario 与 Extensive Form

若随机变量只有有限场景:

\[\xi_1,\ldots,\xi_S\]

概率:

\[p_1,\ldots,p_S\]

则:

\[E[Q(x,\xi)] = \sum_{s=1}^{S}p_sQ(x,\xi_s)\]

每个场景有自己的第二阶段变量:

\[y_s\]

但所有场景共享同一个第一阶段决策:

\[\boxed{x}\]

因为做 \(x\) 时尚不知道最终是哪一个场景。


Scenario Tree 与 Non-anticipativity

Scenario Tree 的核心不是“画很多未来”,而是:

\[\boxed{\text{描述信息何时揭晓}}\]

若两个完整场景到阶段 \(t\) 为止拥有相同的信息历史,那么:

\[\boxed{ x_t^A=x_t^B }\]

这就是 Non-anticipativity:

\[\boxed{ \text{相同信息历史} \Rightarrow \text{相同当前决策} }\]

判断方法:

  1. 站在决策时点;
  2. 只看当时已经可见的信息;
  3. 按可见信息把 scenarios 分组;
  4. 同组决策必须相同;
  5. 信息历史不同后,决策才允许分开。

Stage 不等于 Period

Stage 的边界是:

\[\boxed{ \text{新信息揭晓后,出现新的可执行决策机会} }\]

而不是每过一个时间点就增加一个 stage。

因此一天有 96 个价格交割点,并不自动意味着 96-stage。

若一天开始前只做一次申报,中途没有主动调整机会,则可以仍然是:

\[\boxed{\text{Two-stage}}\]

即:

\[\text{一次申报} \rightarrow \text{96点价格、负荷路径实现} \rightarrow \text{结算}\]

EVPI 与 VSS

定义三个世界。

Wait-and-See

提前知道真实未来后,每个场景分别优化:

\[\boxed{ WS=E_\xi\left[\min_x z(x,\xi)\right] }\]

Recourse Problem

不知道真实未来,但正确使用概率分布:

\[\boxed{ RP=\min_xE_\xi[z(x,\xi)] }\]

Expected Value Solution 的真实表现

先把随机变量替换为均值:

\[\bar\xi=E[\xi]\]

得到均值问题最优解:

\[\bar x\]

再把 \(\bar x\) 放回真实随机世界评价:

\[\boxed{ EEV=E_\xi[z(\bar x,\xi)] }\]

对于成本最小化问题:

\[\boxed{ WS\le RP\le EEV }\]

于是:

\[\boxed{ EVPI=RP-WS }\]

表示完美信息的价值上限。

而:

\[\boxed{ VSS=EEV-RP }\]

表示使用完整随机分布做决策,相比只用均值决策的价值。

最重要的区分:

\[\boxed{ EVPI=\text{信息价值} }\]
\[\boxed{ VSS=\text{随机决策模型价值} }\]

风险中性、Chance Constraint、VaR 与 CVaR

风险中性模型:

\[\boxed{ \min_xE[G(x,\xi)] }\]

只关心平均成本,可能看不见尾部损失。

Chance Constraint:

\[\boxed{ P(G(x,\xi)>\tau)\le\alpha }\]

表示成本超过风险红线 \(\tau\) 的概率不能高于 \(\alpha\)

VaR 关心:

\[\boxed{\text{坏尾巴从哪里开始}}\]

CVaR 进一步关心:

\[\boxed{\text{进入坏尾巴后平均有多惨}}\]

对随机损失 \(Z\)

\[\boxed{ CVaR_{1-\alpha}(Z) = \inf_t \left[ t+\frac1\alpha E[(Z-t)^+] \right] }\]

其中:

  • \(Z\):某策略在不同场景下的潜在损失;
  • \(t\):候选 VaR 门槛;
  • \((Z-t)^+\):超过门槛后的超额损失;
  • \(\alpha\):尾部概率。

CVaR 如何嵌入随机规划

风险硬约束

\[\boxed{ \begin{aligned} \min_x\quad &E[G(x,\xi)]\\ \text{s.t.}\quad &CVaR_{95\%}(G(x,\xi))\le\tau \end{aligned} }\]

Mean-CVaR

\[\boxed{ \min_x E[G(x,\xi)] + \lambda CVaR_{95\%}(G(x,\xi)) }\]

其中:

  • \(\lambda=0\):风险中性;
  • \(\lambda\) 增大:更愿意牺牲平均表现换取尾部安全。

有限场景下,引入:

\[u_s\ge0\]

并约束:

\[u_s\ge G_s(x)-t\]

则:

\[\boxed{ CVaR = t+\frac1\alpha\sum_sp_su_s }\]

因此很多线性随机规划加入 CVaR 后仍然可以保持线性规划结构。


Efficient Frontier 与 Dominance

Mean-CVaR 实际上是两个目标的权衡:

\[\boxed{ E[G] \leftrightarrow CVaR(G) }\]

若策略 D 相比策略 C:

\[E[G_D]>E[G_C]\]

同时:

\[CVaR_D>CVaR_C\]

则 D 被 C 支配。

无论 \(\lambda\) 如何变化,D 都不可能成为最优策略。

扫描不同 \(\lambda\),可以得到:

\[\boxed{\text{期望成本—尾部风险有效前沿}}\]

Scenario Generation 与 SAA

Scenario Generation 回答:

\[\boxed{\text{场景从哪里来}}\]

例如:

  • 历史路径;
  • Monte Carlo;
  • 预测模型;
  • 条件相似日;
  • Markov 状态转移;
  • 聚类和场景压缩。

SAA 回答:

\[\boxed{\text{有了有限样本后,怎样近似真实期望并优化}}\]

二者不是同一件事。


SAA:Sample Average Approximation

真实问题:

\[\boxed{ x^* = \arg\min_{x\in X} E[F(x,\xi)] }\]

真实期望难以直接计算时,使用 \(N\) 个样本:

\[\xi^1,\ldots,\xi^N\]

构造经验目标:

\[\boxed{ \hat g_N(x) = \frac1N\sum_{s=1}^{N}F(x,\xi^s) }\]

再求:

\[\boxed{ \hat x_N = \arg\min_x\hat g_N(x) }\]

在标准等权经验分布中:

\[p_s=\frac1N\]

固定 \(x\) 只计算均值是 Evaluation:

\[\frac1N\sum_sF(x,\xi^s)\]

\(x\) 变化并挑选最优,才是 SAA Optimization。


SAA 不是 Solver

SAA 负责:

\[\boxed{ E[F(x,\xi)] \rightarrow \frac1N\sum_sF(x,\xi^s) }\]

它只是把真实随机问题变成有限场景优化问题。

之后仍需要:

  • LP Solver;
  • MILP Solver;
  • L-shaped / Benders;
  • 其他分解或优化算法。

因此:

\[\boxed{ SAA=\text{统计近似方法,不是求解算法} }\]

Scenario 的正确粒度

若随机对象是一天完整的 96 点价格路径,则一个 scenario 更自然地是:

\[\boxed{ \xi^d= (P^d_1,\ldots,P^d_{96}) }\]

而不是把 \(200\times96\) 个价格点全部打散。

如果策略同时依赖日前和实时,则应尽量保留:

\[\boxed{ (DA_{d,1:96},RT_{d,1:96}) }\]

或价差路径:

\[RT-DA\]

原因是日前和实时之间的联合关系本身就是交易风险的一部分。


SAA 稳定性与样本量

对固定 \(x\)

\[\hat q_N(x) = \frac1N\sum_{s=1}^{N}Q(x,\xi^s)\]

有:

\[\boxed{ Var[\hat q_N(x)] = \frac{Var[Q(x,\xi)]}{N} }\]

标准误差大约按:

\[O(N^{-1/2})\]

下降。

但:

\[\boxed{ \text{稳定}\neq\text{正确} }\]

若样本分布系统性偏离真实未来,样本量再大也可能稳定地错。


OOS、Walk-forward 与 Optimality Gap

不能用同一批数据既寻找最优策略,又证明该策略优秀。

应当:

\[\boxed{ \text{过去训练/构造场景} \rightarrow \hat x \rightarrow \text{未来未见数据评价} }\]

对时间序列,更适合 Walk-forward:

\[[1,W]\rightarrow W+1\]
\[[2,W+1]\rightarrow W+2\]

候选策略真实 optimality gap:

\[\boxed{ Gap(\hat x)=g(\hat x)-v^* }\]

其中:

\[v^*=\min_xg(x)\]

固定候选 \(\hat x\) 后,\(g(\hat x)\) 相对容易用大量 OOS 场景评价;真正的 \(v^*\) 更难估。

SAA 的一个重要结论是:

\[\boxed{ E[\hat v_N]\le v^* }\]

不是每一次都保证 \(\hat v_N\le v^*\),而是期望意义下样本内最优值具有乐观偏差。

统计上下界的严格推导需要结合 SAA 统计推断进一步展开。


Rolling Window、Conditional Scenario 与 Markov

Rolling Window

使用最近 \(W\) 天:

\[D-W,\ldots,D-1\]

构造当前经验分布:

\[\boxed{ \hat P_D^{(W)} = \frac1W \sum_{d=D-W}^{D-1}\delta_{\xi_d} }\]

Rolling Window 主要解决:

\[\boxed{\text{市场分布随时间漂移}}\]

窗口太长:稳定但可能混入旧 regime。
窗口太短:贴近当前但估计噪声大。


Conditional Scenario

真正决策需要的可能是:

\[\boxed{ P(\xi_{D}\mid I_{D-1}) }\]

而不是无条件:

\[P(\xi_D)\]

Conditional Scenario 可以根据:

  • 天气预测;
  • 负荷预测;
  • 新能源预测;
  • 系统供需状态;
  • 近期价格状态;

选择更相似的历史日,或给历史日不同权重。


Markov Model

若存在足够好的状态 \(s_t\),使得:

\[\boxed{ P(s_{t+1}\mid s_0,\ldots,s_t) = P(s_{t+1}\mid s_t) }\]

则完整过去可以被当前 state 压缩。

三状态教学例子:

\[S_t\in\{T,N,L\}\]

分别表示:

  • \(T\):偏紧;
  • \(N\):正常;
  • \(L\):宽松。

转移矩阵每一行表示:

\[P(S_{t+1}\mid S_t)\]

Markov 模型的关键不是“电价一定是一阶 Markov”,而是:

\[\boxed{\text{State 是否足够概括过去对未来的影响}}\]

Multistage Stochastic Programming

Two-stage:

\[x_1\rightarrow\xi_2\rightarrow x_2\]

Multistage:

\[x_1 \rightarrow\xi_2 \rightarrow x_2 \rightarrow\xi_3 \rightarrow x_3 \rightarrow\cdots\]

真正的解不是一串提前写死的数字,而是一套 Policy:

\[\boxed{ \pi= \{x_1,x_2(\xi_2),x_3(\xi_2,\xi_3),\ldots\} }\]

即:

未来看到什么信息,就采取什么动作。


State 是什么

State 不是完整历史,而是:

\[\boxed{ s_t= \text{截至当前,对未来预测、约束和决策仍有用的信息摘要} }\]

例如:

\[s_t= ( q_t, \hat L_t, \text{价格状态}, \text{供需状态}, \text{天气状态} )\]

若两段历史不同,但当前:

  • 持仓相同;
  • 后续可行域相同;
  • 对未来的条件分布相同;

则 optimizer 不需要再区分完整历史。

因此:

\[\boxed{ \text{State 要足够,但不要冗余} }\]

Reality Forward,Optimization Backward

现实执行方向:

\[\boxed{ s_0\rightarrow a_0\rightarrow\xi_1\rightarrow s_1\rightarrow a_1\rightarrow\cdots }\]

Scenario 会随着信息揭晓不断收缩到真实路径。

但为了在今天选择 \(a_0\),优化器必须先知道:

当前动作把系统送入的未来状态值多少钱?

因此内部计算从未来向现在进行:

\[\boxed{ V_T\rightarrow V_{T-1}\rightarrow\cdots\rightarrow V_0 }\]

Action Value 与 Value Function

定义某个动作的总价值:

\[\boxed{ J_t(s_t,a_t) = C_t(s_t,a_t) + E[V_{t+1}(s_{t+1})\mid s_t,a_t] }\]

其中:

  • \(C_t\):当前动作成本;
  • \(V_{t+1}\):从下一状态开始的最优未来成本。

状态价值:

\[\boxed{ V_t(s_t) = \min_{a_t}J_t(s_t,a_t) }\]

最优动作:

\[\boxed{ a_t^* = \arg\min_{a_t}J_t(s_t,a_t) }\]

所以:

\[\boxed{ \min\rightarrow\text{最优值} }\]
\[\boxed{ \arg\min\rightarrow\text{取得最优值的动作} }\]

Backward Recursion 的核心

Value Function 表示:

\[\boxed{ \text{State} \rightarrow \text{从该状态往后能够达到的最小期望成本} }\]

最后阶段先生成一个函数:

\[Q_H(s_H)\]

并不需要提前知道上层最终会留下哪个状态。

上一阶段的动作决定把哪个状态代入:

\[Q_H\]

于是:

\[\boxed{ \text{未来先告诉现在:你给我什么状态,我就告诉你以后最少要花多少} }\]
\[\boxed{ \text{现在再决定:我应该通过什么动作,把系统送到哪个状态} }\]

Ex-Ante Optimal 与 Ex-Post Optimal

Ex-Ante:

\[\boxed{ \text{在决策时点可见信息条件下的最优} }\]

Ex-Post / Oracle:

\[\boxed{ \text{知道真实未来以后回头计算的最优} }\]

因此:

\[\boxed{ \text{事后亏损} \neq \text{证明事前决策错误} }\]

一个决策可能事后亏损,但在当时的信息分布下仍然合理;也可能事后碰巧赚钱,但当时是一个高风险错误决策。


Scenario Tree Explosion

若每次信息揭晓都有 \(b\) 个分支,共有 \(T\) 次分叉:

\[\boxed{ N_{\text{leaf}}=b^T }\]

若各阶段分支数不同:

\[\boxed{ N_{\text{leaf}} = \prod_tb_t }\]

场景树规模随阶段指数增长。

但当历史样本只有约 200 个完整日时:

  • 若每一天完整路径作为一个 Two-stage scenario,则只有约 200 条场景;
  • 并不等于 \(3^{96}\)
  • 此时主要问题可能是条件样本不足,而不是算力不足。

Scenario Reduction 与 Aggregation

Scenario Reduction 的目标:

\[\boxed{ \text{用少量代表场景近似原始分布,同时尽量不改变决策相关信息} }\]

不能简单删除低概率极端场景,因为它们可能决定 CVaR 和对冲策略。

更合理的做法是合并对决策影响相近的场景,并重新分配概率。

对约 200 条历史路径,第一版实验通常没有必要为了算力立即做压缩;更适合把压缩作为敏感性实验:

\[200\rightarrow100\rightarrow50\rightarrow20\]

比较:

  • 最优策略变化;
  • OOS 成本变化;
  • CVaR 变化;
  • 决策是否稳定。

Moment Matching

Moment Matching 的思想是:

场景压缩后,尽量保持原分布的重要统计特征。

一阶矩

\[\boxed{ E[\xi] }\]

表示分布的平均水平。

二阶矩与方差

二阶原点矩:

\[E[\xi^2]\]

方差:

\[\boxed{ Var(\xi)=E[\xi^2]-E[\xi]^2 }\]

若压缩前后均值相同,但方差从很大变成 0,就说明风险结构被抹掉了。

三阶中心矩与偏度

\[E[(\xi-\mu)^3]\]

保留正负方向,可以反映分布往高价或低价一侧拖尾。

标准化偏度:

\[\boxed{ Skewness = \frac{E[(\xi-\mu)^3]}{\sigma^3} }\]

电价经常存在“平时正常、偶尔尖峰”的右尾结构,因此偏度和尾部信息对交易决策很重要。


Moment Matching 的局限

即使两个分布:

  • 均值相同;
  • 方差相同;
  • 甚至部分高阶矩相似;

也不代表它们的关键分位数、尾部形状和最优决策一定相同。

Newsvendor 的最优解依赖:

\[F^{-1}(\kappa)\]

所以 moment 相同但分位数不同,仍然可能产生不同的最优采购量。

因此:

\[\boxed{ \text{匹配有限 moments} \neq \text{匹配完整分布} }\]

Wasserstein / Optimal Transport

Wasserstein 是 Moment Matching 之后的现代扩展工具。

它要解决:

给定原分布 \(P\) 和压缩分布 \(Q\),用新场景代表旧场景时,最佳概率匹配下仍然剩下多少分布误差?

离散形式的 1-Wasserstein:

\[\boxed{ W_1(P,Q) = \min_{\pi} \sum_{i,j}\pi_{ij}|x_i-y_j| }\]

其中:

\[\pi_{ij}\]

表示原场景 \(x_i\) 有多少概率质量由新场景 \(y_j\) 代表。

约束:

\[\sum_j\pi_{ij}=p_i\]

表示每个原场景的概率都必须被完整分配。

\[\sum_i\pi_{ij}=q_j\]

表示每个新场景最终承接规定的概率。

Scenario Reduction 可抽象为:

\[\boxed{ Q^* = \arg\min_{Q:\,|\operatorname{supp}(Q)|\le K} W(P,Q) }\]

即只能留下 \(K\) 个代表场景时,让压缩分布尽可能接近原分布。

对当前 200 天数据,Wasserstein 主要是后续研究工具,不是第一版实验必须使用的组件。


历史路径与 Multistage Tree 的区别

Two-stage 中:

\[\boxed{ 200\text{ 个历史日} = 200\text{ 个完整经验 scenarios} }\]

可以直接使用。

但 Multistage 中,不能简单让每条连续历史路径在第一步后就独立分叉,因为连续价格前缀几乎不会完全相同,这会让模型通过“路径身份”隐蔽地知道未来。

正确节点应该表示:

\[\boxed{\text{当前时点真实可识别的信息状态}}\]

例如:

  • 偏紧;
  • 正常;
  • 宽松。

同一节点下的历史路径必须共享当前决策,直到新的信息真正揭晓。


电力交易教学实验框架

一个完整的教学实验框架可以采用以下主链:

\[\boxed{ \text{事前信息} \rightarrow \text{场景生成} \rightarrow \text{SAA} \rightarrow \text{Two-stage Recourse} \rightarrow \text{CVaR} \rightarrow \text{Walk-forward OOS} \rightarrow \text{EVPI/VSS/Regret} }\]

主引擎采用:

\[\boxed{\text{Rolling-window Two-stage SAA}}\]

而不是在没有真实中间交易机会的情况下强行伪造 Multistage。

场景可包含:

\[\xi_s= ( P^{DA}_{s,1:T}, P^{RT}_{s,1:T}, L_{s,1:T} )\]

第一阶段申报:

\[x_t\]

第二阶段 simple recourse:

\[x_t+y^{buy}_{s,t}-y^{sell}_{s,t}=L_{s,t}\]

风险中性:

\[\min_x\sum_sp_sZ_s\]

Mean-CVaR:

\[\min_x \left[ \sum_sp_sZ_s + \lambda CVaR_\alpha(Z) \right]\]

实验台可比较:

  • Mean-value;
  • Risk-neutral SP;
  • Mean-CVaR SP;
  • Actual / Historical;
  • Oracle;
  • EVPI;
  • VSS;
  • Regret。

教学实验框架的边界

教学原型中的:

  • 偏差结算;
  • 申报上下限;
  • 正负偏差价差;
  • 爬坡约束;
  • 合成数据;

均属于教学占位。

接入江苏真实数据前必须先完成:

\[\boxed{ \text{真实决策时点} + \text{当时可见信息集} + \text{真实结算公式} }\]

第一步应当是单时点人工对账:

\[\boxed{ \text{模型计算成本} = \text{公司真实结算成本} }\]

确认后再扩展到 96 点和 Walk-forward。


总公式速查

Two-stage

\[\boxed{ \min_xc^Tx+E[Q(x,\xi)] }\]

Recourse

\[\boxed{ Q(x,\xi) = \min_y\{q^Ty:Wy=h-Tx,\ y\ge0\} }\]

Finite scenarios

\[\boxed{ E[Q] = \sum_sp_sQ_s }\]

Non-anticipativity

\[\boxed{ \text{相同信息历史} \Rightarrow \text{相同当前决策} }\]

EVPI / VSS

\[\boxed{ EVPI=RP-WS }\]
\[\boxed{ VSS=EEV-RP }\]

CVaR

\[\boxed{ CVaR_{1-\alpha}(Z) = \inf_t \left[ t+\frac1\alpha E[(Z-t)^+] \right] }\]

SAA

\[\boxed{ \hat x_N = \arg\min_x \frac1N\sum_{s=1}^{N}F(x,\xi^s) }\]

Policy

\[\boxed{ \pi= \{x_1,x_2(\xi_2),x_3(\xi_2,\xi_3),\ldots\} }\]

Action value

\[\boxed{ J_t(s_t,a_t) = C_t(s_t,a_t) + E[V_{t+1}(s_{t+1})\mid s_t,a_t] }\]

Value function

\[\boxed{ V_t(s_t) = \min_{a_t}J_t(s_t,a_t) }\]

Markov

\[\boxed{ P(s_{t+1}\mid s_0,\ldots,s_t) = P(s_{t+1}\mid s_t) }\]

Scenario explosion

\[\boxed{ N_{\text{leaf}} = \prod_tb_t }\]

Wasserstein

\[\boxed{ W_1(P,Q) = \min_\pi \sum_{i,j}\pi_{ij}|x_i-y_j| }\]

复习题

A. 基础建模

  1. 为什么实际负荷不能是第一阶段决策变量?
  2. Recourse 和 Recourse Cost 有什么区别?
  3. 为什么 \(Q(x,\xi)\) 里面存在一个 \(\min\)
  4. 为什么最优采购量不一定等于平均负荷?
  5. Newsvendor 最优分位数由哪些成本决定?

B. Scenario 与信息结构

  1. 为什么 finite-scenario 模型中可以有多个 \(y_s\),但第一阶段只能有一个共同 \(x\)
  2. Non-anticipativity 最核心的一句话是什么?
  3. Stage 与 period 有什么区别?
  4. 为什么 96 个交割点不一定是 96-stage?
  5. 为什么连续历史路径不能直接自动变成可实施的 Multistage Tree?

C. 价值评估

  1. WS、RP、EEV 分别代表什么世界?
  2. EVPI 和 VSS 分别衡量哪一层价值?
  3. 为什么 Oracle 不能直接用来评价交易员绩效?
  4. 为什么事后亏损不能直接证明事前决策错误?

D. 风险

  1. VaR 看见了什么,没看见什么?
  2. CVaR 为什么比 VaR 更能区分极端尾部?
  3. Mean-CVaR 中 \(\lambda\) 的经济含义是什么?
  4. 什么叫一个策略被另一个策略支配?

E. SAA 与回测

  1. Scenario Generation 和 SAA 有什么区别?
  2. 固定 \(x\) 求样本均值为什么不等于 SAA Optimization?
  3. 为什么 SAA 不是 Solver?
  4. 为什么 DA 和 RT 不应独立随机拼接?
  5. 为什么不能在同一批数据上既找最优又证明最优?
  6. Rolling Window 和 Walk-forward 分别在解决什么?
  7. 为什么“稳定”不等于“正确”?
  8. 为什么只能说 \(E[\hat v_N]\le v^*\),而不是每次都 \(\hat v_N\le v^*\)

F. Multistage

  1. Policy 为什么不是一串提前写死的数字?
  2. State 为什么不是完整历史?
  3. Action 和下一状态有什么区别?
  4. \(J_t\)\(V_t\) 有什么区别?
  5. \(\min\)\(\arg\min\) 分别返回什么?
  6. 为什么现实向前运行,而优化内部向后递归?
  7. Value Function 如何压缩未来整棵 Scenario Subtree?

G. Scenario Reduction 与 Markov

  1. 为什么低概率极端场景不能简单删除?
  2. 一阶矩、方差和偏度分别描述什么?
  3. 为什么 Moment Matching 不等于完整分布匹配?
  4. Wasserstein 在 Scenario Reduction 中解决什么问题?
  5. Rolling Window、Conditional Scenario 和 Markov Model 有什么区别?
  6. 为什么 Markov 模型最关键的是 state 设计,而不是“价格满足马尔科夫”这句话?
  7. 对约 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;
  • 场景概率估计误差。

江苏业务落地

  • 真实结算公式;
  • 真实决策机会;
  • 中长期、日前、实时之间的业务映射;
  • 可用负荷和价格预测;
  • 交易量上下限和市场流动性。

推荐的建模实施顺序

实际建模可优先按照:

\[\boxed{ \text{真实数据字典与结算公式} \rightarrow \text{单时点 Two-stage 对账} \rightarrow \text{Rolling-window SAA} \rightarrow \text{Walk-forward} \rightarrow \text{Risk-neutral vs Mean-CVaR} \rightarrow \text{EVPI/VSS/Regret} }\]

基础模型跑通后,再逐步加入:

\[\boxed{ \text{Complete Recourse} \rightarrow \text{L-shaped/Benders} \rightarrow \text{Conditional Scenario} \rightarrow \text{Multistage} \rightarrow \text{Scenario Reduction} }\]

最后才进入:

\[\boxed{ \text{Nested Risk} \rightarrow \text{Time Consistency} \rightarrow \text{DRO} }\]

最小记忆版

如果隔一段时间忘了,只先恢复这十句话。

  1. 随机规划研究的是:未来不知道时,现在怎么决策。
  2. Two-stage 是:
\[x\rightarrow\xi\rightarrow y\]
  1. \(Q(x,\xi)\) 是给定 \(x,\xi\) 后第二阶段最优成本。
  2. Scenario Tree 描述信息何时揭晓。
  3. Non-anticipativity 是:同一信息历史必须同一决策。
  4. EVPI 是信息价值,VSS 是随机优化价值。
  5. SAA 用有限样本均值近似真实期望,再对 \(x\) 优化。
  6. Multistage 的解是一套 Policy,不是一串提前写死的数。
  7. Value Function 是:从当前状态往后能达到的最小期望成本。
  8. 电力市场第一版应先做真实结算对账和 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 中常用的现代分布距离工具。

教学边界

本文中所有简化电价、负荷、偏差价差和概率示例,只用于帮助理解数学结构。接入江苏真实数据前,必须以正式市场规则和公司结算结果为准。

本文为教学与研究笔记。简化价格、负荷、概率和结算结构仅用于解释模型;实际市场建模必须重新核验决策时点、可见信息集和正式结算规则。