时间序列模型

  • 一、获取数据源
  • 二、缺失值处理
  • 三、检验序列的稳定性
  • 四、序列平稳化
  • 五、参数寻优
  • 六、建立模型
  • 七、模型检验
  • 八、模型预测

美股封盘(close)数据
获取数据源—>缺失值处理—>检验数据稳定性—>序列平稳—>参数寻优—>建立模型—>模型检验—>模型预测

一、获取数据源
#以谷歌美股封盘数据来构建时间序列模型|导入库包
from pandas_datareader import data
from statsmodels.graphics.tsaplots import plot_acf, plot_pacf
from statsmodels.tsa.arima_model import ARIMA
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import statsmodels.api as sm
import statsmodels.formula.api as smf
import statsmodels.tsa.api as smt
import seaborn as sns
import warnings
warnings.filterwarnings("ignore")
#设置股票代码与起始时间
stock_code = "GOOG"
start_date = "2005-01-01"
end_date = "2019-12-25"
stock_info = data.get_data_yahoo(stock_code, start_date, end_date)
#展示前5行股票数据
print(stock_info.head())
plt.plot(stock_info['Close'], 'g') #展示数据图
plt.show()

展示数据图

图描述

#获取封盘数据
df = pd.DataFrame(data=stock_info)
data = df.loc[:,['Close']]
data.tail() #查看数据截止日期
二、缺失值处理

没有的话,手动创造一些缺失值

1.先对数据进行降采样

2.然后对数据进行升采样

3.之后使用向前填充、向后填充、线性填充来进行缺失值的处理

在处理数据时也可以用降升采样,在这里我是造一些缺失值

#降采样
data1 = data.resample('2W').mean() #取三天的平均值
data1.head()

#查看数据个数
n_sample = data1.shape[0]
n_sample

392

#升采样
data2 = data1.resample('D').asfreq()
data2.head(6)

#缺失值处理 分别为ffill(取前面的值)、bfill(取后面的值)、interpolate(线性取值)
#这里采取的线性填充
data3 = data2.resample('D').interpolate()
data3.head()

三、检验序列的稳定性

主要是观察数据是否是平稳序列,如果不是则要进行处理转换为平稳序列

data = data['Close'].resample('W-MON').mean() #用的是降采样后的数据
data_train = data['2005':'2017'] #将2005-2017的数据化为测试集#画出测试集数据图
data_train.plot(figsize=(8,4))
plt.legend(bbox_to_anchor=(1.25,0.5))
plt.title('Close')
sns.despine()

#观察法# 移动平均图
def draw_trend(timeseries, size):f = plt.figure(figsize=(8,4),facecolor='white')# 对size个数据进行移动平均rol_mean = timeseries.rolling(window=size).mean()# 对size个数据移动平均的方差rol_std = timeseries.rolling(window=size).std()timeseries.plot(color='blue', label='Original')rol_mean.plot(color='red', label='Rolling Mean')rol_std.plot(color='black', label='Rolling standard deviation')plt.legend(loc='best')plt.title('Rolling Mean & Standard Deviation')plt.show()
draw_trend(data_train,12) #移动平均图


通过上图,我们可以发现数据的移动平均值是不稳定的,呈上升趋势。接下来我们再看单位根检验法。

#单位根检验法
#Dickey-Fuller test:
from statsmodels.tsa.stattools import adfuller
def teststationarity(data_train):dftest = adfuller(data_train)# 对上述函数求得的值进行语义描述dfoutput = pd.Series(dftest[0:4], index=['Test Statistic','p-value','#Lags Used','Number of Observations Used'])for key,value in dftest[4].items():dfoutput['Critical Value (%s)'%key] = valuereturn dfoutput
print(teststationarity(data_train))


p值远大于0.05 序列不稳定

四、序列平稳化
# 差分运算
#除个别离群值,序列趋于平稳
data_diff = data_train.diff()
data_diff = data_diff.dropna() # 差分后需要排空,plt.rcParams['font.sans-serif'] = ['SimHei'] #显示中文字体
plt.rcParams['axes.unicode_minus'] = False   #显示负号plt.figure(figsize=(12,4))#画出差分图
data_diff.plot()
plt.title('一阶差分')
plt.show()


再次检验

teststationarity(data_diff)


p值小于0.05 而且检验值同时小于99%,95%,90%置信区间下的临界的ADF检验的值
序列为平稳

五、参数寻优
#画出差分后acf,pacf图
plt.figure(figsize=(6,2))
acf = plot_acf(data_diff,lags=20)
plt.title('ACF')
acf.show()plt.figure(figsize=(6,2))
pacf = plot_pacf(data_diff,lags=20)
plt.title('PACF')
pacf.show()



由acf图截尾可以得q为1,1阶之后点都在置信区间范围内

由pacf图截尾可以p为5,5阶之后点都在置信区间范围内

六、建立模型
#寻找最优参数pq
#通过导入import itertools来遍历 p属于[0 ,10],q属于[0, 2] d=1
import itertoolsp_min = 0
d_min = 1
q_min = 0
p_max = 5
d_max = 1
q_max = 5# 初始化数据框以存储结果
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.nancontinuetry:model = sm.tsa.SARIMAX(data_train,order=(p, d, q),)results = model.fit()results_bic.loc['AR{}'.format(p), 'MA{}'.format(q)] = results.bicexcept:continue
results_bic = results_bic[results_bic.columns].astype(float)#画出BIC热力图
fig, ax = plt.subplots(figsize=(12, 8))
ax = sns.heatmap(results_bic,mask=results_bic.isnull(),ax=ax,annot=True,fmt='.2f',);
ax.set_title('BIC')

