Функция прибыльности запасов


Главная » Ресурсы » Здесь
Жоаннес Верморель, декабрь 2015 г. (Последняя редакция — февраль 2017 г.)

Функция рентабельности запасов позволяет вычислить ожидаемую прибыль (или убытки) от хранения в запасе определенного количества единиц товара. По сути, функция рентабельности запасов позволяет ответить на вопрос «Что мы получим, если увеличим запасы на одну единицу товара?» Данная функция используется для создания политики приоритетных заказов, в которой все элементы располагаются в списке в соответствии с их экономической выгодностью. 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$ (stockout)} \\ 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}$$ Эти свойства распространяются на stockrwd, функцию Envision от Lokad.

Функции stockrwd в Envision

Функция stockrwd в Envision — это функция Lokad, которая позволяет рассчитать функцию рентабельности запасов, а точнее — ее вероятностную оценку, если у вас есть доступ к вероятностным прогнозам. Нас интересует разница в прибыли для  kй единицы товара, поэтому функция Envision определяется следующим образом: $$\text{stockrwd}: k \to R(k)-R(k-1)$$ Синтаксис Envision для данной функции выглядит так:
// предельная прибыль
RM = stockrwd.m(Demand, AM) * M
// убытки из-за дефицита
RS = stockrwd.s(Demand) * S
// расходы на содержание
RC = stockrwd.c(Demand, AC) * C
// восстановление прибыльности запасов
// с точечным сложением
R = RM + RS + RC
Envision раскладывает функцию прибыльности запасов на три компонента. Так как компоненты являются линейными с точки зрения соответствующих экономических переменных, эти переменные хранятся за пределами вызова функции stockrwd(). Указанное разложение функции позволяет оценить экономичные объемы запасов, рассчитанные функцией рентабельности, а также дает возможность легко подстроить экономические предположения, которые лежат в основе расчетов.

Первый аргумент Demand должен представлять собой распределение. Распределение представляет собой вероятностный прогноз спроса и обычно создается системой прогнозирования. Таким образом, Demand является не только распределением, но и случайной переменной (масса равна 1).

