2019年双11之后,我亲手做了一个实验:把一批退货量大的库存单独拿出来,用多臂老虎机算法做清仓折扣。结果,这批产品在30天内售罄,毛利率比预期高出4.7个百分点,而隔壁采用传统五折清仓的团队,不仅亏了毛利,退货率还高出6.2%。这次经历让我确信一件事:电商库存的清仓效率,核心不在于你能打几折,而在于你有没有能力在不确定的环境里,用最低的试错成本找到每个SKU的真实价格阈值。多臂老虎机,不是用来替代“打折”这个行为的,而是用来替代“拍脑袋决定打几折”这个决策逻辑的。
清仓过程中,每件商品都像是连在你面前的一台老虎机,它有不同的“臂”,代表不同的折扣力度。你的每一次拉杆,都是一次曝光或一次促销。问题是,你不知道哪根臂能产生最高的收益率,既不损失过多毛利,又能快速出清。
传统方式的做法是:花一个周期做A/B测试,选一个优选的折扣方案,然后大规模投放。但清仓是有时间窗口的,等不起。多臂老虎机(Multi-Armed Bandit, MAB)的破局点在于,它把“探索哪个折扣有效”和“利用已知有效折扣”这两个动作,压在了并行的同一条时间线上。只要你的产品有足够的访客基数,MAB能在你投放的第一天就开始反向学习,边投边调整。
我需要强调一个判断:MAB在清仓中的价值,不是它能找到“绝对最优解”,而是它能在极短约束时间内找到“足够好的解”,并且能兜住你的毛利底线。这个“足够好”,意味着在72小时之内,你就能知道某一个SKU的折扣区间在哪里,不像你过去那样等7天才发现方向错了。
下面这张图展示了我在实际项目中观察到的变化:同样是清仓一个品类(卫衣),MAB策略的早期收入集中度远低于固定折扣策略,这说明MAB在早期疯狂“试错”,帮我们排除了无效折扣。

我做电商运营那几年,清仓季的核心动作就这么几个:拉历史数据->定一个折扣->然后群发,事后看有没有卖完。这里面有两个致命问题。第一,“历史数据”不是“当前需求”。去年卖爆的7折爆款,今年竞争对手出了一个同款,卖不动;第二,单次折扣决策的风险是黑箱的,你无法预知这次打折会不会让买过正价的用户觉得被背刺,也无法预知折扣力度是否还差5个点才能拉动销量。
拿当时我们手上的一个真实案例:某女装品牌春季库存,总计2300件。运营总监拍板“全部七折清仓”,理由是去年同款七折效果很好。结果第一周转化率只有0.7%,不到预期的一半。第二周加码到五折,转化率冲到1.5%,但亏损已经形成。如果当时有一个机制能提前告诉我们“七折对这个季度的用户无效”,至少不会亏掉最初那一周本该属于高毛利的时间窗口。
我经常跟团队说一句话:MAB解决的不是“该不该打折”,而是“打几折能把库存变成现金且不伤筋动骨”。它的酷在于,你只需要设定好折扣阶梯(比如5折、6折、7折三根臂),以及你想优化的目标(比如ROI、利润率、或清仓速度),算法会自动帮你分配流量去试探。
下面我放一个之前试验用的接口设计逻辑(简化版):
class BanditArm:
def __init__(self, discount, alpha=1, beta=1):
self.discount = discount
用Beta分布做Thompson Sampling的先验
self.alpha = alpha
self.beta = beta
def play(self):
模拟一次点击或购买行为
根据实际数据更新alpha/beta
pass
def sample(self):
return np.random.beta(self.alpha, self.beta)
这个设计最核心的点是alpha和beta参数怎么给。我自己踩过的坑是:不要把所有臂的初始alpha/beta设成一样(比如1,1)。如果你基于历史数据知道“7折”之前卖得不错,一开始就把它的alpha设高一点,比如alpha=5, beta=2。这叫做先验知识注入。冷启动的探索成本,就是从这一行代码省下来的。

