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:

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