天天看點

【時間序列】ARIMA模型1.基礎知識2.ARIMA模型3.時間序列模組化

目錄

1.基礎知識

1.1什麼是時間序列

1.2應用場景

1.3相關系數

1.3.1自相關函數ACF

1.3.2偏自相關PACF

1.3.3ACF和PACF的異同

1.3平穩性

1.3.1什麼是平穩性?

1.3.2平穩性分類

1.3.2什麼樣的資料才算平穩?

1.3.3檢驗平穩性

1.3.4如何解決不平穩?

1.5時間序列和回歸的異同點

2.ARIMA模型

2.1自回歸模型-AR

2.2移動平均模型-MA

2.3ARIMA模型

3.時間序列模組化

3.1環境搭建

3.2ARIMA模組化流程

3.3模型參數選擇

3.3.1使用ACF和PACF看圖選擇

3.3.2通過AIC和BIC繪圖選擇

3.3.3通過周遊的方式選擇

3.4模型殘差檢驗

3.5pandas構造時間序列

3.6重采樣

3.7滑動視窗

3.8ARIMA時間序列預測

1.基礎知識

1.1什麼是時間序列

時間間隔不變的情況下收集的不同時間點資料集合,這些集合被分析用來了解長期發展趨勢及為了預測未來。時間序列資料當中重要的模型ARIMA模型

1.2應用場景

有規律可循才能進行預測,時間序列資料必須要有慣性,資料的内部有一定的平穩性

  • 股票資料:根據股票曆史資料的增長情況,預測未來的趨勢;
  • 降雨量:根據目前降雨量預測未來一周或者一個月的降雨情況.

和自身曆史資料相關的資料一般鬥可以同時間序列來處理

1.3相關系數

1.3.1自相關函數ACF

ACF:不同時間序列和目前值的相關性(有序随機變量序列和自身相比較)

公式:

【時間序列】ARIMA模型1.基礎知識2.ARIMA模型3.時間序列模組化

作用:反應的是同一序列在不同時序取值之間的相關性

範圍:[-1,1]

【時間序列】ARIMA模型1.基礎知識2.ARIMA模型3.時間序列模組化

描述:虛線表示置信區間,置信度如果在95%以内,表示這個區間的值可以相信

1.3.2偏自相關PACF

1.3.3ACF和PACF的異同

對于自相關ACF來說,我們的到的并不是x(t)和x(t-k)之間單純的相關關系,同時還受到中間k-1個随機變量x(t-1),x(t-2)...x(t-k+1)的影響,而k-1個随機變量又都和x(t-k)具有相關關系,是以自相關系數中還摻雜了其他的變量對x(t)與x(t-k)的影響;剔除了中間的k-1個随機變量的幹擾之後,x(t-k)與x(t)影響的相關程度.

最大的差別:ACF包含了其他變量的影響,但是PACF是嚴格的兩個變量之間的相關性.;PACF想計算哪個階就計算哪個階而ACF還要把中間的值考慮進去.

1.3平穩性

1.3.1什麼是平穩性?

平穩性:均值和方差沒有發生明顯的變化。

1.3.2平穩性分類

嚴平穩:均值和方差沒有發生明顯的變化(分布不随時間的變化而變化)。

  • eg:未來時刻t的值要依賴于過去的資訊,期望不發生變化。
  • 2019年降雨量的趨勢和2020年降雨量的趨勢是差不多的。

弱平穩:保持均值和相關性系數不發生明顯的變化。嚴平穩太嚴格了,大多數情況下都是弱平穩。

1.3.2什麼樣的資料才算平穩?

序列預處理:拿到時間序列資料之後,首先要對它的平穩性和随機性進行檢驗。根據檢驗的結果可以講序列分成不同的類型,對不同類型的序列我們采用不同的分析方法。

什麼樣的資料才算平穩?:圍繞着一個常數上下不波動且波動的範圍是有限的,有常數均值和常數方差。如果有明顯的趨勢或者周期性,那它通常不是平穩序列

1.3.3檢驗平穩性

方法一:繪制時序圖

【時間序列】ARIMA模型1.基礎知識2.ARIMA模型3.時間序列模組化

方法二:利用自相關系數和偏自相關系數檢驗

  • AC:自相關系數
  • PAC:偏自相關系數
  • Q統計量
  • 伴随機率
【時間序列】ARIMA模型1.基礎知識2.ARIMA模型3.時間序列模組化

平穩的自相關圖不是截尾(某個值之後直接變成0)就是拖尾(趨近于0),這裡的0指的是在置信區間當中.

  • AC拖尾,PAC在p階後截尾,則AR(p)算法;
  • AC在q階後截尾,PAC拖尾,則MA(q)算法;
  • AC和PAC都是拖尾,則是ARIMA(p,d,q)算法

方法三:機關根檢驗

原假設為具有機關根,則非平穩,對于平穩的時間序列就需要在給定的置信水準上顯著,拒絕原假設。p>0.99,拒絕原假設,使用ADF檢驗機關根,如果想要通過其他方式檢驗,我們可以使用arch庫,檢驗序列中是否存在機關根,如果存在機關根就是非平穩時間序列。

