利用python实现平稳时间序列的建模方式


Posted in Python onJune 03, 2020

一、平稳序列建模步骤

假如某个观察值序列通过序列预处理可以判定为平稳非白噪声序列,就可以利用ARMA模型对该序列进行建模。建模的基本步骤如下:

(1)求出该观察值序列的样本自相关系数(ACF)和样本偏自相关系数(PACF)的值。

(2)根据样本自相关系数和偏自相关系数的性质,选择适当的ARMA(p,q)模型进行拟合。

(3)估计模型中位置参数的值。

(4)检验模型的有效性。如果模型不通过检验,转向步骤(2),重新选择模型再拟合。

(5)模型优化。如果拟合模型通过检验,仍然转向不走(2),充分考虑各种情况,建立多个拟合模型,从所有通过检验的拟合模型中选择最优模型。

(6)利用拟合模型,预测序列的将来走势。

二、代码实现

1、绘制时序图,查看数据的大概分布

trainSeting.head()
Out[36]: 
date
2017-10-01 126.4
2017-10-02  82.4
2017-10-03  78.1
2017-10-04  51.1
2017-10-05  90.9
Name: sales, dtype: float64

plt.plot(trainSeting)

利用python实现平稳时间序列的建模方式

2、平稳性检验

'''进行ADF检验
adf_test的返回值
Test statistic:代表检验统计量
p-value:代表p值检验的概率
Lags used:使用的滞后k,autolag=AIC时会自动选择滞后
Number of Observations Used:样本数量
Critical Value(5%) : 显著性水平为5%的临界值。
(1)假设是存在单位根,即不平稳;
(2)显著性水平,1%:严格拒绝原假设;5%:拒绝原假设,10%类推。
(3)看P值和显著性水平a的大小,p值越小,小于显著性水平的话,就拒绝原假设,认为序列是平稳的;大于的话,不能拒绝,认为是不平稳的
(4)看检验统计量和临界值,检验统计量小于临界值的话,就拒绝原假设,认为序列是平稳的;大于的话,不能拒绝,认为是不平稳的
'''
#滚动统计
def rolling_statistics(timeseries):
 #Determing rolling statistics
 rolmean = pd.rolling_mean(timeseries, window=12)
 rolstd = pd.rolling_std(timeseries, window=12)
 
 #Plot rolling statistics:
 orig = plt.plot(timeseries, color='blue',label='Original')
 mean = plt.plot(rolmean, color='red', label='Rolling Mean')
 std = plt.plot(rolstd, color='black', label = 'Rolling Std')
 plt.legend(loc='best')
 plt.title('Rolling Mean & Standard Deviation')
 plt.show(block=False)
 
##ADF检验
from statsmodels.tsa.stattools import adfuller
def adf_test(timeseries):
 rolling_statistics(timeseries)#绘图
 print ('Results of Augment Dickey-Fuller Test:')
 dftest = adfuller(timeseries, autolag='AIC')
 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] = value #增加后面的显著性水平的临界值
 print (dfoutput)
 
adf_test(trainSeting) #从结果中可以看到p值为0.1097>0.1,不能拒绝H0,认为该序列不是平稳序列

返回结果如下

利用python实现平稳时间序列的建模方式

Results of Augment Dickey-Fuller Test:
Test Statistic    -5.718539e+00
p-value      7.028398e-07
#Lags Used      0.000000e+00
Number of Observations Used 6.200000e+01
Critical Value (1%)   -3.540523e+00
Critical Value (5%)   -2.909427e+00
Critical Value (10%)   -2.592314e+00
dtype: float64

通过上面可以看到,p值小于0.05,可以认为该序列为平稳时间序列。

3、白噪声检验

'''acorr_ljungbox(x, lags=None, boxpierce=False)函数检验无自相关
lags为延迟期数,如果为整数,则是包含在内的延迟期数,如果是一个列表或数组,那么所有时滞都包含在列表中最大的时滞中
boxpierce为True时表示除开返回LB统计量还会返回Box和Pierce的Q统计量
返回值:
lbvalue:测试的统计量
pvalue:基于卡方分布的p统计量
bpvalue:((optionsal), float or array) ? test statistic for Box-Pierce test
bppvalue:((optional), float or array) ? p-value based for Box-Pierce test on chi-square distribution
'''
from statsmodels.stats.diagnostic import acorr_ljungbox
def test_stochastic(ts,lag):
 p_value = acorr_ljungbox(ts, lags=lag) #lags可自定义
 return p_value

