Fonction de récompense associée au stock

Par Joannès Vermorel, Décembre 2015 (dernière mise à jour février 2017)

La fonction de récompense associée au stock quantifie les résultats, positifs et négatifs, qu'il est possible d'attendre du stockage d'un certain nombre d'unités d'un produit. Fondamentalement, cette fonction répond à la question suivante : que gagnons-nous à stocker une unité supplémentaire ? Elle peut être utilisée pour établir un ordre de priorité des commandes dans lequel toutes les unités ont un niveau de priorité en fonction des résultats économiques qu'elles peuvent générer. Lokad recommande l'utilisation de la fonction de récompense associée au stock dès lors que vous souhaitez optimiser ce dernier.


Présentation générale

Du point de vue purement prévisionnel, ce sont les probabilités associées à chaque futur possible qui représentent le mieux la demande future. C’est à dire la probabilité que la demande soit nulle, qu’elle soit de 1 unité, de 2 unités... pour chaque article (produits, SKU, code-barres), en fonction du contexte.

Mais, même si ces probabilités décrivent en détail le futur, elles ne fournissent aucune indication sur les décisions à prendre en matière de stock. Ces dernières ne peuvent reposer uniquement sur des probabilités de demande, le risque financier doit également être pris en considération.

Prenons par exemple deux produits pour lesquels les probabilités de demande sont identiques. Si le premier produit est d’une grande longévité alors que la durée de vie du second est courte, il est plus logique de stocker plus d'unités du produit qui se conserve plus longtemps.

La récompense associée au stock est une fonction mathématique qui calcule la rentabilité de chaque unité ajoutée au stock pour un article donné, à partir de prévisions probabilistes de la demande future et quelques variables économiques. Ces dernières reflètent le bénéfice attendu de la vente de l’article ainsi que les coûts de stockage des unités si celles-ci ne sont pas vendues.

Lokad considère la fonction de récompense associée au stock comme la pierre angulaire de l’optimisation de celui-ci. Les solutions issues de la fonction de récompense associée au stock sont généralement meilleures que celles obtenues via une approche naïve qui consiste à cibler un taux de service ou un taux de couverture donné. En réalité, cette dernière approche ignore les inconvénients possibles, tels que les coûts générés par les invendus.

Facteurs économiques de la récompense associée au stock

L'analyse de la récompense associée au stock est une analyse « économique » puisqu'elle vise à définir les résultats financiers d'un niveau de stock. Pour cela, quelques facteurs économiques de base sont nécessaires car ils impactent les résultats obtenus d'un stock.

L'angle économique ne se réduit pas à une analyse naïve qui vise à la maximisation des bénéfices : les coûts de rupture de stock, notamment, font partie intégrante de l'analyse. L'approche ne fournit qu'un cadre qui facilite l'équilibrage des coûts de stockage et des coûts de rupture de stock mais l'ajustement de cet équilibre est spécifique à chaque entreprise.

Définissons trois variables associées à un seul SKU, sur une période égale aux délais d'approvisionnement :

  • $M$ la marge brute de la vente d'une unité.
  • $S$ la perte associée à une rupture de stock d'une unité.
  • $C$ la perte associée au coût de stockage d'une unité invendue.

Ces variables sont « fondamentales » dans le sens où elles sont indispensables à toute optimisation du stock. Sans une estimation, même rudimentaire, de ces variables, toute méthodologie de commande rencontrera l'un des problèmes suivants :
  • La méthode ne reflète pas les risques associés à une demande future qui peut ne pas arriver. Elle permet donc d'atteindre de bons taux de service mais crée du stock mort.
  • La méthode ne reflète pas les coûts des ruptures de stock et des ventes perdues.
  • La méthode ne reflète pas l'importance de répondre à la demande et de générer un bénéfice qui soutient le stock lui-même.

À partir de ces considérations, passons en revue deux scénarios simples selon que la demande dépasse ou non le stock disponible. $k$ est le nombre d'unité en stock et $y$ le nombre d'unités demandées par le client.

