非平稳时间序列分析(三)——季节模型(SARIMA、STL、Holt-Winters)

news2025/3/6 22:59:12

此前篇章(平稳序列):

时间序列分析(一)——基础概念篇

时间序列分析(二)——平稳性检验

时间序列分析(三)——白噪声检验

时间序列分析(四)——差分运算、延迟算子、AR(p)模型

时间序列分析(五)——移动平均模型(MA模型)

时间序列分析(六)——自回归移动平均模型(ARMA模型)

时间序列分析(七)——平稳序列建模

此前篇章(非平稳序列):

非平稳时间序列分析(一)——时间序列的分解(wold、cramer)、差分运算

非平稳时间序列分析(二)——ARIMA(p, d, q)模型


一、季节性自回归移动平均模型(SARIMA)

模型原理

SARIMA 是 ARIMA 模型的扩展,专门处理时间序列中的 季节性成分,模型结构为 SARIMA(p, d, q)(P, D, Q)s,其中:

非季节性部分:(p, d, q) 

  • p: 自回归项(AR)阶数,捕捉当前值与历史值的线性关系。

  • d: 差分阶数,消除趋势。

  • q: 移动平均项(MA)阶数,捕捉残差中的滞后误差。

季节性部分:(P, D, Q)s 

  • P: 季节性自回归阶数。

  • D: 季节性差分阶数(周期为 s 的差分,如月度数据 s=12)。

  • Q: 季节性移动平均阶数。

  • s: 季节周期长度(如月度数据 s=12,季度数据 s=4)。

SARIMA 模型的一般形式为:

  

其中,B 是滞后算子。

建模步骤

1、平稳 化数据 

  • 通过 差分 消除趋势和季节性

  • 使用 ADF检验 或 KPSS检验 验证平稳性。

2、确定阶数  

  • 观察 ACF(自相关图) 和 PACF(偏自相关图):

    • 非季节性阶数(pq):在滞后1, 2, ... 处显著。

    • 季节性阶数(PQ):在滞后 s2s 处显著。

  • 使用 网格搜索 或 AIC/BIC准则 选择最优参数组合。

3、模型拟合与验证  

  • 检查残差是否为白噪声(Ljung-Box检验)。

  • 预测时需逆差分还原原始数据。

import statsmodels.api as sm

# 示例:拟合SARIMA模型
model = sm.tsa.SARIMAX(
    data, 
    order=(1, 1, 1),          # 非季节部分 (p, d, q)
    seasonal_order=(1, 1, 1, 12)  # 季节部分 (P, D, Q, s)
)
result = model.fit()
result.summary()

# 预测未来12个时间点
forecast = result.get_forecast(steps=12)
print(forecast.predicted_mean)
问题原因与解决方案
过拟合高阶参数(如 p=5, q=5)可能导致模型复杂,预测能力下降 → 优先选择 AIC/BIC 较小的模型。
多重季节性SARIMA 仅支持单一周期 → 使用 TBATS 或 Prophet 处理多周期(如小时+天+周)。
季节性突变季节性模式随时间变化(如疫情导致消费习惯改变) → 使用 STL分解 或 Prophet。
计算复杂度高高阶季节性参数(如 Q=2)导致计算耗时 → 使用 auto_arima 自动搜索最优参数。

二、STL 分解

原理:STL(Seasonal-Trend decomposition using LOESS)将时间序列分解为三个分量:

  •  趋势(Trend):长期变化方向。

  • 季节性(Seasonal):固定周期波动。

  • 残差(Residual):无法解释的随机噪声。 

核心特点

  • 使用 LOESS(局部加权回归) 平滑方法,适应复杂季节性(如振幅变化的季节性)。

  • 支持非固定周期的季节性(需手动指定周期 s)。


建模步骤

 1、分解时间序列

  • 使用 STL 将数据拆分为趋势、季节性和残差。

2、 预测各分量

  • 分别预测趋势和季节性,再合并结果。

  • 残差通常假设为随机噪声,不进行预测。

from statsmodels.tsa.seasonal import STL
import pandas as pd

