库存效益函数


首页 » 资源 » 此处
作者:Joannès Vermorel,2015 年 12 月(最后修订时间:2017 年 2 月)

库存效益函数用于量化库存中持有特定数量的库存单位所产生的预期正/负收益。从根本上说,库存效益函数解决了库存中增加一个库存单位可以给我们带来什么?的问题。通过该函数可以制定优先订货策略,即根据库存单位具体的经济收益确定所有库存单位的优先级。Lokad 建议您在大多数库存优化情形中使用库存效益函数。


不太偏技术性的角度

从纯粹的预测角度而言,未来需求最好表示为与未来所有可能的情形相关的概率;也即需要 0 个单位的概率,需要 1 个单位的概率,等等等等。然后根据相应情形,来针对每个项目(产品、SKU、条码)计算此类概率。

但是,尽管这些概率提供了有关未来的详细信息,但并未给出任何有关库存决策方面的信息。库存决策不能单凭需求概率做出,也应当考量各种财务风险。

举个例子,假设两种产品的需求概率相同。如果第一种产品的存放期很长,而第二种产品的存放期很短,那么从库存的角度来说,在库存中多准备一些这种存放期较长的产品是很合理的。

库存效益是一种数学函数,其做用就是在考虑供应该项目时的未来需求概率预测以及若干反映预期利润的经济变量,以及该项目因无需求而始终位于库存中时的预期成本的情况下,计算在库存中多增加一个单位时的收益率。

Lokad 将库存效益函数视为现代库存优化的基石。由库存效益函数得出的解决方案通常优于采用原生方法(包括针对特定的服务水平或供货率)得出的答案。实际上后面这些方法忽略了所有不利的方面,也即与库存中的项目未售出相关的成本。


库存效益的经济因素

库存效益分析是一种经济学分析,目的是确定某种存货状态的财务收益。为此,我们需要引入若干影响存货收益的基本经济因素。

这个经济角度不应只局限于原生利润最大化分析。具体来说,客户缺货所产生的成本是分析当中一个不可或缺的部分。这种方法只提供旨在平衡存货成本与缺货成本的框架,但是,找到适当的平衡往往完全取决于具体的行业。

假定持续时间与交付周期相同,我们不妨定义与一个 SKU 相关联的三个变量:

  • $M$ 表示销售 1 个库存单位获得的毛利润
  • $S$ 表示因未能供应 1 个库存单位产生的缺货代价(负收益)
  • $C$ 表示保管未销售的 1 个库存单位产生的持有成本(负收益)

在没有评估这些变量的情况下,不能进行库存优化,从这个意义上说这些变量算是基本变量。在未对上述变量进行基本评估的情况下,任何排序方法都会存在下面的一个或多个问题:

  • 这种方法不能反映出(也许不会发生的)未来需求的相关库存风险。因此,这种方法也许可以提供良好的服务水平,但会导致库存积压。
  • 这种方法不能反映出客户端的缺货成本,也不能体现出因未能满足客户需求导致的机会损失。
  • 这种方法不能反映出供应该库存单位并产生利润(进而用以维系库存本身)的重要性。

基于这些考量,我们来看一下两个简单的关于需求是否超出库存的情形。假设 $k$ 为库存单位数,$y$ 为客户需要的库存单位数。

如果库存超出需求,即 $k \geq y$,那么库存的直接效益就是 $yM+(k-y)C$。$yM$ 表示供应给客户的 $y$ 个库存单位产生的相关效益,$(k-y)C$ 表示给定周期结束时未售出的 $(k-y)C$ 个库存单位产生的持有成本。

如果需求超出库存,即 $k < y$,直接效益就是 $kM+(y-k)S$。前 $k$ 个库存单位供应充足,收益为 $kM$,但随后的 $y-k$ 个库存单位处于缺货状态,缺货成本为 $(y-k)S$。

库存效益函数的定义

我们在上一节中计算了直接效益,但是,库存优化是一个反复进行的过程。下一个时段未售出的库存单位,在后续的时段中可能会被售出,因此会产生延迟的利润。下一个时段未售出的库存单位可能在后续时段也未售出,由此产生进一步延迟的持有成本。库存效益函数不只考量下一个时段,而是考量后续所有时段,由此解决了这道难题。

库存效益函数的定义如下:

$$R(t,k)= \begin{cases} kM+(y_t-k)S, & \text{if $y_t \geq k$ (stock-out)} \\ y_tM+(k-y_t)C + \alpha R^*(t+1, k-y_t), & \text{if $y_t < k$ (leftover)} \end{cases}$$

其中,
  • $k$ 表示库存中持有的库存单位数
  • $y_t$ 表示周期 $t$ 内的需求
  • $M$、$S$ 和 $C$ 表示之前引入的经济变量
  • $\alpha$ 表示折扣系数(下文会进行介绍)
  • $R^*$ 等同于 $R$,但 $S=0$(同样会在下文介绍)

