时间序列算法——理论学习

619 阅读10分钟

时间序列算法——理论学习

时间序列定义:

时间序列是按照一定的时间间隔排列的一组数据,其时间间隔可以是任意的时间单位,如小时、日、周、月等。比如,每天某产品的用户数量,每个月的销售额,这些数据形成了以一定时间间隔的数据。

通过对这些时间序列的分析,从中发现和揭示现象发展变化的规律,并将这些知识和信息用于预测。如:是否可以通过现有数据预测未来一年的销售额。

对于时间序列的预测,由于很难确定它与其他变量之间的关系,这时我们就不能用回归去预测,而应使用时间序列方法进行预测。采用时间序列方法需要一系列的模型,这种模型称为时间序列模型。

时间序列特征

时间序列的特征主要包括,趋势性、季节性。周期性。随机噪声。通过对这些的研究,发现时间序列的规律,更好的预测未来时刻的序列值。

  1. 趋势:时间序列具有某种趋势,一段时间内一直变少,一段时间内又不断变多。趋势给人的感觉就是带有惯性不能很快发生改变;

  2. 季节:有些时间序列和季节息息相关,如:水果蔬菜在当季会便宜,在反季会比较贵;

  3. 周期:当时间序列的上升和下降不是固定频率时,就会发生一个周期,通常,周期的平均长度比季节性样式的长度长,周期的大小往往比季节样式的大小可变;

  4. 随机噪声:在现实生活中,因为测量手段和方法或者其他原因,导致在统计中的数据都存在一定的随机噪声,随机噪声和时间序列相互叠加,导致呈现出没有规律性的运动。

时间序列分类

根据平稳分类:

1.白噪声序列:随机序列,无预测价值;

2.平稳非白噪声序列:方差,均值都为常数,可以利用AR,MA,ARMA三种模型

3.非平稳序列:需要转化为平稳序列,利用差分法转化为ARIMA序列

根据变量分类:

单变量时间序列:ARMA->GARCH

多变量时间序列:VAR->MGARCH

时间序列分析步骤

第一步:平稳性检验

方法1:画自相关图(这里的数据是一维的)

平稳序列通常具有短期相关性,随着延迟期数的增加,平稳序列的自相关系数就会很快地衰减为0,而非平稳序列地自相关系数的衰减速度会比较慢,这就是利用自相关图判断平稳性的标准。

以下分析三个例子:

纱布产量

image.png image.png

纵轴表示自相关系数,从图中可以看出,自相关系数衰减到零的速度比较缓慢,在很长的延迟期内,自相关系数一直为正,然后为负,呈现三角对称性,这是具有单调趋势的非平稳序列的一种典型的自相关图形式。

奶牛产量

image.png image.png

图中自相关系数长期位于零轴一边,这是具有单调趋势序列的典型特征,同时还呈现出明显的正弦波动规律,这是具有周期变化规律的非平稳序列的典型特征。

北京最高气温

image.png image.png

图中自相关系数一直比较小,可以认为该序列一直在零轴附近波动,这是随机性较强的平稳序列通常具有的自相关图。

import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf

temperature = r'D:\数模代码\qiwen.xlsx'
milk = r'D:\数模代码\niunai.xlsx'
yarn = r'D:\数模代码\sabu.xlsx'

data_tem = pd.read_excel(temperature, parse_dates=True)#parse_dates=True  尝试将格式解析成日期格式,解析不成功也不会出错,只按原格式输出
data_milk = pd.read_excel(milk, parse_dates=True)
data_yarn = pd.read_excel(yarn, parse_dates=True)

plt.rcParams.update({'figure.figsize': (8, 6), 'figure.dpi': 100})  # 设置图片大小
plot_acf(data_tem.Tem)  # 生成自相关图
plot_acf(data_milk.milk_yield)
plot_acf(data_yarn.yarn_yield)
plt.show()

方法2:ADF方法