# 生成示例数据(假设 data 是时间序列)
data = pd.Series(...)

# STL 分解
stl = STL(data, period=12)  # 周期 s=12(月度数据)
result = stl.fit()

# 绘制分解结果
result.plot()
plt.show()

# 提取各分量
trend = result.trend
seasonal = result.seasonal
residual = result.resid

# 预测(假设趋势用线性模型预测)
from sklearn.linear_model import LinearRegression

# 预测趋势
X = np.arange(len(data)).reshape(-1, 1)
model_trend = LinearRegression().fit(X, trend)
future_trend = model_trend.predict(np.arange(len(data), len(data)+12).reshape(-1, 1))

# 预测季节性(假设周期性重复)
future_seasonal = seasonal[-12:].values  # 取最近一个周期的季节性

# 合并预测结果
forecast = future_trend + future_seasonal
问题原因与解决方案
趋势预测误差累积若趋势用简单线性回归预测,长期预测可能偏离 → 使用 ARIMA 或 Prophet 建模趋势。
固定周期假设STL 需手动指定周期 s → 对非固定周期(如农历节假日)不适用 → 改用 Prophet。
高频数据计算耗时对秒级/分钟级数据,LOESS 平滑计算量大 → 使用 移动平均 或 降采样。
极端值敏感离群值可能扭曲趋势和季节性 → 预处理时需 去噪 或 鲁棒平滑。

三、Holt-Winters 季节性指数平滑

模型原理

Holt-Winters季节性指数平滑法是一种用于预测具有趋势和季节性成分的时间序列的有效方法,包含三个平滑参数:

  • 水平(Level):序列的基线值。

  • 趋势(Trend):序列的增长或下降速率。

  • 季节性(Seasonal):周期性波动。

其中,以上三个参数都需要设立初始值,并有相应的计算公式(未列出)。

两种形式

  • 加法模型:适用于季节性波动幅度不随时间变化的情况。

  • 乘法模型:适用于季节性波动幅度随时间变化而变化的情况(如指数增长趋势)。

观察时间序列图:若季节峰谷的幅度随时间变化显著,选择乘法模型;否则选择加法模型。


建模步骤

  1. 选择模型类型:根据季节性是否随趋势变化选择加法或乘法模型。

  2. 初始化参数:通过第一个周期的数据,初始化水平Level、趋势和季节性。

  3. 优化参数:使用最小化均方误差(MSE)选择最优的 α,β,γ

案例 1:加法模型

  • 场景:预测某城市月度平均气温。

  • 分析:气温的年周期波动幅度稳定(每年夏季约30°C,冬季约5°C),适合加法模型。

案例 2:乘法模型

  • 场景:预测电商平台季度销售额。

  • 分析:销售额在“双11”期间的峰值随平台用户增长逐年放大,需用乘法模型。

from statsmodels.tsa.holtwinters import ExponentialSmoothing

# 拟合加法模型(additive)
model = ExponentialSmoothing(
    data,
    trend='add',    # 趋势类型(add/mul)
    seasonal='add',  # 季节性类型(add/mul)
    seasonal_periods=12  # 周期 s=12
)
result = model.fit()

# 预测未来12个时间点
forecast = result.forecast(12)
print("预测结果:", forecast)

# 查看平滑参数
print("alpha:", result.params['smoothing_level'])
print("beta:", result.params['smoothing_trend'])
print("gamma:", result.params['smoothing_seasonal'])
问题原因与解决方案
长期预测漂移加法模型假设趋势线性增长,长期预测可能偏离 → 改用阻尼趋势(damped trend)。
对突变数据不敏感平滑参数(如 α=0.1)导致模型响应滞后 → 增大 α 
仅支持单一季节性无法处理小时+天的双重周期 → 使用 TBATS 或 Prophet。
初始值敏感初始季节因子估计不准导致预测偏差 → 用多个周期数据初始化。

四、模型对比

