西安住房和城乡建设局网站,百度在线搜索,顺德网站制作案例信息,松原建设小学网站摄影#xff1a;Chris Lawton on Unsplash
一、说明 平稳性是时间序列问题中的一个关键概念。它是指统计属性#xff08;如均值、方差和协方差#xff09;随时间变化的稳定性。为了建立有效的预测模型并确定时间序列数据中有意义的模式#xff0c;了解平稳性的概念以及它与… 摄影Chris Lawton on Unsplash
一、说明 平稳性是时间序列问题中的一个关键概念。它是指统计属性如均值、方差和协方差随时间变化的稳定性。为了建立有效的预测模型并确定时间序列数据中有意义的模式了解平稳性的概念以及它与时间序列分析中其他关键概念的关系至关重要。
二、内容和要点 它不是可以孤立地解释和理解的东西。它直接或间接地与太多的主题和概念有关。我认为为了很好地理解这个主题有必要彻底理解这些其他相关概念。出于这个原因我将首先在我的文章中提供有关这些概念的信息。然后我们将继续讨论平稳性问题。 概念
外推法随机过程联合分销白噪声季节性周期趋势随机游走
Stationarity
WhatWhyTypes
Detection of Stationarity
ADFRollingKPSSUnit Roots
Transformation
DifferencingDecomposition
Conclusion
三、基本概念
3.1 外推法
我们尝试将时间序列作为回归问题来解决。但是其他回归问题中使用的技术例如通过查看房屋有多少个房间来估计房屋的价格不适用于时间序列。在这里我们需要一种不同的方法。这就是为什么我们使用其他名称为ARIMA和SARIMA的模型来解决时间序列问题的原因。
时间序列问题是外推问题。
假设我们想估计我们的房子将消耗多少天然气这是当今的热门话题。
一种方法是我们可以将以前的消耗值和平均每日温度一起绘制。然后我们拟合最适合这些数据点的回归线。我们可以通过回归曲线根据当天的温度来估计消耗量。 消耗与温度。图片由作者提供。
我们在这里做的是一个插值。我们在现有数据范围内进行预测。我们的预测是准确的因为我们在范围内有许多数据可以支持我们的预测。
在外推中我们的预测超出了范围。我们扩展了适合已知数据点的函数。离已知范围越远预测的准确性就越低。 源
现在让我们从时间序列的角度来看问题。这一次我们尝试预测前一天的消耗值的每日天然气消耗量。 消耗时间序列。图片由作者提供。
在这里当我们尝试预测第二天的消费量时我们正在推断这意味着我们正在估计超出我们当前数据范围的东西。
我在上面提到当我们进一步推断时我们结果的可靠性会降低得更多。例如我们在这里的第一个预测会有一定的误差。由于我们将根据第一个预测第二天的预测因此第二个也将受到第一个误差的影响。这样随着时间的流逝错误将像滚雪球一样增长。
3.2 随机过程 随机变量是其值不确定或未知的量由实验结果决定。它是一个将实验结果映射到数值的函数。 随机过程是随机变量的集合这些变量不断演变并按时间编制索引。例如可以将公司一段时间内的股票价格建模为随机过程给定时间股票价格的每个值都表示一个随机变量。随机过程描述了随机变量随时间的变化可以通过均值、方差和自相关函数来表征。 随机过程。源
我们有两个变量;t 时间和 s 样本来自样本空间 S Xts
我们可以将随机过程分为确定性和非确定性随机。
随机指标我们无法从当前值预测未来值。现实生活中的例子股票价格、交通流量、天气模式、生物系统、电力需求确定性一旦我们知道它是如何开始的我们就可以得到未来的值。例如你有一个信号是 Xts cos2πt s如果你知道什么是 s那么你就可以预测未来的值。现实生活中的例子制造过程、人口增长、太阳能系统、机械系统......
让我们用 Python 编写一个随机过程
import numpy as np
import matplotlib.pyplot as pltn_step 100 # we will measure 100 times
step_size 0.1 # we will measure every 0.1 seconds# time steps (x axes)
time np.arange(0, n_step * step_size, step_size)# random noise with mean 0 and standard deviation 1
noise np.random.normal(0, 1, num_steps)# random process as the cumulative sum of the noise
random_process np.cumsum(noise) * step_size# plot
plt.plot(time, random_process)
plt.xlabel(Time)
plt.ylabel(Measurement)
plt.title(Random Process)
plt.show() 图片由作者提供。
3.3 联合分布 联合分布是一种概率分布它描述了两个或多个随机变量同时具有特定值的概率。简而言之它计算两个事件同时发生的可能性。 许多样本观测值黑色是根据联合概率分布显示的。还显示了边际密度。来源维基百科
时间序列表示随机过程的一种可能结果该结果可以通过其完全联合概率分布来完全表征该概率分布包含随机过程在无限时间段内可以采用的所有可能的值组合。
例如如果我们有一个代表股票每日收盘价的时间序列则可能是随机过程的实现该过程模拟了股票价格随时间的变化行为。这个随机过程的完全联合概率分布将指定每日收盘价的所有可能序列的概率同时考虑到影响股票价格的所有因素如经济新闻、市场状况和投资者情绪。
如果时间序列是平稳的那么它与滞后的联合分布应该是时间不变的。换句话说分布不应随着时间索引的变化而变化。这可以通过比较时间序列的联合分布及其在不同时间点的滞后来验证。
我们可以计算上述随机过程及其滞后的联合分布如下所示
lag 10# stack them into 2D arr
joint np.vstack([random_process[:-lag], random_process[lag:]])# 2D Density plot
sns.jointplot(joint[0], joint[1], kindkde)
plt.show() 联合分发。图片由作者提供。
3.4 白噪声 这是一个没有可辨别结构的系列。根据定义它是不可预测的。白噪声过程有一些标准
平均值为零。标准差随时间变化恒定。滞后之间的相关性为零。
y_t 信号 噪声 我们可以将时间序列视为信号和噪声的组合。我们可以在信号上建立一个模型。另一方面噪音是完全不可预测的。 当残差 y_t — signal_model_outcome 接近白噪声过程时这意味着模型在解释观测数据方面做得很好。残差中的任何剩余变异性都可以归因于随机误差或噪声。另一方面如果残差不接近白噪声过程则意味着模型不适合数据并且残差中仍然存在模型未考虑的模式或相关性。
让我们在 Python 中生成一些白噪声
import numpy as npmean 0
std_dev 1
length 100white_noise_signal np.random.normal(mean, std_dev, length)print(Mean: , np.mean(white_noise_signal)) #Mean: -0.1490592783325961
plt.plot(white_noise_signal)
plt.title(White Noise)
plt.xlabel(Time)
plt.ylabel(Amplitude)
plt.show() 白噪声信号。图片由作者提供。
我们可以使用自相关函数ACF工具来测试时间序列是否为白噪声过程。
ACF 测量时间序列与其滞后值之间的相关性。如果是白噪声则表示其值是独立且不相关的因此对于所有滞后ACF 应接近于零。
from statsmodels.graphics.tsaplots import plot_acf# plotting the autocorrelation function
plot_acf(white_noise_signal, lags20, alpha0.05)
plt.show() ACF.图片由作者提供。
lags参数指定要包含在图中的滞后数。 是显著性水平通常取为 0.05 - 95% 置信水平。alpha
如果大多数滞后的自相关值接近于零则表示序列是白噪声过程。
3.5 季节性 季节性是随着时间的推移而重复的规律和可预测的模式。这些模式可以发生在不同的时间尺度上例如每天、每周、每月或每年。 加拿大猞猁数据。源
我们可以在 Python 中生成季节性时间序列数据。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt# a time series with a yearly pattern
range_date pd.date_range(start1/1/2021, end12/31/2023, freqD)
data pd.Series(range_date, indexrange_date)
data np.sin(2 * np.pi * (data.index.dayofyear / 365))# plot
plt.plot(ts)
plt.title(Seasonal T.S.)
plt.xlabel(Day)
plt.ylabel(Val)
plt.show() 虚拟季节性时间序列图。图片由作者提供。
如果时间序列具有季节性分量则将其视为非平稳的。这使得它不适合使用自回归模型进行分析。为了克服这一点有必要识别并消除时间序列中的季节性成分。通过这样做我们将获得一个没有季节性并且可以与自回归模型一起使用的新系列。
有几种方法可以识别和消除季节性成分。我们将在帖子后面检查它们。让我们继续回顾这些概念。
3.6 周期 周期与季节性一样是一种时间序列模式。主要区别在于重复模式的长度。周期具有较长的时间间隔例如年。比如一个企业多年来的增长和收缩周期或者一个地区农产品收成的丰收或干旱。
3.7 趋势 趋势是时间序列中的长期模式或运动。它可以是向上、向下或平坦的。它提供有关数据随时间变化的方向和幅度的信息。
import pandas as pd
import matplotlib.pyplot as plt# a dummy trend data
dates pd.date_range(start2022-01-01, end2023-12-31, freqD)
df pd.DataFrame(datarange(0,len(dates)), indexdates, columns[Value])
# this will add a drop at the beginning of the next year
df[Value] df[Value] 1000 * df.index.dayofyear / 365# plot
df.plot(figsize(12, 5))
plt.title(Trend Data)
plt.ylabel(Value)
plt.show() 在 Python 中生成的虚拟趋势数据。图片由作者提供。
从年初到年底有一个非常强劲的上升趋势。新年的第一天有一个急剧的下降这可能是由任何事情引起的然后又回到了上升趋势中。
3.8 随机游走过程 随机游走过程是一种特殊类型的随机过程其中当前值等于前一个值加上随机误差项即白噪声。
Yt Yt-1 wt 和 wt 是白噪声。 随机游走过程中没有模式。时间序列是纯随机的变量的行为随时间变化。这意味着时间的变化是一个随机变量。 随机游走通常用于对金融时间序列如股票价格或汇率进行建模其中价格会因新闻事件、经济状况和投资者情绪等潜在因素的组合而随时间变化。 随机游走。源
对 Y 在下一个周期中最准确的预测是其当前值。均值是恒定的但方差不是。因此随机游走过程不是静止的。
四、平稳性
4.1 平稳性什么 平稳时间序列的统计行为随时间推移保持不变。这并不意味着它们不会改变它们会改变但变化本身是随机的。时间序列必须具有一些统计属性才能保持平稳
常量平均值随着时间的推移没有趋势。常量方差、协方差数据尺度不变观测值之间的关系一致。无季节性季节性数据的统计属性定期变化。因此均值存在变化模式。 让我们违反常数均值原则
import numpy as np
import matplotlib.pyplot as plt# linear trend data
x np.arange(0, 100, 1)
y x np.random.normal(0, 10, 100)plt.plot(x, y)
plt.xlabel(Time Step)
plt.ylabel(Value)
plt.title(Violating Constant Mean)
plt.show() 平均值不是恒定的。图片由作者提供。
让我们违反常数方差原则
import numpy as np
import matplotlib.pyplot as plt# an increasing variance dummy data
x np.arange(0, 500, 1)
y np.sin(x / 5) * np.exp(0.01 * x) np.random.normal(0, 10, 500)plt.plot(x, y)
plt.xlabel(Time Step)
plt.ylabel(Value)
plt.title(Violating Constant Variance)
plt.show() 方差不是恒定的。图片由作者提供。
季节性数据不能是静止的
import numpy as np
import matplotlib.pyplot as plt# dummy seasonal data
x np.arange(0, 500, 1)
y np.cos(x / 10) np.random.normal(0, 1, 500)# Plot the time series
plt.plot(x, y)
plt.xlabel(Time Step)
plt.ylabel(Value)
plt.title(Violating No Seasonality)
plt.show() 季节性。图片由作者提供。
现在让我们生成平稳的时间序列数据并检查每个条件
import numpy as np
import matplotlib.pyplot as pltm 10 #mean
stddev 2 #standard deviation# generate dummy data
x np.arange(0, 200, 1)
y np.random.normal(m, stddev, 200)plt.plot(x, y)
plt.xlabel(Time Step)
plt.ylabel(Value)
plt.title(Stationary Time Series)
plt.show() 静止时间序列。图片由作者提供。
让我们将整个数据分为 4 部分并计算每个部分的均值和方差
subset_size len(y) // 4
subsets [y[i:isubset_size] for i in range(0, len(y), subset_size)]for i, subset in enumerate(subsets):mean np.mean(subset)variance np.var(subset)print(fMean of subset {i 1}: {round(mean,2)})print(fVariance of subset {i 1}: {round(variance,2)})
Mean of subset 1: 10.51
Variance of subset 1: 3.31
Mean of subset 2: 9.67
Variance of subset 2: 4.4
Mean of subset 3: 9.7
Variance of subset 3: 4.83
Mean of subset 4: 9.49
Variance of subset 4: 3.24我将在下面提到分解但现在让我们简单地检查季节性。
import numpy as np
import pandas as pd
from statsmodels.tsa.seasonal import seasonal_decompose# convert the data into time series
date_rng pd.date_range(start1/1/2020, end7/18/2020, freqD)
y pd.Series(y, date_rng)# seasonal decomposition
result seasonal_decompose(y, modelmultiplicative)
result.plot() 组件。图片由作者提供。
mean_seasonal result.seasonal.mean()
std_seasonal result.seasonal.std()
print(fMean of seasonal component: {round(mean_seasonal,2)})
print(fStandard deviation of seasonal component: {round(std_seasonal,2)})
Mean of seasonal component: 1.0
Standard deviation of seasonal component: 0.03非平稳行为。源 非平稳过程。源
4.2 为什么
我们为什么要费心在时间序列中寻找平稳性
它们易于解释和建模。它们具有恒定的统计属性。因此更容易对数据中的基础模式进行建模。我在上面提到了外推。在外推中预测更加困难。平稳时间序列更易于推断并提供更有效的结果。许多时间序列模型可以使用平稳时间序列ARIMA 和其他线性时间序列模型。
4.3 类型 我们有两种类型的平稳性严格和弱。
弱二阶平稳性是我上面描述的。
另一方面严格平稳性是指在不同时间序列的值在任何时间段内联合分布相同的时间序列。因此该过程不依赖于任何时候的时间。所有时刻、期望值、方差、订单和其他统计属性在一段时间内都是恒定的。这是对平稳性的高度严格的定义在实时时不太期望。
五、平稳性检测
有几种方法可以检测平稳性。最常见的是
澳大利亚国防军轧制金伯利坚
5.1 增强迪基-富勒测试 ADF 用于识别时间序列中平稳性的最常见统计检验。它是一种统计检验通过检验时间序列为非平稳的原假设来检查平稳性。
He非固定式; Ha固定式
import pandas as pd
import matplotlib.pyplot as pltn 200 # data points
m 10 # mean
var 2 # variancex pd.date_range(start2023-01-01, periodsn, freqD)
y np.random.normal(m,stddev, n)# a stationary time series
ts_stationary pd.Series(datay, indexx)# a non-stationary time series
y_non np.array(range(n)) y
ts_non pd.Series(datay_non, indexx) 平稳时间序列。图片由作者提供。 非平稳时间序列。图片由作者提供。
from statsmodels.tsa.stattools import adfullerresult adfuller(ts_stationary)
print(result)
# (-6.741179365234232, 3.115993445779861e-09, 3, 196, {1%: -3.464161278384219, 5%: -2.876401960790147, 10%: -2.5746921001665974}, 796.3640126365929)
print(ADF Statistic: %f % result[0]) #-6.741179
print(p-value: %f % result[1]) #0.000000# Since the p-value is lower than 0.05 significance level,
# we can reject the null hypothesis and,
# this is stationaryresult adfuller(ts_non)
print(ADF Statistic: %f % result[0]) #0.375390
print(p-value: %f % result[1]) #0.980551# Since the p-value is very high than 0.05
# we can accept the null hypothesis and
# this is not stationary.
5.2 roll滚动 我们计算滚动统计数据并检查它们是否随时间发生显着变化。首先我们定义一个窗口大小然后计算平均值和方差并检查它们是否随时间变化为常量或接近常量。 让我们滚动序列并绘制滚动均值和方差
# rolling mean and variance
rolling_mean_s ts_stationary.rolling(window5).mean()
rolling_var_s ts_stationary.rolling(window5).var()plt.plot(rolling_mean_s, labelRolling Mean)
plt.plot(rolling_var_s, labelRolling Variance)
plt.legend(locbest)
plt.title(Rollings Stationary)
plt.show() 静止的滚动统计信息。图片由作者提供。 非平稳的滚动统计信息。图片由作者提供。
5.3 Kwiatkowski-Phillips-Schmidt-Shin Test KPSS Test 另一种统计测试基于将时间序列的属性与白噪声过程的属性进行比较测试结果用于确定平稳性。
何静止;Ha非平稳
from statsmodels.tsa.stattools import kpss# STATIONARYresult kpss(ts_stationary, regressionc)
print(KPSS Statistic: %f % result[0])
# KPSS Statistic: 0.162979
print(p-value: %f % result[1])
# p-value: 0.100000# Since the p-value is high than the significance level (0.05)
# we cannot reject the null hypothesis and
# it means that it is stationary# NON-STATIONARY
result kpss(ts_non, regressionc)
print(KPSS Statistic: %f % result[0])
# KPSS Statistic: 1.358781
print(p-value: %f % result[1])
# p-value: 0.010000# Since the p-value is less than 0.05
# we can reject the null hypothesis and
# it means that it is non-stationary
5.4 单位根 当静止过程受到冲击时冲击的影响会随着时间的推移而减弱系统恢复正常运行。然而在非平稳过程中冲击的影响是永久性的。 平稳时间序列和非平稳时间序列之间的差异。源 单位根是非平稳时间序列的特征其中序列在干扰后倾向于返回其平均值并且没有可预测的趋势。所以我们也可以说如果我们的时间序列有单位根它就不是静止的。 我们有一个 AR1 模型 Φ 是 1 滞后的乘法系数。单位根是关于 Φ 的值。 我们可以将上述等式重写为序列的第一项和ε滞后版本的组合。这称为 MA 模型。 方差和期望值 现在让我们假设 |Φ| 1
当我们让 t 去无穷大时Φ^t 将接近零因此 期望值将变为 E 0。 随着时间的推移它是恒定的。方差也将是恒定的。 因此我们可以说在这种情况下我们的时间序列是静止的。
|Φ| 1
在这种情况下我们的时间序列会随着时间的推移而爆炸。因此期望值 E 将收敛到 - 无穷大。这使得这种情况是非静止的。
冲击作用对系统的影响随着时间的推移而增加。我们无法在现实生活中观察到这种系统。
|Φ| 1
这是单位根情况一种均匀的非平稳条件。期望值将是时间序列的第一个值 E yt y0并且它是常数。和差异 随着时间的推移方差会增加。由于方差不是恒定的因此时间序列不是平稳的。
我们可以使用 Dickey-Fuller 检验检测时间序列中的单位根。
Ho非静止; Ha固定式 Ho: Non-stationary; Ha: stationary
import numpy as np
import pandas as pd
import statsmodels.tsa.stattools as ts# data with a unit root
y np.random.randn(100).cumsum()
plt.plot(y)
plt.show() 虚拟数据。图片由作者提供。
# Dickey-Fuller test
result ts.adfuller(data)
print(Test Statistic: {:.4f}.format(result[0]))
print(p-value: {:.4f}.format(result[1]))# check the p-value
if result[1] 0.05:print(Rejecting the null hypothesis - Time series is stationary)
else:print(Fail to reject the null hypothesis - Time series is not stationary)Test Statistic: -1.6213
p-value: 0.4721
Fail to reject the null hypothesis - Time series is not stationary我们应用差分技术将单位根时间序列转换为信纸。
六、转型 好吧如果我正在处理的时间序列数据不是静止的怎么办那我该怎么办呢非平稳时间序列可以设为平稳。有多种方法可以实现它。
DifferencingDecomposition
6.1 Differencing 我们取连续值序列的差值。假设我们的数据是 X [x1 x2 x3 .... xn]那么第一个区别是 ΔX [nan x2 — x1 x3 — x2 ... xn — xn-1]。 通过差分我们从序列中删除趋势分量。新系列变得更加静止。这就像删除数据的整体向上或向下方向只留下围绕常数平均值的波动。 美国净发电量十亿千瓦时。其他面板在变换和差分后显示相同的数据。源 从前一个观测值中减去每个观测值的过程称为滞后 1 差值。对于具有季节性模式的时间序列滞后通常设置为季节性周期的长度。
# lag-1
ts_non_lag1 ts_non.diff(periods1) 第一个滞后。图片由作者提供。
6.2 分解 在分解方法中我们尝试将时间序列分解为三个组成部分趋势、季节性和残差。我们可以隔离每一块。 分解时间序列后可以进一步分析残差以确定它们是否平稳。如果残差是非平稳的则可能需要进一步的预处理例如差分或季节性分解以使时间序列保持平稳。
添加剂分解
y_t T_t S_t E_t
它通常用于时间序列相对稳定没有大的波动或结构变化并且非常适合对相对简单的时间序列模式进行建模和预测。
当季节性变化的大小如每年同一时间发生的变化随时间保持大致相同并且残差分量减去趋势和季节性后剩余的成分不遵循任何模式并且是随机分布时最好使用它。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import statsmodels.api as sm# generated data
date_range pd.date_range(start01/01/2000, end01/01/2022, freqM)
value np.random.randint(low1000, high2000, sizelen(date_range)) np.sin(np.linspace(0, 10 * np.pi, len(date_range))) * 300
data pd.DataFrame({value: value}, indexdate_range)# additive decomposition
result sm.tsa.seasonal_decompose(data[value], modeladditive)# plot
plt.figure(figsize(10,7))
plt.subplot(411)
plt.plot(result.observed, labelobserved)
plt.legend(locbest)
plt.subplot(412)
plt.plot(result.trend, labeltrend)
plt.legend(locbest)
plt.subplot(413)
plt.plot(result.seasonal, labelseasonal)
plt.legend(locbest)
plt.subplot(414)
plt.plot(result.resid, labelresidual)
plt.legend(locbest)
plt.tight_layout()
plt.show() 添加剂分解。图片由作者提供。 加法和乘法。源
乘法分解
y_t T_t * S_t * E_t
它通常用于时间序列表现出非恒定增长或下降的情况并且波动幅度与序列的大小成正比。
result sm.tsa.seasonal_decompose(data[value], modelmultiplicative)
季节性分解 STL
它涉及平滑和 LOESS 回归的组合以将时间序列分为其季节性、趋势和残差分量。它的工作原理是首先将平滑曲线拟合到时间序列然后删除该曲线以获得季节性分量。然后将该过程的残差与另一条平滑曲线拟合以获得趋势分量并且该过程的残差被视为残差分量。
STL 分解对于分析具有强季节性模式和趋势的时间序列数据特别有用。
result STL(data, period12, seasonal7, robustTrue).fit()
period指定每个周期的观测值数。例如我的数据是每月一次因此我使用 12 作为期间。seasonal指定季节性窗口中的观测值数。此值会影响季节性分量的平滑度。较小的值表示更平滑的季节性分量而较大的值则提供更锯齿状的分量。robust是设置稳健拟合的标志。稳健估计值是能够抵抗数据中异常值或极值影响的统计估计值。它通常用于数据包含异常值或极值的情况这些异常值或极值会极大地影响传统估计方法如平均值或回归的结果。
plt.figure(figsize(15, 10))
plt.subplot(411)
plt.plot(data, labelOriginal)
plt.legend(locbest)
plt.subplot(412)
plt.plot(result.trend, labelTrend)
plt.legend(locbest)
plt.subplot(413)
plt.plot(result.seasonal,labelSeasonality)
plt.legend(locbest)
plt.subplot(414)
plt.plot(result.resid, labelResiduals)
plt.legend(locbest)
plt.tight_layout()
plt.show() STL 分解。图片由作者提供。
七、结论 这是一个漫长而疲惫的职位。这就是为什么我不会试图将所有信息融化在一个锅里以延长它为代价。如果你要处理时间序列问题平稳性是必须知道的主题之一。同时这个主题包含不止一个概念。因此您还应该了解这些概念。 请记住平稳时间序列随时间推移具有恒定的统计属性因此更容易建模和预测。然而许多现实世界的时间序列是非平稳的必须通过差分和分解等技术进行转换才能实现平稳性。理解平稳性的概念及其含义对于在金融、经济和工程等领域工作的人来说至关重要在这些领域经常使用时间序列分析。奥坎·耶尼根 ·