利用python進行時間序列分析——從隨機遊走到GARCH模型(一)
來自專欄 Eureka機器學習讀書筆記5 人贊了文章
本文是主體是翻譯Time Series Analysis (TSA) in Python - Linear Models to GARCH。但是文章主要是python操作,而理論較少,因此在此基礎上補充理論,使文章有血更有肉。歡迎在評論區指正。
目錄
- 動機
- 基礎
平穩性
序列相關(自相關) 為什麼要關心自相關
- 白雜訊和隨機遊走
- 趨勢平穩時間序列
- 對數線性模型
- AR(p)
- MA(q)
- ARMA(p, q)
- ARIMA(p, d, q)
- ARCH(p)
- GARCH(p, q)
- 參考文獻
動機
為什麼我們使用這個模型而不是其他模型,這些模型的有什麼缺點?讓我們來了解他們吧!
#import our Python librariesimport osimport sysimport pandas as pdimport pandas_datareader.data as webimport numpy as npimport statsmodels.formula.api as smfimport statsmodels.tsa.api as smt #tsa為Time Series analysis縮寫import statsmodels.api as smimport scipy.stats as scsfrom arch import arch_modelimport matplotlib.pyplot as pltimport matplotlib as mpl%matplotlib inline
#用pandas_datareader包從雅虎抓取一些數據end = 2015-01-01start = 2007-01-01get_px = lambda x: web.DataReader(x, yahoo, start=start, end=end)[Adj Close]symbols = [SPY,TLT,MSFT]# raw adjusted close pricesdata = pd.DataFrame({sym:get_px(sym) for sym in symbols})lrets = np.log(data/data.shift(1)).dropna()#對數收益
基礎
平穩性
嚴平穩:聯合正態分布 和 對於所有的$t$都是同樣的
弱平穩: 的均值和 與 的協方差隨時間不變,只與 有關。
兩者關係:若嚴平穩二階矩存在,則嚴平穩可以得出弱平穩,相反則不成立。但是假如序列 是正態分布的,嚴平穩和弱平穩是等價的。
為什麼我們需要平穩性?
- 平穩的時間序列預測更簡單,因為我們可以假設未來的統計性質和現在是一樣的
- 在時間序列中大多數模型都假設協方差平穩(如上第三個圖),這意味著當描述性統計(均值、方差、相關性)非常依賴於時間序列的平穩性
例如,假如一個時間序列在過去是一直增長的,那麼樣本均值和方差隨著樣本量增加也跟著增長,那麼在未來均值和方差會一直被低估。如果一個序列的均值和方差沒有明確定義,那麼它與其他變數的相關性也同樣如此
但是我們遇到的大多數金融時間序列是不平穩的,因此時間序列分析中有一大部分需要判斷我們要進行預測的序列是否平穩,假如不是,我們需要進行轉化成平穩序列(之後我們會討論)
註:可以使用ADF(Augemented Dickey-Fuller)檢驗,即單位根檢驗,判斷序列是否平穩。一般有三個模型:
- 不含漂移項與時間趨勢項:
- 只含漂移項:
- 兩者都含:
一般先要判斷序列式哪個模型,然後再進行ADF檢驗:
原假設: 備擇假設: 這裡 ,因為對原先模型進行了差分。
序列相關(自相關性)
本質上,當我們擬合時間序列時,我們將序列分解為三部分:長期趨勢、季節性/循環性、隨機性。隨機部分叫做殘差或誤差,它是預測值與觀察值的差。當時間序列的隨機殘差存在自相關時,就序列相關。
為什麼我們需要關心序列相關
我們關心序列相關是因為它對我們模型預測的正確性有重要的影響,序列相關本質上也和平穩性有關。回顧定義,平穩序列的殘差是序列不相關的(應該有條件,見下注)。假如我們模型不能說明這點,模型係數的標準差將被低估,從而擴大T統計量的大小。結果會出現很多type-1錯誤——我們會拒絕原假設,即使它是對的。通俗來說,忽略自相關意味著模型預測將是空談,關於模型里獨立變數的影響,我們可能得出錯誤的結論。(註:我們構建的模型,最後的殘差一定是序列不相關的,因為序列相關的話就是模型沒完全表示,模型就錯了)
註:平穩時間序列殘差序列不相關,那麼平穩序列序列不相關,則 對多所有的 都成立
檢驗序列是否完全不相關,即需要檢驗所有自相關係數是否為0,即判斷是否為白雜訊。
混成檢驗(也稱L-B檢驗)原假設: 備擇假設: 混成檢驗統計量: 漸進服從自由度為的 分布,m一般等於 決策規則: ,拒絕 。即,Q(m)的值大於自由度為m的卡方分布100(1-α)分位點時,我們拒絕 。也可以則當 p-value 小於等於顯著性水平 α時拒絕 。
白雜訊和隨機遊走
白雜訊是我們第一個需要理解的時間序列模型。根據定義,作為白雜訊過程的時間序列具有連續不相關的誤差,並且這些誤差的預期均值等於零。對於連續續不相關的誤差的另一種描述是獨立同分布。這是非常重要,假如我們的時間序列模型合理且成功的抓住了潛在的過程,模型的殘差將是獨立同分布的,就像一個白雜訊過程。因此時間序列分析試圖為時間序列擬合一個模型,使殘差序列與白雜訊難以分辨。
【當一隨機過程獨立同分布且均值、方差是常數則是白雜訊過程。特別是當均值為零,方差為常數時為高斯白雜訊(可以看出白雜訊是弱平穩的)。此為蔡瑞胸書上定義】
讓我們模擬一個白雜訊看一看。
def tsplot(y, lags=None, figsize=(10, 8), style=bmh): if not isinstance(y, pd.Series): #判斷類型 y = pd.Series(y) with plt.style.context(style): fig = plt.figure(figsize=figsize) #mpl.rcParams[font.family] = Ubuntu Mono layout = (3, 2) ts_ax = plt.subplot2grid(layout, (0, 0), colspan=2) acf_ax = plt.subplot2grid(layout, (1, 0)) pacf_ax = plt.subplot2grid(layout, (1, 1)) qq_ax = plt.subplot2grid(layout, (2, 0)) pp_ax = plt.subplot2grid(layout, (2, 1)) y.plot(ax=ts_ax) ts_ax.set_title(Time Series Analysis Plots) smt.graphics.plot_acf(y, lags=lags, ax=acf_ax, alpha=0.5) smt.graphics.plot_pacf(y, lags=lags, ax=pacf_ax, alpha=0.5) sm.qqplot(y, line=s, ax=qq_ax) qq_ax.set_title(QQ Plot) scs.probplot(y, sparams=(y.mean(), y.std()), plot=pp_ax) plt.tight_layout() return
簡單模擬個白雜訊過程
np.random.seed(1)# plot of discrete white noiserandser = np.random.normal(size=1000)tsplot(randser, lags=30)
我們可以看到過程是隨機且在0附近波動。ACF和PACF顯示沒有明顯的序列相關。要記住,由於是正態分布採樣的結果,我們應該在自相關圖中看到大約5%的顯著性。最下面,QQ圖和概率圖是比較數據的概率分布和其他理論的分布。在這裡,理論分布是標準正態分布,因此我們的數據是正態分布,符合高斯白雜訊。
隨機遊走:隨機遊走是時間序列 的模型: , 是離散的白雜訊序列。
隨機遊走是不平穩的,因為協方差是和時間相關的。如果我們建模的時間序列是隨機遊走的,那麼它是不可預測的。
讓我們使用 從標準正態分布採樣模擬一個隨機遊走
# Random Walk without a driftnp.random.seed(1)n_samples = 1000x = w = np.random.normal(size=n_samples)for t in range(n_samples): #應該從1開始,但影響不大,x[-1]也有值 x[t] = x[t-1] + w[t]tsplot(x, lags=30)
明顯看出序列是不平穩的。讓我們看看隨機遊走對我們的模擬數據是否很好的擬合。回憶隨機遊走模型是 。移項可以得到 。因此,隨機遊走的一階差分應該等於白雜訊。我們可以對時間序列使用 函數看它是否成立。
# First difference of simulated Random Walk seriestsplot(np.diff(x), lags=30)
我們的定義成立,確實是白雜訊過程!假如我們用隨機遊走擬合SPY價格的一階差分會如何?
# First difference of SPY pricestsplot(np.diff(data.SPY), lags=30)
哇,非常像白雜訊!但是看QQ圖和概率圖。這個過程很像標準正態分布但是有厚尾。在ACF和PACF圖上有一些重要的序列相關性,在1,5?16?18和21lags。這意味著應該有更好的模型去描述真實的價格變化過程。
趨勢平穩時間序列
可以用直線來刻畫時間序列。基本方程是:
在這個模型中,因變數的值由 係數和自變數時間來決定。讓我們看一個構造的例子,我們假設ABC公司的銷售在初始是$50.00(即 或截距項),每隔時間步長增加$25.00(即 )
# simulate linear trend# example Firm ABC sales are -$50 by default and +$25 at every time stepw = np.random.randn(100)y = np.empty_like(w)b0 = -50.b1 = 25.for t in range(len(w)): y[t] = b0 + b1*t + w[t]tsplot(y, lags=30)
我們可以看到模型的殘差是序列相關的,且隨著方程滯後的增加線性關係逐漸減少。分布接近正態。在使用線性模型做預測時我們應該考慮並去除序列裡面明顯的自相關成分。PACF在滯後1的意義表明AR模型可能是適合的。
對數線性模型
對數線性模型和線性模型很像,不同之處在於數據點形成指數函數,其表示關於每個時間步長的恆定變化率。例如,ABC公司銷售量每隔一段時間增長X%,下面是一個模擬的銷售數據圖。
# Simulate ABC exponential growth# fake datesidx = pd.date_range(2007-01-01, 2012-01-01, freq=M)# fake sales increasing at exponential ratesales = [np.exp( x/12 ) for x in range(1, len(idx)+1)]# create dataframe and plotdf = pd.DataFrame(sales, columns=[Sales], index=idx)with plt.style.context(bmh): df.plot() plt.title(ABC Sales)
我們然後可以用自然對數對銷售量進行轉換。之後線性模型就能很好的擬合數據了。
# ABC log sales with plt.style.context(bmh): pd.Series(np.log(sales), index=idx).plot() plt.title(ABC Log Sales)
正如我們之前提到的,這些模型有個致命的缺點。它假設序列不相關的誤差,正如我們看到的,在線性模型中是不對的。在真實世界中,時間序列通常違背平穩性假設,這使促使我們進入自回歸模型。
推薦閱讀:
※Arima
※利用python進行時間序列分析——從隨機遊走到GARCH模型(三)【完】
※基於GARCH模型的平安銀行股票研究和危機預警——R語言描述
※參考場景:時間序列分析
※寫給你的金融時間序列分析:初級篇