时间序列算法模型

1、时间序列算法 

1.1、差分自回归移动平均模型(Arima)

1.1.1、概述

        ARIMA是典型的时间序列模型,其由三部分组成:AR模型(自回归模型)和MA模型(滑动平均模型),以及差分的阶数I,因此ARIMA称为差分自回归滑动平均模型。

参考文献:

理论来源 

[python] 时间序列分析之ARIMA_CV前沿-CSDN博客_python 时间序列时间序列建模基本步骤1. 获取被观测系统时间序列数据;2. 对数据绘图,观测是否为平稳时间序列;对于非平稳时间序列要先进行**d阶差分运算**,化为平稳时间序列;3. 经过第二步处理,已经得到平稳时间序列。要对平稳时间序列分别求得其**自相关系数ACF** 和**偏自相关系数PACF** ,通过对自相关图和偏自相关图的分析,得到最佳的**阶层 p **和**阶数 q**4. 由以上得到的$d、q、https://blog.csdn.net/u010414589/article/details/49622625

 代码来源

利用ARIMA模型对时间序列进行分析的经典案例(详细代码)_小白的编码屋-CSDN博客_时间序列模型经典案例因为之前在学数据分析课程的时候老师讲到时间序列这里,但只是简单的对这个经典的时间序列案例介绍了一下,并没有涉及对差分次数d的查找、找ARIMA模型的p、q值和模型检验 这三个步骤。后来我搜寻了整个网络,终于结合各个文章的解释,对代码进行了重新的梳理,下面就是详细的整个代码过程(如果问题,欢迎提出来指正!????):# -*- coding: utf-8 -*-# 用 ARIMA 进行时间序列预测...https://blog.csdn.net/weixin_41013322/article/details/102710236?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522163832816916780271597143%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=163832816916780271597143&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~top_positive~default-1-102710236.first_rank_v2_pc_rank_v29&utm_term=arima&spm=1018.2226.3001.4187

修改后代码如下:

# -*— coding:utf-8 -*-
# @time   :2021/11/30 15:47
# @Author :zhangzhoubin
# -*- coding: utf-8 -*-
# 用 ARIMA 进行时间序列预测
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import statsmodels.api as sm
from statsmodels.tsa.arima_model import ARIMA
from statsmodels.graphics.tsaplots import acf,pacf,plot_acf,plot_pacf
from statsmodels.graphics.api import qqplot

#中文显示
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号

# 1.创建数据
data = [5922, 5308, 5546, 5975, 2704, 1767, 4111, 5542, 4726, 5866, 6183, 3199, 1471, 1325, 6618, 6644, 5337, 7064, 2912, 1456, 4705, 4579, 4990, 4331, 4481, 1813, 1258, 4383, 5451, 5169, 5362, 6259, 3743, 2268, 5397, 5821, 6115, 6631, 6474, 4134, 2728, 5753, 7130, 7860, 6991, 7499, 5301, 2808, 6755, 6658, 7644, 6472, 8680, 6366, 5252, 8223, 8181, 10548, 11823, 14640, 9873, 6613, 14415, 13204, 14982, 9690, 10693, 8276, 4519, 7865, 8137, 10022, 7646, 8749, 5246, 4736, 9705, 7501, 9587, 10078, 9732, 6986, 4385, 8451, 9815, 10894, 10287, 9666, 6072, 5418]

data = pd.Series(data)
data.index = pd.Index(sm.tsa.datetools.dates_from_range('1901','1990'))
print(data)
data.plot(figsize=(12,8))
plt.title('原始数据可视化展示')
plt.ylabel('经济增长量')
plt.xlabel('年份')
#绘制时序的数据图
plt.show()

#2、下面我们先对非平稳时间序列进行时间序列的差分,找出适合的差分次数d的值:
# fig = plt.figure(figsize=(12, 8))
# ax1 = fig.add_subplot(111)
# diff1 = data.diff(1)
# diff1.plot(ax=ax1)
# plt.title('一次差分结果展示')
#这里是做了1阶差分,可以看出时间序列的均值和方差基本平稳,不过还是可以比较一下二阶差分的效果:

#这里进行二阶差分
# fig = plt.figure(figsize=(12, 8))
# ax2 = fig.add_subplot(111)
# diff2 = data.diff(2)
# diff2.plot(ax=ax2)
# plt.title('二次差分的结果展示')
# plt.show()
#由下图可以看出来一阶跟二阶的差分差别不是很大,所以可以把差分次数d设置为1,上面的一阶和二阶程序我们注释掉

#这里我们使用一阶差分的时间序列
#3.接下来我们要找到ARIMA模型中合适的p和q值:
data1 = data.diff(1)
data1.dropna(inplace=True)
#加上这一步,不然后面画出的acf和pacf图会是一条直线
#
#第一步:先检查平稳序列的自相关图和偏自相关图
fig = plt.figure(figsize=(12, 8))
ax1 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(data1,lags=40,ax=ax1)
#lags 表示滞后的阶数
# #第二步:下面分别得到acf 图和pacf 图
ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(data1, lags=40,ax=ax2)
plt.show()