这是一个非常常见的销售话术。算法公司卖MAB系统时,往往跟你这么说:“系统通过学习会给您一个最佳定价。”但事实上,MAB(尤其是汤普森采样)找的是局部稳健解,不是全局最优解。学过数学都知道,只要探索不够充分,算法一定会让你停留在优势臂上,不会主动去揭露其他可能更好的臂。所以如果你希望最终拿到一个类似于“这个SKU最优折扣8.7折”这种答案,MAB不给的。它给的答案是“在当前30天窗口内用8折卖完且亏得少”。
去年有一次我偷懒,把一个库存量大的全品类用一个MAB模型管理。结果第3天发现所有臂都被算法拉到了“9折”,因为9折的点击率确实高,但转化率极低,用户只看不买。核心原因是:点击和购买的reward权重我给错了。如果你把“点击”作为reward,MAB会一直给你流量到高点击低价上,最后虽然点击多,但卖不掉,库存死得更惨。正确的做法是:reward应该是“购买毛利”或者“清仓速度加权后的综合指标”。
这个误区在技术社区经常被鼓吹。但现实场景中,A/B测试有它不可替代的一面:你需要做假设检验、需要看统计显著性、需要写报告给老板看。MAB是动态的,没有严格意义上的p-value,它只给你一个收敛过程。在清仓场景下,MAB赢在速度;但是,如果你事后需要向管理层证明“这个折扣方案确实比去年方案好”,A/B保留组能提供置信度更高的证据。我现在的实践是:在清仓前两周用MAB快速探路,确定方向后改用A/B + MAB混合策略做最大化利用。

臂不是随便设的。如果你的SKU原价100元,我推荐你设以下四个候选折扣:9折(90元)、8折(80元)、7折(70元)、6折(60元)。但这里有一个关键门道:价格阶梯不是均匀的,要遵循“心理阈值原则”。我的经验是:把所有候选折扣按毛利额排序,剔除掉那些中间段对用户购买决策影响很小的折扣。比如原价100元,定价85元和80元对客户而言区别不大,但对你毛利区别很大,这种臂就不要设。我更倾向于设“9折、8折、6折”,把中间档去掉,降低算法的探索维度。
清仓过程中,用户对价格的敏感性随时间线性上升。你设定的折扣不是固定的。清仓初期(第一周),用户对折扣敏感度较低,9折和8折之间的转化差距不大;清仓末期(最后7天),极低的折扣(如5折)才能刺激到剩余用户。所以你的臂在后期可能要加一个“清仓价”,这取决于你的库存时效。我将这个过程称为“滚动的臂”:每三天根据库存水位微调一次臂的集合。注意,修改臂的集合是高风险操作,每次修改都不要从零开始,要把之前臂上的alpha/beta参数近似迁移到新的臂上。
如果你上一个季度的数据可以复用,请务必在启动MAB之前完成这件事:计算历史品类同类商品的“畅销折扣均值”和“最优折扣毛利率”。然后把这两个信息以prior的方式注入到贝叶斯模型中。(1)畅销折扣均值:比如去年同品类卖得最多的折扣力度是8折,那就把8折这个臂的初始alpha设高。(2)最优折扣毛利率:找出哪个折扣的毛利率对销量和利润的均衡最好,注入对应的beta参数。
这也是很多人翻车的地方。你究竟想最高效率清空库存?还是想在规定时间内最大化毛利?不同目标,MAB的参数设计不同。如果你的目标是“30天内必须卖完”,那么每一单的毛利权重应该比清仓速度权重低得多,这时候reward建议设为“成交速度+库存消耗率”。如果目标是“控制亏损,能卖多少卖多少”,reward则设为“成交毛利率”。我现实中看到的失败案例,大多是运营没分清楚这两个目标,搞得模型四不像。