这道公式乍看似乎有点复杂,其实只是关于一个 SKU 的简单模型而已,其中库存单位为 $k$,需求的单位为 $y_t$。除了 $\alpha R^*(t+1, k-y_t)$ 变量外,该表达式与上文详述的直接效益相同。

为了将后续所有时段都纳入考量范围,还需要进行两项操作。首先是对效益函数本身进行递归调用,即总效益为下一个时段的效益(或损失)加后续所有时段的效益(或损失)之和。一个函数趋于无穷初看之下令人费解,但其实它只是想反映出未售出的存货会从一个时段延续至下一个时段而已。

其次,我们要为未来的效益引入 $\alpha$ 作为折扣系数。这种方法受到的启发来自于贴现现金流,它所反映的事实是远期产生的利润价值不如近期产生的利润价值高。这种逻辑同样适用于成本:即时成本的影响高于远期发生的成本的影响。

最后一点,递归是使用 $R^*$ 进行的,即忽略缺货成本,而是采用 $R$。它所反映的是,当前库存只是用于防止当前时段发生缺货,而不是用于防止其他任何交付时段内缺货。根据定义,交付周期表示当前库存所覆盖的持续时间。对于下一个时段,按照定义,将通过另外一次机会采购更多存货(下文会介绍如何处理无再订货的案例)。因此,一个时段内不发生缺货的责任将随之流入下一个时段,这就涉及到后续的存货决策。

库存效益函数的概率估算

库存效益函数的表达式 $R$ 依赖于通常未知的未来需求 $y_t$。但是,如果提供有预测结果,我们仍可以计算出 $R$。要计算 $R$,建议采用未来需求的概率预测,即不只是估计未来的平均需求,也要估计完整的概率分布。根据这一观点,我们可以引入 $\hat{R}$,对基于概率需求预测的 $R$ 进行经验估计。函数 $\hat{R}$ 的表达如下: $$ \begin{align} \hat{R}(t,k)= & \sum_{y |y \geq k} \mathbf{P}(Y_t=y) ( kM+(y-k)S ) \\ & + \sum_{y|y < k} \mathbf{P}(Y_t=y) ( yM+(k-y)C + \alpha \hat{R}^*(t+1, k-y) ) \end{align} $$ 通过这个表达式,原先的 $R$ 表达式就可以转换为条件概率。第一行反映的是缺货情形,第二行反映的是库存剩余的情形。这两行均根据各自的概率进行加权。

从下文可以看出,出于实用目的,可以计算出 $\hat{R}$。事实上,Lokad 提供了一种叫做 stockrwd 的内置函数,利用该函数可以准确实现这道公式。下文会对此进行详细介绍。

实际上,之所以唯一可用的度量结果只有 $\hat{R}$,个中原因在于 $R$ 无法进行有效计算 – 因为未来需求是未知的。因此,通过库存效益函数,我们可以引用估计值 $\hat{R}$,而不是"实际"的函数 $R$。另外还要注意一点,估计值 $\hat{R}$ 的准确度取决于基本概率预测的准确度,但有关这一点的介绍不在本文的范畴之内。

库存效益函数的属性

库存效益函数可以写成 $R(k, M, S, C)$ 来强调经济变量。库存效益函数意味着各分量相加: $$\begin{align} R(k, M, S, C) = & R(k, M, 0, 0) + \\ & R(k, 0, S, 0) + \\ & R(k, 0, 0, C) \end{align}$$ 库存效益函数与 $M$, $S$ 和 $C$ 呈线性关系: $$\begin{align} R(k, aM, bS, cC) = & aR(k, M, 0, 0) + \\ & bR(k, 0, S, 0) + \\ & cR(k, 0, 0, C) \end{align}$$ 这些属性会自然而然地扩展到 Lokad 提供的 Envision 函数——stockrwd

Envision 中的 stockrwd 函数

stockrwd 是一种 Envision 功能函数,Lokad 使用该函数来实现库存效益函数,更准确地说是提供概率估计,前提是有现成的概率预测结果。由于我们对库存中的第  k 个库存单位的效益增量感兴趣,所以可以将这个 Envision 函数定义为: $$\text{stockrwd}: k \to R(k)-R(k-1)$$ 相应的 Envision 语法为:
RM = stockrwd.m(Demand, AM) * M // margin reward component
RS = stockrwd.s(Demand) * S // stockout penalty component
RC = stockrwd.c(Demand, AC) * C // carrying cost component
R = RM + RS + RC // recomposing the stock reward with point-wise additions
Envision 将库存效益函数分解为三个分量。由于各分量与相应的经济变量呈线性关系,因此调用 stockrwd() 函数时经济变量将被排除在外。这种分解有助于检查库存效益生成的经济数量,便于调整推动计算的经济假设。

