【时间序列】时间序列分解总结

2021年9月6日 20点热度 0条评论 来源: AI蜗牛车

作者 | 追光者

研究 | 机器学习与时间序列

出品 | AI蜗牛车

1.朴素分解

一个时间通常由长期趋势,季节变动,循环波动,不规则波动几部分组成

长期趋势指现象在较长时期内持续发展变化的一种趋向或状态。

季节波动是由于季节的变化引起的现象发展水平的规则变动

循环波动指在某段时间内,不具严格规则的周期性连续变动

不规则波动指由于众多偶然因素对时间序列造成的影响

分解模型又分为加法模型和乘法模型。加法指的是时间序分的组成是相互独立的,四个成分都有相同的量纲。乘法模型输出部分和趋势项有相同的量纲,季节项和循环项是比例数,不规则变动项为独立随机变量序列,服从正态分布。

加法模型:

 

乘法模型:

 

这里提一点,乘法模型可以通过取对数变换为加法模型

混合模型

 

 

1.1 因素分解

移动平均:

 

选取当前观测及其过去的个数据还有未来个数据去平均,,称为m阶移动平均(m-MA),一般来说,阶数越高,曲线越平滑

随机性是围绕中间值波动的,用平均刚好可以在一定程度上抵消随机性,也没有季节性因素。所以可以认为此序列只包含长期趋势和循环变动两部分(T*C或T+C)

此外,当阶数为偶数时,移动平均线是非对称的。为了达到对称性的要求,可以使用中心化移动平均(centred moving average)。以-MA为例子,意思是4阶移动平均后再来一次二阶平均。

通常,一个2 x m-MA等价于一个所有权重都取1/m,除了第一个和最后一个项取权重1/2m的m+1阶移动平均。所以,如果季节周期是偶数且阶数为m,我们使用2 x m-MA来估计趋势-循环。如果季节周期是奇数且阶数为m,使用m-MA来估计趋势-循环。比如,2 x 12-MA可用于估计月度数据的趋势-循环;7-MA可用于估计带有周季节性的日数据趋势。

假设原始数据是具有季节性的,那如果移动平均的阶数没选好,就会被数据中的季节性所污染

ps:移动平均后前k个和后k个数据是null

季节因素

直接带入上述加法或乘法模型,除以或减去,便得到或

将随机因素去掉,剩下的就是季节因素了。随机性,顾名思义,具有随机性,没有固定的模式,可以通过平均来消除一定的随机性。以一年的数据为例,分别对每个季节的去趋势数据()做平均,则可得到四个平均数代表季节性

还有一个概念是季节修正平均数

image-20201003154818065

用这个数据作为例子,得到了每一年的四季度的平均数,如何更好的体现出季度的变化呢,可以修正平均值

如果400被合计数402.74来除,结果是0.9932。以0.9932乘以各季节的平均数得到111.95,109.13,75.76,103.16等(见表中最后一行)。现在这四个季节指数的和为400,它们的含义就更加清楚了,例如第二季度的109.13就表示第二季度比全年平均数高出9.13%,第三季度的75.76表示第三季度比全年低24.24%

——MBA智库

长期趋势

循环因子比较复杂,通常只需要使用移动平均的得到T-C项,将循环变动也归入趋势中。不过也有需要将循环变动分离出来的情况。

分离长期趋势可以用趋势外推法(根据预测变量的历史时间序列揭示出的变动趋势外推将来),有线性外推,指数曲线,生长曲线等趋势外推法。

1.2 季节分析

季节调整数据

如果季节性引起的变化不是主要的考虑,则季节性调整的数据可能有用。例如,每月的失业数据通常是季节性调整,以便突出由于经济的基本状态而不是季节变化引起的变化。辍学者找工作造成的失业增加是季节性变化的,而经济衰退造成的失业增加是非季节性的。大多数研究失业数据的经济分析师对非季节性变化更感兴趣。因此,就业数据(和许多其他经济系列)通常是季节调整数据。季节调整序列包含趋势周期和余项。因此,它们不是“平稳”的,而“下降”或“上升”可能会误导人。如果目的是寻找一系列的转折点,并解释方向上的任何变化,那么最好使用趋势周期成分,而不是季节性调整的数据。

