时间序列分析之holtwinters和ARIMA

时间序列分析包括holt-winters和ARIMA模型,用于处理趋势、季节性和噪声。平滑处理如指数平滑法通过权衡新旧信息改善移动平均法的缺陷,而ARIMA模型结合差分操作,适用于非平稳时间序列。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#时间序列分析之holtwinters和ARIMA

时间序列是指按时间先后顺序排列的随机序列。所谓时间序列分析,就是根据有序随机变量或观测得到的有序数据之间相互依赖所包含的信息,用概率统计方法定量地建立一个合适的数学模型,并根据这个模型对相应序列所反映的过程或系统作出预报或进行控制。


文章目录


##一、概述
###1.时间序列的平稳性
如果一个时间序列的统计特征不随时间推移而变化,即满足:

1.对于任意的时间t,其均值恒为一常数;

2.对于任意的时间t和s,其自协方差和自相关系数只依赖于时间间隔t-s,而与t和s的起止点无关。

这样的时间序列被称为平稳时间序列。也可以认为,如果一个时间序列无明显的上升或下降趋势,各观察值围绕其均值上下波动,这个均值相对于时间来说是一个常数,那么时间序列为平稳序列(弱平稳(Weak stationarity))

事实上,有两种关于平稳的定义,还有一种强平稳过程:

**强平稳过程(Strict stationarity)?*对于所有可能的n,所有可能的 t 1 , t 2 , . . . , t n t_{1},t_{2},...,t_{n} t1,t2,...,tn,如果所有可能的 Z t 1 , Z t 2 , . . . , Z t n Z_{t_{1}},Z_{t_{2}},...,Z_{t_{n}} Zt1,Zt2,...,Ztn的联合分布与 Z t 1 − k , Z t 2 − k , . . . , Z t n − k Z_{t_{1}-k},Z_{t_{2}-k},...,Z_{t_{n}-k} Zt1k,Zt2k,...,Ztnk相同时,称其为强平稳。

两种平稳过程并没有包含关系,弱平稳不一定是强平稳,强平稳也不一定是弱平稳。强平稳是事实上的平稳,而弱平稳是统计量在观测意义上的平稳(均值、方差)。

平稳的基本思想是:时间序列的行为并不随时间改变。平稳性刻画的是时间序列的统计性质关于时间平移的不变性。我们研究时间序列很重要的一个出发点 是希望通过时间序列的历史数据来得到其未来的一些预测,换言之,我们希望时间序列在历史数据上的一些性质,在将来保持不变,这就是时间平移的不变性。反之,如果时间序列不是平稳的,由历史数据得到的统计性质对未来预测毫无意义。