Si le stock dépasse la demande, $k \geq y$, alors la récompense immédiate associée au stock est $yM+(k-y)C$. En effet, $yM$ représente les $y$ unités vendues avec la récompense associée et $(k-y)C$ représente le coût de stockage des $(k-y)C$ unités invendues à la fin de la période.

Si la demande dépasse le stock, $k < y$, alors la récompense immédiate suit la formule $kM+(y-k)S$. Dans ce cas, les $k$ premières unités vendues entraînent la récompense $kM$ mais il manque ensuite $y-k$ unités, ce qui induit la perte $(y-k)S$ associée à la rupture de stock.

Définition de la fonction de récompense associée au stock

Dans l'exemple précédent, nous avons calculé une récompense « immédiate » mais l'optimisation du stock est itérative. Les unités qui ne sont pas vendues pendant une période peuvent l'être pendant à la suivante, ce qui génère un bénéfice retardé. Il se peut aussi qu'elles ne soient pas vendues non plus durant la période suivante et génèrent alors des coûts de stockage retardés. La fonction de récompense associée au stock résout ce problème en prenant en compte toutes les périodes à venir.

La fonction de récompense associée au stock est définie comme suit : $$R(t, k)= \begin{cases} kM+(y_t-k)S & \text{if $y_t \geq k$ (stockout)} \\ y_tM+(k-y_t)C + \alpha R^*(t+1, k-y_t) & \text{if $y_t < k$ (leftover)} \end{cases}$$ Avec :

  • $k$ le nombre d'unité en stock ;
  • $y_t$ la demande pour la période $t$ ;
  • $M$, $S$ et $C$ les variables économiques vues précédemment ;
  • $\alpha$ facteur d'escompte présenté ci-dessous ;
  • $R^*$ identique à $R$ mais avec $S=0$, également présenté ci-dessous.

Au premier abord, cette formule peut sembler effrayante mais il s'agit en fait d'une modélisation directe d'un seul SKU avec $k$ unités en stock pour lequel la demande est $y_t$. À l'exception du composant $\alpha R^*(t+1, k-y_t)$, cette formule est semblable à celle de la récompense immédiate que nous avons détaillée plus haut.

Deux spécificités permettent de prendre en compte toutes les périodes à venir. Premièrement, un appel récursif à la fonction de récompense elle-même, en d'autres termes la récompense est la somme des récompenses (ou pertes) de la prochaine période et de celles de toutes les périodes suivantes. Cette fonction qui avance indéfiniment dans le futur peut paraître déroutante mais elle reflète simplement le fait que le stock invendu passe d'une période à l'autre.

Deuxièmement, $\alpha$ est introduit en tant que facteur d'escompte des récompenses futures. Cette approche s'inspire de la méthode du discounted cash flow qui reflète le fait qu'un bénéfice généré dans un futur lointain a moins de valeur qu'un bénéfice généré dans un futur proche. La même logique s'applique réciproquement aux coûts : un coût immédiat a plus de conséquences qu'un coût qui incombe dans le futur.

Enfin, la récursivité est effectuée à l'aide de $R^*$, qui ne prend pas en compte les coûts de rupture de stock, au lieu de $R$. $R^*$ reflète le fait que le stock actuel ne doit prévenir les ruptures de stock que pour la durée du délai de réapprovisionnement en cours. En effet, par définition, le délai d'approvisionnement représente la durée couverte par le stock actuel. Pour la période suivante, il sera possible de se réapprovisionner (nous verrons de cas sans réapprovisionnement dans la suite). Ainsi, la prévention des ruptures de stock pour les périodes qui suivent la prochaine dépend de décisions en matière de stock qui adviendront dans le futur.

Estimation probabiliste de la fonction de récompense associée au stock