ADF检验是最常用的单位根检验方法之一,通过检验序列是否存在单位根来判断序列是否平稳。ADF检验是DF检验的增强版。

DF检验:

基于非平稳序列的基本特征将其大致归为三类:

  • 当序列基本走势呈现无规律上升或下降并反复时,将其归为无漂移项自回归过程;
  • 当序列基本走势呈现明显的随时间递增或递减且趋势并不太陡峭时,将其归为带漂移项自回归过程;
  • 当序列基本走势随时间快速递增时,则将其归为带趋势项回归过程。

image.png ADF检验:

为了能适用于高阶自回归过程的平稳性检验,对DF检验进行了修正,引入了更高阶大的滞后项,ADF的检验回归式修正为: image.png image.png ADF检验可以通过python中的statsmodels模块,导入adfuller

返回值的意义是:

  • adf:Test statistic,T检验,假设检验值。
  • pvalue:假设检验结果。
  • usedlag:使用的滞后阶数。
  • nobs:用于ADF回归和计算临界值用到的观测值数目。
  • icbest:如果autolag不是None的话,返回最大的信息准则值。
  • resstore:将结果合并为一个dummy

    如何确定数据是否平稳:

    image.png
  1. 根据1%,5%,10%的值与第一个数值进行比较,如果都同时大于三个值,则说明不能拒绝原假设,非平稳,如果同时小于三个值,说明非常好的拒绝原假设,是平稳的;
  2. 看第二个值,p-value是否非常接近0,接近0,则是平稳的,否则是非平稳的,本例中。为0.84,说明数列为非平稳。

    可以利用y=np.diff(y),对数列y进行一阶差分滞后,本例中可以看到差分后的数列是平稳的。也可以使用对数变换、平滑、时序分解等平稳化方法将序列平稳化。

image.png

import numpy as np
from matplotlib import pyplot as plt
from statsmodels.tsa.stattools import adfuller
#from arch.unitroot import ADF

np.random.seed(123)
y = np.random.standard_normal(size=100)
for i in range(1, len(y)):
    y[i] = 1 + 0.1 * i + y[i]
plt.figure(figsize=(12, 6))
plt.plot(y)
plt.show()  # 以上为生成一个趋势平稳的序列
y=np.diff(y)#进行一阶差分滞后
result=adfuller(y)
print(result)

第二步:白噪声检验

平稳性检验通过后还要做白噪声检验,如果是白噪声,序列是完全随机的,过去的行为对未来的发展没有影响,故而没有必要再深入分析了,非白噪声,则可以使用各种简单又准确的平稳时间序列预测模型进行预测。

image.png 本文介绍两种方法,进行白噪声检验:

自相关图:

由定义知,白噪声完全无自相关性,理想情况下,延迟k阶的样本自相关系数均为0。实际上由于样本序列的有限性,延迟k阶自相关系数并不完全为0,只要在0值附近即认为无自相关性。

Ljung-Box检验:

利用第一步的ADF中的p-value值,当p-value<0.05(一般都用1%, 5%, 10%), 拒绝原假设H0,结果显著,序列相关;当p-value>0.05,接受原假设H0,结果不显著,序列不相关,认为是白噪序列。

第三步:模型识别与估计参数

在平稳时间序列分析中,最关键的过程就是利用数据去识别和建模,一个比较直观的方法,就是通过观察自相关系数(ACF)和偏自相关系数(PACF)可以对拟合模型有一个初步的识别,从理论上说,平稳的AR、MA和ARMA模型的ACF和PACF有如下特性:

模型(序列)AR(p)MA(q)ARMA(p,q)
自相关系数(ACF)拖尾q阶截尾拖尾
偏自相关系数(PACF)p阶截尾拖尾拖尾

拖尾:始终有非零的取值,不会在k大于某个常数后就横等于0(或在0附近随机波动)

截尾:在大于某个常数k后快速区域0为k阶截尾

