4. 时间序列分解方法
农产品价格序列往往同时叠加了多种变化来源:长期趋势、固定周期的季节性波动、随机冲击以及偶发事件造成的异常。时间序列分解的核心任务,就是把这些混在一起的分量拆开,让每一部分可以被单独观察和解释。本节聚焦两种最常用的分解方法——经典分解与STL分解,说明它们的计算逻辑、在农产品价格上的适用性,以及如何解读分解结果。
一、分解模型的基本形式
两种方法都建立在“可加”或“可乘”的分解假设上。可加模型写作 Y_t = T_t + S_t + R_t,即观测值等于趋势项、季节项与残差项之和;可乘模型写作 Y_t = T_t × S_t × R_t。选择哪一种,取决于季节波动的幅度是否随价格水平变化。农产品价格常出现“价格越高、季节波动绝对值越大”的现象,此时可乘模型更贴近实际;若波动幅度大体稳定,可加模型更简洁。实际分析中也可以先取对数,把可乘关系转化为可加关系再分解。
二、经典分解的计算流程
经典分解(Classical Decomposition)是一种基于移动平均的确定性方法,步骤清晰、易于手工复现。以月度农产品价格、季节周期 m = 12 为例:
- 提取趋势:对原序列做 12 期中心化移动平均,得到趋势项
T_t。偶数周期需要做两次移动平均(如 2×12 期)以保证对称居中。 - 去趋势:可加模型用
Y_t − T_t,可乘模型用Y_t / T_t,得到“去趋势序列”。 - 估计季节项:把去趋势序列按月份分组,对每个月份求平均,得到 12 个季节指数;再将其中心化(减去总平均或调整为均值为 1),得到
S_t。 - 计算残差:可加模型
R_t = Y_t − T_t − S_t,可乘模型R_t = Y_t / (T_t × S_t)。
经典分解的局限也很明确:移动平均会“吃掉”序列两端的若干观测,导致首尾趋势缺失;它假设季节形态在多年间固定不变,无法刻画季节振幅随年份漂移的情况;对异常值也较敏感。因此它更适合作为快速摸底和教学演示,而非精细分析。
三、STL分解的改进逻辑
STL(Seasonal-Trend decomposition using Loess)用局部加权回归(Loess)代替移动平均,通过内循环与外循环交替迭代,逐轮修正趋势项和季节项。它的关键参数直接决定分解结果的“粗细”:
s.window:季节项的平滑窗口。设为"periodic"表示季节形态在各年完全相同;设为奇数则允许季节形态缓慢演变。t.window:趋势项的平滑窗口,越大趋势越平滑,越小越能捕捉短期拐点。s.degree/t.degree:局部拟合的多项式阶数,常用 0 或 1。robust = TRUE:启用稳健迭代,降低异常值对趋势和季节项的拉扯。
相比经典分解,STL能处理任意周期(不限于整数年)、保留两端趋势估计、允许季节形态随时间变化,并且对异常值更稳健,因此在农产品价格分析中更为实用。
四、在农产品价格上的操作示例
假设我们有一份某蔬菜批发市场 2018—2023 年的月度均价序列(示例数据,用于说明流程)。在 R 中可按如下方式完成两种分解:
library(stats)
price <- ts(veg_price, start = c(2018, 1), frequency = 12)
# 经典分解(可加)
fit_cla <- decompose(price, type = "additive")
# STL分解(稳健、允许季节形态缓慢变化)
fit_stl <- stl(price, s.window = 13, t.window = 25,
robust = TRUE)
# 查看季节项与趋势项
fit_stl$time.series[, "seasonal"]
fit_stl$time.series[, "trend"]
参数选择上,s.window = 13 表示季节形态允许在约一年尺度上缓慢调整,适合观察“旺季更旺、淡季趋缓”的演变;t.window = 25 对应约两年的趋势平滑,能保留年度级别的拐点而过滤月度噪声。若只关心固定季节形态,可改为 s.window = "periodic"。
五、结果解读与判断依据
分解结果的价值在于分别读三项。趋势项反映供需格局、成本与政策的中长期方向,应关注其斜率变化与拐点位置;季节项反映生产周期和消费节令,应关注峰谷月份、振幅大小以及振幅是否逐年扩大;残差项则集中体现突发天气、运输中断、疫病或政策冲击,若残差在某段时间持续偏离零且幅度显著,往往对应可追溯的事件。
判断分解是否合理,可看三点:残差是否近似零均值、无明显残留季节结构;季节项是否与已知的生产消费节律吻合;趋势项在序列两端是否平滑连续(STL应明显优于经典分解)。若残差中仍能看到规律性波动,说明周期设定或平滑参数需要调整。
把两项结果放在一起看,往往比单看一项更有信息量。例如某年经典分解的季节指数显示某月为全年高点,而STL的季节项在该年明显抬升,同时残差在该月为正,这提示该月的高价既有常规节令因素,也可能叠加了短期供给冲击。区分“结构性季节”与“一次性冲击”,正是分解分析在农产品价格研判中的直接用途。