非平稳时间序列分析(三)——季节模型(SARIMA、STL、Holt-Winters)
此前篇章(平稳序列):
时间序列分析(一)——基础概念篇
时间序列分析(二)——平稳性检验
时间序列分析(三)——白噪声检验
时间序列分析(四)——差分运算、延迟算子、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(偏自相关图):
-
非季节性阶数(
p,q):在滞后1, 2, ... 处显著。 -
季节性阶数(
P,Q):在滞后s,2s处显著。
-
-
使用 网格搜索 或 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):周期性波动。
其中,以上三个参数都需要设立初始值,并有相应的计算公式(未列出)。
两种形式
-
加法模型:适用于季节性波动幅度不随时间变化的情况。
![]()

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

观察时间序列图:若季节峰谷的幅度随时间变化显著,选择乘法模型;否则选择加法模型。
建模步骤
-
选择模型类型:根据季节性是否随趋势变化选择加法或乘法模型。
-
初始化参数:通过第一个周期的数据,初始化水平Level、趋势和季节性。
-
优化参数:使用最小化均方误差(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预测趋势和残差,灵活性高。 |
# 文章如有错误,欢迎大家指正。我们下期再见叭
相关文章:
非平稳时间序列分析(三)——季节模型(SARIMA、STL、Holt-Winters)
此前篇章(平稳序列): 时间序列分析(一)——基础概念篇 时间序列分析(二)——平稳性检验 时间序列分析(三)——白噪声检验 时间序列分析(四)—…...
【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…...
《大语言模型的原理发展与应用》:此文为AI自动生成
《大语言模型的原理发展与应用》:此文为AI自动生成 一、引言:大语言模型,AI 时代的 “新引擎” 在当今数字化浪潮中,大语言模型宛如一颗璀璨的明星,照亮了人工智能发展的道路,成为推动各领域变革的核心驱…...
FPGA 高速接口Aurora8B/10B 协议详解与仿真
FPGA 高速接口Aurora8B/10B 协议详解与IP仿真 1 摘要 Aurora 8B/10B 是一种用于高速串行通信的协议,通常用于 FPGA 设计和其他数字通信应用。即一种编码方案,旨在在传输数据时提供可靠性、时钟恢复和错误检测。主要用于在点对点串行链路间移动数据的可…...
大白话Vue 源码
大白话Vue 源码 整体介绍 Vue 源码就像是一个超厉害的“魔法工具箱”,它能帮咱们轻松地做出各种漂亮又好用的网页。这个工具箱里有好几个关键的“魔法道具”,分别是响应式系统、虚拟 DOM、模板编译、组件系统和生命周期钩子,下面咱一个一个…...
grpc工具使用
工具安装 protoc 访问protoc release,根据系统型号,下载对应版本的protoc工具,并将下载到的可执行文件存放于$path中 安装完成后,可通过protoc --version指令校验是否安装成功 protoc --version # 输出: # libprotoc…...
ESP8266连接网络实时上传数据
要实现这个功能,可以按照以下步骤进行编程。我们将使用Arduino IDE来编写代码,并结合ESP8266的WiFi库、MQTT库以及Web服务器库来实现。 1. 准备工作 硬件:ESP8266开发板、温度传感器(如DS18B20)、显示屏(如OLED)。软件:Arduino IDE、ESP8266库、PubSubClient库(MQTT)…...
【手撕算法】支持向量机(SVM)从入门到实战:数学推导与核技巧揭秘
摘要 支持向量机(SVM)是机器学习中的经典算法!本文将深入解析最大间隔分类原理,手撕对偶问题推导过程,并实战实现非线性分类与图像识别。文中附《统计学习公式手册》及SVM调参指南,助力你掌握这一核心算法…...
定制化开发的WooCommerce独立站商城更安全
定制化开发的WooCommerce独立站商城在安全性、交易风险控制以及整体用户体验方面有显著优势。以下是定制化开发在这些方面的具体表现: 1. 安全性更高 定制化开发允许开发者从底层架构开始设计和优化,确保网站的安全性。以下是具体表现: (1…...
AORO P9000 PRO三防平板携手RTK高精度定位,电力巡检效率倍增
电网系统覆盖幅员辽阔,每年因设备故障导致的巡检耗时超过百万工日。传统巡检模式受限于定位误差、设备防护不足和作业效率低下三大核心痛点,亟需智能化工具的突破性革新。为了满足这一需求,遨游通讯推出AORO P9000 PRO三防平板,以…...
游戏引擎学习第135天
仓库:https://gitee.com/mrxiao_com/2d_game_3 回顾 game_asset.cpp 的创建 在开发过程中,不使用任何现成的游戏引擎或第三方库,而是直接基于 Windows 进行开发,因为 Windows 目前仍然是游戏的标准平台,因此首先在这个环境中进行…...
安全渗透测试的全面解析与实践
引言 随着网络安全威胁的日益增加,企业和组织对自身系统的安全性提出了更高的要求。安全渗透测试(Penetration Testing,简称渗透测试)作为主动发现和修复系统安全漏洞的重要手段,已成为安全防护体系中的关键环节。本文…...
关联封号率降70%!2025最新IP隔离方案实操手册
高效运营安全防护,跨境卖家必看的风险规避指南 跨境账号管理的核心挑战:关联封号风险激增 2024年,随着全球电商平台对账号合规的审查日益严苛,“关联封号”已成为跨境卖家最头疼的问题之一。无论是同一IP登录多账号、员工操作失误…...
【深度学习CV】【图像分类】从CNN(卷积神经网络)、ResNet迁移学习到GPU高效训练优化【案例代码】详解
摘要 本文分类使用的是resNet34,什么不用yolo v8,yolo v10系列,虽然他们也可以分类,因为yolo系列模型不纯粹,里面包含了目标检测的架构,所以分类使用的是resNet 本文详细介绍了三种不同的方法来训练卷积神经网络进行 CIFAR-10 图…...
【Java基础-51.5】字节流与字符流的转换:Java I/O 中的桥梁
在 Java 的 I/O 操作中,字节流和字符流是两种常见的数据处理方式。字节流以字节为单位进行读写,适合处理二进制数据(如图片、音频等);而字符流以字符为单位进行读写,适合处理文本数据。在实际开发中&#x…...
如何设置爬虫的访问频率?
设置爬虫的访问频率是确保爬虫行为合法且不给目标网站服务器造成过大压力的重要措施。合理的访问频率可以有效避免被网站封禁IP,同时也能保证爬虫的效率。以下是一些设置爬虫访问频率的方法和策略: 一、设置请求间隔 (一)固定间隔…...
如何排查服务器内存泄漏问题
服务器内存泄漏是一种常见的问题,可能导致系统性能下降甚至系统崩溃。以下是一般情况下用于排查服务器内存泄漏问题的步骤: 排查服务器内存泄漏问题的步骤: 监控系统资源: 使用系统监控工具(如top、htop、free&#x…...
Ubuntu20.04双系统安装及软件安装(九):谷歌浏览器
Ubuntu20.04双系统安装及软件安装(九):谷歌浏览器 打开终端,下载谷歌浏览器软件包: wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb下载完成后直接在原终端执行: sudo…...
有关Java中的集合(1):List<T>和Set<T>
学习目标 核心掌握List集合了解Set集合 1.List<T> ● java.util.List。有序列表。 ● List集合元素的特点:有序表示存取有序(因为有索引)而且可以重复 ● List常用实现类: ArrayList、LinkedList、Vector等 1.1 常用方法…...
【C++STL之vector】vector容器浅析
文章目录 🌟 深入探索C vector:从青铜到王者的动态数组进阶指南 🌟🚀 开篇:为什么vector是C程序员的瑞士军刀?🔍 一、vector的本质解密:不只是智能数组那么简单1.1 动态数组的华丽蜕…...
如何通过卷积神经网络(CNN)有效地提取图像的局部特征,并在CIFAR-10数据集上实现高精度的分类?
目录 1. CNN 提取图像局部特征的原理 2. 在 CIFAR - 10 数据集上实现高精度分类的步骤 2.1 数据准备 2.2 构建 CNN 模型 2.3 定义损失函数和优化器 2.4 训练模型 2.5 测试模型 3. 提高分类精度的技巧 卷积神经网络(Convolutional Neural Network, CNN&#…...
Redis的持久化-RDBAOF
文章目录 一、 RDB1. 触发机制2. 流程说明3. RDB 文件的处理4. RDB 的优缺点 二、AOF1. 使用 AOF2. 命令写⼊3. 文件同步4. 重写机制5 启动时数据恢复 一、 RDB RDB 持久化是把当前进程数据生成快照保存到硬盘的过程,触发 RDB 持久化过程分为手动触发和自动触发。 …...
Redis 的几个热点知识
前言 Redis 是一款内存级的数据库,凭借其卓越的性能,几乎成为每位开发者的标配工具。 虽然 Redis 包含大量需要掌握的知识,但其中的热点知识并不多。今天,『知行』就和大家分享一些 Redis 中的热点知识。 Redis 数据结构 Redis…...