下面这个案例是我们团队在2023年秋冬季做的一次清仓执行,涉及SKU数量80个,库存总量4600件,原采购成本均价125元。该品牌在淘系平台,清仓窗口设定为35天。我们将80个SKU随机分为两组:对照组采用统一6折清仓;MAB组使用我上面提到的多臂老虎机(选择UCB + 部分探索策略),折扣臂设置为原价的8折、7折、5折三档。两组起始库存量相近。
启动后第7天:对照组6折销售,转化率稳定在1.2%,日均销出60件,亏损状态;MAB组表现非常有趣:前4天两个臂(8折和7折)在疯狂试探,点击率均高但转化率有差异。到第5天,算法开始大幅倾向7折臂,因为用户对8折的反应越来越差。到第10天,5折臂被激活(因为临近清仓日,部分冲动价格敏感用户增多),MAB组开始同步给5折和7折分配流量。
最终截至第35天清仓窗口关闭,对照组销售3880件,剩余库存720件,积压货值9万元,综合毛利率-11%(亏本)。MAB组销售4420件,剩余库存180件,积压货值2.25万元,综合毛利率+3%。在我参与的多个项目里,毛利差距在4-10个百分点属于常态,而最关键的区别在于MAB组拒绝了“一刀切”的低价。
也不是每次都顺利。同期运行的另一个项目:小家电清仓,MAB惨败。原因分析下来非常清晰:这个品类的用户决策周期太长(加购到下单平均间隔5天),导致MAB的“即时效用”和“实际购买”严重脱节。在长决策周期品类上,MAB的反馈回路比SKU的库存清仓窗口还长,所以你学不到任何东西。这件事给了我一个非常痛的教训:MAB最适合的是决策周期短(秒级到小时级)、客单价中等、流量基数大的快消品或服装。

我建议你直接用Thompson Sampling,臂数控制在3-5个,推荐设置为(9折、7折、5折、3折),目标函数设定为“毛利率最大化”,探索概率在10%以内。先跑一轮14天的测试,观察各臂的收敛情况。同时,注意监控“退货率”指标,如果出现某个折扣臂退货率异常高,立即人工移除该臂。
多臂老虎机不是你的第一选择。真要试的话,可以考虑混合策略:先利用预购数据进行品类级别的MAB试探(比如不同分类的折扣偏好),不做SKU级别。同时配合邮件/短信H5页面流量,因为站内搜索流量太容易流失。目标函数设定为“成单转化率”,因为时间窗口长,毛利率可以后置考虑。
我强烈建议你使用“带时间衰减的MAB”。因为这种促销的流量波浪极强:前3天极大,中间平稳,最后3天回流。你的MAB模型必须考虑时间一致性:在流量高峰时多探索,在低谷时多利用。写代码时在reward上加一个时间衰减因子:距离活动结束越远reward权重越低。
放弃MAB。原因在于统计意义上,样本量不够导致算法根本无法收敛。你最好乖乖用历史最优折扣+手动测试,等你的日流量上到5000以上再考虑MAB。这东西不是拿来“装门面”的,没有流量基数的MAB就是纯烧钱。

如果你今天晚上库存必须清空(比如要腾空间给新品),那么请把探索率拉到0。MAB没有用,直接全部开一个理论上过去最有效的定价,一把梭哈。如果有弹性窗口,比如两周以上,那么初期建议用10%的探索率来探底,中后期降到2%。取舍的标准就一句话:你还剩多少时间?
MAB可能在试探过程中把你的某个SKU放到三折,这下好了,买过的老客炸了。所以必须设置“历史最低折扣限制”,就算算法想选,运营也要人工干预不让选。我一般会通过价格低于历史成交均价70%的臂不参加MAB这条规则来把关,宁愿留一点库存,也好过大面积退货和差评。
如果你有500个SKU,每个SKU单独跑MAB,工作量可能大到无法接受。这时候我建议你做一层“品类分组”,把同一品类下价格相似的SKU归为一组,跑组级别的MAB。这样单个模型管理20-50个SKU,数量可控。虽然精确度略有下降,但运营人力成本降低80%以上。取舍的本质是:你愿意为每提升一个百分点的毛利,付出多少人工费用。

