一、平稳序列建模步骤

假如某个观察值序列通过序列预处理可以判定为平稳非白噪声序列,就可以利用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)

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 statisticsrolmean = 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,认为该序列不是平稳序列

返回结果如下

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,qsm.graphics.tsa.plot_pacf(ts_log_diff,lags=40) #ARIMA,pacf_pacf_plot(trainSeting)   #查看数据的自相关图和偏自相关图

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

##借助AIC、BIC统计量自动确定
from statsmodels.tsa.arima_model import ARMA
def proper_model(data_ts, maxLag): init_bic = float("inf")init_p = 0init_q = 0init_properModel = Nonefor 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:continuebic = results_ARMA.bicif bic < init_bic:init_p = pinit_q = qinit_properModel = results_ARMAinit_bic = bicreturn init_bic, init_p, init_q, init_properModelproper_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))#残差平方和

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实现平稳时间序列的建模相关推荐

  1. python 白噪声检验-利用python实现平稳时间序列的建模方式

    假如某个观察值序列通过序列预处理可以判定为平稳非白噪声序列,就可以利用ARMA模型对该序列进行建模.建模的基本步骤如下: (1)求出该观察值序列的样本自相关系数(ACF)和样本偏自相关系数(PACF) ...

  2. 通过R语言实现平稳时间序列的建模--基础(ARMA模型)

    目录 1. 建模流程 2. 序列平稳性检验和纯随机性检验 2.1 图检验 2.2 单位根检验 3. 模型选择 ​ 4. 参数估计 5. 模型检验 5.1 模型显著性检验 5.2 参数显著性检验 6. ...

  3. 手把手教你用Python处理非平稳时间序列(附代码)

    作者:AISHWARYA SINGH 翻译:陈之炎 校对:丁楠雅 本文约3600字,建议阅读10分钟. 本文将重点介绍时间序列数据的平稳性检验方法. 简介 预测一个家庭未来三个月的用电量,估计特定时期 ...

  4. python时间序列预测不连续怎么办_手把手教你用Python处理非平稳时间序列(附代码)...

    本文约3600字,建议阅读10分钟. 本文将重点介绍时间序列数据的平稳性检验方法. 简介 预测一个家庭未来三个月的用电量,估计特定时期道路上的交通流量,预测一只股票在纽约证券交易所交易的价格--这些问 ...

  5. 手把手教你用Python处理非平稳时间序列

    简介 预测一个家庭未来三个月的用电量,估计特定时期道路上的交通流量,预测一只股票在纽约证券交易所交易的价格--这些问题都有什么共同点? 它们都属于时间序列数据的范畴!如果没有"时间" ...

  6. python处理时间序列非平稳_手把手教你用Python处理非平稳时间序列

    简介 预测一个家庭未来三个月的用电量,估计特定时期道路上的交通流量,预测一只股票在纽约证券交易所交易的价格--这些问题都有什么共同点? 它们都属于时间序列数据的范畴!如果没有"时间" ...

  7. python平稳性检验_Python中非平稳时间序列的处理

    以下应用有什么共同点:预测未来三个月的一个家庭的电力消耗:估计在一定时期内道路的交通量:以及预测一个股票在纽约证券交易所上交易的价格. 以上都涉及时间序列数据的概念!如果没有"时间" ...

  8. python 时间序列预测_使用Python进行动手时间序列预测

    python 时间序列预测 Time series analysis is the endeavor of extracting meaningful summary and statistical ...

  9. 时间序列 预处理 python_【Python算法】时间序列预处理

    [Python算法]时间序列预处理 1.时间序列的预处理 拿到一个观察值序列后,首先要对它的纯随机性和平稳性进行检验,这两个重要的检验被称为序列的预处理.根据检验结果可以将序列分为不同的类型,对不同类 ...

  10. python财务报表预测股票价格_建模股票价格数据并进行预测(统计信号模型):随机信号AR模型+Yule-Walker方程_Python...

    1.背景: 针对股票市场中AR 模型的识别.建立和估计问题,利用AR 模型算法对股票价格进行预测. 2.模型选取: 股票的价格可视为随机信号,将此随机信号建模为:一个白噪声通过LTI系统的输出,通过原 ...

最新文章

  1. AI时代的中层支柱:统计学
  2. Linux-C-Program:makefile
  3. laravel 模版引擎使用
  4. day58-activiti 02-历史数据查询
  5. ML机器学习导论学习笔记
  6. NLP多任务学习:一种层次增长的神经网络结构 | PaperDaily #16
  7. linux之V4L2摄像头应用流程
  8. 工业4.0时代,工业交换机在智能电网建设中有什么作用?
  9. 「软件测试」刚从腾讯面试出来,留下了这些面试笔记
  10. Oracle数据库创建表空间
  11. 因为梦想 书送远方 《数据化运营》免费领取
  12. python自定义函数拟合_python自定义函数拟合
  13. MyBatis条件查询
  14. 运动耳机什么款式好、最适合运动的耳机类型
  15. 网易云音乐黑胶会员免费领取
  16. 制作放射冲击星空粒子海报图片的PS教程
  17. 单词串联记忆 - 故事 - Party上浪漫的事后传
  18. SQL如何判断某一天是当月第几周的问题
  19. Java:面向Web和移动应用的Java开发的增长
  20. Flutter应用架构之BloC模式实践

热门文章

  1. php生成excel带图片格式,php导出excel单元格带图片显示方法
  2. YDOOK:VSC VisioStudio Code 设置 鼠标滚轮缩放字体大小 滚轮控制字体放大缩小
  3. 浏阳市大瑶计算机学校,2021年湖南长沙浏阳市重点小学排名学校一览
  4. 老卫带你学---keras中文文档
  5. 【csdn积分】获得方式大全
  6. USB接口和雷电接口有什么关系?
  7. 教师职称考计算机模块,2015教师职称计算机考试模块.doc
  8. CAD1:1导出图纸的步骤
  9. 【GIS】GIS矢量空间分析(上)
  10. 专利CPC客户端保存文件出现Schema校验失败的解决方法