本节位置:承接第一份笔记中的 Two-Stage、Scenario Tree、Non-anticipativity、EVPI、VSS;本节继续学习“如何把随机规划做得更接近真实交易问题”,重点包括风险厌恶、SAA、样本外验证、多阶段策略、状态与价值函数、Backward Recursion。
当前掌握状态:SAA 主干已理解;SAA 统计下界/置信区间细节需要后续复习;Multistage / Policy / State / Backward Recursion 主干已理解;凸性与最优性证明的数学细节尚未闭环。
1. 从风险中性到风险厌恶
第一份笔记里的标准随机规划目标是:
xminE[G(x,ξ)]其中:
- x:策略或决策;
- ξ:未来随机信息;
- G(x,ξ):策略 x 在场景 ξ 下产生的总成本或损失。
风险中性目标只关心:
平均成本最小但两个策略可能有相同的平均成本,却有完全不同的尾部风险。
例如:
| 策略 |
期望成本 |
极端场景成本 |
| A |
40000 |
100000 |
| B |
45000 |
60000 |
如果只看期望,A 更好;如果特别害怕极端亏损,B 可能更符合实际风险偏好。
因此需要把风险度量直接嵌入 stochastic programming。
2. CVaR 在随机规划里怎么用
本节不重新推导 CVaR 本体,只复习它如何进入随机规划。CVaR 的详细推导已在单独的 CVaR 学习笔记中完成。
对随机损失 Z,尾部概率为 α 时:
CVaR1−α(Z)=tinf[t+α1E[(Z−t)+]]其中:
- t:辅助阈值,最优时落在对应 VaR 分位附近;
- (Z−t)+=max(Z−t,0):超过阈值的尾部损失;
- α:尾部概率,例如 α=0.05 对应 95% CVaR。
在电力交易里,可以令:
Z=G(x,ξ)即某个购电策略在电价、负荷、偏差等随机场景下产生的总成本或损失。
3. 两种常见的 Risk-Averse Stochastic Programming 写法
3.1 硬风险预算
目标仍然最小化期望成本:
xminE[G(x,ξ)]但是要求:
CVaR95%(G(x,ξ))≤τ含义:
在控制平均成本的同时,不允许尾部成本超过某个风险预算。
3.2 Mean-CVaR 加权目标
另一种写法:
xminE[G(x,ξ)]+λCVaR95%(G(x,ξ))其中:
表示对尾部风险的厌恶程度。
- λ=0:完全风险中性;
- λ 越大:越愿意牺牲平均收益换取尾部安全。
一个我们做过的例子
策略 A:
E[GA]=40000,CVaRA=100000策略 B:
E[GB]=45000,CVaRB=60000加权目标:
JA=40000+100000λJB=45000+60000λ令两者相等:
40000+100000λ=45000+60000λ得到:
λ=0.125含义:
当风险惩罚权重超过 0.125,B 的低尾部风险开始抵消它在平均成本上的劣势。
4. 有限 Scenario 下的 CVaR 线性化
假设场景为:
s=1,…,S场景概率:
策略 x 在场景 s 下的成本:
引入辅助变量:
并约束:
us≥Gs(x)−t于是:
CVaR1−α=t+α1s∑psus这意味着,如果 Gs(x) 本身是线性的,那么 CVaR 也能被放进一个线性规划框架。
电力采购场景下,一个简单的损失函数可以写成:
Gs(x)=400x+700ysbuy−200yssell再把 CVaR 辅助变量和电量平衡约束一起加入模型。
5. Efficient Frontier 与 Dominance
Mean-CVaR 模型本质上是在两个维度之间做权衡:
E[G]↔CVaR(G)如果一个策略在两个维度上都比另一个策略差,那么它被支配。
例如:
策略 C:
E[GC]=50000,CVaRC=50000策略 D:
E[GD]=55000,CVaRD=80000则:
C 同时拥有更低期望成本和更低 CVaR所以 D 被 C 支配,无论 λ 怎么选,D 都不会成为最优策略。
6. Scenario Generation 和 SAA 不是一回事
这是后面非常重要的区分。
Scenario Generation
回答:
场景从哪里来?可以来自:
- 历史数据;
- Monte Carlo;
- 专家构造;
- 条件采样;
- 聚类 / 场景压缩。
SAA
回答:
拿到有限样本以后,如何用它近似真实期望并做优化?所以:
Scenario Generation=SAA前者负责“造场景”,后者负责“把场景变成优化问题”。
7. SAA:Sample Average Approximation
真实问题:
x∈Xming(x)其中:
g(x)=E[F(x,ξ)]真实分布可能非常复杂,甚至无法直接计算期望。
我们得到 N 个样本:
ξ1,ξ2,…,ξN构造经验平均:
g^N(x)=N1s=1∑NF(x,ξs)然后求:
x^N=argx∈Xming^N(x)这就是 SAA。
8. SAA 最核心的直觉
在 iid SAA 中,每个样本场景被赋予经验概率:
ps=N1因此可以理解为:
当真实概率分布难以直接使用时,先用有限样本构造一个“经验分布”,再在这个经验世界里优化。
但要注意:
我们是在近似真实分布,不是在宣称真实世界就是这 N 个样本。
9. 固定 x 求平均,不等于 SAA 优化
这是学习过程中一个重要分界。
如果固定:
然后计算:
N1s∑F(100,ξs)这只是:
评价这个固定策略而不是 SAA optimization。
真正的 SAA 要让:
可以变化,并求:
x^N=argxminN1s∑F(x,ξs)所以:
Sample Average + fixed x=EvaluationSample Average + optimize over x=SAA
10. SAA 不是一个求解算法
SAA 做的是:
E[F(x,ξ)]→N1s∑F(x,ξs)也就是把随机期望问题变成有限场景优化问题。
但是得到 SAA 问题以后,仍然需要一个 optimization algorithm 去求它。
例如:
- LP Solver;
- MILP Solver;
- L-shaped / Benders;
- 其他分解算法。
因此:
SAA=近似方法,不是optimizer本身
11. SAA 的样本量和稳定性
对固定 x:
q^N(x)=N1s=1∑NQ(x,ξs)其方差:
Var[q^N(x)]=NVar[Q(x,ξ)]所以标准误差大致按:
O(N−1/2)下降。
含义:
Scenario 数量增多,样本平均通常会更稳定,但 Monte Carlo 的收敛并不快。
一个重要提醒:
稳定=正确如果样本本身存在系统性偏差,那么 N 很大,也只是稳定地逼近一个错误分布。
12. 电力价格 Scenario 应该怎么构造
我们讨论江苏数据时,形成了三层复杂度。
Level 1:单时点 / 单时段
例如只研究每天 18:00 的价格:
ξs=P18:00(s)适合:
- 单时点决策;
- 没有跨时段耦合约束;
- 先验证最基础模型。
注意:不能把所有天的 96 点无脑打平,因为这样会破坏“同一时段”的业务含义。
Level 2:分时块 Scenario
例如把一天拆为:
谷段 / 平段 / 峰段 / 晚峰每个 scenario 是一个低维向量。
这是单点和完整日路径之间的折中。
Level 3:完整 96 点路径
每一天作为一个 scenario:
ξs=(P1(s),P2(s),…,P96(s))适用于:
- 96 点之间有耦合;
- 储能;
- 曲线约束;
- 连续持仓调整;
- 跨时段风险。
核心判断:
决策之间如果有路径依赖,就不能把每个点独立抽样。
13. 日前和实时必须保持联合关系
如果一个策略的成本同时取决于:
和:
那么 scenario 应尽量保存:
(PDA,PRT)或者直接保存价差:
ΔP=PRT−PDA不要独立地从两个边际分布分别抽样:
PDA∼FDAPRT∼FRT然后随机拼接。
原因:
日前和实时之间的相关结构本身就是交易风险的一部分。
14. 为什么不能在同一批数据上既找最优又证明最优
假设有 200 天数据。
如果我们用全部 200 天求:
然后仍然在这 200 天上评价:
g^200(x^)那么评价会偏乐观。
因为:
x^ 本身就是专门针对这 200 天优化出来的。
所以要区分:
Optimization Sample和:
Out-of-Sample Evaluation
15. 对时间序列,更适合 Walk-Forward
随机打乱训练/测试在 iid 问题里可以使用,但电力市场具有明显时间顺序。
因此更符合真实交易逻辑的是:
过去数据→训练/构造 scenario/求解→未来数据验证例如:
进一步可以滚动:
[1,150]→151[2,151]→152[3,152]→153这就是 walk-forward。
它和 Non-anticipativity 的精神完全一致:
做历史时点的决策时,不能使用该时点之后的数据。
16. Candidate Solution 的 Optimality Gap
真实目标:
g(x)=cTx+E[Q(x,ξ)]真实最优值:
v∗=xming(x)SAA 求出候选:
它的真实 optimality gap:
Gap(x^)=g(x^)−v∗≥0问题在于:
和:
通常都不知道。
17. 为什么候选策略比较容易评价
一旦:
固定下来,问题就从“优化”变成了“评价”。
可以用一批大的独立 OOS 样本:
ξ1,…,ξN′计算:
g^N′(x^)于是能够对:
构造一个统计意义上的 upper bound:
直觉:
固定一个策略以后,我们只需要反复模拟它在不同未来下的表现,不再需要搜索最优决策。
18. 为什么真实最优值 v∗ 更难估
SAA 的最优值:
v^N=xming^N(x)需要特别注意:
v^N≤v∗并不是每个样本都成立某一次样本可能:
v^N>v∗真正有保证的是:
E[v^N]≤v∗原因可以从:
v^N=xming^N(x)≤g^N(x)开始。
对任意固定 x 取期望:
E[v^N]≤E[g^N(x)]=g(x)再对右侧取最小:
E[v^N]≤v∗这是我们当时重点纠正过的一点。
19. 用多次 SAA 构造 Lower Bound
独立求解 M 次 SAA:
v^N(1),v^N(2),…,v^N(M)求平均:
vˉN,M=M1m=1∑Mv^N(m)由于:
E[v^N]≤v∗所以可以进一步结合样本方差和 t 分布,构造统计意义上的 lower bound:
而候选策略 OOS 评价给出:
于是:
Gap(x^)≲U−L这里的统计置信区间公式细节目前标记为:
主干已懂,统计推导待复习
20. SAA 的完整工作流
到这里,SAA 主线可以压缩成:
Scenario Generation→SAA→x^→OOS Validation→Stability/Gap Check对应业务语言:
先用数据构造未来 → 在样本世界里求策略 → 拿未来未见数据检验 → 检查策略是否稳定、是否接近真实最优。
21. 从 Two-Stage 进入 Multistage
Two-stage:
x1→ξ2→x2Multistage:
x1→ξ2→x2→ξ3→x3→⋯例如电力交易可以抽象成:
年度→月度→日前→实时每一次新的信息揭晓后,都可能再次调整决策。
22. Multistage 最大的升级:Decision 变成 Policy
如果今天直接写:
(x1,x2,x3)很容易误解为:
今天把所有未来动作一次性写死。
但真正的多阶段决策应该是:
π={x1,x2(ξ2),x3(ξ2,ξ3),…}也就是说:
Solution = PolicyPolicy 是:
未来看到什么信息,就采取什么动作。
例如:
x2(系统偏紧)=+20x2(系统宽松)=0真正求的是这整套规则,而不是单独一个未来数字。
23. Policy 和 Non-anticipativity 是同一件事的两个方向
Policy 说:
决策可以依赖已经看到的信息Non-anticipativity 说:
决策不能依赖还没有看到的信息所以:
相同信息历史⇒相同当前决策这正是 Scenario Tree 中共享节点的含义。
24. Reality Forward,Optimization Backward
这是我们学习 Backward Recursion 时最重要的认知修正。
现实世界的执行方向永远是:
S0→a1→ξ2→S1→a2→ξ3→⋯也就是说:
Reality runs forward随着信息逐步揭晓,Scenario Tree 会从大量可能路径逐渐收缩到真正发生的一条路径。
但今天为了决定 a1,必须提前知道:
不同动作会给未来留下什么状态,而这些状态未来值多少钱?
于是 optimizer 内部要:
从未来往现在计算价值即:
Optimization runs backward
25. Scenario 收缩、Backward Recursion、Scenario Reduction 不要混淆
Scenario Tree Execution
现实中随着信息揭晓:
{A,B,C,D}→{A,B}→{A}这是:
现实路径逐步确定Backward Recursion
事前计算:
未来状态值多少钱→今天怎么做Scenario Reduction
为了省算力,在求解前主动:
10000 scenarios→100 representative scenarios这是:
模型近似 / 计算降维三者不是同一件事。
26. 为什么算叶子时不需要知道上面最终做了什么
这是 Backward Recursion 真正被理解的关键。
最开始的疑问是:
算最后一个叶子时,我还不知道前面的节点到底做了什么,怎么能算最后阶段成本?
答案:
最后阶段先算的是一个函数,不是一个固定数字例如:
Q3(q,P)=(100−q)P其中:
是进入最后阶段时已经持有的电量。
我们暂时不知道最终会是:
q=50,80,100中的哪一个。
没关系,先得到整个函数:
q↦Q3(q,P)上一阶段的动作再决定最终把哪个 q 代入这个函数。
27. Value Function / Cost-to-go
最重要的记忆句:
State→从这个状态往后能够达到的最小成本这就是 Value Function。
例如:
表示:
当前处于状态 st 时,从现在一直到结束,在以后都采取最优动作的前提下,能够达到的最小期望总成本。
它不是:
- 当前动作;
- 当前成本;
- 单独一个未来 Scenario 的成本。
它是:
从现在开始整段未来的最优价值
28. State 到底是什么
我们后来把书里的 xt 暂时换成更直观的:
表示 state。
State 不是“所有历史数据”。
更好的定义:
st=截至现在,对未来决策仍然有用的信息的充分摘要例如电力交易里,可以粗略写成:
st=(qt,L^t,供需状态,价格状态)其中:
- qt:当前持仓;
- L^t:最新负荷预测;
- 供需状态:偏紧 / 宽松;
- 价格状态:影响未来价格分布的信息。
29. 为什么只知道“持仓=80”可能不够
两个状态都持仓:
但:
A:39℃、负荷继续上调、系统偏紧;
B:25℃、负荷继续下调、系统宽松。
则:
P(ξt+1∣IA)=P(ξt+1∣IB)所以:
Vt(80∣IA)=Vt(80∣IB)因此:
相同持仓=相同状态只要信息会影响未来条件分布、约束或成本,它就应该被 state 保留。
30. State 要足够,但不要冗余
假设两条历史路径完全不同,但到了当前:
- 持仓相同;
- 当前约束相同;
- 对未来所有随机变量的条件分布相同。
那么 optimizer 不需要再区分完整历史。
所以:
State 是对历史的压缩,不是历史本身。判断标准:
在知道当前 state 后,额外知道过去,还会不会改变对未来的预测或可行动作?
如果不会,这部分历史可以丢掉。
这已经非常接近 Markov 思想:
P(未来∣st,完整过去)=P(未来∣st)目前只需要理解这个直觉,不需要继续展开 Markov 理论。
31. Action 和 State 不能混
定义:
at=当前阶段采取的动作例如:
at∈{不买,买20}而:
st+1=动作 + 新随机信息共同形成的下一状态因此:
at=st+1更准确的关系是:
(st,at,ξt+1)→st+1例如:
当前持仓 80,选择买 20,再遇到实时价格 700:
(80,买20,700)→(100,700)
32. QH(xH−1,ξH) 的三个角色
Birge & Louveaux 在最后阶段写:
QH(xH−1,ξH)=xHmincHxHsubject to:
WHxH=hH−TH−1xH−1这里:
xH−1
上一个阶段留下来的状态 / 输入ξH
进入最后阶段后已经揭晓的环境信息xH
最后阶段当前真正要优化的动作所以:
不是一个动作,而是这个最后阶段小优化问题的最优值函数。
33. 带随机状态的 Q 和取完期望的 Q
这是多阶段递归里另一个关键区别。
未来已经揭晓
Qt+1(xt,ξt+1)含义:
给定当前留下的状态 xt,并且下一阶段真实随机状态已经发生后,后面最优成本是多少?
未来还没揭晓
当前阶段真正需要的是:
Qt+1(xt)=E[Qt+1(xt,ξt+1)∣It]含义:
当前还不知道下一阶段真实情况时,这个状态对应的未来最优期望成本。
所以月度阶段如果还不知道实时价格 PRT,就不能偷看:
QRT(x,PRT)而应该使用:
QRT(x)
34. 信息更新为什么会改变 Value Function
同样持仓:
但是当前信息不同:
IA=系统明显偏紧IB=系统明显宽松则未来实时价格条件分布可能不同:
P(PRT∣IA)=P(PRT∣IB)所以:
QRT(80∣IA)=QRT(80∣IB)完整链条:
信息更新→条件分布更新→Q/V 更新→最优动作更新这就是 Multistage 相比于简单 Two-Stage 真正多出来的动态性。
35. 当前动作的总价值:Jt(st,at)
为了避免把“动作”和“状态价值”混在一起,我们引入:
Jt(st,at)=Ct(st,at)+E[Vt+1(st+1)∣st,at]其中:
- Ct:现在做这个动作的直接成本;
- Vt+1:动作和随机结果把系统送入下一状态后,从那里往后的最优未来成本。
所以:
Jt=选定某一个动作后的总期望成本
36. Value Function:Vt(st)
当前状态有多个可选动作:
a1,a2,…每个动作有自己的:
Jt(st,ai)真正的状态价值是:
Vt(st)=atminJt(st,at)也就是:
Vt(st)=atmin[Ct(st,at)+E[Vt+1(st+1)∣st,at]]这就是我们目前对 Bellman / Backward Recursion 最直观的理解。
37. min 和 argmin 不要混
假设:
J(a1)=40J(a2)=32J(a3)=35那么:
Vt(st)=32因为:
min(40,32,35)=32而最优动作:
at∗=a2因为:
at∗=argatminJt(st,at)所以:
min→最优值是多少argmin→哪个动作取得最优值
38. 我们亲手做过的一轮 Backward Recursion
当前状态:
st=(持仓80,系统偏紧)两个动作:
a1=不买a2=买20当前买入价:
350 元/MWh实时价格:
PRT={700,200,70%30%下一阶段 Value Function 已经提前算好:
Vt+1(80,700)=14000Vt+1(80,200)=4000Vt+1(100,700)=0Vt+1(100,200)=0
38.1 动作 1:不买
当前成本:
未来期望成本:
0.7×14000+0.3×4000=9800+1200所以:
Jt(st,不买)=11000
38.2 动作 2:买20
当前成本:
20×350=7000买完持仓 100,未来补购成本:
所以:
Jt(st,买20)=7000因此:
Vt(st)=min(11000,7000)=7000最优动作:
at∗=买20
39. 再往前倒一层
回到:
st−1=(持仓60,尚不知道系统松紧)两个动作:
当前价格:
300 元/MWh下一阶段:
P(偏紧)=60%P(宽松)=40%已知:
Vt(80,偏紧)=7000Vt(80,宽松)=2000如果买 20:
Jt−1(买20)=6000+0.6×7000+0.4×2000=6000+4200+800=11000如果不买,假设:
Vt(60,偏紧)=16000Vt(60,宽松)=6000则:
Jt−1(不买)=0.6×16000+0.4×6000=9600+2400=12000于是:
Vt−1(st−1)=min(11000,12000)=11000最优动作:
at−1∗=买20
40. 为什么这叫“递归”
上一轮我们求出来的:
在更前一层已经不再是最终答案,而变成:
下一层可以直接调用的未来价目表因此:
Vt+1→Vt→Vt−1→⋯→V0每往回一层都做同一件事:
比较当前动作→当前成本+未来价值→取最小→生成新的 Value Function
41. Value Function 为什么能压缩整棵未来子树
假设从某个当前状态往后还有:
- 多个价格场景;
- 多个负荷场景;
- 多个未来动作;
- 多级 Scenario Tree。
一旦这些都在下一层被优化过,就可以把整棵 subtree 压缩成:
Vt(st)所以更前一层不用重新展开所有叶子,只需要查:
这个下一状态值多少钱?这就是 Dynamic Programming 能够做 backward recursion 的核心结构。
42. “当前局部最优” vs “基于当前信息的全局最优”
每一阶段并不是只最小化:
Ct(st,at)否则容易出现:
现在便宜,但给未来留下一个非常昂贵的状态。
真正比较:
Ct(st,at)+E[Vt+1(st+1)]所以:
当前阶段追求的是“基于当前信息的全局最优”,不是当前成本局部最优。
43. Ex-Ante Optimal 和 Ex-Post Optimal
即使一个策略是当时信息条件下的最优:
真实未来发生后,回头看可能存在一个更好的动作。
这不代表原决策一定错。
需要区分:
Ex-Ante Optimal
基于决策时点当时可获得的信息,做出的最优决策Ex-Post / Oracle Optimal
已经知道真实未来以后,回头计算出来的最优决策所以:
事后亏损=证明事前决策错误这和第一份笔记中的:
RPvsWS是同一条逻辑。
44. 电力交易复盘因此要拆成两层
以后做交易复盘,不能只问:
实际价格发生后,哪个策略赚得最多?
还要问:
在当时的信息集下,真实可实施的策略中,哪个是最优?
因此可以区分:
Strategy / Decision Quality和:
Forecast / Distribution Quality一个决策可能:
- 事后结果很差,但基于当时分布是合理策略;
- 事后碰巧赚钱,但当时实际上是一个风险极高的错误决策。
45. 目前还没有完全闭环的数学问题
我们已经知道 Birge & Louveaux 对多阶段随机线性规划给出:
- 相应 feasibility sets 和 value functions 具有凸性;
- 有限 scenario 时进一步具有 polyhedral 性质。
但是下面这些数学层面的证明目前还没有真正掌握:
为什么递归后仍然凸?为什么求到的是模型内全局最优?LP duality / KKT / optimality certificate 如何严格证明最优?所以这里明确标记:
Needs Evidence / Later Review不要因为主线暂时继续,就误以为这部分数学已经完全掌握。
46. 本节完整知识链
这一节可以压成:
Risk Neutral→CVaR Risk Control然后:
True Distribution→Scenario Generation→SAA→x^→OOS→Gap/Validation再继续:
Two-Stage→Multistage→Policy→State→Value Function→Backward Recursion最后形成:
信息更新→条件分布更新→状态价值更新→最优动作更新
47. 复习时最应该检查的 15 个问题
如果下面问题能脱稿回答,本节主干基本恢复。
- Risk-neutral stochastic programming 为什么可能不够?
- Mean-CVaR 和 CVaR hard constraint 分别表达什么风险偏好?
- Scenario Generation 和 SAA 有什么区别?
- 为什么 SAA 场景通常可以看成每个概率 1/N?
- 固定 x 求样本平均为什么不叫 SAA optimization?
- 为什么“样本更多”只能说明更稳定,而不能自动说明更正确?
- 为什么日前和实时场景不能随意独立重采样?
- 为什么交易回测更适合 walk-forward,而不是随意随机打乱?
- Gap(x^)=g(x^)−v∗ 中,哪个量容易 OOS 估计,哪个更难?
- 为什么不能写成“每次 v^N≤v∗”,而只能说 E[v^N]≤v∗?
- Multistage 的 solution 为什么是一套 policy,而不是一串提前写死的数字?
- Reality Forward 和 Optimization Backward 分别是什么意思?
- State 为什么不是完整历史,而是对未来仍有用的信息摘要?
- Jt(st,at) 和 Vt(st) 有什么区别?
- min 与 argmin 分别给出什么?
48. 最小记忆版
如果过几天忘了细节,只先恢复下面这些。
Risk-Averse
minE[G]+λCVaR(G)SAA
E[F(x,ξ)]≈N1s=1∑NF(x,ξs)x^N=argxming^N(x)Validation
Gap(x^)=g(x^)−v∗E[v^N]≤v∗Gap(x^)≲U−LMultistage Policy
π={x1,x2(ξ2),x3(ξ2,ξ3),…}State
st=截至现在,对未来决策仍有用的信息摘要Value Function
Vt(st)=从当前状态往后能够达到的最小期望成本Action Value
Jt(st,at)=Ct(st,at)+E[Vt+1(st+1)∣st,at]Backward Recursion
Vt(st)=atminJt(st,at)at∗=argatminJt(st,at)最核心的一句话
未来先告诉现在:“你给我什么状态,我就告诉你以后最少要花多少”;现在再决定:“那我应该通过什么动作,把系统送到哪个状态”。
49. 下一阶段学习入口
当前已经具备继续进入下面内容的基础:
Scenario Tree ExplosionScenario ReductionRolling HorizonL-shaped/Benders Decomposition再往后才进入更高级的:
Nested CVaR/Dynamic Risk/Time Consistency/DRO
50. 参考来源与对应章节
-
John R. Birge & François Louveaux, Introduction to Stochastic Programming:
- Chapter 2.5:Random Variables and Risk Aversion
- Chapter 3.5:Multistage Stochastic Programs with Recourse
- Chapter 10:Monte Carlo Methods
-
Alexander Shapiro & Andy Philpott, A Tutorial on Stochastic Programming:
- Section 2.2:Monte Carlo / SAA
- Section 2.3:Candidate solution evaluation / optimality gap
- Section 3:Multi-stage stochastic programming / policy / backward dynamic programming
- Section 4:Risk-averse optimization / chance constraints / VaR / CVaR
-
Rockafellar & Uryasev, Optimization of Conditional Value-at-Risk:
- CVaR 辅助函数与 scenario-based optimization 形式。