Три переменные M, S и C представляют собой экономические переменные, описанные в начале статьи. Аргументы AM и AC — это два разных фактора дисконтирования. На практике S и C должны быть отрицательными. Два значения AM и AC также должны быть включены в сегмент $[0;1[$.

Функция возвращает R, распределение, отражающее $k \to R(k) - R(k-1)$. Будьте осторожны: такое распределение не является случайной переменной. Это функция экономической рентабельности. Формальное определение подразумевает, что это оно даже не является компактным носителем. В Envision есть особые алгоритмы для обработки таких некомпактных распределений.

Рассмотрим типичное определение экономических переменных:
M = SellPrice - BuyPrice
// произв. 0,5
S = -0.5 * (SellPrice - BuyPrice)
// произв. 0,3
C = -0.3 * BuyPrice * mean(Leadtime) / 365
// AM — маржа
AM = 0.3
// АС — расходы на содержание
AC = 1 - 0.2 * mean(LeadTime) / 365
У нас есть:

  • 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 // произвол.
SB = 0.5 * SellPrice // произвол.

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 // простая сборка
Две экономических переменных MB и SB отражают наценку на единицу товара и убытки вследствие дефицита товара для продукции из задолженного заказа. Вместо них можно было бы использовать M и S, однако, как уже было сказано выше, задолженные заказы, как правило, считаются более важными, чем обычные.

В сценарии активно используется оператор сдвига Envision >>. Вследствие того, что спрос на заказанные таким образом товары считается известным, распределение прибыли сдвигается вправо соответствующим образом. Будьте осторожны: если сначала переместить спрос (Demand), результаты будут иными. Такая операция показывает функции прибыльности запасов, что в любой период в будущем объем Backorder будет гарантированно пользоваться спросом.

Иллюстрация рентабельности запасов

Пока что функция прибыльности заказов может показаться достаточно непонятной. Ниже приводится визуальное представление серии трансформаций, связанных со спросом при анализе прибыльности запасов при наличии задолженных заказов.

Image

Первый график с заголовком Спрос в будущем отражает вероятностный прогноз спроса для отдельно взятой единицы учета. Кривая показывает распределение вероятностей, причем все, что ниже кривой, равно единице. Уровень спроса в будущем косвенно связан с вероятностным прогнозом спроса, который также представляет собой распределение вероятностей. Такое распределение обычно создается с помощью системы вероятностного прогнозирования.

График Предельный уровень пополнения отражает долю спроса, которую компания может удовлетворить за счет приобретения каждой дополнительной единицы товара. Иными словами, данный график показывает, что происходит с уровнем пополнения по мере увеличения запасов. Все, что находится ниже кривой линии, равно единице, так как здесь показан предельный уровень пополнения. Распределение предельного уровня пополнения можно рассчитать с помощью функции fillrate().

График Спрос с задолженными заказами идентичен графику Спрос в будущем за исключением того, что в нем добавлено 8 единиц товара, которые представляют собой задолженный заказ. Задолженные заказы представляют собой гарантированный спрос, потому что такие товары уже приобретены клиентами. Как следствие, когда появляются задолженные заказы, распределение вероятности спроса сдвигается вправо, потому что на такие товары есть гарантированный спрос. Оператор сдвига >> используется для выполнения подобных трансформаций исходных распределений.

График Уровень пополнения с задолженными заказами также очень похож на график Предельный уровень пополнения, но он также сдвинут на 8 единиц вправо. Выстроенный уровень пополнения здесь связан только с неопределенным спросом, поэтому форма распределения не меняется.

График Маржа отражает предельную экономическую прибыль, рассчитанную с помощью функции прибыльности запасов на основе Спроса с задолженными заказами. Прибыльность запасов можно представить в виде распределения, однако она не является таковой — все, что находится ниже кривой линии, равняется не единице, а общей прибыли, которую можно получить при неограниченном запасе товара. В левой части графика все единицы заказанных товаров дают одинаковую прибыль, потому что они уже приобретены клиентами и прибыль от них уже известна.

График Убытки из-за дефицита представляет собой второй компонент функции прибыльности запасов. Форма данного графика распределения может показаться необычной, но дело в том, что из-за особенностей функции прибыльности запасов все, что находится ниже кривой линии, приравнивается к нулю. Таким образом, мы начинаем с нулевого уровня запаса, когда компания несет максимальные убытки, так как полностью не удовлетворяет спрос. По мере движения вправо уровень запасов растет, и компания удовлетворяет все большую и большую долю спроса, сокращая при этом убытки из-за дефицита. Так продолжается до тех пор, пока убытки совсем не исчезнут, потому что спрос полностью удовлетворен. Убытки из-за дефицита заказанных товаров выше, чем убытки из-за простой невозможности удовлетворить спрос. Таким образом, мы отражаем мысль о том, что клиенты, которые оформили задолженный заказ, ожидают более качественного обслуживания, чем те, кто еще ничего не приобрел.

График Расходы на содержание представляет собой третий и последний компонент функции прибыльности запасов. У расходов на содержание нет верхней границы — всегда можно докупить еще одну единицу товара, что приведет к увеличению расходов. Это несходящееся распределение, и оно стремится к отрицательной бесконечности справа. Все, что находится ниже кривой линии, равно отрицательной бесконечности, хотя такой подход и не очень практичен. Справа расходы на содержание заказанных товаров равны нулю — эти товары уже приобретены клиентами, и они в ближайшее время будут им доставлены, так что тратиться на их содержание не придется.

Окончательная прибыльность запасов (не показана выше) получается за счет суммирования трех компонентов соответствующей функции. Конечное распределение можно рассматривать как коэффициент рентабельности для каждой дополнительной единицы товара. Данное распределение обычно начинается с положительных значений, так как первые единицы товара рентабельны, а затем начинает стремиться к отрицательной бесконечности при увеличении запасов из-за неограниченных расходов на содержание.

Под термином «носитель функции» , как правило, подразумеваются уровни спроса с ненулевой вероятностью. В графиках выше под термином «носитель функции» понимается целый диапазон значений, которые необходимо обрабатывать в Envision как неравные нулю. В частности, стоит отметить, что существуют различные расчеты, для которых требуется расширение носителя функции распределения, чтобы конечное распределение не было ограниченным.

  • Операция сдвига, которая выполняется при наличии задолженных заказов, требует увеличения носителя функции на число единиц заказанного товара.
  • Компоненты маржи и расходов на содержание теоретически не ограничены справа, и для них может потребоваться значительное расширение носителя функции.
  • Для выполнения требований по ограничениям заказов, таким как MOQ, уровень запасов иногда должен быть даже выше, чем при распределениях со сдвигом. Правильная оценка «хвоста» распределения крайне важна для определения того, может ли ограничение MOQ быть соблюдено с сохранением экономической выгоды.

Важным моментом на иллюстрации выше является необходимость расширения функции прибыльности запасов за пределы ненулевого спроса. При наличии ограничения по минимальному объему заказа (MOQ) компания может быть вынуждена закупать товары в количествах, превышающих 100% вероятность обслуживания в заданном периоде. Функция прибыльности заказов может справиться и с этой ситуацией. Значение ограничений по MOQ подробно описывается в следующем разделе. На практике система Envision автоматически настраивает носитель функции таким образом, чтобы распределение не ограничивалось при расчетах.

Разбор типичных ситуаций

Функция рентабельности запасов позволяет выразить экономическую ситуацию сравнительно небольшими усилиями. Как мы уже видели, удалять что-либо из этой модели нерационально, так как она перестает отражать три базовых состояния единицы SKU: продана, в наличии и в дефиците. Настраивая экономические переменные, функцию рентабельности запасов можно подогнать под различные сферы деятельности.

Авиация

В авиационной промышленности постоянно требуются запчасти для поддержания самолетов в рабочем состоянии. Отсутствие важных запчастей обычно приводит к так называемым происшествиям с воздушными судами на аэродроме (AOG), которые обходятся гораздо дороже, чем сами запчасти.

В таких ситуациях разумно использовать следующие компоненты:

  • M=0 — если обслуживание той или иной запчасти осуществляется бесплатно, то такое обслуживание не дает преимуществ.
  • S= constant — все важные запчасти могут повлиять на возможность осуществления авиарейса, а значит и убытки от их отсутствия одинаковы.
  • C= constant (годовые показатели) — большинство запчастей можно хранить достаточно долго, поэтому допустимо считать ежегодные расходы на их хранение постоянными.

Газеты

Когда речь идет о запасах в издательском деле, мы рассматриваем только единицы товара, которые можно продать в течение следующего периода, так как они полностью теряют свою ценность в последующих периодах. Газеты являются отличным примером такого товара, однако есть и другие варианты. Так же ведут себя товары, которые пользуются спросом только в течение определенного времени, и товары с небольшим сроком хранения — их нужно продать в течение очень короткого периода времени.

В таких случаях рекомендуется использовать следующие элементы:

  • M — валовая прибыль
  • S — доля валовой прибыли
  • C = 0 — ничего не переносится из одного периода в другой
  • A = 0 — отсроченная прибыль в последующих периодах не ожидается.