时间序列1-如何分析你的时间序列

目录

0. 背景

1 数学计量基础

1.1 协方差与相关系数

1.2 自相关系数

2 平稳性检验

2.1 时间序列平稳性检验意义

2.2 严平稳和弱平稳

2.3 时间序列平稳性统计学性质

2.4 代码实例1-数据展示

2.5 代码实例2-ADF平稳性检验

2.6 代码实例3-数据差分

3 季节性检验

3.1 季节性检验相关概念

3.2 测量季节强度

3.3 代码实例1-数据生成

3.4 代码实例2-STL分解时间序列观测数据是否具有季节性 

3.5 代码实例3-计算季节性强度

4. 趋势性检验


0. 背景

时间序列是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列,其中隐藏着一些过去与未来的关系。时间序列统计分析则是是将一组按时间顺序排列的观测值构成一个统计的时间序列,并运用特定的数学方法对这些数据进行处理和分析,以揭示数据的内在规律,并预测未来的发展趋势。该方法应用于多个领域的动态数据处理统计方法。

时间序列分析的特点在于,它主要依据时间的推移来研究数据的变化趋势,而不受其他外在因素的影响。这种分析方法在电力系统、工程、金融、科技等领域都有广泛的应用。特别是在大数据时代,时间序列分析已经成为AI技术的一个重要分支,通过与机器学习模型相结合,可以更好地对时间序列进行建模和预测。

时间序列分析的主要方法包括简单序时平均数法加权序时平均数法移动平均法加权移动平均法、趋势预测法、指数平滑法、季节性趋势预测法、市场寿命周期预测法等。其中,移动平均法是一种常用的时间序列分析方法,它通过计算观察期内数据的平均值来预测未来的趋势。然而,移动平均法也有其局限性,如对于非平稳序列和转折点的预测可能会出现偏差。

时间序列分析的基本步骤通常包括数据收集、数据预处理、模型建立、参数估计、模型检验和预测等。数据收集是获取原始数据的过程,数据预处理则是对原始数据进行清洗、变换等操作,以消除异常值和噪声。模型建立则是根据数据的特性选择合适的模型,参数估计则是通过一定的数学方法求解模型的参数。模型检验是对模型的拟合效果进行评估,预测则是利用模型对未来的趋势进行预测。关于时序数据的预处理和基本特征的提取工作,我在之前的文章基于时间序列的特征工程技巧与季节性分析一文中已经做过相关介绍。

当然,时间序列分析也存在一些挑战,如数据的非平稳性、季节性、周期性等因素都可能对预测结果产生影响。因此,在进行时间序列分析时,需要充分考虑这些因素,并选择合适的模型和方法进行预测。今天,我给大家分享一些关于时间序列统计分析的相关知识,这些内容是做时序分析的基础内容。

1 数学计量基础

时间序列模型,早期主要是进行充分的假设与检验,例如平稳性检验,自相关性检验等,这些基础理论推动了自回归法,移动平均法,指数移动平均法等经典时间序列模型的发展。

1.1 协方差与相关系数

在描述时间序列的统计分析方法之前,我们需要简单了解下概率论中的两个基础概念:协方差相关系数。熟悉的朋友们可跳过。

假设两个随机变量X和Y满足未知的概率分布(可以是同分布也可以是不同的分布), X和Y的协方差为:

Cov(X,Y)=E[(X-\mu _{X})(Y-\mu _{Y})]

其中,E[\cdot ] 为求解数学期望的运算符。 \mu _{X}\mu _{Y} 分别为X和Y的均值。

协方差告诉我们两个随机变量是如何一起移动的。但只用协方差衡量变量相关性存在一些问题:协方差是有量纲的,它的大小受随机变量本身波动范围(或取值范围)所影响。因此,人们希望使用某个和协方差有关,但是又是无量纲的测量来描述两个随机变量的相关性。最简单的做法就是用变量自身的波动对协方差进行标准化,相关系数便由此得来。

令ρ表示X和Y的相关系数,它的定义为:

\rho (X,Y)=\frac{E[(X-\mu_{X}(Y-\mu_{Y}))]}{\sigma _{X}\sigma_{Y}}=\frac{Cov(X,Y)}{\sigma_{X}\sigma_{Y}}

其中\sigma_{X}\sigma_{Y} 分别为X和Y的标准差。通过使用X和Y的标准差对它们的协方差归一化,ρ的取值范围在 -1 到 +1 之间,即 [-1, +1]:

  • \rho (X,Y)=1表示X和Y之间存在确切的线性正相关;

  • \rho (X,Y)=0表示X和Y之间不存在任何线性相关性;

  • \rho (X,Y)=-1表示X和Y之间存在确切的线性负相关。

值得一提的是,相关系数仅仅刻画 X和Y之间的线性相关性;它不描述它们之间的(任何)非线性关系。

1.2 自相关系数

有了上面内容的铺垫,下面我们聊聊时间序列的自相关性。

时间序列的自相关性是指时间序列与其自身的滞后版本之间的相关性。换句话说,它是衡量一个时间序列在不同时间点上的取值是否存在关联性的指标。如果时间序列在某个时间点上的取值与其过去或未来的取值存在关联,那么该时间序列就具有自相关性。自相关性的存在意味着时间序列中的信息并不是完全独立的,而是存在一定的依赖关系。这种依赖关系可能是由于季节性因素、周期性因素、趋势性因素等引起的。因此,了解和掌握时间序列的自相关性对于时间序列分析和预测具有重要意义。

时间序列数据是一直延伸的,根据这种数据特点,自相关性考察的是 t 时刻的值和距当前任意间隔 k时刻的值之间的线性相依关系。由于来自同一个时间序列,因此结合之前的数学基础,可以推广出自相关系数。

定义:v_{t}v_{t-k}的相关系数称为v_{t}的间隔为k的自相关系数。由上一节的中介绍的相关系数的定义可知:\rho _{k}=\frac{Cov(v_{t},v_{t-k})}{\sigma _{v_{t}}\sigma_{v_{t-k}}}

从这个定义不难看出,当 k=0 时有:\rho =1。这表示v_{t}的间隔为 0 的自相关系数恒定为 1。

上面定义的\rho _{k}是总体的统计特性。实际中,我们仍然只能通过有限的样本数据来计算样本的统计特性。令\varsigma _{k}为与\rho _{k}对应的样本统计量,则有:

\varsigma _{k}=\frac{c_{k}}{c_{0}}\\ c_{k}=\frac{1}{n}\sum_{t=1}^{n-k}(v_{t}-\bar{r})(v_{t+k}-\bar{r})

上式中,c_{k}是 v_{t}的间隔为 k 的样本自协方差;\varsigma _{k}v_{t}的间隔为  k  的样本自相关系数。利用相关图我们可以清晰地看到 \varsigma _{k}是如何随间隔 k 变化的。

自相关性的度量通常使用自相关函数(ACF)或偏自相关函数(PACF)来进行。自相关函数衡量的是时间序列与其自身在不同滞后期数下的相关性,而偏自相关函数则衡量的是时间序列在排除了其他滞后期数影响后的自相关性。

下图为两个假想时间序列的相关图。它们呈现出完全不同结构的自相关性。事实上,第一个相关图的时间序列存在明显的趋势;而第二个相关图的时间序列存在明显的周期性。这两个例子说明相关图可以告诉我们很多时间序列的内在特性。

图片

在上图中还存在一个概念:滞后阶数Lag。滞后阶数(Lag)是指时间序列与其自身在时间上的移动(即滞后)之间的时间间隔。换句话说,滞后阶数表示我们向后追溯的观测值的数量。例如,如果有一个时间序列表示每个月的销售额,那么滞后阶数为1就表示我们要比较当前月的销售额与上一个月的销售额之间的关系。

在进行时间序列分析时,滞后阶数的选择是非常重要的,因为它直接影响到模型的预测精度。如果滞后阶数过小,可能会忽略一些重要的信息;而如果滞后阶数过大,则可能会引入一些噪声和冗余信息,从而降低模型的预测性能。

滞后阶数的确定通常基于一些统计准则,如赤池信息准则(AIC)或贝叶斯信息准则(BIC)。这些准则可以帮助我们在不同的滞后阶数之间做出选择,以找到最佳的模型。在进行自相关检验时,需要选择合适的滞后阶数来进行检验。一般情况下,滞后阶数可以根据数据的特征和模型的类型来选择。例如,如果数据具有季节性,可以选择较大的滞后阶数;如果数据没有季节性,可以选择较小的滞后阶数。

有了以上的数学基础,在评价一个时间序列的建模是否合适时,我们可以首先找到原始时间序列和它的拟合序列之间的残差序列;然后只要画出这个残差序列的相关图就可以看到它是否含有任何模型未考虑的额外自相关性:

  • 如果残差的相关图和之前拟合的图相似,则可以认为残差是一个随机噪声,而模型已经很好的捕捉了原始时间序列中的自相关性;

  • 如果残差的相关图体现了额外的自相关性,它们将为我们改进已有的模型提供依据,因为这些额外的自相关说明已有模型没有考虑原始时间序列在某些特定间隔上的自相关。

因此,在进行时间序列分析和预测时,需要对时间序列的自相关性进行充分的检验和理解,以便选择合适的模型和方法进行建模和预测。同时,也需要注意自相关性可能带来的问题,如过度拟合、参数估计困难等,并采取相应的措施进行解决。

2 平稳性检验

平稳性是时间序列分析的基础。平稳性是指时间序列的统计特性,如均值、方差和协方差等,不随时间的变化而变化。如果一个时间序列是平稳的,那么它的统计特性就可以在整个时间序列上保持一致,这使得我们可以使用更简单的模型和方法来进行分析和预测。通俗的理解平稳性,指直观上看当数据没有明显的模式特征的话(趋势性、季节性),我们认为它是平稳的。定义上“平稳”指固定时间和位置的概率分布与所有时间和位置的概率分布相同的随机过程。其数学期望和方差这些参数也不随时间和位置变化

2.1 时间序列平稳性检验意义

  • 模型假设满足:很多时间序列模型,例如ARIMA,要求数据是平稳的。通过进行平稳性检验,确保了模型的基本假设得到满足,提高模型的可靠性和准确性。

  • 消除趋势和季节性影响:平稳时间序列更容易去除趋势和季节性影响,使得更容易观察到序列中的其他特征和模式,从而更好地进行预测和分析。

  • 提高模型性能:在进行时间序列分析和建模时,平稳性检验有助于提高模型性能,非平稳性序列可能导致模型的不准确性和不稳定性,而平稳序列更有助于模型的稳健性。

  • 有效控制误差:平稳序列有助于有效控制误差的影响,使得模型更加可靠。这对于预测和决策制定过程中的信任度至关重要。

  • 时间序列的可解释性:平稳性有助于提高时间序列的可解释性,使得对数据背后机制的理解更加清晰。

2.2 严平稳和弱平稳

平稳性检验的方法有多种,其中最常见的是通过绘制时间序列的折线图和统计特征图来进行可视化分析。具体来说,我们可以通过观察折线图中曲线是否围绕某一数值上下波动(判断均值是否稳定),曲线上下波动幅度变化是否大(判断方差是否稳定),以及曲线波不同时间段动的频率或紧凑程度变化是否大(判断协方差是否稳定)来判断时间序列是否是平稳的。

在数学上,时间序列的严平稳有着更精确的定义:它要求时间序列中任意给定长度的两段子序列都满足相同的联合分布。这是一个很强的条件,在实际中几乎不可能被满足。因此我们还有弱平稳的定义,它要求时间序列满足均值平稳性和二阶平稳性

如果一个时间序列满足以下两个条件,则它是弱平稳的:

  1. 对于所有的时刻t,有E(v_{t})=\mu,其中μ是一个常数(均值平稳性)。

  2. 对于所有的时刻t和任意的间隔k,值之间的协方差\sigma (v_{t}-v_{t-k})=\gamma _{k},其中\gamma _{k}与时间t无关,它仅仅依赖于间隔k。这称为方差平稳性

弱平稳假设对于分析时间序列至关重要。为了解释这一点,来看一个例子。假设我们想知道某天股票收益率的均值是多少,假设股票变化时序是平稳的,我们就可以通过过去的数据预估出未来一段时间的收益均值。不幸的是,历史只发生一次,时间也一去不复返。大部分股市时序是不符合平稳性假设的。因此这个方法对于金融数据是行不通的。

在一般弱平稳的假设下,我们也可以通常假定投资品收益率序列是弱平稳的。只要有足够多的历史数据,这个假定可以用实证方法验证。比如,我们可以把数据分成若干个子集,并分别计算每个子集的统计量,然后通过统计的手段检验这些来自不同子集的统计量的一致性。对于此,更复杂的非线性模型对波动率建模(比如 GARCH),又或者把时间段细分为更短的区间,使得在每个小区间内的时间序列尽量满足弱平稳性,是常见且通用的时间序列分析方法。

2.3 时间序列平稳性统计学性质

  • 常数均值:时间序列的均值在不同时间点上是常数。即使有波动,整体的平均水平应该是不变的。

  • 常数方差:时间序列的方差在不同时间点上是常数。方差描述了数据的离散程度,平稳性要求这种离散程度是稳定的。

  • 常数自协方差:自协方差是描述时间序列在不同时间点上的相关性。平稳性要求自协方差在不同时间点上是常数,表示时间序列的相关性模式是稳定的。

  • 缺乏趋势和季节性:平稳性还要求时间序列中不存在明显的趋势和季节性影响,使得数据不受外部因素的影响而呈现稳定状态。

除了可视化分析外,我们还可以使用统计测试方法来进行平稳性检验。其中最常用的方法是单位根检验,如ADF检验PP检验。这些检验方法的原理是通过构建一个统计量来测试时间序列中是否存在单位根,即时间序列是否是非平稳的。如果统计量的值小于某个临界值,那么我们就可以拒绝原假设(存在单位根),认为时间序列是平稳的。

2.4 代码实例1-数据展示

import numpy as np
import matplotlib.pyplot as plt
from statsmodels.tsa.stattools import adfuller

# 生成不平稳时间序列数据
np.random.seed(42)
data = np.cumsum(np.random.randn(1000))

# 可视化不平稳数据
plt.figure(figsize=(15,5 ),dpi=300)
plt.plot(data,color = 'c')
plt.title('Non-stationary Time Series')
plt.xlabel('Time')
plt.ylabel('Value')
plt.show()

2.5 代码实例2-ADF平稳性检验


from statsmodels.tsa.stattools import adfuller
import pandas as pd
def find_stationarity_order_with_p_values(time_series, max_diff=5, significance_level=0.05):
    """
    循环进行差分,并输出每一阶差分的ADF检验结果,判断在几阶差分时数据达到平稳。

    Parameters:
    - time_series: 待差分的时间序列
    - max_diff: 最大尝试的差分阶数,默认为5
    - significance_level: ADF检验的显著性水平,默认为0.05

    Returns:
    - results: 每一阶差分的结果,包括差分阶数、p-value以及是否达到平稳
    """

    results = []

    # 差分阶数为0时进行原始序列的平稳性检验
    result = adfuller(time_series)
    p_value = result[1]
    is_stationary = p_value <= significance_level

    results.append({
        'order': 0,
        'p_value': p_value,
        'is_stationary': is_stationary
    })

    # 从差分阶数为1开始循环
    diff_order = 1
    while diff_order <= max_diff:
        diff_series = time_series.diff().dropna()
        result = adfuller(diff_series)
        p_value = result[1]
        is_stationary = p_value <= significance_level

        results.append({
            'order': diff_order,
            'p_value': p_value,
            'is_stationary': is_stationary
        })

        if not is_stationary:
            diff_order += 1
            time_series = diff_series
        else:
            break

    return results


# df['Price']为检验时间序列数据
results = find_stationarity_order_with_p_values(pd.Series(data))
for result in results:
    print(f"第 {result['order']} 阶差分的p-value: {result['p_value']}, 是否达到平稳: {result['is_stationary']}")

通过循环进行差分,利用ADF检验判断每一阶差分后的时间序列是否达到平稳,原始数据P值大于0.05呈现不平稳状态,经过一阶差分后P值小于0.05数据在一阶差分时达到平稳,其中ADF检验,是用于检验时间序列数据是否具有单位根,即数据是否是非平稳的,ADF检验的原假设是数据具有单位根,即非平稳;备择假设是数据是平稳的,通过检验ADF统计量的显著性水平(p-value),可以判断是否拒绝原假设,从而确定时间序列的平稳性

除了ADF检验之外,还有一些常用于检验平稳性的方法,其中包括:

KPSS 检验:与ADF检验相反,KPSS检验的原假设是数据是平稳的,备择假设是数据具有单位根。通过检验统计量的显著性水平,可以判断是否拒绝原假设,从而确定平稳性。

PP检验:类似于ADF检验,PP检验也用于检验单位根。它在计算过程中采用不同的修正方法,但其基本思想是与ADF检验相似。

走势图观察:通过绘制时间序列的走势图,观察是否存在明显的趋势和季节性,以判断平稳性。

2.6 代码实例3-数据差分

需要注意的是,在进行平稳性检验时,我们还需要考虑时间序列的季节性和趋势性等因素。如果时间序列存在季节性或趋势性,那么我们需要对这些因素进行差分或其他变换,以消除它们对平稳性的影响

def difference_and_save(data, column_name, diff_order=1):
    """
    对数据进行差分并保存为DataFrame。

    Parameters:
    - data: 包含时间序列数据的原始DataFrame
    - column_name: 要差分的列名
    - diff_order: 差分阶数,默认为1

    Returns:
    - diff_df: 差分后的DataFrame
    """

    # 复制原始DataFrame以防修改原数据
    diff_df = data.copy()

    # 进行指定阶数的差分
    for i in range(diff_order):
        diff_df[column_name] = diff_df[column_name].diff()

    # 删除NaN值
    diff_df = diff_df.dropna()

    return diff_df

column_names = ['Value']
df = pd.DataFrame(data, columns=column_names)
df_diff = difference_and_save(df, 'Value', diff_order=1)
# 可视化不平稳数据
plt.figure(figsize=(15,5 ),dpi=300)
plt.plot(data,color = 'c', label = '原始数据')
plt.plot(df_diff,color = 'r', label='一阶差分')
plt.title('Value')
plt.legend()
plt.xlabel('Time')
plt.ylabel('Value')
plt.show()

上述代码表示的是通过一阶差分后的数据(即每个时间点的值与前一个时间点的值之差),代表的是原始时间序列在差分阶数下的变化趋势。原始数据经过一阶差分后数据达到平稳。

数据差分,也被称为差分运算,是一种对时间序列数据进行处理的方法。它主要是通过对相邻两个数据点进行相减,得到它们之间的差值,并将这些差值作为新的数据点输出。这种处理方式常用于时间序列数据分析,可以将数据的趋势、变化率等信息展现出来,方便进行进一步的分析和预测。差分运算可以分为一阶差分、二阶差分等,其中一阶差分是最常见的。一阶差分就是简单地对相邻两个数据点进行相减,得到它们之间的差值。而二阶差分则是在一阶差分的基础上,再对相邻的两个一阶差分结果进行相减。

差分的数学表达:

一阶差分:\Delta data[t]=data[t]-data[t-1]

二阶差分:\Delta^{2} data[t]=\Delta data[t]-\Delta data[t-1]

n阶差分:\Delta^{n} data[t]=\Delta^{n-1} data[t]-\Delta^{n-1} data[t-1]

其中,\Delta表示差分操作,表示了当前时刻的值与前一个时刻值之差,以及递归应用 n次差分操作。

差分运算的主要目的是消除数据中的季节性因素和趋势性因素,使数据变得平稳。非平稳序列可能会因为存在某种趋势或周期性变化而导致难以进行分析和预测,而差分运算可以将这些趋势或周期性变化转化为平稳的序列,从而更容易进行分析和建模。需要注意的是,差分运算虽然可以消除数据的趋势和季节性因素,但也可能导致数据丢失一些重要的信息。因此,在进行差分运算时需要根据实际情况进行权衡和选择。

3 季节性检验

时序数据的季节性检验是时间序列分析中的一个重要环节,其主要目的是检测数据是否存在季节性因素,即数据是否在特定时间段内呈现出重复的模式或趋势。季节性因素通常是由季节性变化节假日其他定期事件引起的。季节性检验的好处在于它提供了深入了解时间序列中季节性模式的机会,从而进行准确的趋势分析、精准预测和有效的数据分析。通过对季节性因素的检测和理解,我们可以更好地捕捉数据的内在结构,为后续的建模和预测工作提供有力的支持。

3.1 季节性检验相关概念

  • 季节性图:

    作用:通过绘制原始数据的季节性图,可以直观地观察数据在不同时间点的季节性模式。

    过程:将数据按季节(例如每个月或每个季度)进行分组,然后绘制季节性图。如果在特定时间点上存在明显的周期性波动,就可能表明数据存在季节性。

  • 自相关图(ACF):

    作用:自相关图用于检查时间序列中的自相关性,包括季节性自相关。

    过程:绘制自相关图,观察在不同滞后阶数(lag)下的自相关系数。如果在滞后阶数对应于季节性的倍数处存在显著的自相关峰值,可能表示季节性模式。

  • 季节性分解:

    作用:使用时间序列分解方法,如加法模型或乘法模型,将数据分解为趋势、季节性和残差。

    过程:季节性分解后,观察季节性部分是否显示明显的周期性模式。这可以通过查看季节性成分的图表或进行统计测试来实现。

  • 单位根检验:

    作用:用于检验时间序列数据是否具有单位根,即是否是非平稳的。季节性通常导致非平稳性。

    过程:进行单位根检验,如果结果显示数据不是平稳的,那么可能存在季节性。在进行检验时,可以考虑使用季节性差分。

  • 周期性分析(周期图谱):

    作用: 周期图谱用于识别时间序列中的周期性成分,包括季节性。

    过程: 通过计算傅里叶变换,生成频谱图,观察是否存在在频谱中与季节性周期相对应的峰值。

3.2 测量季节强度

计算季节性强度的主要作用是量化季节性在时间序列中的相对强度,以便更深入地了解季节性对总体波动的贡献。在时间序列分解中,趋势(Trend)、季节性(Seasonal)和残差(Residuals)是分解得到的三个主要部分,它们分别代表了不同的时间序列成分:

  • 趋势:趋势成分表示时间序列中的长期趋势或变化方向。趋势反映了数据在较长时间尺度上的整体走势。如果趋势是递增的,表示数据整体上呈上升趋势;如果趋势是递减的,表示数据整体上呈下降趋势。
  • 季节性:季节性成分捕捉了时间序列中重复出现的短期周期性模式。这些模式通常与特定的时间段或季节相关,在案例中,设定了周期为12,因此季节性成分是探讨在每个周期(这里是12个数据点)的模式。
  • 残差:残差是分解后剩余的部分,表示不能被趋势和季节性解释的随机波动或噪声。残差是时间序列中无法通过趋势和季节性模型来捕捉的部分,它反映了数据中未被模型考虑的波动。

季节强度计算过程:

  • STL分解:

    使用STL方法对时间序列进行分解,将其拆分成趋势、季节性和残差三个部分。STL是一种广泛用于时间序列分解的方法,其中 LOESS(局部加权回归)用于拟合趋势和季节性。

  • 方差计算

    计算残差和季节性的方差之和,这是通过将分解得到的残差和季节性部分相加,然后计算其方差得到,这个值代表了季节性和残差整体的波动程度。计算残差的方差,这是通过直接计算分解得到的残差部分的方差得到,这个值代表了残差的波动程度。

  • 季节性强度计算:

    计算季节性强度,季节性强度是通过计算残差的方差占残差和季节性的方差之和的比例,然后用1减去这个比例得到,季节性强度的值在0到1之间,越接近1表示季节性越强。

3.3 代码实例1-数据生成

import numpy as np
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = 'SimHei' # 设置中文显示
plt.rcParams['axes.unicode_minus'] = False

# 设置时间周期和数据点数
period = 12
size = 120

# 设置两个幅度参数
beta1 = 0.3
beta2 = 0.6

# 生成一个包含正弦和余弦值的数组
sin1 = np.asarray([np.sin(2 * np.pi * i / 12) for i in np.arange(1, size + 1)])
cos1 = np.asarray([np.cos(2 * np.pi * i / 12) for i in np.arange(1, size + 1)])

# 生成随机游走数据
xt = np.cumsum(np.random.normal(scale=0.1, size=size))

# 生成包含趋势、正弦和余弦成分以及噪声的时间序列
series_det = xt + beta1 * sin1 + beta2 * cos1 + np.random.normal(scale=0.1, size=size)

3.4 代码实例2-STL分解时间序列观测数据是否具有季节性 

import statsmodels.api as sm

# 进行STL分解
result = sm.tsa.seasonal_decompose(series_det, period=12)

# 可视化分解结果
plt.figure(figsize=(12, 8))

plt.subplot(4, 1, 1)
plt.plot(series_det, label='原始时间序列')
plt.title('原始时间序列')

plt.subplot(4, 1, 2)
plt.plot(result.trend, label='趋势')
plt.title('趋势成分')

plt.subplot(4, 1, 3)
plt.plot(result.seasonal, label='季节性')
plt.title('季节性成分')

plt.subplot(4, 1, 4)
plt.plot(result.resid, label='残差')
plt.title('残差')

plt.tight_layout()
plt.show()

2eea4e9c7f834e7a9b67e5d690ca676c.png

从上图中可以明显看出该时间序列具有强烈的季节性,其中参数period 是用于指定季节性周期的参数,具体来说,季节性是指在时间序列中重复出现的周期性模式,比如每年、每季度或每月都可能存在某种模式,如果时间序列是按每季度观察的,那么 period=4 可能是一个合适的值,因为季节性的周期是每四个时间点重复一次。如果时间序列是按月观察的,那么 period=12 可能更合适,因为季节性的周期是每十二个时间点重复一次。

3.5 代码实例3-计算季节性强度

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

# 计算输入时间序列的季节性强度,即时间序列中季节性成分相对于残差和季节性成分的方差之和的相对强度。
# 季节性强度的值范围从0到1,值越接近1表示季节性越强。
def seasonal_strength(series: pd.Series) -> float:
    """
    计算时间序列的季节性强度。

    参数:
    series (pd.Series): 输入的时间序列数据。

    返回:
    float: 季节性强度的值,范围从0到1,值越接近1表示季节性越强。

    """
    # 对时间序列进行分解
    series_decomp = STL(series, period=12).fit()

    # 计算残差和季节性的方差之和
    resid_seas_var = (series_decomp.resid + series_decomp.seasonal).var()
    
    # 计算残差的方差
    resid_var = series_decomp.resid.var()

    # 计算季节性强度
    result = 1 - (resid_var / resid_seas_var)

    return result

print("时间序列季节性强度:\n",seasonal_strength(series_det))

上述代码的季节性强度为0.9587,季节性强度接近1表示季节性在时间序列中的影响非常强烈,意味着季节性模式在数据中占主导地位,对整体变动有显著的贡献。 

季节性检验的方法有多种,其中一种常用的方法是基于时间序列的残差分析。除了残差分析外,还有其他一些季节性检验方法,如季节性图、傅里叶分析等。这些方法都可以帮助我们检测和理解时间序列数据中的季节性因素。

4. 趋势性检验

时间序列的趋势性可能表现为上升、下降或平稳等不同的形式。时间序列的趋势性检验就是判断时间序列数据是否存在长期趋势或变化。了解时间序列的趋势性对于预测未来走势、制定决策等具有重要意义。时间序列的趋势性分析方法有多种,主要包括以下方法:

趋势性检验的方法有多种,下面介绍几种常用的方法:

  1. 图形分析法:通过绘制时间序列数据的折线图或散点图,观察数据点随时间变化的趋势。如果数据点呈现出明显的上升或下降趋势,则可以初步判断时间序列存在趋势性。
  2. 移动平均法:移动平均方法同样适用于水文时间序列的趋势分析。通过计算滑动窗口内的均值来平滑数据,减少随机波动,突出长期趋势。
  3. 单位根检验:单位根检验是一种统计检验方法,用于判断时间序列是否平稳。如果时间序列存在单位根,即序列是非平稳的,那么它可能存在趋势性。常见的单位根检验方法包括ADF检验和PP检验。
  4. 分解法:在时间序列中,季节性和周期性变化通常也很显著。因此,使用分解方法将时间序列分解为趋势、季节性和残差部分,可以更好地理解长期趋势。STL(Seasonal and Trend decomposition using Loess)分解法是常用的一种方法。
  5. 斜率法:斜率法是通过计算时间序列数据的线性回归斜率来判断趋势性。如果斜率显著不为零,则表明时间序列存在趋势性。这种方法简单直观,但要求数据具有线性关系。典型方法为Sen's斜率法。Sen's斜率法用于计算时间序列中的趋势斜率,它是一种非参数的方法,对异常值和数据分布不敏感。
  6. Cox-Stuart检验:Cox-Stuart检验是一种非参数检验方法,用于判断时间序列是否存在单调趋势。它通过比较时间序列中相邻时期的数据差异来判断趋势性。如果差异显著,则表明时间序列存在趋势性。
  7. Mann-Kendall检验:Mann-Kendall检验是一种非参数的检验方法,用于检测时间序列中是否存在趋势。它基于数据的秩次关系,不需要假设数据分布的具体形式,因此在水文数据的趋势分析中应用广泛。

以上方法可以单独应用,也可以结合使用,以更全面地分析时间序列中的趋势性。选择合适的方法取决于数据的特点、研究目的以及分析者的偏好和经验。这些方法各有优缺点,实际应用中需要根据数据的特性和分析目的选择合适的方法。同时,趋势性检验的结果还需要结合其他统计指标和实际情况进行综合判断。

  • 43
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值