干货 | 我用ARIMA模型预测了11个国家的销量

楼主
我是社区第988519位番薯,欢迎点我头像关注我哦~

干货 | 我用ARIMA模型预测了11个国家的销量,结果令人意外!

手把手实战:销量预测、自动调参、置信区间,一文看懂时间序列

大家好,我是德里克。

最近接到一个有意思的需求:根据某产品2026年上半年的历史销售数据,预测未来30天(20267月)各国每天的销量。

数据涉及11个国家/地区(含阿根廷、巴西、法国、德国、意大利、日本、墨西哥、西班牙、英国、美国、其他),时间跨度181,颗粒度细到国家+

拿到这种多国家时序数据,第一反应肯定不是用Excel拍脑袋。我选择了经典且稳定的ARIMA模型,配合Pythonstatsmodels库,实现了一套全自动网格搜索+评估+预测的流程。

今天把整个过程、踩坑点和最终结果拆开揉碎了分享给大家。

一、为什么选ARIMA?它到底在算什么?

很多同学一听到时间序列就头疼,什么自回归(AR差分(I移动平均(MA,名字唬人,其实逻辑特别生活化。

我举个简单的例子:

  • AR(自回归):今天的销量跟昨天、前天的销量有没有关系?比如周末效应,昨天卖得好,今天大概率也不会差。
  • I(差分):如果销量整体在逐月上涨(趋势),我们就做减法——用今天的减去昨天的,把趋势掉,让数据变平稳。
  • MA(移动平均):今天除了看历史销量,还要看前几天的意外误差。比如上周搞了个大促,多卖了100件,这个冲击会延续到未来几天。

ARIMA(p,d,q)就是这三个部分的组合拳。

  • p:看几个历史值(滞后阶数)
  • d:差分几次(消趋势)
  • q:看几个历史误差

听起来复杂,但其实代码里我们直接让机器遍历(p,d,q)组合,选AIC最小的那个,省去了大量人工试错。

二、代码核心流程:四步走

整个Python脚本只有200多行,核心逻辑分四步:

1. 数据清洗与对齐
原始数据是Excel,字段含时间、国家、实际销量

  • 国家 + 时间聚合求和。
  • 遇到某些日期没有记录(比如节假日没营业),直接0
  • 保证每个国家的时间序列是连续的,一天不落。

2. 网格搜索最优参数
对每个国家单独建模(因为各国销量波动规律完全不同)。
设定搜索范围:

  •  [0, 4]
  •  [0, 2]
  •  [0, 4]

一共5×3×5=75种组合,用AIC(赤池信息准则)挑最优。AIC兼顾了模型的拟合优度和复杂度,值越小越好

3. 测试集验证(滚刀肉环节)
最后14做测试集,前面的数据训练。
计算三个硬指标:

  • MAE(平均绝对误差):预测差了绝对值平均多少。
  • RMSE(均方根误差):对大偏差惩罚更狠。
  • MAPE(平均绝对百分比误差):看误差占真实值的比例,消除量纲影响。

4. 未来30天预测 + 置信区间
用全量数据重新训练最优模型,预测未来30天,顺便输出95%置信区间(上下限),告诉老板:真实值大概率落在这个区间里,别把预测当圣旨。

三、各国预测效果大PK,谁是优等生?

脚本跑完后,汇总表让我挺意外。放几个有代表性的国家给大家看看:

国家

最优参数

MAE

RMSE

MAPE(%)

预测30天合计

美国 (US)

(2,2,4)

29.41

37.47

10.26%

9,495

巴西 (Brazil)

(4,1,3)

13.15

18.91

13.05%

3,736

英国 (UK)

(4,1,3)

22.26

25.21

16.35%

4,563

阿根廷 (AR)

(0,2,4)

449.27

635.70

29.57%

43,635

西班牙 (Spain)

(3,1,3)

54.64

68.32

40.71%

6,572

亮点解读:

  • 美国是真稳!MAPE只有10%,说明美国市场的日销量波动非常有规律,ARIMA抓到了稳定的周期。
  • 巴西、英国紧随其后,误差控制在15%左右,属于靠谱预测
  • 阿根廷虽然误差绝对值很大(MAE=449),但它的销量基数本身就大(日均1500+),所以MAPE不到30%,勉强及格。但注意到它的参数是d=2(二阶差分),说明销量趋势变化剧烈,模型为了追趋势牺牲了部分稳定性。
  • 西班牙直接翻车了(MAPE=40%)。推测是销量存在剧烈的无规律跳动,或者存在我们没捕捉到的季节/促销因素。这也提醒我们:ARIMA虽好,但遇到波动大的数据,该上外部特征(节假日、天气)还是得上。

四、别只看平均值!置信区间藏着大秘密

我重点看了阿根廷的预测明细,发现一个有趣的现象:

2026-07-01预测销量142595%置信区间是 [568, 2282]
到了730日,预测销量1501,区间变成了 [-2262, 5263]

注意,下限变成了负数!

这在统计学上没问题,但在业务上,销量不可能是负数。这说明:

  1. 预测时间越远,不确定性呈指数级放大(虽然ARIMA的区间有时不会像LSTM那样爆炸,但阿根廷数据太抖了)。
  2. 如果你的业务要求精准安全库存,只看预测均值会害死人。必须看置信下限,并以此为基础设置安全库存底线

反观巴西,预测值稳定在120左右,置信区间也收得很窄(比如[40, 210]),这样的预测结果直接拿来指导补货,决策成本低很多。

五、关于代码和落地的一些大实话

  1. 自动选参是双刃剑:虽然grid_search很省事,但在数据量小或噪声大的情况下,AIC最小不一定预测效果最好。我建议跑完代码后,人工看一眼d值,如果d=2(差分两次),最好再拿ADF检验验证一下平稳性。
  2. 缺失值填0合理吗? 要看业务场景。如果某天没销售就是没开张,填0很合理。但如果只是没记录,填0会严重拉低均值。本项目基于销售基础数据,默认没记录即为0,业务上说得通。
  3. Excel输出好评:脚本将结果写入了4Sheet(模型汇总、按国家按日汇总、横向对比、各国单独页),直接把Excel甩给业务部门,他们用透视表就能二次分析,数据人要学会用业务熟悉的方式交付

六、写在最后:预测只是起点,决策才是终点

这次ARIMA实战,让我再次感受到:

时序预测不是炫技,而是对不确定性的管理。

如果你的数据平稳、规律,ARIMA是小而美的利器(几行代码就出结果,可解释性极强)。
如果你的数据波动大(像阿根廷、西班牙),别死磕纯统计模型,考虑引入外部变量(节假日、促销),或者直接上ProphetXGBoost

最后,附上本次实战的核心代码文件(sales_arima_forecast.py)和完整预测结果CSV,大家获取课程https://edu.fanruan.com/video/590即可享有核心代码文件。照着跑一遍,你也能成为公司里的预测小能手

 

分享扩散:

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

返回顶部 返回列表