test_stochastic(trainSeting,[6,12])
Out[62]: (array([13.28395274, 14.89281684]), array([0.03874194, 0.24735042]))

从上面的分析结果中可以看到,延迟6阶的p值为0.03<0.05,因此可以拒绝原假设,认为该序列不是白噪声序列。

4、确定ARMA的阶数

(1)利用自相关图和偏自相关图

####自相关图ACF和偏相关图PACF
import statsmodels.api as sm
def acf_pacf_plot(ts_log_diff):
 sm.graphics.tsa.plot_acf(ts_log_diff,lags=40) #ARIMA,q
 sm.graphics.tsa.plot_pacf(ts_log_diff,lags=40) #ARIMA,p
 
acf_pacf_plot(trainSeting) #查看数据的自相关图和偏自相关图

利用python实现平稳时间序列的建模方式

(2)借助AIC、BIC统计量自动确定

##借助AIC、BIC统计量自动确定
from statsmodels.tsa.arima_model import ARMA
def proper_model(data_ts, maxLag): 
 init_bic = float("inf")
 init_p = 0
 init_q = 0
 init_properModel = None
 for p in np.arange(maxLag):
  for q in np.arange(maxLag):
   model = ARMA(data_ts, order=(p, q))
   try:
    results_ARMA = model.fit(disp=-1, method='css')
   except:
    continue
   bic = results_ARMA.bic
   if bic < init_bic:
    init_p = p
    init_q = q
    init_properModel = results_ARMA
    init_bic = bic
 return init_bic, init_p, init_q, init_properModel
 
