库存数据的季节性调整:如何剔除季节性因素?
做基差交易的人,最怕什么?
怕数据骗人。
明明库存看着在下降,你兴冲冲做多,结果价格反而跌了。为什么?因为那个下降是季节性规律,不是基本面驱动。我早年就吃过这个亏,后来才明白——库存数据必须做季节性调整。
什么是季节性因素?
说白了,就是每年固定时间出现的规律性波动。
比如:
- 春节前,下游停工,库存被动累积
- 3-4月,开工旺季,库存快速去化
- 7-8月,高温限电,生产受限
- 年底,贸易商回笼资金,主动去库
这些规律每年都来一遍。如果你不做调整,就会把季节性波动误判成趋势性变化。
核心观点:季节性调整的目的,是把「每年都有的那部分」剥离掉,留下真正反映供需变化的「异常部分」。
三种主流调整方法
我这些年用过的方法不少,真正靠谱的就三种。我一个个说。
1. 同比法(最简单,但粗糙)
直接拿今年第N周的数据,跟去年同周比。
优点:操作简单,Excel拉一下就行。
缺点:忽略了趋势变化。如果去年是去库年,今年是累库年,同比会失真。
# 伪代码示例
adjusted_inventory = current_week_inventory - last_year_same_week_inventory
我的经验:同比法只适合快速看个大概。真要下单,别只用这个。
2. 移动平均比率法(Census X-12)
这是美国人口普查局搞出来的方法,后来被大宗商品领域广泛采用。
核心思路:
- 先算一个中心化移动平均,作为趋势-周期项
- 用原始数据除以这个移动平均,得到季节-不规则项
- 对季节-不规则项做平滑,提取出季节性因子
- 用原始数据除以季节性因子,得到调整后数据
# Python示例(使用statsmodels)
import statsmodels.api as sm
# 假设inventory是pandas Series,频率为周
decomposition = sm.tsa.seasonal_decompose(
inventory,
model='multiplicative', # 库存数据通常用乘法模型
period=52 # 年度周期
)
seasonal_factor = decomposition.seasonal
adjusted_inventory = inventory / seasonal_factor
注意:这个方法要求数据至少3年以上。数据太短,季节性因子不稳定。
3. 回归法(我最常用的)
为什么我偏爱回归法?因为它灵活。
你可以把季节性因素拆成:
- 周度哑变量(52周,每周一个系数)
- 月度哑变量(12个月)
- 节假日效应(春节、国庆等)
# Python示例
import pandas as pd
import statsmodels.api as sm
# 构造周度哑变量
df['week'] = df.index.isocalendar().week
week_dummies = pd.get_dummies(df['week'], prefix='W')
# 构造节假日哑变量
df['is_spring_festival'] = (df.index.month == 2).astype(int)
# 回归模型
X = sm.add_constant(week_dummies)
X['is_spring_festival'] = df['is_spring_festival']
y = df['inventory']
model = sm.OLS(y, X).fit()
df['adjusted_inventory'] = model.resid # 残差就是调整后数据
避坑指南:我曾经用回归法时,忘了加入趋势项。结果季节性因子把趋势也吃掉了。后来我习惯在回归里加一个时间趋势变量(1,2,3,...N),效果就好多了。
实战中的三个关键点
方法讲完了,但真正用起来,有几个坑你得注意。
第一,数据频率要匹配
如果你做的是周度基差交易,就别用月度库存数据做季节性调整。频率不匹配,调整后的数据反而引入噪音。
第二,注意结构性变化
2018年贸易战、2020年疫情,这些事件会永久改变库存的季节性模式。我建议每2-3年重新估算一次季节性因子,别一套参数用十年。
第三,调整后的数据要跟价差一起看
季节性调整只是第一步。调整后的库存数据,要跟基差、月间价差放在同一张图上。如果调整后库存下降,但基差也在下降,那说明有其他因素在主导。
我的习惯:每次做季节性调整,我都会画一张对比图——原始库存vs调整后库存。如果两条线走势高度一致,说明季节性因素不强;如果差异明显,那调整就很有价值。
一张图看懂整个流程
下面这张图,是我自己总结的库存季节性调整流程。每次做数据前,我都会过一遍。
最后说两句
季节性调整不是万能药。它解决的是「规律性噪音」的问题,但解决不了「数据质量」的问题。
我见过有人把垃圾数据做了一通季节性调整,然后信心满满地建仓,结果亏得一塌糊涂。嗯,数据源本身的质量,比调整方法重要十倍。
所以我的建议是:先花80%的精力搞清楚数据是怎么来的,再花20%的精力做调整。顺序别搞反了。