风险价值VaR,CVaR和鲁棒优化RO,分布式鲁棒优化DRO区别,和库存模型的联系(python代码)
Value at Risk (VaR) 在金融监管中被广泛采用,其数学本质是损失分布在给定置信水平下的分位数,因此刻画的是高概率情形下的最大损失。

将VaR用到库存模型定义下:

因此我们可以求VaR 约束型库存模型:在求平均成本最小的同时要求“高概率下库存损失不超过一个上限:

还可以求VaR 最小化模型,追求高置信水平下的最坏可接受库存成本:

然而,VaR只看分位点,95% 的需求情形下,库存系统的成本不超过 VaR;但最坏的 5% 需求情形中,损失可能非常大,VaR 不关心它们有多大。这在需求波动大、缺货代价极高的库存系统中是致命问题。这也是引入 Conditional VaR (CVaR) 的动机之一。库存CVaR定义如下:即在最坏的 1-\alpha的需求情形下,库存成本的平均水平。它衡量的是极端需求冲击下缺货或积压导致的平均灾难性成本。

CVaR 有一个非常重要的可优化表示:

因此CVaR Newsvendor 模型可以写为如下,这使得问题保持凸性并可以直接数值求解。

如果用n个需求样本近似期望,则目标变成可计算的确定性问题:

下面给出用“样本近似”的方式,算一个给定订货量 Q下的平均成本、VaR 和 CVaR的python代码。
import numpy as np
def empirical_var(losses, alpha=0.95):
"""经验 VaR:VaR = inf{x: F(x) >= alpha} 的离散实现(左分位)"""
losses = np.asarray(losses, dtype=float)
return np.quantile(losses, alpha, method="lower")
def empirical_cvar(losses, alpha=0.95):
"""经验 CVaR(ES):取超过 VaR 门槛的尾部平均"""
losses = np.asarray(losses, dtype=float)
var = empirical_var(losses, alpha)
return losses[losses >= var].mean()
def newsvendor_cost(Q, D, h=1.0, p=8.0, c=0.0):
"""
cost = h*(Q-D)^+ + p*(D-Q)^+ + c*Q
"""
Q = float(Q)
D = np.asarray(D, dtype=float)
holding = h * np.maximum(Q - D, 0.0)
shortage = p * np.maximum(D - Q, 0.0)
return holding + shortage + c * Q
rng = np.random.default_rng(0)
n = 2000
D = rng.normal(loc=100, scale=20, size=n)
D = np.maximum(D, 0.0)
Q = 110
alpha = 0.95
L = newsvendor_cost(Q, D, h=1.0, p=8.0)
print(L)
print("mean:", L.mean())
print("VaR:", empirical_var(L, alpha))
print("CVaR:", empirical_cvar(L, alpha))
可以看到CVaR 建模的是在给定需求分布下的尾部风险厌恶,在这个分布下,最坏会怎样?下面我们说RO和DRO,这是一次“世界观升级”,不是风险度量升级。鲁棒优化直接换问题:如果我连分布都看错了,最坏会怎样?关于DO和DRO的介绍可参考分布式鲁棒优化。
值得注意的是,在库存模型中,某些 DRO 问题等价于 CVaR 。
例如Wasserstein DRO ⇔ “分位 + Lipschitz 惩罚,库存中若成本对需求是 Lipschitz,使用 Wasserstein 球,则最坏分布会把概率质量推向缺货最严重区域,行为上非常像极端尾部 CVaR,但风险水平由 半径 \varepsilon控制而不是 \alpha;还有ϕ-divergence DRO ⇔ CVaR:

更多推荐
所有评论(0)