场景推荐模型原因
严格统计假设SARIMA数学形式严谨,适合学术研究和需置信区间的场景。
快速原型开发Holt-Winters参数少、实现简单,适合季节性明显且周期固定的业务数据。
复杂季节性STL + 机器学习STL分解后,可用XGBoost/LSTM预测趋势和残差,灵活性高。

# 文章如有错误,欢迎大家指正。我们下期再见叭

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2310744.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【web前端开发】CSS--CSS简介及其编写位置(上)

1、CSS简介 (1)CSS的全称为:层叠式样式表(Cascading Style Sheets) (2)CSS也是一种标记语言,用于给HTML结构设置样式,例如:文字大小、颜色、元素宽度等等…

云原生时代的技术桥梁

在数字化转型的大潮中,企业面临着数据孤岛、应用间集成复杂、高成本与低效率等问题。这些问题不仅阻碍了企业内部信息的流通和资源的共享,也影响了企业对外部市场变化的响应速度。当前,这一转型过程从IT角度来看,已然迈入云原生时…

【数据结构】什么是栈||栈的经典应用||分治递归||斐波那契问题和归并算法||递归实现||顺序栈和链栈的区分

文章目录 🥧栈的初步理解:🥧易错:如何判断栈满🥧栈满理解🥧栈的基本运算📚栈操作的伪代码逻辑(顺序和链栈)📕顺序栈运算实现:顺序栈的表示&#x…

雷池WAF的为什么选择基于Docker

Docker 是一种开源的容器化平台,可以帮助开发人员将应用程序及其所有依赖项打包到一个称为容器的独立、可移植的环境中。Docker 的核心概念包括以下几点: 容器:Docker 使用容器来封装应用程序及其依赖项,使其能够在任何环境中都能…

Ubuntu20.04双系统安装及软件安装(七):Anaconda3

Ubuntu20.04双系统安装及软件安装(七):Anaconda3 打开Anaconda官网,在右侧处填写邮箱(要真实有效!),然后Submit。会出现如图示的Success界面。 进入填写的邮箱,有一封Ana…

文件上传漏洞:upload-labs靶场11-20