1.3.4如何解決不平穩?

差分法:目前值和曆史值做減法。

  • 一階差分:t2-t1,t3-t2。
  • 二階查分:在一階差分的基礎上再做一次差分。
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
x=np.linspace(1,100,40)
y=np.random.randint(20,25,size=40)
y=pd.Series(y)
y1=y.diff(1)
y2=y1.diff(1)
plt.figure(figsize=(16,3))
plt.plot(x,y,label='x,y')
plt.plot(x,y1,label='x,y1')
plt.plot(x,y2,label='x,y2')
plt.legend()
           

1.5時間序列和回歸的異同點

  • 回歸分析假設每個資料點之間獨立,而時間序列則是利用資料之間的相關性進行預測;
  • 回歸分析和自回歸模型看上去有很大的相似性。但是由于缺失了獨立性,利用線性回歸求解的自回歸模型參數會是有偏的。但又由于這個解是一緻的,是以在實際應用中還是利用線性回歸來近似AR模型,忽視或者假設資料的獨立性很可能會造成模型的失效。金融市場的預測模組化尤其需要注意這一點。

2.ARIMA模型

2.1自回歸模型-AR

AR:描述目前值和曆史值之間的關系,用變量自身的曆史時間資料對自身進行預測。

公式:

【時間序列】ARIMA模型1.基礎知識2.ARIMA模型3.時間序列模組化

yt表示目前值,u表示常數項 p表示階數 ri表示自相關系數 

【時間序列】ARIMA模型1.基礎知識2.ARIMA模型3.時間序列模組化

表示誤差

限制

  • 用自身的資料做預測
  • 必須是平穩的
  • 适用于預測與前期相關的現象.
  • 具有自相關性如果自相關系數小于0.5,那麼就不能采用自回歸

2.2移動平均模型-MA

MA:該模型主要關注的是自回歸模型中的誤差項的累加

公式:q階自回歸模型

【時間序列】ARIMA模型1.基礎知識2.ARIMA模型3.時間序列模組化

作用:有效的消除了預測中的随機波動

2.3ARIMA模型

ARIMA是自回歸與移動平均的結合.差分自回歸移動平均模型

公式:

【時間序列】ARIMA模型1.基礎知識2.ARIMA模型3.時間序列模組化

原理

将非平穩的時間序列轉換成平穩的時間序列然後将因變量進對他的滞後值以及随機誤差項的現值和滞後值進行回歸所建立的模型.

【時間序列】ARIMA模型1.基礎知識2.ARIMA模型3.時間序列模組化

,

【時間序列】ARIMA模型1.基礎知識2.ARIMA模型3.時間序列模組化

表示系數;p和q表示觀察到的階數,u表示常數即截距,

【時間序列】ARIMA模型1.基礎知識2.ARIMA模型3.時間序列模組化

表示誤差

3.時間序列模組化

3.1環境搭建

  • 下載下傳statsmodels
  • 切換到存放到該檔案的目錄下,不加載緩存安裝:pip3 --no-cache-dir install  安裝路徑
  • acf和pacf幫助我們進行模型參數的選擇

3.2ARIMA模組化流程

  • 将序列平穩(方差法确定d值)
  • p和q階數确定:ACF和PACF
  • ARIMA(p,d,q)
  • 通過AIC和BIC選擇更加簡單的模型

3.3模型參數選擇

3.3.1使用ACF和PACF看圖選擇

3.3.2通過AIC和BIC繪圖選擇

  • AIC赤池資訊準則:AIC=2k-2ln(L)
  • BIC貝葉斯資訊準則:BIC=kln(n)-2ln(L),引入了樣本的數量對我們的行為準則也有影響
  • k表示模型參數的個數,n表示樣本的數量,L表示似然函數
  • k越小越好,L越大越好

3.3.3通過周遊的方式選擇

from __future__ import absolute_import,division,print_function
import sys
import os
import pandas as pd
import numpy as np
import matplotlib.pylab as plt
import statsmodels.api as sm
import statsmodels.formula.api as snf
import statsmodels.tsa.api as smt
import seaborn as sns

pd.set_option('display.float_format',lambda x:"%.5f"%x)
np.set_printoptions(precision=5,suppress=True)
pd.set_option('display.max_columns',100)
pd.set_option('display.max_rows',100)
sns.set(style='ticks',context='poster')

fig=plt.figure(figsize=(12,8))
ax1=fig.add_subplot(211)
fig=sm.graphics.tsa.plot_acf(sentiment_short,lags=20,ax=ax1)
ax1.xaxis.set_ticks_position('bottom')
fig.tight_layout()
ax2=fig.add_subplot(212)
fig=sm.graphics.tsa.plot_pacf(sentiment_short,lags=20,ax=ax2)
ax2.xaxis.set_ticks_position('bottom')
fig.tight_layout()