第 1 个参数 Demand 为分布。该分布表示需求概率,通常由预测引擎生成。因此,Demand 不仅应当是分布,也应当是随机变量(质量等于 1)。

MSC 这三个变量是本文开头定义的经济变量。参数 AMAC 是两个不同的折扣系数。 SC 应为负数。 AMAC 这两个值也应包含在 $[0;1[$ 段中。

此函数返回 R——一种反映 $k \to R(k) - R(k-1)$ 的分布。请注意,这种分布并非随机变量,而是经济效益函数。实际上,其形式定义表明了它甚至不是紧支集 分布。Envision 有专门的算法,可精准处理此类非紧凑型分布。

我们来看一下经济变量的典型定义:
M = SellPrice - BuyPrice
S = -0.5 * (SellPrice - BuyPrice) // 0.5 arbitrary
C = -0.3 * BuyPrice * mean(Leadtime) / 365 // 0.3 arbitrary
AM = 0.3 // 'A' for margin component
AC = 1 - 0.2 * mean(LeadTime) / 365 // 'A' for carrying cost component
其中:
  • M 定义为每个单位的毛利润。
  • S 被任意定义为毛利润的 0.5 倍。其影响视行业而定,具体取决于客户对缺货的容忍程度。
  • C 表示为年持有成本,占每年初始采购价格的 30%。系数 C 反映 mean(LeadTime) 周期,单位不是年而是天。
  • AM 为边际效益的折扣系数,表示为从一个周期到下一个周期逐步降低 70%。
  • AC 为持有成本的折扣系数,表示为未来效益中 20% 的年度折扣。同样,这个值也会进行扩展,以便通过 mean(Leadtime) / 365 契合交付周期。

实际上,交付周期概率也由预测引擎进行预测。因此在上面的脚本中,我们假定了 Leadtime 是一种分布。

边际成本与持有成本的折现系数

上述折现系数 A 针对库存效益函数中的三个分量的用法是不同的。

对于库存效益的边际分量,仍存在后期购买更多库存的可能。因此,折现系数非常不利于仅在后期才会产生边际效益的采购数量。事实上,根据定义,后期购买更多库存以满足未来需求的可能仍然存在。这就是为什么我们建议折扣力度要大 AM = 0.3 的原因。

对于库存效益的“缺货处罚分量”,根据定义,折现系数始终为零。因此,折现系数不影响该分量。

对于库存效益的“持有成本分量”,库存使得金融资产减少。对于 AC,我们建议采用 20% 的年度折扣,因为库存只会随着时间的推移而产生成本,因为还要考虑机会成本:现在投入的用于购买存货的资金无法用于后续观察到未来需求的情形。

未交货订单与库存效益

未交货订单让情况变得复杂化。当存在未交货订单时,未来的需求只有部分未知;因为未交货订单数量被假定为已知。此外,由于客户耗费了额外的精力在产品延期交货上面,因此履行未交货订单通常被认为比履行常规订单更为重要。下面的脚本说明了如何结合库存效益函数与未交货订单。
MB = 0.5 * SellPrice // arbitrary
SB = 0.5 * SellPrice // arbitrary

RM = MB * uniform(1, Backorder) + (stockrwd.m(Demand, AM) * M) >> Backorder
RS = SB * uniform(1, Backorder) + zoz(stockrwd.s(Demand) * S) >> Backorder
RC = (stockrwd.c(Demand, AC) * C) >> BackOrder
R = RM + RS + RC // plain recomposition

MBSB 这两个经济变量表示延期交货单位本身的单位边际效益和缺货惩罚。虽然我们也可以使用 MS,但如上所述,未交货订单通常被认为比常规订单更重要。

这段脚本大量使用了 Envision 提供的 >> 移位运算符。实际上,由于延期交货数量的前提是需求已知,因此效益分布相应转移到右边。请注意,先转移需求(即 Demand)不会产生相同的结果。事实上,转移需求会告知库存效益这一点:在今后的每个周期,Backorder 数量将保证满足需求。

库存效益的视觉展示

至此,库存效益函数可能仍感觉有点神秘。在下面提供的视觉展示中,展现了在存在未交货通知单的情况下应用库存效益分析时与需求相关联的一系列变换。

Image

第一张图的标题叫做“未来需求”,展示了与给定 SKU 相关联的概率需求预测。这条曲线表示概率分布,曲线下的总面积等于 1。在这种背景下,未来需求隐式关联交付周期概率预测,也表示为概率分布。此类分布通常通过概率预测引擎生成。

边际供货率图表示由每个额外的库存单位捕获的额外需求部分。换言之,此图展现了库存增加时供货率的变化情况。由于这里展示的是边际供货率,因此曲线下的总面积等于 1。边际供货率分布可以采用 fillrate() 函数计算。

未交货订单需求图与未来需求图相同,不同之处在于引入了 8 个单位来表示未交货订单。未交货订单体现了有保证的需求,因为这些单位已被客户购买。因此,当引入延期交货单位时,需求的概率分布转移到右边,因为延期交货的单位等于有保证的需求。移位运算符 >> 可用作分布代数的一部分,来计算初始分布上的这种变换。

未交货订单供货率边际供货率图非常相似,但也右移了 8 个单位。在这里,绘制的供货率仅与不确定的需求相关联,因此分布形状保持不变。

边际效益图表示库存效益函数以未交货订单需求为输入计算得出的边际经济效益。库存效益可以视为分布,但这不是概率分布:曲线下的面积不等于 1,而是等于通过无限库存捕获的总边际效益。在图的左边,每个延期交货单位产生相同的边际效益,这并不奇怪,因为捕获已经购买的这些单位的边际效益是板上钉钉的事。

缺货惩罚表示库存效益函数的第二分量。分布的形状可能会有点意想不到,但这种形状仅反映出这一点:通过构建库存效益函数,曲线下的总面积为零。直观地说,库存水平从零开始即可得出所有缺货惩罚的总和,因为缺失所有需求。接着向右移动,可以看到更高的库存水平能够满足越来越多的需求,从而缺货惩罚逐渐减少直至没有惩罚为止,因为此时整个需求都得以满足。未服务于未交货订单的缺货惩罚表示为大于未服务于未来需求的惩罚。在这里,我们展示了的前提是:相比未购买任何项目的客户,已延期交货的客户通常有着更高的服务期望。

持有成本图表示库存效益函数的第三个同时也是最后一个分量。由于持有成本没有上限 - 总是可以再增加一个库存单位,因而会进一步增加持有成本 – 所以分布具有分散的特点:右侧趋向于负无穷大。曲线下的总面积为负无穷大,不过这是一个相当理论化的观点。在右侧,与延期交货单位相关的持有成本为零:事实上,这些单位已被客户购买,不会产生任何持有成本,因为这些单位将尽快发运给客户。

最后的库存效益 - 上面未展示 - 将通过对库存效益函数的三个分量求和来获取。所得到的分布将解读为额外获取一个库存单位所产生的投资回报率。这种分布通常以正值开始,第一个库存单位是盈利的,但是随着我们转向越来越高的库存水平,它会收敛为负无穷大。

支集一词通常是指与非零概率相关联的需求水平。在上图中,术语_支集_泛指需由 Envision 作为非零值处理的整个范围。特别值得一提的是,有多项计算需要扩展分布支集,以确保最终得到的分布不会被截断。

  • 当存在未交货订单时,移位运算要求支集增加延期交货的单位数量。
  • 库存效益函数的边际成本和持有成本在右侧没有理论上的限制,可以要求扩展任意大的支集。
  • 订单限制(例如 MOQ)可能要求库存水平高于移位分布所达到的库存水平。对分布的尾部进行适当评估是估计 MOQ 能否满足盈利性的关键。

上述说明中值得注意的一点是需要将库存效益函数的计算扩展到非零需求范围之外。事实上,只要存在 MOQ,公司可能就不得不购买超出覆盖下一周期未来需求 100% 服务水平的商品。库存效益函数同样涵盖了这些情况。下文将详细介绍 MOQ 的影响。实际上,Envision 运行时可以自动调整支集,以确保在计算过程中不会截断分布。

了解典型情况

库存效益函数反映了存货相对较少时的财务后果。如我们所见,去除该模式中的任何一项都是不明智的,否则将无法反映出一个 SKU 单位的三种基本状态:已售出、缺货或有存货。通过调整经济变量,库存效益经过调整后便可以反映出相应的状态。

航空航天

在航空航天工业中,需要备好备用部件以保证飞机得到正常维护。缺少 NO-GO 备用部件将触发 AOG(飞机停航待修)事件,这类事件所造成的损失远远超过备用部件本身。

在这种情形中,可以很合理地得出:

  • M=0(除非部件维修后可以获得高价值),部件维修不会创造利润。
  • S= 常量,因为所有 NO-GO 部件都能导致飞机停航待修,缺货造成的代价是一致的。
  • C= 常量(按年计算),因为大部分部件使用寿命较长,在第一种方法中将年度持有成本按常量进行估计是可行的。

报纸

就报纸库存而言,可以认为一张报纸只能在下一个周期内售出,否则在下下周期将彻底失去其市场价值。报纸是此类产品的原型,但并非唯一的情形。高度季节性的易腐的产品也存在类似的情况,此类产品可供销售的时间非常短。

在这种情形中,我们可以得出:

  • M 为毛利润
  • S 为毛利润的一部分
  • C = 0,因为没有任何库存从一个周期延续至下一个周期
  • A = 0,同上,未来的周期内无法获得任何效益