Priorización económica de la compra

Los pronósticos probabilísticos proporcionan información estratégica mucho más específica sobre el futuro en comparación con los métodos de pronóstico más tradicionales, y nos incitan a repensar todo el proceso de pedido. En esta sección, detallamos cómo puede generarse una lista de prioridad de compra utilizando Lokad. Los dos beneficios clave de este abordaje en comparación con los puntos de reorden son: la eliminación de niveles de servicio por mantener y adaptar, y una metodología de compra más flexible que se ajusta mejor a las limitaciones de suministro.

La lista de prioridad de compra es un ejemplo de política de pedido priorizado para el inventario. Esta amplia clase de políticas de inventario logra un rendimiento de inventario superior comparada con las políticas de inventario tradicionales. Cuando es posible, Lokad recomienda utilizar una política de pedido priorizado.

Plantilla de script para la lista de prioridad

Para generar una lista de prioridad, tenemos que utilizar un breve script de Envision (ver a continuación). Este script puede crearse en su cuenta de Lokad utilizando el botón Create Envision script (crear script de Envision). Una vez que se ha creado el nuevo proyecto, se le presentará un editor de código fuente. Copie el código a continuación y haga clic en Save (guardar).

read "/sample/Lokad_Items.tsv" with
Supplier: text
Category: text
SubCategory: text
read "/sample/Lokad_Orders.tsv" as Orders
read "/sample/Lokad_PurchaseOrders.tsv" as PO

orderingLeadtime := 7 // 7 días

// excluir PO no entregadas
where PO.DeliveryDate > PO.Date
Leadtime = forecast.leadtime(
hierarchy: Category, SubCategory
present: (max(Orders.Date) by 1) + 1
leadtimeDate: PO.Date
leadtimeValue: PO.DeliveryDate - PO.Date + 1)

Demand = forecast.demand(
horizon: Leadtime +* dirac(orderingLeadtime)
hierarchy: Category, SubCategory
present: (max(Orders.Date) by 1) + 1
demandDate: Orders.Date
demandValue: Orders.Quantity)

show form "Purchase simulator" a1b3 tomato with 
Form.budget as "Max budget"

M = SellPrice - BuyPrice
// penalización por desabastecimiento
S = - 0.25 * SellPrice
// % '0,3' como costo de almacenamiento anual
C = - 0.3 * BuyPrice * mean(Leadtime) / 365
// caso de pedido pendiente
MB = 0.5 * SellPrice
MBU = MB * uniform(1, Backorder)
// back-order case
SB = 0.5 * SellPrice
SBU = SB * uniform(1, Backorder)
// oportunidad de comprar más tarde
AM = 0.3
// % '0,2' como descuento económico anual
AC = 1 - 0.2 * mean(Leadtime) / 365

RM = MBU + (stockrwd.m(Demand, AM) * M) >> Backorder
RS = SBU + zoz(stockrwd.s(Demand) * S) >> Backorder
RC = (stockrwd.c(Demand, AC) * C) >> BackOrder
// recomposición simple
R = RM + RS + RC

Stock = StockOnHand + StockOnOrder

DBO = Demand >> BackOrder
table G = extend.distrib(DBO, Stock, LotMultiplier)

where G.Max > Stock
G.Q = G.Max - G.Min + 1
 // integral de la función de recompensa por existencias
G.Reward = int(R, G.Min, G.Max)
G.Score = G.Reward / max(1, BuyPrice * G.Q)

// primero las puntuaciones principales
// pero se preserva el pedido de pares (Id, G.Max)
G.Rank = rank(G.Score, Id, -G.Max)
G.Invest = cumsum(BuyPrice * G.Q) sort [G.Rank]

where G.Invest < Form.budget + 0
where exists(G.Q)
show table "Purchase priority list with $\{Form.budget}" c1g3 tomato with
Id as "Id"
Supplier as "Supplier"
StockOnHand as "OnHand"
StockOnOrder as "OnOrder"
sum(G.Q) as "Qty"
mean(Leadtime) as "Leadtime"
sum(G.Reward) as "Reward" unit:"$"
sum(BuyPrice * G.Q) as "Cost" unit:"$"
group by Id
order by avg(G.Score) desc

Este script produce un panel de información que contiene una tabla. Se espera que un planificador de cadena de suministro compre los artículos sugeridos siguiendo el orden de la lista. Las cantidades sugeridas tienen en cuenta los pedidos pendientes, así como los multiplicadores de lote.

Image