import itertools
p_min=0
d_min=0
q_min=0
p_max=4
d_max=0
q_max=4
result_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:
        result_bic.loc['AR{}'.format(p),'MA{}'.format(q)]=np.nan
        continue
    try:
        model=sm.tsa.SARIMAX(train_data,order=(p,d,q))
        results=model.fit()
result_bic=result_bic[result_bic.columns].astype(float)
fig,ax=plt.subplots(figsize=(10,8))
ax=sns.heatmap(
    result_bic,
    mask=result_bic.isnull(),
    ax=ax,
    annot=True,
    fmt='.2f',
)
ax.set_title("BIC")
        result_bic.loc['AR{}'.format(p),'MA{}'.format(q)]=results.bic
    except:
        continue
           

3.4模型殘差檢驗

ARIMA模型的殘差是否是平均值為0且方差為常數的正太分布

檢驗方法:QQ圖(如果是線性,那就是正太分布);畫出來的圖如果符合一條直線,那就符合正太分布,否則不符合

model_results.plot_diagnostics(figsize=(16,12))
           

3.5pandas構造時間序列

時間序列一般有三種方式:

  • 時間戳:具有到某個時間點
  • 時間周期
  • 時間間隔

重要函數:date_range()

建立時間序列

# 這裡可以如果有結束時間,那麼就不可以有時間周期
rng=pd.date_range(
    start='2018/07/01',  # 起始時間
    periods=10,  # 時間周期
    freq='D'  # 以天為疊代周期,疊加天M,Y,H,3D
)

pd.date_range('2010-01-01','2011-01-01',freq='1D1H')

pd.date_range(dt.datetime(2016,1,1),periods=20)
           
time.truncate(before='2016-1-10')  # 擷取2016-1-10之前的時間
time.truncate(after='2016-1-10')  # 擷取2016-1-10之後的時間

pd.Timestamp('2016-07-10 10:15:2')  # 時間戳

pd.Period('2016-01') # 時間區間

pd.Timedelta('1 day')  # 時間偏移量

pd.Period('2016-01-01')+pd.Timedelta('1 day')  # 運算

ts_period=ts.to_period()  # 将時間戳轉換成時間周期

ts_period['2016-07-10 08:30':'2016-07-10 11:45']  # 時間周期的切片包含結尾值

ts['2016-07-10 08:30':'2016-07-10 11:45']  # 時間戳的切片不包含結尾值
           

3.6重采樣

描述:舉個例子,我們現在按月統計了一年當中每周的降雨量,現在我們想要按天統計這一年的降雨量我們稱為升采樣,如果我們想要按月統計這一年的降雨量,這個叫降采樣.

降采樣

統計90天每天的降雨量
rng=pd.date_range('2011/01/01',periods=90,freq='D')
ts=pd.Series(np.random.randn(len(rng)),index=rng)
ts.head()

# 降采樣:每月統計一次,求取每個月的降雨量總和,降采樣
ts.resample('M').sum()
           

升采樣

在進行升采樣的時候,樣本數量增多,就會出現大量的空樣本,這時候我們應該填充,填充的方法有:

  • - ffill:空值取前值,ffill(1):填充的個數
  • - bfill:空值取後值
  • - interpolate('linear'):線性取值

不同頻率統計出來的結果是不一樣的,這樣我們就可以多角度多元度的分析我們的資料

# 每個月的降雨量
rng=pd.date_range('2011/01/01',periods=9,freq='M')
ts=pd.Series(np.random.randn(len(rng)),index=rng)

# 每天的降雨量
ts.resample('D').interpolate('linear')
           

3.7滑動視窗

舉個例子:我現在有2016年1月1日到2020年1月1日的降雨量資料,我們想每10天統計一次,那麼視窗的長度就是10,而得到的結果中前9次的統計值都是空值(NaN)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

df=pd.Series(
    np.random.randn(600),
    index=pd.date_range('2016/7/1',freq='D',periods=600)
)

r=df.rolling(window=10)  # 建立華東2視窗

print(r.mean()) # 滑動視窗的均值

plt.figure(figsize=(15,5))
df.plot(style='r--')
df.rolling(window=10).mean().plot(style='b')  # 對滑動視窗的值做可視化展示
           

3.8ARIMA時間序列預測

操作步驟

  1. 繪制出時間序列資料
  2. 如果該模型是不平穩的,需要我們進行差分,一階或者二階
  3. 繪制ACF和PACF圖選取p和q的值
  4. 模組化ARIMA
  5. 預測:predict('20140607','20161214',dynamic=True,type=levels)

我們還可以同時間序列做分類的任務:tsfresh包提供了提取目前時間序列特征的子產品,分類的目的是什麼情況下時間序列的值是正常的什麼情況下時間序列的值是異常的.

最後說說資料提取:

  • 提取資料的時候我們必須明白屬性代表的含義?屬性之間的關系?哪些屬性會影響我們最終的結果,我們把可能影響我們值的屬性提取出來,然後進行預處理,編碼,數值填充等操作,還可以根據具體的情況進行降維,最後才是模組化和做預測,最後才是模型的評估.

繼續閱讀