La fonction de récompense associée au stock $R$ est exprimée en fonction de la demande future $y_t$, qui est généralement inconnue. Cependant, $R$ peut tout de même être calculée si des prévisions sont disponibles. Pour cela, nous recommandons l'utilisation de prévisions probabilistes de la demande future, qui fournissent non pas une estimation de la demande future moyenne mais la distribution complète des demandes possibles. À partir de ces informations, il est possible de faire appel à $\hat{R}$, l'estimation empirique de $R$ qui s'appuie sur les prévisions probabilistes de la demande. La formule de la fonction $\hat{R}$ est la suivante : $$ \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} $$ Cette expression convertit l'expression $R$ d'origine en probabilités conditionnelles. La première ligne correspond aux scénarios de rupture de stock et la deuxième à ceux de stock invendu. Les deux lignes sont pondérées en fonction de leur probabilité respective.

Comme nous le verrons par la suite, $\hat{R}$ peut être calculé dans un but pratique. En réalité, Lokad fournit une fonction intégrée appelée stockrwd qui met en œuvre cette formule. Ce sujet est abordé plus en détail dans la section suivante.

En pratique, la seule mesure disponible est $\hat{R}$ car $R$ ne peut pas réellement être calculé, puisque, par définition, la demande future est inconnue. Donc ce que nous appelons fonction de récompense associée au stock est en réalité l'estimation $\hat{R}$ plutôt que la fonction $R$. Notez également que l'exactitude de l'estimation $\hat{R}$ dépend de celle des prévisions probabilistes sous-jacentes mais cette discussion dépasse le sujet du présent document.

Propriétés de la fonction de récompense associée au stock

La fonction de récompense associée au stock peut être écrite comme ceci $R(k, M, S, C)$ pour mettre l'accent sur les variables économiques. Elle est cumulative en ce qui concerne ses composants : $$\begin{align} R(k, M, S, C) = & R(k, M, 0, 0) + \\ & R(k, 0, S, 0) + \\ & R(k, 0, 0, C) \end{align}$$ Elle est aussi linéaire en ce qui concerne ses paramètres $M$, $S$ et $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}$$

Les fonctions stockrwd dans Envision

stockrwd est une fonction de la fonctionnalité Envision de Lokad, qui met en œuvre la fonction de récompense associée au stock (ou plutôt son estimation probabiliste) si des prévisions probabilistes sont disponibles. Si l'incrément de récompense associé à la kème unité en stock nous intéresse, la fonction Envision est définie par $$\text{stockrwd}: k \to R(k)-R(k-1)$$ La syntaxe Envision correspondante est la suivante :
// margin reward component
RM = stockrwd.m(Demand, AM) * M
// stockout penalty component
RS = stockrwd.s(Demand) * S
// carrying cost component
RC = stockrwd.c(Demand, AC) * C
// recomposing the stock reward
// with point-wise additions
R = RM + RS + RC
Envision décompose la fonction de récompense associée au stock en trois composants. Ces derniers étant linéaires en ce qui concerne les variables économiques, celles-ci restent en dehors de l'appel stockrwd() de la fonction. Cette décomposition facilite l'inspection des quantités économiques générées par la récompense associée au stock et l'ajustement des hypothèses économiques qui guident le calcul.

Le premier argument Demand doit être une distribution. Celle-ci représente la demande probabiliste et est généralement issue du moteur de prévisions. Demand doit non seulement être une distribution mais également une variable aléatoire (de masse égale à 1).