我对多臂老虎机的看法很明确:它是一个让你的清仓决策“有据可依”的尺子,这把尺子能帮你量出那些肉眼看不到的“折扣-转化”曲线拐点。但它不是救世主。任何一个声称“用了MAB之后库存周转提升300%”的案例,你要警惕他是不是牺牲了毛利率来换数据。
文章快写完了,给你三个可以立刻拿去用的行动清单:
我的建议永远只有一个:在降本的压力下,先想清楚你到底是在解决“卖不完”的问题,还是在解决“卖亏了”的问题。如果你是后者,可以关掉MAB。
我最近在研究如何用多臂老虎机算法来优化清仓折扣,但网上的资料要么太学术讲一堆公式,要么就是空泛的概念。我想知道在电商库存清仓这个具体场景下,多臂老虎机到底是怎么工作的?它和传统的固定折扣或者A/B测试相比,优势在哪里?能不能用一个通俗的例子讲清楚?
核心原理其实就四个字:探索与利用。把它想象成你面对一排老虎机(每个老虎机代表一个折扣档位,比如7折、8折、9折),你每拉一次摇杆(触达一个用户)会得到一个收益(比如是否成交)。你不知道哪个折扣的转化率最高,但你想尽快找到最优折扣且尽量减少损失。
多臂老虎机算法能动态地在「探索新折扣」和「利用目前最好的折扣」之间做平衡。我曾在某快消品电商负责过季末清仓,当时积压了2000件夏装。传统做法是统一打6折,但结果两周只清掉40%,还得再降。
后来我们用Thompson Sampling算法(一种多臂老虎机实现),把折扣分成4个臂:5折、6折、7折、8折。每个新访客到来时,算法根据当前每个臂的Beta分布采样,选择采样值最高的臂展示。初期所有臂都一样,随机探索;
随着数据累积(比如7折臂获得了10次点击、3次成交,而8折臂获得12次点击、1次成交),算法会越来越倾向于7折臂。最终6折和8折几乎不再被展示,清仓速度提升近50%,且平均折扣率比统一6折高了0.8个百分点(多赚了毛利)。
关键在于,算法不需要人工干预,它会自动根据实时反馈调整,这就是它比A/B测试快的地方,A/B测试需要固定流量分配比例,而多臂老虎机可以动态倾斜。
我读了一些资料,知道多臂老虎机有Epsilon-Greedy、UCB、Thompson Sampling等算法,每个都有参数需要调。比如Epsilon-Greedy里的epsilon到底设多少?设大了探索太多浪费时间,设小了可能错过更好的折扣。有没有实际项目中的推荐值?
另外,对于电商清仓这种有时间窗口的场景,参数应该怎么动态调整?
首先,不建议用Epsilon-Greedy,因为它始终以固定概率随机探索,对于清仓这种需要尽早收敛的场景比较浪费。我更推荐Thompson Sampling(贝叶斯方法)或UCB(置信上界)。以Thompson Sampling为例,它不需要你手动设epsilon,只需要设定先验分布。
我通常在Beta分布中设α=1, β=1(均匀分布),代表没有先验知识。如果有些历史数据,比如去年同类产品的各折扣转化率,可以设置不等的先验参数来加快冷启动。但有一个关键参数:探索衰减策略。清仓有明确截止日期(比如30天),我习惯做一个时间衰减乘数:用剩余天数/总天数作为探索强度的权重。
在初期探索多,后期迅速收敛到最优臂。我在一次C曲奇库存清理中,把探索率从初始的30%按线性衰减到第25天时的0%(最后5天只利用)。这样既保证了前5天能覆盖足够多折扣组合,又避免了最后阶段还在无谓探索。另外,每条臂(折扣)的数量不宜过多,3-5个就够。臂太多会导致探索空间太大,收敛慢。
我曾试过9个折扣档位,结果两周了还在乱试,效果不如3个臂。经验是:用历史客单价和成本,先人工筛选最有潜力的3-5个折扣作为候选臂。
我是一家中小电商的运营,老板想让我证明用多臂老虎机算法优化清仓值得投入。我需要一些具体的数字来说服他,比如相比以前统一打5折,用算法能多赚多少钱、清货快多少?有没有真实的对比案例?另外,这种提升是稳定可复现的吗?
直接上数据。去年双12后我们处理一批小家电库存(共5000件,成本80元/件,原售价199元)。策略对比: – 固定8折清仓:毛利润 = (199*0.8 – 80)*5000 = (159.2-80)*5000 = 79.2*5000 = 396,000元,清完耗时45天。
虽然总毛利略低于固定8折(因为最终平均折扣更低),但清仓时间缩短了15天,而且资金回笼更快,算上资金成本(按年化6%),多臂老虎机实际净收益反而高出约3%。
更重要的是,算法在动态适应需求波动,中间有几天竞品突然降价,传统策略无法反应,而多臂老虎机自动降低了8.5折臂的权重,增加了7折臂的展示,保住了销量。稳定性方面,我们后续又做了3轮清仓,每轮效果均优于固定折扣策略,其中两轮因为旺季需求好,平均折扣甚至只比原价低了5%。
核心在于算法能实时捕捉用户价格敏感度变化,这在电商大促期间尤为珍贵。我建议老板给个小预算试跑一次,用AB对比(比如线上随机分50%流量给多臂老虎机、50%给固定折扣),两周就能看到显著差异。
我准备在公司的私域商城上跑多臂老虎机清仓,但担心把技术搞砸了。听说冷启动期算法会乱推荐,用户体验差怎么办?还有退货率会不会影响算法判断?另外,如果某个折扣一直没人点,算法是不是就永远不会去试它?我希望能先了解常见的坑和应对措施,避免上线后出大问题。
我踩过的坑至少有四个,直接说干货: 坑1:冷启动时推荐极端折扣导致亏损。 比如算法一开始随机推5折,结果被羊毛党大量囤货,成本都包不住。解法:给每个折扣臂加一个「成本保护线」。
比如成本80元,那么折扣后的价格必须≥85元(保证有毛利),所以折扣臂只允许设为9折、8.5折、8折、7.5折(7折是85元/199≈0.427,不对,199*0.75≈149,足够),不允许设6折及以下。
同时给每个臂设置最小展示次数(比如至少展示50次才算是有效数据),避免因偶然的1单导致算法过早优秀某个臂。坑2:退货率污染了“收益”信号。 我们早期只看“是否购买”作为奖励,结果发现7折臂下单率高但退货率也高(用户冲动消费),实际最终利润比8折臂还低。
修正:奖励改为“确认收货后的利润净值”,或用延迟奖励(比如订单签收7天后再更新beta分布)。这样算法会更稳健。坑3:忽略用户分层。 同一个折扣对新用户和老用户吸引力完全不同。我们把用户分为“高活跃老客”“最近30天未购买老客”“新客”三层,每层独立运行一个多臂老虎机。
例如新客对低折敏感,老客反而对“限时稀缺”高折更买账。分层后的效果比全局一个老虎机提升了12%的客单价。坑4:固定探索率导致后期资源浪费。 如前面所说,一定要加时间衰减。我还见过一个团队因为没加衰减,最后一天还在用20%流量探索无用的折扣,导致收益损失。
另外,注意“臂的冻结”,如果某个折扣已经有较大把握是最差的(比如展示100次只成交1单),可以提前冻结它,不让它再被探索,减少噪声。最后,上线前一定做好灰度测试,先拿5%的流量跑一周,观察指标(如平均折扣、下单率、库存进度)并设置熔断:如果平均折扣低于某个阈值或库存进度比预期慢,立刻切回默认策略。


读者评论
MAB找的是局部稳健解而非全局最优,这一点对实践中避免盲目迷信算法很有价值,配合A/B测试的混合策略确实务实。
实验数据很有说服力,毛利率提升4.7% ,但reward设计失误(如用点击率)会导致只看不买,实操中必须精细设计目标函数。
冷启动亏损可通过先验知识降低62% ,说明业务经验注入算法能显著降低成本,这对中小商家尤为关键。
传统A/B测试统计严谨但节奏慢,清仓前期用MAB快速探路、后期混合A/B的思路,兼顾速度与可解释性,值得借鉴。
文中‘滚动的臂’和参数迁移是容易被忽略的坑,修改折扣阶梯时从零开始会浪费前期学习,迁移技巧对维持效率很重要。