跌跌撞撞搞了半天ARIMA模型,结果是越深入越懵懂,开始以为很难,学完以为很简单,再学特么的一个字“玄“呼

您所在的位置:网站首页 白噪声检验q统计量 跌跌撞撞搞了半天ARIMA模型,结果是越深入越懵懂,开始以为很难,学完以为很简单,再学特么的一个字“玄“呼

跌跌撞撞搞了半天ARIMA模型,结果是越深入越懵懂,开始以为很难,学完以为很简单,再学特么的一个字“玄“呼

2023-06-27 21:29| 来源: 网络整理| 查看: 265

        学习的过程也是敲代码的过程,方向搞错了,搞数据分析,还得是notebook靠谱,我是上手直接在pycharm上撸的,越搞越发现得回头重新检测,重新调参,悔不当初。。。(不过好的一点是可以更加直观,及更加清晰的把思路捋出来)

        学习参考一些书籍,结合网上各种乱七八糟的资料,B站各种七上八下的视频(绝大部分都是转的一个“奶声”博主的视频,但也发现里面很多有错误的地方,讲的不明不白和漏了的地方,博主可能也没完全整明白)。

        ARIMA看似就简单pdq,主要是pq,d是属于比较简单的,pq的选择有很多的方法(AIC、BIC、遍历),选出来最优结果不一定适合你的模型,因为模型建好后还要对其进行评判,包括白噪声检测,残差检验。。。。不合格就得又回去找pq了。

      下面直接上代码,过程还是比较清晰的(有需要的地方基本都有注释,有些阶段是需要反复使用的),欢迎课下交流!!!!

     

import math import pandas as pd import matplotlib.pyplot as plt from statsmodels.tsa import stattools from statsmodels.graphics.tsaplots import * from statsmodels.tsa.stattools import adfuller #平稳性ADF检测函数 from statsmodels.tsa.arima.model import ARIMA import warnings #忽略警告,设置周期的话影响模型 warnings.filterwarnings("ignore", message="A date index has been provided, but it has no associated frequency information and so will be ignored when e.g. forecasting.") # 1.数据读取 df = pd.read_csv('D:\\history_A_000001_k_2010-01-01_2023-06-01_data.csv', index_col='date') # 2.查看数据基本情况 def base(df): print(df.head()) print(df.tail()) print(df.info()) print(df.describe()) print(df.columns) print(df.index) # base(df) df.index = pd.to_datetime(df.index) # 将索引type='object转化为datetime格式dtype='datetime64[ns]' # 3.数据筛选 """" df_part1 = df.loc['2014-01-01':'2015-01-01'] df_part2 = df.loc['2015'] df_part3 = df.loc['2016':] df_part4 = df.loc['2017-09':'2017'] #一年中指定一天以后的数据 """ #4.数据选取 及 观测(pctChg) data=df['pctChg'] data=data.dropna() # 很重要,用了diff的话去除时间序列中的空格 plt.rcParams['font.sans-serif']=['Microsoft YaHei'] # 解决无法显示中文的问题 plt.rcParams['axes.unicode_minus'] = False # 解决负号'-'显示为方块的问题 """ fig,ax = plt.subplots(2, 2, figsize=(10, 10)) # ax[0,0].hist(data, bins=150) # 在ax[0]中添加直方图,bins设置直方图分组数量 # ax[0,0].set_title(u'直方图') ax[0,0].plot(data) # 在ax[1]中绘制折线图 ax[0,0].set_title(u'原始数据图') ax[0,0].axhline(y=0, color='r') # 添加 y=0 的水平参考线 ax[0,0].grid(axis='y') # 在 ax[1] 子图中显示横向网格线 ax[0,1].plot(data.diff(1)) # 在ax[1]中绘制折线图 ax[0,1].set_title(u'1阶差分图') ax[0,1].axhline(y=0, color='r') # 添加 y=0 的水平参考线 ax[0,1].grid(axis='y') # 在 ax[1] 子图中显示横向网格线 ax[1,0].plot(data.diff(170)) # 在ax[1]中绘制折线图 ax[1,0].set_title(u'170阶差分图') ax[1,0].axhline(y=0, color='r') # 添加 y=0 的水平参考线 ax[1,0].grid(axis='y') # 在 ax[1] 子图中显示横向网格线 ax[1,1].plot(data-data.mean()) ax[1,1].plot(data.diff(170)) # 在ax[1]中绘制折线图 ax[1,1].set_title(u'170阶差分图与原始数据图') ax[1,1].axhline(y=0, color='r') # 添加 y=0 的水平参考线 ax[1,1].grid(axis='y') # 在 ax[1] 子图中显示横向网格线 plt.show() """ #5.计算ACF与PACF acfs = stattools.acf(data) pacfs = stattools.pacf(data) # print(acfs[:60]) # print(pacfs[:60]) #6.绘制ACF与PACF图(柱形高度等于各自相关系数值,蓝色区域表示95%置信区间,超过区间表示相关系数显著不为0) fig,ax = plt.subplots(1, 2, figsize=(10, 5)) plot_acf(data,use_vlines=True,title='ACF',lags=160,ax=ax[0]) #参数use_vlines设置为True表示在图上画出垂直线表示滞后时间(lag) plot_pacf(data,use_vlines=True,title='PACF',lags=160,ax=ax[1],method="ywm") #method="ywm"避免超出+-1告警 plt.show() #7.平稳性检测 (acf与pacf如快速衰减到0亦可认为平稳,下面主要应用单根ADF检验进行检测)(非平稳的话在第4步用diff搞平稳,记住差分阶数,后续要用) result = adfuller(data) print('ADF统计量值为:', result[0]) #ADF统计量值0.05,说明模型残差为白噪声,残差已无利用价值 #11.都搞定后则利用模型进行相关预测 yuce1 = best_model.forecast(10) #[0]表示取出预测结果中的第一个部分,也就是预测出来的数值序列 print(yuce1) plt.plot(yuce1) pred = best_model.predict(start='20200506', end='20230525', dynamic=True) #使用predict函数进行预测 plt.plot(data) plt.plot(pred) plt.show() print(pred)

搞完后修改调整了下代码,对近期做了个小预测---"六月匍匐前进"!!!(文章数据采集至2023年6月1日,祝大家伙儿童节快乐)

tips:做差分diff得时候有个小插曲,一般也就一阶二阶就可获得稳定性,但是会丢到原来数据得部分信息,按道理,越高丢的越多,但试了下"高阶(老高了)"发现咋又回光返照,信息再现了,有的说是白噪声,但这也白得太假了吧。(望指教!!!!!!!!!!!)

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3