Skip to content

chizi15/Newsvendor-related

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

"""
1. 背景介绍
以残差最小化为目标的结构化数据预测(如销量预测)的方法主要有三大类,第一类是一元和多元的时间序列分析方法,常用的一元方法例如ETS(即指数平滑霍尔特温特斯)和SARIMA,多元方法例如Prophet和VARMAR,它们在特征(即相关变量features)较少时性价比是很高的;第二类是基于监督回归的机器学习方法,例如scikit-learn和pycaret里面的回归类模型及其集成方法,在目标变量target受features影响而不是自身序列影响更多时,预测精度通常会比第一类中的时间序列分析方法更高,例如在促销场景而不是生命周期场景中;三是基于监督的深度神经网络方法,例如DeepAR、CNN-QR、TFT,这些方法通常更适合于带有多特征的大量样本同时进模型训练,才能体现出性价比。
而以利润最大化为目标的三类决策方法,可以处理零售商的订货、且同时进行定价的问题,因为对预测期的数量和毛利率同时进行决策,才可能使毛利率最大化,而只订数量是无法实现该目标函数的。三类方法分别是带有解析解的机理模型、基于监督回归的机器学习模型和基于监督的深度神经网络;其中基于机理的方法只能处理销量、毛利率(即进价和售价)、时间效应(即节假日、周日、季节性效应)这三类变量的建模求解,另外两类方法理论上可以处理任意多维度变量的建模求解,因为它们不需要推导出解析解,只要能算出局部最优的数值解即可。由于时间关系,本文只对机理模型进行了验证,以及和现有生产系统预测值的对比,机器学习和深度学习的开源决策方法还未进行测试。需要注意的是,基于残差最小化的预测方法,是根据历史销量、价格和其他特征(如时间效应、天气效应等)进行训练,在已知或默认的预测期价格和其他特征的条件下,推理出预测期的销量,其目标是使预测值和真实值尽可能地“像”和接近;而基于利润最大化的决策方法,是以不同的历史销量、价格和其他特征的对应组合为单元进行训练,在已知预测期其他特征的条件下,决策出预测期的价格及其对应销量,其目标是根据对预测期不同价格及其对应销量的组合,使毛利率最大化。
无论采用基于残差最小化的三类预测方法,还是基于利润最大化的三类决策方法,都应尽可能地遵循pre-processing、modeling、post-processing的前中后算法架构和流程。前部的pre-processing主要包括ETL和feature engineering,后者根据数据特点和选用模型的不同,又分为对target和features的transform;中部的modeling是各自的三类方法,机理解析类、机器学习类、深度学习类,以及对某些方法的集成流程,如boosting、bagging、voting、meta stacking等;后部的post-processing主要是对各模型的误差偏移补偿,对不同模型结果或者补偿结果的自适应加权,工业品的安全库存计算,以及一些跟业务特点有关的操作,如工业品的订货公式和参数设置。当然不是所有步骤都是必须的,最好是根据数据特点和问题特点的结合,来合理选用和优化。

2. 数据处理步骤:
(1)	读取shape为22,507,686 rows x 10 columns的流水表,按organ, class, code, busdate进行日内分组聚合,则可对销售单价price字段求分组众数,若同一组内众数个数≥2,则求其平均数;认为该数值代表当天的基准售价。
(2)	将日内超出(1)中基准售价±10%的销售记录剔除,放到该code另外的非基准售价样本组中,认为那些记录不是该code的正常需求;或者说当价格波动大时,那些需求和基准价格需求不是同质的,所以应放到不同的样本组中。得到shape为21,919,315 rows x 13 columns的基准售价筛选流水表。
(3)	将(2)中得到的筛选流水表按organ, class, code, busdate分组聚合为1,789,766 rows的账表,并得出各code的平均售价时间序列price和平均毛利率时间序列β。
(4)	将账表按organ, code进行日间分组聚合,求得各code的price和β字段的中位数和均值,以其加权平均作为各code的基准price和β,选取同时满足基准price和β在±10%范围内的日间销售记录,认为筛选后的账表是售价和毛利率稳定的记录,可作为决策模型的训练数据,用于(7)中拟合概率分布。筛选后账表的shape变为616,485 rows x 16 columns。
(5)	将(4)中得到的筛选账表分3次和商品资料表、每日结存表、预测表进行左连接,再剔除无预测值的记录,使生产系统预测销量和理论销量一一对应,便于(7)中计算相对权重α和其他各种精度和相关性指标。可得shape为604,644 rows x 31 columns的综合表。
(6)	将(5)中得到的综合表按临界日期2022年8月1日划分为训练集和验证集。训练集取理论销量和毛利率共2个字段的时序,从code层级开始,依次按sm_sort, md_sort, bg_sort, class, organ共六个层级自底向上逐层分组聚合,再将各组聚合表按行拼接,得到训练表,则可得每个层级中每个样本的单值平均利润率β,并记录每个样本的销量时序,即找到训练表中每个样本对应的单值β和销量时序。验证集取生产系统预测值、理论销量和毛利率共3个字段的时序,也是从code层级开始,按sm_sort, md_sort, bg_sort, class, organ共六个层级自底向上逐层分组聚合,再将各组聚合表按行拼接,得到验证表,则可得每个层级中每个样本的单值平均利润率β,并记录每个样本的生产系统预测时序和理论销量时序,即找到验证表中每个样本对应的单值β、生产系统预测时序和销量时序。再根据索引找到训练表中样本和验证表中样本的对应关系,便可进行(7)中相对权重α和各种评估指标的计算。
(7)	根据(6)中生成的训练表和验证表的样本及其对应关系,循环计算出各层级各样本的α时序和评估指标。
i. 计算决策模型的最优解:
对训练表中样本的销量时序用γ分布进行拟合,得到其最优参数,便可得该参数下γ分布对应的分位数函数ppf,将该样本的单值平均毛利率β代入该ppf函数,则可得该样本在其β利润率±10%范围内,在验证集上的最优订货量Q*;
ii.	计算α时序及其均值:
将该样本的最优解Q*、验证表上该样本对应的生产系统预测时序、理论销量时序代入公式Q生产(t) = (1-α)Q※(t) + α·d(t)理论,可得该样本的α时序;取α时序的中位数,作为该样本对应的单值平均相对权重α。
iii. 计算其他评估指标:
将同一个样本在验证表中的生产系统预测时序和理论销量时序代入评估指标函数regression_evaluation_def中即可;包括4个零次的精确度指标,6个一次的精确度指标,2个二次的精确度指标,和7个相关性指标。

3. 说明:对于理论销量的分解,当α<0或α>200%时,决策值比预测值占更大权重;当α∈(0,200%)时,预测值比决策值占更大权重;当α=0时,预测值与决策值相等;当α=2时,预测值+决策值 = 2*理论销量,即预测值与决策值占相等权重。
由上述相对权重α的分布可知,此时生产系统预测值优于决策订货值,或者说在大多数情况下,前者对理论销量的分解占更大权重。这是因为决策模型尚未加载时间相关效应,且是一次训练,给出各单品三个月的基准毛利率对应的订货量,且决策模型本来就不是以逼近理论销量为目标,而是在毛利率及其对应销量的各组中,使毛利率最大化为目标,所以这样的结果是有很大潜力的,可以对预测方法进行很好的补充甚至以决策为主。

4. 决策方法应用到生产系统的改造步骤
本文使用的脚本只进行了初步验证,还没有加载时间效应,在进行生产化改造的时候也还有些步骤要做。需要了解的是,下列每一个步骤都是对机理决策模型的使用条件做了简化,因为严格按照假设条件,同一个单品的毛利率和销量分组将过多,在超市实际定价操作的时候也不方便,所以可以先做一个简化版本看效果,如果有需要细化,再来加工步骤,使操作过程更加接近模型的应用条件。
步骤1:在得到各单品的真实需求,例如理论销量后,将越近的销量点复制出更多的销量点,越远的点复制出更少的点;或者是对历史上处在当前点生命周期位置附近的点复制出更多销量点,越远离当前点生命周期位置的历史销量点复制出越少的点。这样做一是可以增加样本中元素个数,更有利于后续拟合概率密度函数,二是可以使越近当前时间位置的元素占越大的权重,越远离当前时间位置的元素占越小的权重。可得各单品复制扩展后的样本集。
步骤2:将扩展样本集剔除时间效应,如节假日效应、周日效应,甚至是生命周期的季节性效应,认为剔除时间效应后的销量主要受价格影响(机理决策模型无法代入天气等相关变量,因为推导不出解析解,只有使用机器学习和深度学习类的决策模型来建模天气等相关变量)。
步骤3:选一种常用的概率密度函数,如γ分布的PDF,去拟合剔除时间效应后的扩展样本集,由此可得该分布的分位数函数PPF。
步骤4:计算剔除时间效应后的扩展样本集的归一化平均毛利率,归一化平均毛利率 =(总售价 – 总进价)/ 总售价,是一个(0,1)之间的数,千万不能用长尾毛利率 = (总售价 – 总进价)/ 总进价,最好也不要用样本中各销量点的毛利率再求平均,因为样本中各点处的售价通常不是唯一的。
步骤5:将第4步计算出的归一化毛利率代入步骤3得到的PPF函数的自变量中,得出无时间效应下,该单品在该平均毛利率下的近似最优销量Q※。
步骤6:加载预测期的时间效应到Q※上,得到该单品预测期各天的订货量。
每天重复步骤1~步骤6,进行滚动训练和预测。

5. 相关竞赛案例和参考文献
国内外机器学习和数据科学竞赛(Kaggle或天池)中的案例,以及相关的论文或专著,下面列出三本,有一些关于零售商工业品及生鲜销量预测和定价的建模和求解,下面列出这些链接以供参考,或许能得到一些启发。
Kaggle: Your Machine Learning and Data Science Community
天池大数据竞赛_天池大赛-阿里云天池 (aliyun.com)
Forecasting: theory and practice
Demand Prediction in Retail
Forecasting: Principles and Practice (3rd ed)

"""

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages