作者:东哥起飞,来源:Python数据科学
本文开启时间序列系列的相关介绍,从零梳理时序概念、相关技术、和实战案例,欢迎订阅 👉时间序列专栏 跟踪全部内容。
本篇介绍时间序列的平稳性的相关概念。很多传统时序方法比如ARMA、ARIMA都需要时序具备平稳性,那什么是时序的平稳性?为什么需要平稳性,平稳性有什么作用?
时间序列平稳性是指一组时间序列数据看起来平坦,各阶统计特征不随时间的变化而变化。平稳性分为宽平稳和严平稳,我们分别给出定义:
严平稳是一种条件很苛刻的定义,时间序列的所有统计性质(如均值、方差、协方差...N阶矩)都不会随时间推移而发生变化,才能被认为是平稳的。因为随机变量族统计性质完全由联合概率分布族决定,所以严平稳定义为:
为时间序列,对于任意正整数
,任取
和任意整数
,当
时,有
时间序列
与
有相同的联合分布函数, 即
但现实中获取随机序列的联合分布非常难,所以一般不适用严平稳,而使用条件不算苛刻的宽平稳。
宽平稳,也叫弱平稳、二阶平稳,或者协方差平稳。宽平稳时间序列的统计性质主要由低阶矩(二阶矩以内)决定,所以只需保证二阶以内统计特性不随时间变化而变化即可。它的定义如下:
对于时间序列
,如果满足以下三个条件:
无关,即
无关,即
有关,与时间的起始位置
无关,即
则该时间序列是宽平稳的,该随机过程是平稳随机过程。
均值是一阶矩,描述符合某种分布的随机变量的取值,总是在某个值周围波动。 方差是二阶矩,描述了这种波动的大小程度或者离散程度。 自协方差也是二阶矩,是一种特殊的协方差,是时间和时间本身的特殊协方差。普通的协方差是
,自协方差是
,本质是一样的。 协方差描述两个变量之间的变动关系,关于协方差的理解可以参考这篇文章:如何通俗的理解协方差、相关系数?
白噪声是最简单的平稳过程(纯随机过程)记作
,定义如下:
也就是均值为0,方差为
,协方差为0(无自相关性)的序列
用Python代码能生成一个白噪声序列:
import numpy as np
from matplotlib import pyplot as plt
white_noise = np.random.standard_normal(size=500)
plt.figure(figsize=(15, 8))
plt.plot(white_noise)
plt.show()
上图可以看到时序前后没有任何联系(白噪声的自协方差是0,取值是完全随机的),因此对于我们想要通过历史时序数据预测未来是行不通的,不具有分析的价值。只有当序列平稳且非白噪声时,应用分析方法才有意义。
另一种就是非白噪声平稳时间序列,虽然现实中平稳序列不常见,但经过一些处理后也可以变成平稳的非白噪声序列。
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
df=pd.read_excel('data.xlsx',engine='openpyxl')
plt.figure(figsize=(12, 6))
plt.show()
上图来自真实数据,虽然波动不完全相同,但从均值、方差大体来看是平稳的。当然关于时间序列平稳性检测除肉眼观察还有一些量化的方法,会在后续介绍。
现实世界大多数时间序列都是非平稳的,但可以通过差分、取对数等方法转化成平稳时间序列,但如果不能转化也就意味着不能使用平稳时间序列分析方法了。
大部分股票的收盘价数据就是非平稳的,以A股上某一只股票2020-2022年的收盘价数据为例,肉眼看上去走势无明显规律,且不同时段波动很大,基本可以认为是一个非平稳的时间序列。
import pandas as pd
import akshare as ak
from matplotlib import pyplot as plt
df = ak.stock_zh_a_hist(symbol="601800", start_date="20200101", end_date='20221231')
df = df.set_index('日期')
df.index = pd.to_datetime(df.index)
close = df['收盘'].astype(float)
close = close[::-1]
plt.figure(figsize=(12, 6))
plt.plot(close)
plt.show()
非平稳时序中有一种特殊的时序叫随机游走,定义为:
,其中的
是均值为0的白噪声。
通过公式我们能看出,随机游走是时序数据的不断累加形成的,累加的是白噪声,即一阶差分
,而白噪声是纯随机的,因此随机游走和白噪声一样,其未来趋势也是无法预测的。
下面用Python生成的两个随机游走图形感受下。
import numpy as np
from matplotlib import pyplot as plt
np.random.seed(6)
def random_walk():
steps = np.random.standard_normal(size=500)
steps[0] = 0
walk = np.cumsum(steps)
return walk
plt.figure(figsize=(12, 6))
plt.plot(random_walk())
plt.plot(random_walk())
plt.show()
上图两个随机游走曲线都是纯随机生成的,因为固定了seed
所以再执行代码会保持这个图形,但如果把seed
注释掉再执行图形又是一个新的随机曲线了。为了增加对随机游走的理解,下面用一个经典的赌徒输光例子来解释下。
赌徒输光是说如果一个赌徒去赌,大概率会输光,有什么依据吗?假设一个项目的胜率是50%,现在我们将每一次的输赢作为一个随机变量,兜里的钱会随着每次输赢而变化,此时兜里的钱就服从随机游走模型。我们来模拟几种不同的结果,最差的情况是如果运气不好10赌8输,随机游走曲线会很快下降到赌徒底线,兜里的钱全输光;如果此时运气好10赌8赢,随机游走曲线向上,庄家给钱赌徒小赚,此刻及时止盈还是赚的;但赌徒不会止盈还会继续玩下去,出于随机性的输赢结果,曲线迟早会到赌徒底线;如果曲线上升到庄家的上线,庄家给钱关门倒闭,但这种情况几乎不会发生,因为庄家的钱是无限多的,至少比玩家多得多。所以按照50%的胜率下,赌徒是不可能赢钱的,因为随机游走曲线会以更大的概率先到达赌徒的底线。
如前面宽平稳定义,满足三个条件,均值、方差都是常数,自协方差不随时间变化只与时间间隔k有关。如果一个时序是宽平稳的,那么时序本身肯定是存在某种分布规律的,前后具有一定自相关性且能够延续下去,利用这些信息预测未来数据才更可靠。
平稳时序预测相对非平稳预测方法更容易。这就是为什么即使时序是不平稳的,一般也要先通过差分、取对数等方法转化成平稳时间序列再进行分析。
上篇文章 时间序列基本概念、任务、预测方法 提到,时间序列中每个时刻
都可以认为是一个随机变量,它们都有自己的分布。但时间不能倒流,因而每个随机变量
就只有一个观测值。
这样就会造成一个问题,由于每个分布只有一个观测值,数据过少导致无法研究分布的性质。但是通过平稳性,从不同时刻的分布之间发现内在关联,可以缓解由于样本容量少导致的估计精度低的问题。
现在有一组时间序列
5个时序点,每个时点都只有一个观测值,按数理统计分析来讲,此时样本很少是无法进行分析的。
如果现在判断出该时序是满足宽平稳的时间序列,可知该时序均值
是个常数,即每个时点随机变量均值都为
。此时就可以认为这5个观测值都变成了常数
的样本观测值,即
,于是通过以上5个样本观测值可估算出均值
上面的一行观测样本现在转变成以下形式,每个时点的观测值互为补充其他时点的观测值,或者可以理解为
合并为一个均值为
的随机变量了。
这样做就可以极大的减少了随机变量的个数,同时增加了待估变量的样本容量,降低了分析的难度,二阶矩方差和协方差也同理,感兴趣可以参考[1]
参考链接 [1].《应用时间序列分析》-王燕 [2].https://mp.weixin.qq.com/s/ZnQA-wUndDLKfM08Y6ZlEA [3].https://mp.weixin.qq.com/s/-WAnD9ZXEDezy0Adrw11xw [4].https://www.jianshu.com/p/fcddbb571027/