AccueilIA et Machine LearningMoteur de tarification dynamique — Élasticité de la demande en temps réel

🏷️ Moteur de tarification dynamique — Élasticité de la demande en temps réel

Observez un moteur d'optimisation des prix sonder l'élasticité de la demande d'un article de vente au détail et ajuster le prix en temps réel, arbitrant entre le revenu et l'écoulement des stocks.

IA et Machine Learning3DAvancé60 FPS
ai-retail-dynamic-pricing ↗ Ouvrir en autonome

À propos du moteur de tarification dynamique

Les détaillants connaissent rarement leur courbe de demande — ils n'observent que le nombre d'unités vendues au prix pratiqué. Cette simulation cache une courbe de demande à élasticité constante, demande = k·prix^(−ε), derrière un signal de vente bruité et censuré par le stock, et laisse un moteur de tarification la découvrir en direct. Chaque jour simulé, le moteur exploite soit sa meilleure estimation de prix actuelle, soit explore un prix voisin pour continuer à apprendre, exactement comme un bandit multi-bras équilibrant exploitation et gain d'information.

En dessous, une régression log-log glissante sur les 30 dernières observations (prix, unités vendues) récupère une estimation de ε et de l'échelle de demande k. Une recherche par grille sur la plage de prix autorisée note ensuite chaque prix candidat par le revenu attendu moins une pénalité pour s'écarter du rythme nécessaire pour écouler le stock restant avant la fin de l'horizon — une version simplifiée du problème de gestion du revenu à stock terminal que les compagnies aériennes et les détaillants résolvent chaque jour. Observez la courbe de demande, la courbe de revenu, la jauge d'écoulement et le journal d'ajustement de prix se mettre à jour ensemble à mesure que le moteur converge vers le véritable optimum (ou en est écarté).

Questions fréquentes

Qu'est-ce que l'élasticité de la demande, et comment le moteur l'estime-t-il sans jamais la voir ?

L'élasticité-prix de la demande ε mesure à quel point la quantité demandée réagit au prix : une hausse de prix de 1 % réduit la demande d'environ ε %. Cette simulation génère la vraie demande quotidienne à partir d'une courbe à élasticité constante, demande = k·prix^(−ε), mais le moteur ne connaît jamais k ni ε — il n'observe que les unités bruitées et plafonnées par le stock réellement vendues au prix qu'il a pratiqué ce jour-là. En prenant les logarithmes, ln(demande) = ln(k) − ε·ln(prix) devient une droite, si bien qu'une régression par moindres carrés ordinaires sur les 30 dernières paires (prix, vendu) récupère des estimations de k et de ε directement à partir de la pente et de l'ordonnée à l'origine.

Pourquoi le moteur « sonde »-t-il des prix voisins au lieu de sauter directement à l'optimum ?

Une régression ajustée sur un groupe étroit de prix est peu fiable — si toutes les observations se situent près de 38-42 $, l'estimation de la pente contraint à peine ε en dehors de cette plage, et la courbe de revenu estimée peut être très erronée une fois extrapolée. Le moteur se comporte donc comme un bandit multi-bras : la plupart des jours, il exploite le prix que son modèle actuel croit être le meilleur, mais avec une probabilité ε-bandit (le curseur de taux d'exploration), il déplace plutôt le prix vers un niveau voisin aléatoire uniquement pour recueillir un point de donnée plus informatif. Cet arbitrage exploration/exploitation est le même que celui utilisé dans les vrais systèmes de tarification en ligne et d'enchères publicitaires.

Pourquoi n'y a-t-il parfois aucun prix intérieur qui maximise le revenu ?

Le revenu sous élasticité constante est R(p) = p·k·p^(−ε) = k·p^(1−ε). Si ε > 1 (demande élastique), l'exposant 1−ε est négatif, donc R(p) est strictement décroissant en p — le revenu est maximisé en pratiquant le prix le plus bas que le moteur est autorisé à pratiquer, et le volume compense plus que largement la marge plus faible. Si ε < 1 (demande inélastique), 1−ε est positif et le revenu continue d'augmenter avec le prix, donc le meilleur prix est le plus élevé autorisé. Seul le cas ε = 1 rend le revenu plat. C'est pourquoi ce simulateur impose toujours des curseurs explicites de prix plancher et plafond — les vrais problèmes de « prix optimal » sont généralement des optimisations contre une borne, pas un pic intérieur lisse.