import pandas as pd
import matplotlib.pyplot as plt
from statsmodels.graphics.tsaplots import plot_acf
from statsmodels.graphics.tsaplots import plot_pacf
temperature = r'D:\数模代码\qiwen.xlsx'
milk = r'D:\数模代码\niunai.xlsx'
yarn = r'D:\数模代码\sabu.xlsx'
data_tem = pd.read_excel(temperature, parse_dates=True)#parse_dates=True  尝试将格式解析成日期格式,解析不成功也不会出错,只按原格式输出
data_milk = pd.read_excel(milk, parse_dates=True)
data_yarn = pd.read_excel(yarn, parse_dates=True)

plt.rcParams.update({'figure.figsize': (8, 6), 'figure.dpi': 100})  # 设置图片大小
plot_acf(data_tem.Tem)  # 生成自相关图
plot_acf(data_milk.milk_yield)
plot_acf(data_yarn.yarn_yield)
plt.show()
plot_pacf(data_tem.Tem,lags=9)  # 生成偏自相关图
plot_pacf(data_milk.milk_yield,lags=9)#lags表示滞后的阶数
plot_pacf(data_yarn.yarn_yield,lags=9)
plt.show()

第四步:模型检验

模型的显著性检验:

  1. 目的:检验模型的有效性

  2. 检验对象:残差序列

  3. 判断原则:
  • 一个好的拟合模型应该能够提取观察序列中几乎所有的样本相关信息,即残差序列应该为白噪声序列;
  • 反之,如果残差序列为非白噪声序列,就意味着残差序列中还残留着相关信息未被提取,这就说明拟合模型不够有效

第五步:模型优化

由于p,q,d的不准确性,对p,q,d进行遍历,选择最好的参数。

这个本人没有查到好的资料,就不做解释了,欢迎朋友们留言指正。

第六步:模型预测

时间序列大致有7种预测模型

  • 朴素估计:使用最后一个时间点的值估计后面一段时间段的值;
  • 简单平均:把历史时刻变量所有值的平均值作为预测值;
  • 滑动窗平均:使用之前一定大小时间段的平均值作为这个时间点的值;或者使用加权的滑动窗平均,加权的权重可以根据时间来设定,比如越是近的时刻权重越大;
  • 简单指数平滑:当前时刻的值由历史时刻的值来确定,但是根据时刻进行了指数衰减;
  • Holt's线性趋势方法:主要考虑趋势;
  • Holt-winters方法:这种思想比较简单,假设数据服从两点,数据是呈递增、递减趋势的;数据服从一个周期变化;
  • Arima方法(p,d,q)

    对于p的解释,含义是当前时间点的值等于过去若干个时间点的值的回归,因为不依赖于别的解释变量,只依赖于自己过去的历史值,故称为自回归,如果依赖过去最近的p个历史值,称阶数为p,记为AR(P)模型;

    对于d的解释,含义是模型对时间序列进行了差分,因为时间序列要求平稳性,不平稳的序列需要差分(一般方法)转化为平稳序列,d表示差分的阶数。一阶差分为,t时刻的值减去t-1时刻的值,得到新的时间序列称为一阶差分序列,以此类推,另外还有一种特殊的差分是季节性差分s,即一些时间序列反应出一定的周期T,让t时刻的值减去t-T时刻的值得到的就是季节性差分序列;

    对于q的解释,表示移动平均模型,含义是当前时间点的值等于过去若干个时间点的预测误差的回归,预测误差=模型预测值-真实值,如果序列依赖过去最近的q个历史预测误差值,称阶数为q,为MA(q)模型。

    后续会继续从一道具体例题,和代码去研究,第一次写,逻辑有点不清楚,下次加油!

引用:时间序列的平稳性检验方法(汇总篇) - 知乎 (zhihu.com) (36条消息) 时间序列的7种预测模型_rosefunR的博客-CSDN博客_时间序列预测模型