proper_model(trainSeting,40)
#在statsmodels包里还有更直接的函数:
import statsmodels.tsa.stattools as st
order = st.arma_order_select_ic(ts_log_diff2,max_ar=5,max_ma=5,ic=['aic', 'bic', 'hqic'])
order.bic_min_order
'''
我们常用的是AIC准则,AIC鼓励数据拟合的优良性但是尽量避免出现过度拟合(Overfitting)的情况。所以优先考虑的模型应是AIC值最小的那一个模型。
为了控制计算量,我们限制AR最大阶不超过5,MA最大阶不超过5。 但是这样带来的坏处是可能为局部最优。
timeseries是待输入的时间序列,是pandas.Series类型,max_ar、max_ma是p、q值的最大备选值。
order.bic_min_order返回以BIC准则确定的阶数,是一个tuple类型

返回值如下:

order.bic_min_order
Out[13]: (1, 0)

5、建模

从上述结果中可以看到,可以选择AR(1)模型

################################模型######################################
# AR模型,q=0
#RSS是残差平方和
# disp为-1代表不输出收敛过程的信息,True代表输出
from statsmodels.tsa.arima_model import ARIMA
model = ARIMA(trainSeting,order=(1,0,0)) #第二个参数代表使用了二阶差分
results_AR = model.fit(disp=-1)
plt.plot(trainSeting)
plt.plot(results_AR.fittedvalues, color='red') #红色线代表预测值
plt.title('RSS:%.4f' % sum((results_AR.fittedvalues-trainSeting)**2))#残差平方和

利用python实现平稳时间序列的建模方式

6、预测未来走势

############################预测未来走势##########################################
# forecast方法会自动进行差分还原,当然仅限于支持的1阶和2阶差分
forecast_n = 12 #预测未来12个天走势
forecast_AR = results_AR.forecast(forecast_n)
forecast_AR = forecast_AR[0]
print (forecast_AR)

print (forecast_ARIMA_log)
[90.49452199 84.05407353 81.92752342 81.22536496 80.99352161 80.91697003

80.89169372 80.88334782 80.88059211 80.87968222 80.87938178 80.87928258]

##将预测的数据和原来的数据绘制在一起,为了实现这一目的,我们需要增加数据索引,使用开源库arrow:
import arrow
def get_date_range(start, limit, level='day',format='YYYY-MM-DD'):
 start = arrow.get(start, format) 
 result=(list(map(lambda dt: dt.format(format) , arrow.Arrow.range(level, start,limit=limit))))
 dateparse2 = lambda dates:pd.datetime.strptime(dates,'%Y-%m-%d')
 return map(dateparse2, result)
 
# 预测从2017-12-03开始,也就是我们训练数据最后一个数据的后一个日期
new_index = get_date_range('2017-12-03', forecast_n)
forecast_ARIMA_log = pd.Series(forecast_AR, copy=True, index=new_index)
print (forecast_ARIMA_log.head())
##绘图如下
plt.plot(trainSeting,label='Original',color='blue')
plt.plot(forecast_ARIMA_log, label='Forcast',color='red')
plt.legend(loc='best')
plt.title('forecast')

利用python实现平稳时间序列的建模方式

以上这篇利用python实现平稳时间序列的建模方式就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
在Gnumeric下使用Python脚本操作表格的教程
Apr 14 Python
举例讲解Linux系统下Python调用系统Shell的方法
Nov 07 Python
深入探究Django中的Session与Cookie
Jul 30 Python
Python二叉树定义与遍历方法实例分析
May 25 Python
解决PyCharm同目录下导入模块会报错的问题
Oct 13 Python
Python考拉兹猜想输出序列代码实践
Jul 05 Python
python基础教程之while循环
Aug 14 Python
pytorch中tensor张量数据类型的转化方式
Dec 31 Python
pytorch对梯度进行可视化进行梯度检查教程
Feb 04 Python
Python读取分割压缩TXT文本文件实例
Feb 14 Python
tensorflow 20:搭网络,导出模型,运行模型的实例
May 26 Python
Keras - GPU ID 和显存占用设定步骤
Jun 22 Python
Python ADF 单位根检验 如何查看结果的实现
Jun 03 #Python
基于Python快速处理PDF表格数据
Jun 03 #Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
Jun 03 #Python
Python3创建Django项目的几种方法(3种)
Jun 03 #Python
Django 实现 Websocket 广播、点对点发送消息的代码
Jun 03 #Python
使用python实现时间序列白噪声检验方式
Jun 03 #Python
部署Django到阿里云服务器教程示例
Jun 03 #Python
You might like
全国FM电台频率大全 - 11 浙江省
2020/03/11 无线电
php中get_headers函数的作用及用法的详细介绍
2013/04/27 PHP
ThinkPHP的L方法使用简介
2014/06/18 PHP
PHP中strncmp()函数比较两个字符串前2个字符是否相等的方法
2016/01/07 PHP
用js遍历 table的脚本
2008/07/23 Javascript
JavaScript 变量命名规则
2009/09/23 Javascript
JS DOM 操作实现代码
2010/08/01 Javascript
jQuery之浮动窗口实现代码(两种方法)
2010/09/08 Javascript
javascript游戏开发之《三国志曹操传》零部件开发(二)人物行走的实现
2013/01/23 Javascript
jQuery实现带有动画效果的回到顶部和底部代码
2015/11/04 Javascript
Angularjs结合Bootstrap制作的一个TODO List
2016/08/18 Javascript
基于百度地图api清除指定覆盖物(Overlay)的方法
2018/01/26 Javascript
js中let和var定义变量的区别
2018/02/08 Javascript
浅谈vue单一组件下动态修改数据时的全部重渲染
2018/03/01 Javascript
jQuery实现获取选中复选框的值实例详解
2018/06/28 jQuery
Node.js Buffer模块功能及常用方法实例分析
2019/01/05 Javascript
VueX模块的具体使用(小白教程)
2020/06/05 Javascript
详解vue中v-model和v-bind绑定数据的异同
2020/08/10 Javascript
用Python实现协同过滤的教程
2015/04/08 Python
值得收藏的10道python 面试题
2019/04/15 Python
Python测试模块doctest使用解析
2019/08/10 Python
Django项目基础配置和基本使用过程解析
2019/11/25 Python
在python中list作函数形参,防止被实参修改的实现方法
2020/06/05 Python
python如何修改文件时间属性
2021/02/05 Python
Viking比利时:购买办公用品
2019/10/30 全球购物
Java多态性的定义以及类型
2014/09/16 面试题
Linux如何压缩可执行文件
2014/03/27 面试题
工作人员思想汇报
2014/01/09 职场文书
列车长先进事迹材料
2014/01/25 职场文书
《伯牙绝弦》教学反思
2014/03/02 职场文书
学校教研活动总结
2014/07/02 职场文书
实习科室评语
2015/01/04 职场文书
自主招生推荐信怎么写
2015/03/26 职场文书
2015年暑期社会实践方案
2015/07/14 职场文书
新郎父亲婚礼致辞
2015/07/27 职场文书
2016党校学习心得体会
2016/01/07 职场文书