###2.时间序列的组成
每个时间序列的主要组成部分:

  • 趋势
  • 季节性
  • 噪音
  • 其他
    趋势可以是线性或非线性的,可以是上升或者下降趋势;时间序列呈周期性变化,就叫季节性;时间序列采集过程中不可避免地存在一些干扰,称之为噪音;此外还有一些未知的成分,如异常值、丢失的数据等等。
    ##二、时间序列的平滑处理
    大部分时间序列都存在一个重要问题:存在噪音,也就是某个值的大小随机变化。消除噪音或至少减小它的影响对时序分析很重要,我们必须寻找让信号变平滑的方法。移动平均法(moving average)是我们所知道的最简单的平滑算法。
    ###1.移动平均法
    它的基本原理:对任意奇数个连续的点,将它们最中间的点的值替换为其他点的平均值,假设{ x i x_{i} xi}表示数据点,位置i的平滑值为 s i s_{i} si,则有:
    s i = 1 2 k + 1 ∑ j = − k k x i + j s_{i}=\frac{1}{2k+1}\sum_{j=-k}^{k}x_{i+j} si=2k+11j=kkxi+j
    这个简单的方法存在很严重的问题,这和图像处理中的均值滤波是类似的(只不过这里是一维的),采用这样简单粗暴的平滑处理会导致数据变“模糊”,当一个尖峰进入平滑窗口时,当前的数据就会被这个尖峰突然扭曲,直到异常值离开平滑窗口。即因为噪音数据,原始数据丢失了细节。在图像处理中,我们采用高斯滤波来解决这一问题,我们的平滑窗口是带权值的,越靠近中心数据的权重越大,越靠近平滑窗口边缘的点权重越小。这里同样适用,我们通过使用加权移动平均法,公式如下:
    s i = ∑ j = − k k w j x i + j , 其 中 ∑ j = − k k w j = 1 s_{i}=\sum_{j=-k}^{k}w_{j}x_{i + j} ,其中\sum_{j=-k}^{k}w_{j}=1 si=j=kkwjxi+jj=kkwj=1
    这里的 w j w_{j} wj是权重因数。使用高斯函数来生成权重因数公式如下:
    f ( x , σ ) = 1 2 π σ 2 e x p ( − 1 2 ( x σ ) 2 ) f(x,\sigma)=\frac{1}{\sqrt{2\pi\sigma^{2}}}exp(-\frac{1}{2}(\frac{x}{\sigma})^{2}) f(x,σ)=2πσ2 1exp(
### 时间序列分析案例及其Python实现 #### 使用Holt-Winters算法的时间序列预测模型 对于时间序列数据,可以采用Holt-Winters指数平滑法来进行短期预测。该方法适用于具有趋势季节性的数据集。 在Python中可以通过`statsmodels`库来轻松构建此模型: ```python import pandas as pd from statsmodels.tsa.holtwinters import ExponentialSmoothing # 假设df是一个包含日期索引以及目标变量y的数据框 model = ExponentialSmoothing( df['y'], seasonal="mul", # 或者 "add" trend="mul", # 或者 "add" seasonal_periods=12 # 如果是月度数据则设置为12;如果是季度数据,则设置为4 ).fit() pred = model.predict(start=pd.to_datetime('2023-01-01'), end=pd.to_datetime('2023-12-31')) print(pred) ``` 上述代码展示了如何利用乘法型或加法型的Holt-Winters模型对给定时间段内的未来值做出预测[^2]。 #### ARIMA模型用于股票价格预测 ARIMA(AutoRegressive Integrated Moving Average)是一种广泛应用于金融领域中的时间序列建模技术。下面的例子说明了怎样用它来做股市收盘价的趋势外推: ```python import numpy as np import matplotlib.pyplot as plt from statsmodels.tsa.arima.model import ARIMA data = ... # 加载您的时间序列数据到Pandas Series对象中 arima_model = ARIMA(data, order=(5, 1, 0)) results_ARIMA = arima_model.fit() plt.plot(data) plt.plot(results_ARIMA.fittedvalues, color='red') plt.title('RSS: %.4f'% sum((results_ARIMA.fittedvalues-data)**2)) plt.show() ``` 这段脚本会绘制原始股价曲线图并叠加拟合后的ARIMA模型输出结果,红色线条表示通过调整参数得到的最佳匹配路径[^1]。 #### LSTM神经网络处理多步超前预报问题 长期短记忆(Long Short-Term Memory,LSTM)单元特别适合捕捉长时间依赖关系,在许多实际应用场合下表现出色。这里给出一个简单的LSTM架构实例,用来解决电力消耗量的多步提前预估任务: ```python from keras.models import Sequential from keras.layers import Dense, LSTM def create_dataset(dataset, look_back=1): dataX, dataY = [], [] for i in range(len(dataset)-look_back-1): a = dataset[i:(i+look_back), 0] dataX.append(a) dataY.append(dataset[i + look_back, 0]) return np.array(dataX), np.array(dataY) np.random.seed(7) dataset = ... # 导入您自己的时间序列数据集 scaler = MinMaxScaler(feature_range=(0, 1)) dataset = scaler.fit_transform(dataset.reshape(-1, 1)) train_size = int(len(dataset) * 0.67) test_size = len(dataset) - train_size train, test = dataset[0:train_size,:], dataset[train_size:len(dataset),:] look_back = 1 trainX, trainY = create_dataset(train, look_back) testX, testY = create_dataset(test, look_back) trainX = np.reshape(trainX, (trainX.shape[0], 1, trainX.shape[1])) testX = np.reshape(testX, (testX.shape[0], 1, testX.shape[1])) model = Sequential() model.add(LSTM(4, input_shape=(1, look_back))) model.add(Dense(1)) model.compile(loss='mean_squared_error', optimizer='adam') model.fit(trainX, trainY, epochs=100, batch_size=1, verbose=2) trainPredict = model.predict(trainX) testPredict = model.predict(testX) trainPredict = scaler.inverse_transform(trainPredict) testPredict = scaler.inverse_transform(testPredict) ``` 以上程序片段定义了一个基本结构的循环神经网络,并训练其学习输入特征与相应标签之间的映射规律,从而完成对未来时刻数值变化情况的有效推测.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值