Revisemos el contenido del script. La línea superior contiene datos de lectura de la carpeta /sample en la se espera que se encuentren los archivos de ejemplo.

Con respecto al archivo Lokad_Items.tsv que se espera que contenga la lista de productos o SKU, suponemos que tendrá dos columnas "especiales":

  • SellPrice: el precio de venta unitario (sin impuestos)
  • BuyPrice: el precio de compra unitario (sin impuestos)

Una vez que haya ajustado el script para asegurar que extraiga datos de la carpeta de entrada correcta, y suponiendo que los campos SellPrice y BuyPrice están disponible como lo espera nuestra tecnología, puede hacer clic en el botón Run. El script se ejecuta y produce un panel de información que contiene una sola tabla grande. Haga clic en la tabla, en la parte inferior de la pantalla, y tendrá la opción de descargar esta tabla como una planilla de Excel.

La primera parte del script incluye dos llamadas al motor de pronóstico probabilístico de Lokad para pronosticar el tiempo de entrega y la demanda respectivamente.

Luego, introduzcamos las variables económicas relevantes para el cálculo de la función de recompensa por existencias:
  • M: la recompensa (margen bruto) por unidad servida desde el stock.
  • S: la penalidad por unidad cuando no se satisface una demanda desde el stock.
  • C: los costes de almacenamiento anuales por unidad.
  • AM: el factor de descuento sobre el componente de margen.
  • AC: el factor de descuento sobre el componente de costo de almacenamiento.

El núcleo de la lógica de priorización se encuentra en el cálculo de G.Rewards y G.Score.
  • G.Reward: representa las recompensas económicas asociadas con G.Q unidades adicionales en stock (generalmente, G.Q es simplemente igual a 1).
  • G.Score: representa un cociente de la cantidad de rendimientos en dólares por cada dólar invertido en stock.

El filtro where que sigue excluye las situaciones en las que el punto de reorden se encuentra por debajo de los niveles de inventario actuales. Excluimos estas situaciones porque solo estamos considerando aquellos escenarios de compra en los que tenemos como objetivo adquirir más inventario. Dentro de este bloque, procedemos con una segunda serie de cálculos que impulsa a la priorización misma:

  • G.Rank: ordena todas las entradas de la grilla de acuerdo con su puntuación. La operación de ordenación viene, sin embargo, con una adaptación: para cada artículo, la nueva ordenación preserva el orden del punto de reorden.
  • G.Invest: muestra cómo crear un cálculo acumulativo. Aquí, calculamos la inversión total (acumulativa), suponiendo que cada artículo se compra siguiendo el orden de la lista.

Por último, el script termina con una instrucción show table, y todas las líneas de las grillas se agregan por Id para dar lugar a una lista en la que cada artículo aparece solo una vez.

Ajustando la priorización

El script que vimos anteriormente hace suposiciones un tanto simplistas de las variables económicas utilizadas para el cálculo de la recompensa por existencias. Puede que no todos sus artículos estén sujetos a los mismos costes de almacenamiento. Algunos artículos pueden ser perecederos, otros pueden ocupar mucho espacio, etc. Puede visitar nuestra sección sobre costes de inventario para suposiciones más realistas con respecto a este tipo de costes. En la práctica, observamos que la mayoría de los comerciantes subestiman sistemáticamente su costo de inventario. En nuestra experiencia, cualquier coste de almacenamiento anualizado que equivalga a menos del 25 % es cuestionable.

Si bien revisar el script puede resultar un poco tedioso al principio, en la práctica, hemos visto que esta es una de las pocas opciones que ofrece la flexibilidad que se requiere para implementar suposiciones que estén alineadas con su negocio. El script de Envision ofrece el tipo de expresividad que generalmente puede encontrar en una planilla de cálculo de Excel.

Del lado de las ganancias, el script que vimos anteriormente favorece una maximización pura del margen bruto. Aún así, esto puede tener un efecto negativo en su actividad si algunos artículos de menor margen resultan impulsar su negocio generando muchas ventas más pequeñas pero mucho más rentables (por ejemplo, un ciente compra un teléfono inteligente que da un 2,5 % de margen bruto, a lo que le sigue una compra de dos accesorios de telefonía que dan un 50 % de margen bruto). En este caso, puede introducir un factor de "fondo de comercio" representado por algún margen diferido aplicado a este tipo de artículos insignia.

Nuestra experiencia indica que hay casi tantos parámetros de priorización como actividades comerciales, pero la priorización refleja la combinación específica que define a su negocio. No dude en si desea recibir más asistencia.