首页 > 编程语言 >【python】时间序列模型(ARIMA)

【python】时间序列模型(ARIMA)

时间:2024-08-25 17:53:48浏览次数:9  
标签:plt float64 python ChinaBank ARIMA np fig 序列 ax

文章目录


前言

接上一篇博客,用python完成代码编写。

一、示例

  • 已知一个上市公司一段时期的开盘价,最高价,最低价,收盘价等信息,要求建立模型,预测股价。
  • 这里只需要股票的收盘价(close),我们可以把数据提取出来,并划分为训练集和测试集
  • 本题我们把1-3月份的数据作为训练集,4-6月份的数据作为测试集

二、代码实现----python

全部数据的平稳性检验

# 差分法
import pandas as pd
import matplotlib.pyplot as plt

# 导入数据
ChinaBank = pd.read_csv('ChinaBank.csv',index_col = 'Date',parse_dates=['Date'])
#.diff(1)做一个时间间隔
ChinaBank['diff_1'] = ChinaBank['Close'].diff(1) #1阶差分

#对一阶差分数据在划分时间间隔
ChinaBank['diff_2'] = ChinaBank['diff_1'].diff(1) #2阶差分

fig = plt.figure(figsize=(12,10))
#原数据
ax1 = fig.add_subplot(311)
ax1.plot(ChinaBank['Close'])
#1阶差分
ax2 = fig.add_subplot(312)
ax2.plot(ChinaBank['diff_1'])
#2阶差分
ax3 = fig.add_subplot(313)
ax3.plot(ChinaBank['diff_2'])
plt.show()

运行结果:

在这里插入图片描述

结果分析:

可以看出,一阶差分和二阶差分后,平稳性变好。

ADF检验

import matplotlib.pyplot as plt
import pandas as pd
import statsmodels.api as sm
from statsmodels.tsa.seasonal import seasonal_decompose
from statsmodels.tsa.stattools import adfuller as ADF

# 计算原始序列、一阶差分序列、二阶差分序列的单位根检验结果
ChinaBank['diff_1'] = ChinaBank['diff_1'].fillna(0)
ChinaBank['diff_2'] = ChinaBank['diff_2'].fillna(0)

timeseries_adf = ADF(ChinaBank['Close'].tolist())
timeseries_diff1_adf = ADF(ChinaBank['diff_1'].tolist())
timeseries_diff2_adf = ADF(ChinaBank['diff_2'].tolist())


# 打印单位根检验结果
print('timeseries_adf : ', timeseries_adf)
print('timeseries_diff1_adf : ', timeseries_diff1_adf)
print('timeseries_diff2_adf : ', timeseries_diff2_adf)

运行结果:

timeseries_adf :  (np.float64(0.5279198084831831), np.float64(0.9856974415734416), 9, 335, {'1%': np.float64(-3.4500219858626227), '5%': np.float64(-2.870206553997666), '10%': np.float64(-2.571387268879483)}, np.float64(-734.0738716811488))
timeseries_diff1_adf :  (np.float64(-6.17718554497899), np.float64(6.587109239761689e-08), 8, 336, {'1%': np.float64(-3.449962981927952), '5%': np.float64(-2.870180642420163), '10%': np.float64(-2.5713734527352607)}, np.float64(-735.8436797171294))
timeseries_diff2_adf :  (np.float64(-9.202545123160359), np.float64(1.9841232339614826e-15), 13, 331, {'1%': np.float64(-3.4502615951739393), '5%': np.float64(-2.8703117734117742), '10%': np.float64(-2.5714433728242714)}, np.float64(-717.2833732193096))

结果分析:

A D F ADF ADF检验的结果共有五个参数:

  • 第一个值:表示 Test Statistic,即 T 检验,表示 T 统计量,假设检验值
  • 第二个值:p-value,即 p 值,表示 T 统计量对应的概率值
  • 第三/四个值:Lags Used,即表示延迟和测试的次数
  • 第五个参数{‘1%’: xxx, ‘5%’: xxx, ‘10%’: xxx}:不同程度拒绝原假设的统计值

如何确定该序列是否平稳呢?

  • 1%、5%、10%不同程度拒绝原假设的统计值和 ADF 假设检验值比较,ADF 假设检验值同时小于1%、5%、10%即说明非常好地拒绝该假设
  • P-value 是否非常接近 0

图检验法

  1. 原始数据
