|
干货 | 我用ARIMA模型预测了11个国家的销量,结果令人意外!
手把手实战:销量预测、自动调参、置信区间,一文看懂时间序列
大家好,我是德里克。
最近接到一个有意思的需求:根据某产品2026年上半年的历史销售数据,预测未来30天(2026年7月)各国每天的销量。
数据涉及11个国家/地区(含阿根廷、巴西、法国、德国、意大利、日本、墨西哥、西班牙、英国、美国、其他),时间跨度181天,颗粒度细到“国家+日”。
拿到这种“多国家时序数据”,第一反应肯定不是用Excel拍脑袋。我选择了经典且稳定的ARIMA模型,配合Python的statsmodels库,实现了一套全自动网格搜索+评估+预测的流程。
今天把整个过程、踩坑点和最终结果拆开揉碎了分享给大家。
一、为什么选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. 网格搜索最优参数 对每个国家单独建模(因为各国销量波动规律完全不同)。 设定搜索范围:
- p ∈ [0, 4]
- d ∈ [0, 2]
- q ∈ [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预测销量1425件,95%置信区间是 [568, 2282]。 到了7月30日,预测销量1501件,区间变成了 [-2262, 5263]!
注意,下限变成了负数!
这在统计学上没问题,但在业务上,销量不可能是负数。这说明:
- 预测时间越远,不确定性呈指数级放大(虽然ARIMA的区间有时不会像LSTM那样爆炸,但阿根廷数据太抖了)。
- 如果你的业务要求精准安全库存,只看预测均值会害死人。必须看置信下限,并以此为基础设置“安全库存底线”。
反观巴西,预测值稳定在120左右,置信区间也收得很窄(比如[40, 210]),这样的预测结果直接拿来指导补货,决策成本低很多。
五、关于代码和落地的一些大实话
- 自动选参是双刃剑:虽然grid_search很省事,但在数据量小或噪声大的情况下,AIC最小不一定预测效果最好。我建议跑完代码后,人工看一眼d值,如果d=2(差分两次),最好再拿ADF检验验证一下平稳性。
- 缺失值填0合理吗? 要看业务场景。如果某天没销售就是没开张,填0很合理。但如果只是没记录,填0会严重拉低均值。本项目基于“销售基础数据”,默认没记录即为0,业务上说得通。
- Excel输出好评:脚本将结果写入了4个Sheet(模型汇总、按国家按日汇总、横向对比、各国单独页),直接把Excel甩给业务部门,他们用透视表就能二次分析,数据人要学会用业务熟悉的方式交付。
六、写在最后:预测只是起点,决策才是终点
这次ARIMA实战,让我再次感受到:
时序预测不是炫技,而是对“不确定性”的管理。
如果你的数据平稳、规律,ARIMA是小而美的利器(几行代码就出结果,可解释性极强)。 如果你的数据波动大(像阿根廷、西班牙),别死磕纯统计模型,考虑引入外部变量(节假日、促销),或者直接上Prophet、XGBoost。
最后,附上本次实战的核心代码文件(sales_arima_forecast.py)和完整预测结果CSV,大家获取课程https://edu.fanruan.com/video/590即可享有核心代码文件。照着跑一遍,你也能成为公司里的“预测小能手”。
|