大家好,又见面了,我是你们的朋友全栈君。
按时间顺序排列的一组随机变量X1,X2,…,Xt表示一个随机事件的时间序列。
时间序列分析的目的是给定一个已被观测了的时间序列,预测该序列的未来值。
模型名称 | 描述 |
---|---|
平滑法 | 常用于趋势分析和预测,利用修匀技术,削弱短期随机波动对序列的影响,使序列平滑化。 根据所用平滑技术的不同,可分为移动平均法和指数平滑法。 |
趋势拟合法 | 把时间作为自变量,相应的序列观察值作为因变量,建立回归模型。 根据序列的特征,可分为线性拟合和曲线拟合。 |
组合模型 | 时间序列的变化主要受到长期趋势(T)、季节变动(S)、周期变动(C)和不规则变动()这四个因素的影响。 根据序列的特点,可以构建加法模型和乘法模型。 加法模型:x = T S C 乘法模型:x = TSC |
AR模型 | 以前p期的序列值为自变量,随机变量Xt为因变量建立线性回归模型 |
MA模型 | 随机变量Xt的取值与前各期的序列值无关,建立Xt与前q期的随机扰动()的线性回归模型 |
ARMA模型 | 随机变量Xt的取值,不仅与前p期的序列值有关,还与前q期的随机扰动()有关 |
ARIMA模型 | 许多非平稳序列差分后会显示出平稳序列的性质,称这个非平稳序列为差分平稳序列。 对差分平稳序列可以使用ARIMA模型进行拟合 |
ARCH模型 | 能准确地模拟时间序列变量的波动性变化,适用于序列具有异方差性并且异方差函数短期自相关 |
GARCH模型及其衍生模型 | 称为广义ARCH模型,是ARCH模型的拓展。更能反映实际序列中的长期记忆性、信息的非对称性等性质 |
1、时间序列分析之前,需要进行序列的预处理,包括纯随机性和平稳性检验。根据检验结果可以将序列分为不同的类型,采取不同的分析方法。
纯随机序列 | 又叫白噪声序列,序列的各项之间没有任何相关关系,序列在进行完全无序的随机波动。 白噪声序列是没有信息可提取的平稳序列,可以终止分析。 |
---|---|
平稳非白噪声序列 | 均值和方差是常数。通常建立一个线性模型来拟合该序列的发展,从而提取有用信息。 ARMA模型是最常用的平稳序列拟合模型。 |
非平稳序列 | 均值和方差不稳定。一般将其转变成平稳序列,应用有关平稳时间序列的分析方法,如ARMA模型。 如果时间序列经差分运算后,具有平稳性,称该序列为差分平稳序列,使用ARIMA模型进行分析。 |
(1)纯随机性检验
如果序列是纯随机性检验,则序列值之间应该没有任何关系。实际上纯随机性序列的样本自相关系数不会绝对为零,但是很接近零,并在零附近随机波动。
纯随机性检验,又叫白噪声检验,一般是构造检验统计量来检验。常用的检验统计量有Q统计量、LB统计量,由样本各延迟期数的自相关系数,可以计算出检验统计量,然后计算对应的p值,如果p值大于显著性水平,则表示接受原假设,是纯随机序列,停止分析。
(2)平稳性检验
如果时间序列在某一常数附近波动且波动范围有限,即有常数均值和常数方差,并且延迟k期的序列变量的自协方差和自相关系数是相等的,或者说延迟k期的序列变量之间的影响程度是一样的,则称该时间序列为平稳序列。
两种检验方法:
a. 根据时序图和自相关图的特征做出判断的图检验,该方法操作简单、应用广泛,缺点是带有主观性;
时序图检验:根据平稳时间序列的均值和方差都为常数的性质,平稳序列的时序图显示序列值始终在一个常数附近随机波动,且波动的范围有界。
如果有明显的趋势性或周期性,通常不是平稳序列。
自相关图检验:平稳序列具有短期相关性,所以平稳序列中,只有近期的序列值对现时值得影响比较明显,间隔越远的过去值对现时值的影响越小。
随着延迟期数k的增加,平稳序列的自相关系数会比较快的衰减趋向于零,并在零附近随机波动,而非平稳序列的自相关系数衰减的速度比较慢。
b. 构造检验统计量,目前最常用的方法是单位根检验。
单位根检验是指检验序列中是否存在单位根,因为存在单位根就是非平稳时间序列。
2、平稳时间序列分析
ARMA模型的全称是自回归移动平均模型,可以细分为AR模型、MA模型和ARMA模型三类,都可以看做是多元线性回归模型。
建模步骤:
(1)计算自相关系数(ACF)和偏自相关系数(PACF)
(2)ARMA模型识别,也叫模型定阶,由AR(p)模型、MA(q)模型和ARMA(p,q)的自相关系数和偏自相关系数的性质,选择合适的模型。
模型 | 自相关系数(ACF) | 偏自相关系数(PACF) |
---|---|---|
AR(p) | 拖尾 | p阶截尾 |
MA(q) | q阶截尾 | 拖尾 |
ARMA(p,q) | 拖尾 | 拖尾 |
(3)估计模型中未知参数的值,并进行参数检验
(4)模型检验
(5)模型优化
(6)模型应用:进行短期预测。
3、非平稳时间序列分析
实际上,在自然界中绝大部分序列都是非平稳的。
分析方法分为两类:
(1)确定性因素分解的时序分析
把所有序列的变化都归结为四个因素,长期趋势、季节变动、循环变动和随机变动的综合影响。
缺点是由随机因素导致的波动难以确定和分析,对随机信息浪费严重,会导致模型拟合精度不够理性。
(2)随机时序分析
根据时间序列的不同特点,随机时序分析可以建立的模型有ARIMA模型、残差自回归模型、季节模型、异方差模型等。
ARIMA模型建模步骤:
a. 检查序列的平稳性
b. 对原始序列进行差分,并进行平稳性和白噪声检验
c. 选择ARIMA模型
需要为ARIMA(p、d、q)模型指定参数p、d、q。其中d为差分次数。
或者使用forecast包里面的auto.arima函数实现最优ARIMA模型的自动选取。
模型 | ACF | PACF |
---|---|---|
ARIMA(p,d,0) | 逐渐减小到零 | 在p阶后减小到零 |
ARIMA(0,d,q) | q阶后减小到零 | 逐渐减小到零 |
ARIMA(p,d,q) | 逐渐减小到零 | 逐渐减小到零 |
d. 拟合模型
e. 预测
举例说明ARIMA模型的应用。
R语言实现:
1、读取数据集
2、生成时序对象,检验平稳性
代码语言:javascript复制sales = ts(data) #生成时序对象
plot.ts(sales,xlab="时间",ylab="销量") #作时序图
acf(sales) #作自相关图
library(fUnitRoots)
unitrootTest(sales) #单位根检验
时序图如下,具有单调递增趋势。
自相关图如下,自相关系数长期大于零,说明序列间具有很强的长期相关性。
单位根检验 结果如下,p值显著大于0.05,判断为非平稳序列。(非平稳序列一定不是白噪声序列)
3、对原始序列进行一阶差分,并进行平稳性检验。
代码语言:javascript复制difsales = diff(sales) #一阶差分
plot.ts(difsales,xlab="时间",ylab="销量残差") #作时序图
acf(difsales) #作自相关图
unitrootTest(difsales) #单位根检验
时序图如下,在均值附近比较平稳的波动。
自相关图如下,有很强的短期相关性。
单位根检验 结果如下,p值小于0.05,所以一阶差分后的序列是平稳序列。
4、白噪声检验
代码语言:javascript复制Box.test(difsales,type = "Ljung-Box") #白噪声检验
结果为
p值显著小于0.05,所以一阶差分后的序列是平稳非白噪声序列。
5、拟合ARIMA模型
第一种方法:
代码语言:javascript复制pacf(difsales) #作偏自相关图
偏自相关图如下,
根据表4的选择方法,选定ARIMA(1,1,0)模型。
代码语言:javascript复制fit = arima(sales,order=c(1,1,0)) #ARIMA(1,1,0)模型
第二种方法:
代码语言:javascript复制auto.arima(CWD) #另一个实例
输出结果如下:
6、模型检验
模型确定后,检验其残差是否为白噪声,如果不是白噪声,说明残差中还存在有用的信息,需要修改模型参数,进一步提取。
代码语言:javascript复制fit = arima(CWD,order = c(0,1,1)) #另一个实例
r3 = fit$residuals
Box.test(r3,type = "Ljung-Box")
7、预测
代码语言:javascript复制library(forecast)
forecast(fit,5) #预测接下来5期的序列值
plot(forecast(fit,5)) #作预测图,深色区域分别为80%和95%的置信区间
结果为
8、模型评价
采用三个衡量模型预测精度的统计量指标:平均绝对误差、均方根误差、平均绝对百分误差。这三个指标从不同方面反映了模型的预测精度。
代码语言:javascript复制mae = mean(abs(pre-real)) #平均绝对误差
rmse = mean((pre-real)^2) #均方根误差
mape = mean(abs(pre-real)/real) #平均绝对百分误差
结合实际业务分析,将误差阈值设定在一个值,如1.5,评价模型的预测精度。
Python实现:
代码语言:javascript复制#ARIMA时序模型
import pandas as pd
forecastnum = 5
data = pd.read_excel("arima_data.xls",index_col=u'日期') #pandas自动将“日期”列识别为datetime格式
#时序图
import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
data.plot()
plt.show()
#自相关图
from statsmodels.graphics.tsaplots import plot_acf
plot_acf(data).show()
#ADF单位根检验
from statsmodels.tsa.stattools import adfuller as ADF
print(u'原始序列的ADF检验结果为:',ADF(data[u'销量']))
#返回值依次是adf、pvalue
输出结果为:
可以得出时间序列不平稳,需要进行差分操作。
代码语言:javascript复制D_data = data.diff().dropna() #差分
D_data.columns = [u'销量差分']
D_data.plot() #时序图
plt.show()
plot_acf(D_data).show() #自相关图
from statsmodels.graphics.tsaplots import plot_pacf
plot_pacf(D_data).show() #偏自相关图
print(u'差分序列的ADF检验结果为:',ADF(D_data[u'销量差分']))
输出结果为:
这时差分后的序列符合平稳性。
代码语言:javascript复制#白噪声检验
from statsmodels.stats.diagnostic import acorr_ljungbox
print(u'差分序列的白噪声检验结果为:',acorr_ljungbox(D_data,lags=1)) #返回统计量和p值
输出结果为:
p值小于显著性水平,所以非白噪声。
代码语言:javascript复制from statsmodels.tsa.arima_model import ARIMA
data[u'销量'] = data[u'销量'].astype(float)
#定阶
pmax = int(len(D_data)/10) #一般阶数不超过length/10
qmax = int(len(D_data)/10)
bic_matrix =[] #bic矩阵
for p in range(pmax 1):
tmp = []
for q in range(qmax 1):
try: #存在部分报错
tmp.append(ARIMA(data,(p,1,q)).fit().bic)
except:
tmp.append(None)
bic_matrix.append(tmp)
bic_matrix = pd.DataFrame(bic_matrix)
p,q = bic_matrix.stack().idxmin() #先用stack展平,用idxmin找出最小值位置
print (u'BIC最小的p值和q值为:%s,%s' % (p,q))
model = ARIMA(data,(p,1,q)).fit() #建立ARIMA(0,1,1)模型
model.summary2() #模型报告
model.forecast(5) #预测5天的数据,返回预测结果、标准误差、置信区间
输出结果为:
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/151153.html原文链接:https://javaforall.cn