Qu'est-ce que la pénalité de cadencement des stocks, et pourquoi ne pas simplement maximiser le revenu chaque jour ?

Maximiser isolément le revenu estimé du jour peut écouler le stock beaucoup trop vite (laissant de l'argent sur la table de clients qui auraient payé plus) ou beaucoup trop lentement (terminant la saison avec un stock invendu, bradé à zéro). Le moteur calcule un rythme cible — stock restant divisé par jours restants — et note chaque prix candidat comme le revenu estimé moins λ·(demande estimée à ce prix − rythme cible)², où λ est le curseur de poids de cadencement. Un λ plus élevé tire le prix choisi vers ce qui maintient l'écoulement dans les temps ; un λ plus faible laisse le moteur poursuivre le pur revenu et risquer de terminer avec un surstock ou une rupture de stock.

Quelle est la différence entre exploration et exploitation dans ce moteur de type bandit ?

L'exploitation consiste à pratiquer le prix que le meilleur modèle actuel du moteur juge maximiser le score de revenu ajusté du cadencement — il utilise ce qui a déjà été appris. L'exploration consiste à essayer délibérément un prix différent, voisin, même si le modèle ne le croit pas actuellement optimal, uniquement pour observer comment la demande y réagit et affiner l'estimation d'élasticité. Trop peu d'exploration et le moteur peut rester bloqué près d'un prix localement correct tout en manquant un bien meilleur ailleurs sur la courbe ; trop d'exploration et il gaspille des jours sur de mauvais prix. Le curseur de taux d'exploration contrôle directement la fréquence à laquelle un prix de sondage aléatoire est utilisé à la place de la recommandation du modèle.

Pourquoi la demande observée est-elle « censurée » une fois le stock bas ?

La vraie courbe de demande du simulateur peut appeler, disons, 220 unités un jour donné, mais s'il ne reste que 40 unités en stock, seules 40 unités sont réellement vendues et observées. La régression du moteur ne voit jamais que les unités vendues, pas la vraie demande non contrainte, donc à mesure que le stock approche de zéro, la demande observée sous-estime systématiquement la courbe réelle — un biais bien connu dans les données de vente au détail appelé censure de la demande. C'est l'une des raisons pour lesquelles les vrais systèmes de gestion du revenu essaient d'arrêter les remises avant que le stock ne devienne critique, plutôt que de lire des ventes nulles comme une « absence de demande ».

Quelles techniques du monde réel cette simulation reflète-t-elle ?

La forme générale — une courbe cachée à élasticité constante, des expériences de prix générant des données de vente bruitées, une régression en ligne récupérant la courbe, et une contrainte de cadencement contre un horizon fixe — reflète la gestion du revenu des compagnies aériennes et des hôtels, l'optimisation des démarques en vente au détail, et les « bandits de tarification contextuelle » utilisés par certaines plateformes de e-commerce. Les vrais systèmes ajoutent bien plus (prix des concurrents, cannibalisation entre articles, segments de clientèle, politiques d'exploration plus riches comme l'échantillonnage de Thompson), mais la boucle centrale sonder → estimer → optimiser → cadencer est la même que celle utilisée ici.

⚙ Sous le capot

Une courbe de demande cachée à élasticité constante est sondée par une politique de tarification de type bandit : une régression log-log glissante récupère ε et k à partir de ventes bruitées et censurées par le stock, et une recherche par grille choisit le prix qui maximise le revenu estimé moins une pénalité de cadencement des stocks chaque jour simulé.

Canvas TextureConstant ElasticityBandit ExplorationRevenue OptimizationInventory Pacing

3D · Moteur de rendu Three.js / WebGL · cible 60 FPS · s'exécute entièrement côté client, sans installation

Qu'avez-vous trouvé ?

Ajouter les étapes de reproduction (facultatif)