目录 pass-11 pass-12 pass-13 pass-14 pass-15 pass-16 pass-17 pass-18 pass-19 pass-20 pass-11 分析源代码 ,发现上传文件的存放路径可控 if(isset($_POST[submit])){$ext_arr array(jpg,png,gif);$file_ext substr($_FILES[upload_file][name],st…

HTTP协议(20250305)

1. 万维网 WWW(World Wide Web)世界范围内的,联机式的信息储藏所,万维网解决了获取互联网上的数据时需要解决的以下问题: 怎样标识分布在整个互联网上的文档 URL用什么样的协议实现万维网上的各种链接 HTTP怎么使用户能够方便的查看文档数…

Qt中txt文件输出为PDF格式

main.cpp PdfReportGenerator pdfReportGenerator;// 加载中文字体if (QFontDatabase::addApplicationFont(":/new/prefix1/simsun.ttf") -1) {QMessageBox::warning(nullptr, "警告", "无法加载中文字体");}// 解析日志文件QVector<LogEntr…

FPGA 高速接口Aurora8B/10B 协议详解与仿真

FPGA 高速接口Aurora8B/10B 协议详解与IP仿真 1 摘要 Aurora 8B/10B 是一种用于高速串行通信的协议&#xff0c;通常用于 FPGA 设计和其他数字通信应用。即一种编码方案&#xff0c;旨在在传输数据时提供可靠性、时钟恢复和错误检测。主要用于在点对点串行链路间移动数据的可…

【手撕算法】支持向量机(SVM)从入门到实战:数学推导与核技巧揭秘

摘要 支持向量机&#xff08;SVM&#xff09;是机器学习中的经典算法&#xff01;本文将深入解析最大间隔分类原理&#xff0c;手撕对偶问题推导过程&#xff0c;并实战实现非线性分类与图像识别。文中附《统计学习公式手册》及SVM调参指南&#xff0c;助力你掌握这一核心算法…

AORO P9000 PRO三防平板携手RTK高精度定位,电力巡检效率倍增

电网系统覆盖幅员辽阔&#xff0c;每年因设备故障导致的巡检耗时超过百万工日。传统巡检模式受限于定位误差、设备防护不足和作业效率低下三大核心痛点&#xff0c;亟需智能化工具的突破性革新。为了满足这一需求&#xff0c;遨游通讯推出AORO P9000 PRO三防平板&#xff0c;以…

游戏引擎学习第135天

仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾 game_asset.cpp 的创建 在开发过程中&#xff0c;不使用任何现成的游戏引擎或第三方库&#xff0c;而是直接基于 Windows 进行开发&#xff0c;因为 Windows 目前仍然是游戏的标准平台&#xff0c;因此首先在这个环境中进行…

关联封号率降70%!2025最新IP隔离方案实操手册

高效运营安全防护&#xff0c;跨境卖家必看的风险规避指南 跨境账号管理的核心挑战&#xff1a;关联封号风险激增 2024年&#xff0c;随着全球电商平台对账号合规的审查日益严苛&#xff0c;“关联封号”已成为跨境卖家最头疼的问题之一。无论是同一IP登录多账号、员工操作失误…

【深度学习CV】【图像分类】从CNN(卷积神经网络)、ResNet迁移学习到GPU高效训练优化【案例代码】详解

摘要 本文分类使用的是resNet34,什么不用yolo v8&#xff0c;yolo v10系列,虽然他们也可以分类&#xff0c;因为yolo系列模型不纯粹&#xff0c;里面包含了目标检测的架构&#xff0c;所以分类使用的是resNet 本文详细介绍了三种不同的方法来训练卷积神经网络进行 CIFAR-10 图…

如何排查服务器内存泄漏问题

服务器内存泄漏是一种常见的问题&#xff0c;可能导致系统性能下降甚至系统崩溃。以下是一般情况下用于排查服务器内存泄漏问题的步骤&#xff1a; 排查服务器内存泄漏问题的步骤&#xff1a; 监控系统资源&#xff1a; 使用系统监控工具&#xff08;如top、htop、free&#x…

Ubuntu20.04双系统安装及软件安装(九):谷歌浏览器

Ubuntu20.04双系统安装及软件安装&#xff08;九&#xff09;&#xff1a;谷歌浏览器 打开终端&#xff0c;下载谷歌浏览器软件包&#xff1a; wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb下载完成后直接在原终端执行&#xff1a; sudo…

有关Java中的集合(1):List<T>和Set<T>

学习目标 核心掌握List集合了解Set集合 1.List<T> ● java.util.List。有序列表。 ● List集合元素的特点&#xff1a;有序表示存取有序&#xff08;因为有索引&#xff09;而且可以重复 ● List常用实现类&#xff1a; ArrayList、LinkedList、Vector等 1.1 常用方法…

【C++STL之vector】vector容器浅析

文章目录 &#x1f31f; 深入探索C vector&#xff1a;从青铜到王者的动态数组进阶指南 &#x1f31f;&#x1f680; 开篇&#xff1a;为什么vector是C程序员的瑞士军刀&#xff1f;&#x1f50d; 一、vector的本质解密&#xff1a;不只是智能数组那么简单1.1 动态数组的华丽蜕…

Redis的持久化-RDBAOF

文章目录 一、 RDB1. 触发机制2. 流程说明3. RDB 文件的处理4. RDB 的优缺点 二、AOF1. 使用 AOF2. 命令写⼊3. 文件同步4. 重写机制5 启动时数据恢复 一、 RDB RDB 持久化是把当前进程数据生成快照保存到硬盘的过程&#xff0c;触发 RDB 持久化过程分为手动触发和自动触发。 …

Redis 的几个热点知识

前言 Redis 是一款内存级的数据库&#xff0c;凭借其卓越的性能&#xff0c;几乎成为每位开发者的标配工具。 虽然 Redis 包含大量需要掌握的知识&#xff0c;但其中的热点知识并不多。今天&#xff0c;『知行』就和大家分享一些 Redis 中的热点知识。 Redis 数据结构 Redis…