fig = plt.figure(figsize=(12,7))

ax1 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(ChinaBank['Close'], lags=20,ax=ax1)
ax1.xaxis.set_ticks_position('bottom') # 设置坐标轴上的数字显示的位置,top:显示在顶部  bottom:显示在底部

ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(ChinaBank['Close'], lags=20, ax=ax2)
ax2.xaxis.set_ticks_position('bottom')

plt.show()

运行结果:

在这里插入图片描述
结果分析:

ACF中,大部分的值没有落在置信区间内,所以不具有平稳性。

  1. 一次差分
fig = plt.figure(figsize=(12,7))

ax3 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(ChinaBank['diff_1'], lags=20, ax=ax3)
ax3.xaxis.set_ticks_position('bottom')

ax4 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(ChinaBank['diff_1'], lags=20, ax=ax4)
ax4.xaxis.set_ticks_position('bottom')

运行结果:

在这里插入图片描述

结果分析:

由图形可以看出,大部分的值都落在了置信区间内。

划分训练集

# 提取Close列
ChinaBank.index = pd.to_datetime(ChinaBank.index)
sub = ChinaBank.loc['2014-01':'2014-06','Close']

sub.head()

# 划分训练测试集
train = sub.loc['2014-01':'2014-03']
test = sub.loc['2014-04':'2014-06']

平稳性检验

ADF检验

# ADF检验

from statsmodels.tsa.stattools import adfuller as ADF

timeseries_adf = ADF(train.tolist())

# 打印单位根检验结果
print('timeseries_adf : ', timeseries_adf)

运行结果:

timeseries_adf :  (np.float64(-2.902677813259885), np.float64(0.04503748919120268), 0, 61, {'1%': np.float64(-3.542412746661615), '5%': np.float64(-2.910236235808284), '10%': np.float64(-2.5927445767266866)}, np.float64(-227.51423828600673))

图检验法

import statsmodels.api as sm

# 绘制
fig = plt.figure(figsize=(12,7))

ax1 = fig.add_subplot(211)
fig = sm.graphics.tsa.plot_acf(train, lags=20,ax=ax1)
ax1.xaxis.set_ticks_position('bottom') # 设置坐标轴上的数字显示的位置,top:显示在顶部  bottom:显示在底部

ax2 = fig.add_subplot(212)
fig = sm.graphics.tsa.plot_pacf(train, lags=20, ax=ax2)
ax2.xaxis.set_ticks_position('bottom')

plt.show()

运行结果:

在这里插入图片描述

确定 p,q

1. 相关函数法

由训练集的 ACF 和 PACF 图可以看出,ACF拖尾、PACF截尾,所以是AR(1)。

2. AIC、BIC准则

以 BIC 准则为例,确定 p,q 的取值范围为 [0,5],通过循环网格搜索所有组合的 BIC 的值

#遍历,寻找适宜的参数
import itertools
import numpy as np
import seaborn as sns

#确定pq的取值范围
p_min = 0
d_min = 0
q_min = 0
p_max = 5
d_max = 0
q_max = 5

#Initialize a DataFrame to store the results,,以BIC准则
results_bic = pd.DataFrame(index=['AR{}'.format(i) for i in range(p_min,p_max+1)],
                           columns=['MA{}'.format(i) for i in range(q_min,q_max+1)])

for p,d,q in itertools.product(range(p_min,p_max+1),
                               range(d_min,d_max+1),
                               range(q_min,q_max+1)):
    if p==0 and d==0 and q==0:
        results_bic.loc['AR{}'.format(p), 'MA{}'.format(q)] = np.nan
        continue
    try:
        model = sm.tsa.ARIMA(train, order=(p, d, q))
        results = model.fit()
        results_bic.loc['AR{}'.format(p), 'MA{}'.format(q)] = results.bic
    except:
        continue

results_bic

运行结果:

在这里插入图片描述

绘制热力图:

#得到结果后进行浮点型转换
results_bic = results_bic[results_bic.columns].astype(float)

#绘制热力图
fig, ax = plt.subplots(figsize=(10, 8))
ax = sns.heatmap(results_bic,
                 mask=results_bic.isnull(),
                 ax=ax,
                 annot=True,
                 fmt='.2f',
                 cmap="Purples"
                 )

ax.set_title('BIC')
plt.show()

results_bic.stack().idxmin()

运行结果:

在这里插入图片描述
在这里插入图片描述