2.STL分解

STL分解是时间序列分解里常用的方法,基于LOESS(局部加权回归)将时间序列分解成趋势分量、季节分量和余项。

 

img

STL的优势:

  • 可以处理任何类型的季节性

  • 允许季节成分随时间变化,并且变化的速率可以变化

  • 季节随时间变化速率以及TC的平滑性都可以自定义

  • 对异常值不敏感

缺点:

  • 只有加法模式

  • 不能自动处理日历变动或交易日影响

2.1 代码

#官方示例
#将CO2数据分解为水平,季节和残差

from statsmodels.datasets import co2
import matplotlib.pyplot as plt
from pandas.plotting import register_matplotlib_converters
register_matplotlib_converters()
data = co2.load(True).data
data = data.resample('M').mean().ffill()

from statsmodels.tsa.seasonal import STL
res = STL(data).fit()
res.plot()
plt.show() 

image-20201003165458302

函数原型

statsmodels.tsa.seasonal.STL(endog, period=None, seasonal=7, trend=None, low_pass=None, seasonal_deg=0, trend_deg=0, low_pass_deg=0, robust=False, seasonal_jump=1, trend_jump=1, low_pass_jump=1)¶

# period:序列的周期性
# seasonal:季节长度,必须为奇数整数
# trend:必须是一个奇数整数,建议使用大于1.5 *周期/(1-1.5 /季节性)的最小奇数整数

3.其他分解方法

3.1 X11分解

X11方法中,时间序列由四个因素组成,分别是

  • 趋势-循环

  • 季节变动

  • 不规则波动

  • 周工作日变动

有兴趣可去看:Dagum, Estela Bee, and Silvia Bianconcini. 2016. Seasonal Adjustment Methods and Real Time Trend-Cycle Estimation: Springer.

3.2 SEATS 分解法

Seasonal Extraction in ARIMA Time Series ,由西班牙银行发明的方法,用于分析季度和月度数据。

详细可看:http://www.seasonal.website/seasonal.html

4.趋势与季节度量

以时间序列分解为例,不限于一种方法,其他分解方法也可以用类似的数学方法进行度量

 

分别代表平滑后的趋势项,季节项,余项。以下图为例,

image-20201003165458302

如果某时间序列趋势性很很强,例如是上升的趋势,如上图的Trend,去除季节性后,趋势的方差理论上是要比余项Resid要大的(具体情况具体分析),所以我们可以定义趋势强度为

因为有时候余项是可能比季节变换后的序列的方法更大的,有可能随机波动特别大。所以取趋势区间为0-1

季节强度也可以用类似的方法,但是要去趋势才能做

同理,使用均值或标准差也有一定参考价值。

5.参考

  1. https://www.statsmodels.org/stable/generated/statsmodels.tsa.seasonal.STL.html#statsmodels.tsa.seasonal.STL)

  2. Forecasting : Principles and Practice  --Rob J Hyndman

  3. https://wiki.mbalib.com/wiki/%E6%97%B6%E9%97%B4%E5%BA%8F%E5%88%97%E5%88%86%E8%A7%A3%E6%B3%95

  4. https://otexts.com/fppcn/seasonal-strength.html

更多精彩内容(请点击图片进行阅读)

公众号:AI蜗牛车

保持谦逊、保持自律、保持进步

个人微信

备注:昵称+学校/公司+方向

如果没有备注不拉群!

拉你进AI蜗牛车交流群

点个在看,么么哒!
    原文作者:AI蜗牛车
    原文地址: https://blog.csdn.net/qq_33431368/article/details/109233776
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。