時間序列python

2021-07-16 22:27:59 字數 3556 閱讀 3399

平穩性檢測

平穩性的定義:圍繞乙個常數上下波動且波動範圍有限,即有常數均值和常數方差。如果有明顯的趨勢或者週期性,那它通常不是平穩序列。檢測方法有三種:

(1)時序圖檢測

(2)自相關係數和偏相關係數》通過spss

截尾:就是在某階之後,係數都為0

拖尾:就是有乙個緩慢衰減的趨勢,但是不都為0

2.不平穩的處理方法

差分法:一階差分指的是原序列值相距一期的兩個序列之間的減法運算;k階差分就是相距k期的兩個序列值之間相減。

3.純隨機性檢驗

對於純隨機序列,又稱白雜訊序列,序列的各項數值之間沒有任何相關關係,序列在進行完全無序的隨機波動,可以終止對該序列的分析。白雜訊序列是沒有訊息可提取的平穩序列。

對於平穩非白雜訊序列,它的均值和方差是常數。通常是建立乙個線性模型來你和該序列的發展,藉此提取該序列的有用資訊。arma模型是最常用的平穩序列擬合模型。

二、平穩時間序列建模

某個時間序列經過處理,被盤點為平穩非白雜訊序列,就可以進行時間序列建模

建模步驟:

(1)計算出該序列的自相關係數(acf)和偏相關係數(pacf)

(2)模型識別,也成模型定階。根據係數情況從ar(p)模型,ma(q)模型、arma(p,q)模型、arima(p,d,q)模型中選擇合適模型,其中p為自回歸項,d為差分階數,q為移動平均項數。

(3)估計模型中的未知引數的值並對引數進行檢驗

(4)模型檢驗;

(5)模型優化

(6)模型應用:進行短期**

例子

coding:utf-8

#arima模型

import pandas as pd

#引數初始化

disfile='e:/data.xls'

#讀取資料,指定時間列為指標,pandas自動將「日期」列識別為datetime格式

data=pd.read_excel(disfile,index_col=u'日期')

#時序圖

import matplotlib.pyplot as plt

#用來正常顯示中文標籤

plt.rcparams['font.sans-serif']=[simhei']

#用來正常顯示負號

plt.rcparams['axes.unicode_minus'] = false

data.plot()

plt.show()

#自相關圖

from statsmodels.graphics.tsaplots import plot_acf

plot_acf(data).show()

#平穩性檢測

from statsmodels.tsa.stattools import adfuller as adf

print(u'原始序列的adf檢驗結果為:', adf(data[u'銷量']))

#返回值依次為adf、pvalue、usedlag、nobs、critical values、icbest、regresults、resstore

原始序列的單位根(adf)檢驗

adf cvalue p值

1.81 1% 5% 10%

-3.7112 -2.9812 -2.6301 0.9984

pdf值大於三個水平值,p值顯著大於0.05,該序列為非平穩序列。

#差分後的結果

d_data = data.diff().dropna()

d_data.columns = [u'銷量差分']

#時序圖

d_data.plot()

plt.show()

#自相關圖

plot_acf(d_data).show()

plt.show()

from statsmodels.graphics.tsaplots import plot_pacf

#偏自相關圖

plot_pacf(d_data).show()

#平穩性檢測

print(u'差分序列的adf檢驗結果為:', adf(d_data[u'銷量差分']))

#白雜訊檢驗

from statsmodels.stats.diagnostic import acorr_ljungbox

#返回統計量和p值

print(u'差分序列的白雜訊檢驗結果為:', acorr_ljungbox(d_data, lags=1))

一階差分後序列的白雜訊檢驗

stat p值

11.304 0.007734

p值小於0.05,所以一階差分後的序列為平穩非白雜訊序列。

from statsmodels.tsa.arima_model import arima

#定階#一般階數不超過length/10

pmax = int(len(d_data)/10)

#一般階數不超過length/10

qmax = int(len(d_data)/10)

#bic矩陣

bic_matrix =

for p in range(pmax+1):

tmp =

for q in range(qmax+1):

#存在部分報錯,所以用try來跳過報錯。

try:

except:

#從中可以找出最小值

bic_matrix = pd.dataframe(bic_matrix)

#先用stack展平,然後用idxmin找出最小值位置。

p,q = bic_matrix.stack().idxmin()

print(u'bic最小的p值和q值為:%s、%s' %(p,q))

取bic資訊量達到最小的模型階數,結果p為0,q為1,定階完成。

#建立arima(0, 1, 1)模型

model = arima(data, (p,1,q)).fit()

#給出乙份模型報告

model.summary2()

#作為期5天的**,返回**結果、標準誤差、置信區間。

model.forecast(5)

最終模型**值如下:

2015/2/7

2015/2/8

2015/2/9

2015/2/10

2015/2/11

4874.0

4923.9

4973.9

5023.8

5073.8

利用模型向前**的時間越長,**的誤差將會越大,這是時間**的典型特點。

引數檢驗如下:

coef.

std.err.tp值

const

49.956

20.139

2.4806

0.0182

ma.l1.d.銷量

0.671

0.1648

4.0712

0.0003

從檢驗結果p值來看,建立的模型效果良好。

python時間序列

from datetime import datetime 返回當前時刻的日期和時間 print datetime.now 分別返回當前時刻的年,月,日 print datetime.now year print datetime.now month print datetime.now day 返...

python時間序列2

錨定位置 from pandas.tseries.offsets import day,monthend now datetime.datetime 2011,11,17 錨定偏置量 monthend print now 3 day monthend將now這個日期移至本月末尾 如果日期已經是本月末...

python時間序列分析

什麼是時間序列 時間序列簡單的說就是各時間點上形成的數值串行,時間序列分析就是通過觀察歷史資料 未來的值。在這裡需要強調一點的是,時間序列分析並不是關於時間的回歸,它主要是研究自身的變化規律的 這裡不考慮含外生變數的時間序列 為什麼用python 用兩個字總結 情懷 愛屋及烏,個人比較喜歡pytho...