结果分析和模型检验

残差序列的随机性可以通过自相关函数法来检验,即做残差的自相关函数图

# 模型检验

#根据以上求得
p = 1
d = 0
q = 0

model = sm.tsa.ARIMA(train, order=(p,d,q))
results = model.fit()
resid = results.resid #获取残差

#绘制
#查看测试集的时间序列与数据(只包含测试集)
fig, ax = plt.subplots(figsize=(12, 5))

ax = sm.graphics.tsa.plot_acf(resid, lags=40,ax=ax)

plt.show()

运行结果:
在这里插入图片描述
结果分析:从 ACF 图中可以看出残差之间独立性比较高。

模型预测

# 模型预测
predict_sunspots = results.predict(dynamic=False)
print(predict_sunspots)

#查看测试集的时间序列与数据(只包含测试集)
plt.figure(figsize=(12,6))
plt.plot(train)
plt.xticks(rotation=45) #旋转45度
plt.plot(predict_sunspots)
plt.show()

#绘图
fig, ax = plt.subplots(figsize=(12, 6))
ax = sub.plot(ax=ax)
#预测数据
predict_sunspots.plot(ax=ax)
plt.show()

运行结果:

在这里插入图片描述
在这里插入图片描述
结果分析:

该模型拟合效果较好,并向后预测了三个月的股票价格波动。

标签:plt,float64,python,ChinaBank,ARIMA,np,fig,序列,ax
From: https://blog.csdn.net/m0_65032457/article/details/141532051

相关文章

  • sql server导入mysql,使用python多线程
    概述在上一篇文章中,链接:https://www.cnblogs.com/xiao987334176/p/18377915使用工具SQLyog进行导入,传输过程是单进程的,一个表一个表的传,一条条数据插入,所以传输速度会比较慢。如果sqlservermdf文件在200m左右,传输需要花费30分钟左右。如果来了一个10GB左右的mdf的文件,需要25......
  • 计算机毕业设计推荐- 基于Python的高校岗位招聘数据分析平台
    ......
  • 面试官问什么?Python基础与进阶?介绍Django框架?MySQL数据库索引?
    Catalog自我介绍Python001.Python支持哪些数据类型?01.数字类型02.序列类型03.映射类型04.集合类型05.其他类型06.特点总结002.什么是模块(module),如何导入一个模块?01.导入模块02.`import`和`from...import...`的区别003.高频发问题004.数据去重005.Python中......
  • 基于python+flask框架的社区团购平台(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网技术的飞速发展和智能设备的普及,电子商务已渗透到人们生活的方方面面,社区团购作为一种新兴的电商模式,近年来迅速崛起并受到广泛......
  • 基于python+flask框架的基于推荐系统的电影网站系统小程序前端(开题+程序+论文) 计算机
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在数字化时代,互联网已成为人们获取信息和娱乐的主要途径之一,电影作为大众喜爱的文化消费形式,其在线观看和推荐需求日益增长。随着电影产业......
  • 基于python+flask框架的基于WEB的咖啡销售系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景在快节奏的现代生活中,咖啡已成为许多人日常生活中不可或缺的饮品,不仅因为其独特的口感和提神醒脑的功效,更因其承载了社交、休闲等多种文化......
  • 基于python+flask框架的网上电影购票系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景随着互联网技术的迅猛发展和智能设备的普及,线上娱乐消费已成为人们日常生活的重要组成部分。电影作为深受大众喜爱的文化娱乐形式之一,其购......
  • 3-python之字符串
    字符串基本特点1:字符串的本质是:字符序列。2:Python不支持单字符类型,单字符也是作为一个字符串使用的。        引号创建字符串                我们可以通过单引号或双引号创建字符串a='love'print(a)#结果是:love           ......
  • 4:python之序列 (列表篇)
    序列        列表简介                1:列表:用于存储任意数目、任意类型的数据集合。        2:列表是内置可变序列,是包含多个元素的有序连续的内存空间列表的标准语法格式:a=[1,2,3,'qwe','你好']方法要点描述a.append(x)增加元......
  • 基于python+flask框架的力悦月子会所管理系统(开题+程序+论文) 计算机毕设
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容研究背景近年来,随着人们生活水平的提高和健康意识的增强,母婴健康服务行业迎来了前所未有的发展机遇。力悦月子会所作为高端母婴护理服务的代表,其服......