Les trois variables M, S et C sont les variables économiques définies précédemment. Les arguments AM et AC sont deux facteurs de remise distincts. En pratique, S et C doivent avoir des valeurs négatives et les valeurs AM et AC doivent être comprises dans $[0;1[$.

La fonction renvoie R, une distribution qui reflète $k \to R(k) - R(k-1)$. Attention, cette distribution n’est pas une variable aléatoire mais une fonction de récompense économique. D’après sa définition formelle, ce n’est même pas une distribution de « support compact ». Envision comprend des algorithmes conçus précisément pour gérer ce type de distributions non compactes.

Voyons une définition typique de ces variables économiques :
M = SellPrice - BuyPrice
// 0.5 arbitrary
S = -0.5 * (SellPrice - BuyPrice)
// 0.3 arbitrary
C = -0.3 * BuyPrice * mean(Leadtime) / 365
// 'AM' for margin component
AM = 0.3
// 'AC' for carrying cost component
AC = 1 - 0.2 * mean(LeadTime) / 365

Nous avons :
  • M la marge brute par unité.
  • S arbitrairement défini sur 0,5 fois la marge brute. Naturellement, les conséquences varient d'un secteur à l'autre en fonction de la tolérance des clients aux ruptures de stock.
  • C est un coût de stockage annuel estimé à 30 % du prix d'achat initial par an. Le facteur C correspond à des périodes de mean(LeadTime) jours, et non années.
  • AM, facteur de remise pour la récompense associée à la marge, est exprimé via un déclin par étape de 70 % d'une période à l'autre.
  • AC, facteur de remise pour les coûts de stockage, est exprimé comme une remise de 20 % sur les récompenses futures. La valeur est également mise à l’échelle des délais d'approvisionnement via mean(Leadtime) / 365.

En pratique, les délais d’approvisionnements probabilistes sont aussi censés être des prévisions produites par le moteur de prévisions. Par conséquent, dans le script ci-dessus, nous considérons que Leadtime est une distribution.

Facteurs de remise pour la marge et les coûts de stockage

Le facteur de remise A décrit précédemment n’est pas censé être utilisé de façon identique pour les trois composants de la fonction de récompense associée au stock.

Pour le composant de la marge de la récompense associée au stock, l’opportunité correspond à l’achat de stock ultérieurement. Par conséquent, le facteur de remise doit fortement pénaliser les quantités achetées qui ne généreront une marge que dans les périodes ultérieures. En effet, par définition, l’opportunité correspond à l’achat ultérieur de stock pour faire face aux périodes futures. Nous suggérons donc l’utilisation d’une remise importante AM = 0.3.

Pour le composant de pénalité de rupture de stock de la récompense associée au stock, le facteur de remise est quant à lui, par définition, toujours nul. Ce facteur de remise n’influe donc aucunement sur ce composant.

Pour le composant des coûts de stockage de la récompense associée au stock, le stock est un actif en déclin. Nous suggérons une remise annuelle de 20 % pour AC, car le stock ne génère que des coûts avec le temps et les coûts d’opportunité doivent être pris en compte : l’argent investi aujourd’hui pour acheter du stock n’est plus disponible ensuite, lorsque la demande future a été constatée.

Commandes en souffrance et récompense associée au stock

Les commandes en souffrance compliquent la situation. Lorsque des commandes en souffrance existent, la demande future est partiellement connue, puisque les quantités des commandes en souffrance sont censées être connues. De plus, les clients ayant fait l’effort de passer ces commandes, ces dernières prennent plus d’importance que les commandes normales. Le script ci-dessous illustre comment la fonction de récompense associée au stock peut être combinée à des commandes en souffrance.
MB = 0.5 * SellPrice // arbitrary
SB = 0.5 * SellPrice // arbitrary

MBU = MB * uniform(1, Backorder)
SBU = SB * uniform(1, Backorder)

RM = MBU + (stockrwd.m(Demand, AM) * M) >> Backorder
RS = SBU + zoz(stockrwd.s(Demand) * S) >> Backorder
RC = (stockrwd.c(Demand, AC) * C) >> BackOrder
R = RM + RS + RC // plain recomposition
Les deux variables économiques MB et SB représentent la marge par unité et la pénalité de rupture de stock des unités des commandes en souffrance. Nous aurions pu utiliser M et S à la place, mais, comme indiqué plus haut, les commandes en souffrance sont généralement considérées comme plus importantes que les commandes normales.

Le script exploite l’opérateur de décalage >> disponible dans Envision. En effet, les quantités des commandes en souffrance étant censées correspondre à une demande connue, la distribution des récompenses est décalée vers la droite en conséquence. Attention, si la demande est décalée en premier (c’est-à-dire Demand), les résultats ne sont pas les mêmes. En effet, le décalage de la demande indique à la récompense associée au stock que, pour chaque période à venir, la quantité des commandes en souffrance est une demande garantie.

Illustration visuelle de la récompense associée au stock

La fonction de récompense associée au stock peut encore vous paraître un peu énigmatique. Voici, ci-dessous, une représentation visuelle des transformations de séries qui portent sur la demande lorsqu’une analyse de récompense associée au stock est appliquée en présence de commandes en souffrance.

Image

Le premier graphique — titré « Future demand » (demande future) — représente une prévision probabiliste de la demande associée à un SKU donné. La courbe représente la distribution des probabilités, l’aire de la surface qu’elle dessine étant égale à 1. Cette demande future est associée de façon implicite aux prévisions probabilistes du délai d'approvisionnement, également représentées par une distribution de probabilités. Une telle distribution est généralement générée par un moteur de prévisions probabilistes.

Le graphique « Marginal fill rate » (taux de couverture marginal) représente la part de demande supplémentaire couverte par chaque unité ajoutée au stock. En d’autres termes, ce graphique montre les conséquences d’une augmentation du stock sur le taux de couverture. C’est ensuite le taux de couverture marginal qui est représenté, l’aire de la surface dessinée par la courbe vaut 1. La distribution du taux de couverture marginal peut être calculée par la fonction fillrate().

Le graphique « Demand with backorders » (demande avec commandes en souffrance) est identique au graphique « Future demand », sauf que 8 unités représentent une commande en souffrance. Cette dernière correspond à une demande garantie puisque ces unités ont déjà été achetées par les clients. Par conséquent, lorsque des unités d’une commande en souffrance entrent en jeu, la distribution des probabilités de la demande est décalée vers la droite. L’opérateur de décalage >> est disponible dans l’algèbre des distributions et permet de calculer cette transformation de la distribution d’origine.

Le graphique « 'Fill rate with backorders » (taux de couverture avec commandes en souffrance) est très similaire au graphique « Marginal fill rate » d’origine, mais est également décalé de 8 unités vers la droite. Dans ce cas, le taux de couverture représenté est uniquement associé à une demande incertaine, la forme de la distribution reste donc identique.

Le graphique « Margin » (marge) représente les conséquences économiques positives calculées par la fonction de récompense associée au stock à partir de la demande avec commandes en souffrance. La récompense associée au stock peut être représentée comme une distribution, mais il ne s’agit pas d’une distribution de probabilités : l’aire de la surface sous la courbe n’est pas égale à 1, mais à la marge totale qui serait faite avec un stock illimité. Sur la gauche du graphique, chaque unité de la commande en souffrance offre la même marge : les unités ayant été achetées, la marge associée est certaine.

Le graphique « Stockout penalty » (pénalité de rupture de stock) représente le deuxième composant de la fonction de récompense associée au stock. La forme de la distribution peut sembler surprenante, mais elle reflète simplement le fait que, de par la construction de la fonction de récompense associée au stock, l’aire totale sous la courbe est nulle. De façon intuitive, en partant d’un niveau de stock nul, nous obtenons la somme de toutes les pénalités de rupture de stock puisqu’aucune demande ne peut être satisfaite. Puis, en allant vers la droite, les niveaux de stock augmentent et de plus en plus de demandes sont satisfaites, ce qui diminue les pénalités de rupture de stock jusqu’à ce qu’il ne reste plus de pénalités, car toutes les demandes sont satisfaites. La pénalité de rupture de stock associée à une commande en souffrance non satisfaite est représentée comme plus importante que la pénalité de non-réponse à la demande qui suit. Nous illustrons ici l’hypothèse que les clients qui ont déjà une commande en souffrance sont plus exigeants vis-à-vis du niveau de service que ceux qui n’ont pas encore commandé.

Le graphique « Carrying costs » (coûts de stockage) représente le troisième et dernier composant de la fonction de récompense associée au stock. Comme les coûts de stockage ne sont pas limités — il est toujours possible de stocker une unité de plus et d’augmenter ces coûts — la distribution est divergente : elle tend vers moins l’infini sur la droite. L’aire totale sous la courbe est infinie dans le négatif. Sur la droite, les coûts de stockage associés aux unités de la commande en souffrance sont nuls : ces unités ont déjà été achetées par les clients et seront expédiées directement, elles ne génèrent donc pas de coûts de stockage.

La récompense finale associée au stock, qui n’est pas représentée ci-dessus, serait obtenue en ajoutant les trois composants de la fonction de récompense associée au stock. La distribution qui en résulterait serait interprétée comme le retour sur investissement de chaque unité supplémentaire en stock. Cette distribution commence généralement avec des valeurs positives, les premières unités en stock étant rentables, mais converge vers moins l'infini lorsque les niveaux de stock augmentent, puisque les coûts de stockage ne sont pas limités.

Le terme support désigne généralement les niveaux de demande associés à des probabilités non nulles. Dans les graphiques ci-dessus, le terme « support » est utilisé de façon moins rigoureuse pour désigner la plage à traiter entièrement par Envision comme valeurs non nulles. En particulier, il faut signaler que plusieurs calculs ont besoin d’un support de distribution étendu pour garantir que la distribution résultante finale ne soit pas tronquée.

  • L’opération de décalage, qui a lieu si des commandes en souffrance existent, nécessite que le support soit étendu du nombre d’unités de ces commandes.
  • Les composants marge et coûts de stockage de la fonction de récompense associée au stock n’ont pas de limite théorique sur la droite et peuvent nécessiter de grandes extensions du support.
  • Les contraintes de commande, telles que les quantités minimales, peuvent nécessiter des niveaux de stock supérieurs à ceux atteints par les distributions décalées. Une bonne analyse de la traîne de la distribution est essentielle à l’estimation de la rentabilité des quantités minimales de commande.

L'illustration ci-dessus illustre que le calcul de la fonction de récompense associée au stock doit être étendu au-delà de la plage de demande non nulle. En effet, lorsque des quantités minimales de commande existent, l’entreprise peut être obligée d’acheter des produits au-delà d’un taux de service de 100 % de la demande future pour la période suivante. La fonction de récompense associée au stock couvre également ces situations. L’incidence des quantités minimales de commande est présentée plus en détail dans la suite. En pratique, lors de l'exécution d'Envision, le support est ajusté automatiquement afin que les distributions ne soient pas tronquées.

Analyse de situations typiques

La fonction de récompense associée au stock est directe dans le sens où elle reflète les résultats financiers générés par un stock de façon relativement minimaliste. En effet, comme nous l'avons vu, il serait peu judicieux d'amputer une partie du modèle, qui ne reflèterait alors même plus les trois états de base d'une unité de SKU : vendue, en rupture ou en stock. En ajustant les variables économiques, la récompense associée au stock peut être adaptée aux différents secteurs.

Aéronautique

Dans le secteur aéronautique, les pièces détachées sont nécessaires pour entretenir les appareils. Les ruptures de stock de pièces NO-GO déclenchent des incidents de type AOG (avion immobilisé au sol) dont le coût est bien supérieur à celui des pièces elles-mêmes.

Dans ce contexte, il est raisonnable d'avoir :

  • M = 0, sauf si l'entretien des pièces est payant, il n'y a pas d'avantage différencié à leur entretien.
  • S= constante, comme toutes les pièces NO-GO peuvent potentiellement clouer l'appareil au sol, la perte associée à une rupture de stock est uniforme.
  • C= constante (annualisée), puisque la plupart des pièces ont une longue durée de vie, il est possible, dans un premier temps, d'estimer que le coût de stockage est une constante.

Journaux

Dans ce domaine, les articles ne peuvent se vendre que pendant la période qui arrive et sinon perdent entièrement leur valeur marchande à l'itération suivante. Les journaux sont de parfaits exemples de ce type d'articles mais des comportements similaires sont également observés pour des articles saisonniers et périssables qui ne peuvent être vendus que pendant un court laps de temps.

Dans ce cas, nous aurions :

  • M, la marge brute.
  • S, une part de la marge brute.
  • C = 0, puisque rien ne passe d'une période à l'autre.
  • A = 0, idem, aucune récompense ne peut être obtenue sur une période future.