#由上图可知,我们可以分别用ARMA(7,0)模型、ARMA(7,1)模型、ARMA(8,0)模型等来拟合找出最佳模型:
#第三步:找出最佳模型ARMA
arma_mod1 = sm.tsa.ARMA(data1,(7,0)).fit()
print(arma_mod1.aic, arma_mod1.bic, arma_mod1.hqic)
#1580.3025343975862 1602.7002617251756 1589.3304155296435
arma_mod2 = sm.tsa.ARMA(data1,(7,1)).fit()
print(arma_mod2.aic, arma_mod2.bic, arma_mod2.hqic)
#1581.7419537046683 1606.6283174019898 1591.7729327402876
arma_mod3 = sm.tsa.ARMA(data1,(8,0)).fit()
print(arma_mod3.aic, arma_mod3.bic, arma_mod3.hqic)
#1582.027426337836 1606.9137900351575 1592.0584053734553

# #由上面可以看出ARMA(7,0)模型最佳
# #第四步:进行模型检验
# #首先对ARMA(7,0)模型所产生的残差做自相关图
# resid = arma_mod1.resid
# #一定要加上这个变量赋值语句,不然会报错resid is not defined
# fig = plt.figure(figsize=(12, 8))
# ax1 = fig.add_subplot(211)
# fig = sm.graphics.tsa.plot_acf(resid.values.squeeze(),lags=40,ax=ax1)
# ax2 = fig.add_subplot(212)
# fig = sm.graphics.tsa.plot_pacf(resid, lags=40,ax=ax2)
# #
# #接着做德宾-沃森(D-W)检验
# print(sm.stats.durbin_watson(arma_mod1.resid.values))
# # #得出来结果是不存在自相关性的
# #
# # #再观察是否符合正态分布,这里用qq图
# fig = plt.figure(figsize=(12,8))
# ax = fig.add_subplot(111)
# fig = qqplot(resid, line='q',ax=ax, fit=True)
# plt.show()
# #最后用Ljung-Box检验:检验的结果就是看最后一列前十二行的检验概率(一般观察滞后1~12阶),
# #如果检验概率小于给定的显著性水平,比如0.05、0.10等就拒绝原假设,其原假设是相关系数为零。
# #就结果来看,前12阶的P值都是大于0.05,所以在0.05的显著性水平下,不拒绝原假设,即残差为白噪声序列。
# r,q,p = sm.tsa.acf(resid.values.squeeze(),qstat=True)
# data2 = np.c_[range(1,41), r[1:], q, p]
# table= pd.DataFrame(data2, columns=[ 'lag','AC','Q','Prob(>Q)'])
# print(table.set_index('lag'))
# #
# #第五步:平稳模型预测,对未来十年进行预测
# predict_y =arma_mod1.predict('1990', '2000', dynamic=True)
# print(predict_y)   #arima模型采用的推算的方法,利用训练好的模型,提供推算的个数就可以预测出来
#
# fig, ax = plt.subplots(figsize=(12,8))
# ax1 = data1.loc['1901':]
# ax = data1.loc['1901':].plot(ax=ax)
# predict_y.plot(ax=ax)
# plt.show()


#还原到原始序列
ts_restored = pd.Series([data[0]], index=[data.index[0]]) .append(data1).cumsum()   #由于上面差分采用步数为1的差分,依据原始数据的第一个数据进行数据还原,获取历史原始数据

#第六步:使用ARIMA模型进行预测
model = ARIMA(ts_restored,order=(7,1,0)) #导入ARIMA模型
result = model.fit()
predict_y =result.predict('1991', '2000', dynamic=True)
a=pd.concat([data1,predict_y])

#结果数据+预测数据进行还原
res = pd.Series([data[0]], index=[data.index[0]]) .append(a).cumsum()
print(res)  #arima模型采用的推算的方法,利用训练好的模型,提供推算的个数就可以预测出来
plt.plot(res,'b')  #绘制真实值预测值整个曲线
plt.title('真实数据和预测数据可视化(整体绘制)')
plt.show()

#绘制真实值和预测值分段曲线,可视化分析出不同预测值的分布
a=res.loc[:'1990']
b=res.loc['1990':]
plt.plot(a,label="True_valeu",color='b')
plt.plot(b,label="pred_value",color='r',linestyle="--")
plt.title('真实数据和预测数据可视化(分段绘制)')
plt.show()

相关知识补充

1)差分

        差分用于反映离散数据的离散情况的一种量化,是研究离散数据的一种工具,计算逻辑和微分基本一致。

        差分(difference)又名差分函数或差分运算,差分的结果反映了离散量之间的一种变化,是研究离散数学的一种工具。它将原函数f(x) 映射到f(x+a)-f(x+b) 。差分运算,相应于微分运算,是微积分中重要的一个概念。总而言之,差分对应离散,微分对应连续。差分又分为前向差分、向后差分及中心差分三种。

        读者熟悉等差数列:a1 a2 a3……an……,其中an+1= an + d( n = 1,2,…n )d为常数,称为公差, 即 d = an+1 -an , 这就是一个差分, 通常用D(an) = an+1- an来表示,于是有D(an)= d , 这是一个最简单形式的差分方程。

        定义. 设变量y依赖于自变量t ,当t变到t + 1时,因变量y = y(t)的改变量Dy(t)= y(t+1) - y(t)称为函数y(t)在点t处步长为1的(一阶)差分,记作Dy1= yt+1- yt,简称为函数y(t)的(一阶)差分,并称D为差分算子。 

差分具有类似于微分的运算性质。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值