#获取最优参数train_results = sm.tsa.arma_order_select_ic(data_train, ic=['aic', 'bic'], trend='nc', max_ar=5, max_ma=5)print('AIC', train_results.aic_min_order)
print('BIC', train_results.bic_min_order)

七、模型检验

由于ACF.PACF确定的pq值与BIC.AIC检验的结果不一样

1.(5,1,1)

2.(1,1,1)

3.(5,1,4)

#画出残差图,正态分布图,QQ图,相关图的检验图
arima511= sm.tsa.SARIMAX(data_train, order=(5,1,1))
model_results511 = arima511.fit(disp=True)
arima111= sm.tsa.SARIMAX(data_train, order=(1,1,1))
model_results111 = arima111.fit(disp=True)
arima313= sm.tsa.SARIMAX(data_train, order=(5,1,4))
model_results313 = arima313.fit(disp=True)
model_results511.plot_diagnostics(figsize=(12, 8));
model_results111.plot_diagnostics(figsize=(12, 8));
model_results313.plot_diagnostics(figsize=(12, 8));




通过残差图,qq图以及相关图最终确定参数为(5,1,1)

八、模型预测
model = ARIMA(data_train,order=(5,1,4),freq='W-MON') #设置模型
result = model.fit()  #训练模型
pre = result.predict('2017-09','2018-09',dynamic=True,typ='levels')  #带入预测时间区域
plt.figure(figsize=(12,6))
plt.plot(pre)
plt.plot(data_train) #画出预测图


预测为上升趋势 。

数据挖掘之时间序列模型(最全流程分析)相关推荐

  1. spark提交应用的全流程分析

    spark提交应用的全流程分析 @(SPARK)[spark] 本文分析一下spark的应用通过spark-submit后,如何提交到集群中并开始运行. 先介绍一下spark从提交到运行的全流程,下面 ...

  2. 机器学习模型训练全流程

    一.机器学习模型训练全流程 1.获得原始数据集 同时包含X和Y--可以用于监督学习(回归或分类):只包含X--无监督学习. 若Y包含定量值,那么数据集(由X和Y组成)用于回归:若Y包含定性值,那么数据 ...

  3. 干货:机器学习模型训练全流程!

    [提醒:公众号推送规则变了,如果您想及时收到推送,麻烦右下角点个在看,或者把本号置顶] 正文开始 周末在家无聊闲逛github,发现一个很有趣的开源项目,作者用手绘图的方式讲解了机器学习模型构建的全流 ...

  4. 【深度学习】深度学习模型训练全流程!

    Datawhale干货 作者:黄星源.奉现,Datawhale优秀学习者 本文从构建数据验证集.模型训练.模型加载和模型调参四个部分对深度学习中模型训练的全流程进行讲解. 一个成熟合格的深度学习训练流 ...

  5. 加载tf模型 正确率很低_深度学习模型训练全流程!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:黄星源.奉现,Datawhale优秀学习者 本文从构建数据验证集. ...

  6. 9 张手绘图:阐明机器学习模型训练全流程

    Datawhale干货 译者:张峰,安徽工业大学,Datawhale成员 周末在家无聊闲逛github,发现一个很有趣的开源项目,作者用手绘图的方式讲解了机器学习模型构建的全流程,逻辑清晰.生动形象. ...

  7. python训练模型、如何得到模型训练总时长_【绝对干货】机器学习模型训练全流程!...

    周末在家无聊闲逛github,发现一个很有趣的开源项目,作者用手绘图的方式讲解了机器学习模型构建的全流程,逻辑清晰.生动形象.同时,作者也对几张图进行了详细的讲解,学习之后,收获很多,于是将其翻译下来 ...

  8. 深度学习模型训练全流程!

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 作者:黄星源.奉现,Datawhale优秀学习者 本文从构建数据验证集. ...

  9. 最全的机器学习模型训练全流程

    简言 发现一个很有趣的开源项目,作者用手绘图的方式讲解了机器学习模型构建的全流程,逻辑清晰.生动形象.想给大家分享一下. 项目地址:https://github.com/dataprofessor/i ...

最新文章

  1. Ubuntu 10.10 安装配置 Ruby on Rails
  2. python 排名函数_一个危险的Python函数,不推荐使用
  3. buu Windows系统密码
  4. Fuzz学习笔记(一)—— WinAFL环境搭建与基本使用
  5. Suffix Zeroes
  6. 嵌入式 说明书 软件著作权_软件著作权详细解读
  7. 我的HTML总结之常用基础便签
  8. 快速幂(求A^B的最后三位数表示的整数(A^B的含义是A的B次方))(java)
  9. php ajax加载,php – 什么更快? Ajax加载JSON或Ajax加载完整输出
  10. 2017ACM/ICPC广西邀请赛题解
  11. 作为ACMer,在我最懈怠的时候让我看到了这段话
  12. 如何破解无线网密码进行上网
  13. 牛客 打气球的最大分数
  14. distill_bert和tiny_bert
  15. 庄周带你练习数据库语句复习常备之【JavaWeb阶段学习】
  16. ​华为NTP配置命令
  17. MATLAB基本操作及概念
  18. CCNA-基础配置(1)
  19. 磁盘分区删除卷问题-如何删除EFI系统分区
  20. Python己亥杂说2 - 快排

热门文章

  1. Elasticsearch之指定分片、路由查询
  2. iOS-Core-Animation-Advanced-Techniques(五)
  3. C语言编程学习:写的秒速计算四则混合运算项目
  4. word中图片不显示怎么办
  5. JavaScript中递归函数
  6. COMSOL 专题学习
  7. SoviChart数据可视化:条形图(Bar chart)
  8. 【SQL注入】手工注入常用语句合集
  9. matlab快速入门(1):输入命令
  10. 《合成孔径雷达成像——算法与实现》之【1】仿真图2.2