R語言自學系列(5) — 資料的時間序列性質檢驗
前言
本章開始正是要進入時間序列的環節,這一篇要探討的是時間資料的一些性質,到底一筆資料需要具備那些特性我們才稱它叫做時間序列?基本上,我們認為一筆序列資料最主要的特徵是他具有前後相關性,而其中有些會具有季節性與固定趨勢,舉例來說:
上圖為測試大溪地到達爾文群島海水溫度的相對差異來測量,也就是我們常說的聖嬰現象。資料中我們可以看到很明顯的季節性問題,以及微幅的下降趨勢(雖然說是微幅,實際上對於氣象來說是很嚴重的變化)。
此外,我們將時間序列資料除了這些有可能出現的性質外,根據其資料特性如期望值、自我相關係數等將資料區分為定態與非定態(定態又可分為弱定態與嚴格定態等),以下會一一講解,但在此之前我們先來看如何處理資料集中的時間資料,也就是在R語言中出現的日期格式。
處理時間格式
一般來說,R語言或是Python中對日期都有其特別的格式,舉例來說:
我們可以發現today變數在經過as.Date()轉換前,資料格式為character,在經過轉換以後則變成Date格式,另外我們也可以用as.POSIXct的格式把資料轉變成POSIXct,那這麼做的好處是甚麼呢?簡單來說就是支援各種運算。現行的R語言資料格式以上述兩種而言,前者Date是自帶格式,可以透過一些方式快速去取得如月份、日期、季度等資料,後者的POSIXct則是透過精準的絕對數值來衡量時間,相信大家多少知道2000年的千禧年危機,原因是因為當前電腦的儲存格式是給定一個起始點(現行是1970年1月1日),並以6位數字來儲存時間資料,這是當時設計制度時最不吃記憶體資源的方法之一,但也因為電腦通常有數字計算限制(比方65535的最大記憶體限制),因此到了某個時間後時間格式就會重新計算,因此造成電腦錯亂(以現在的情況下來說,到2038年1月19日又會出現這個問題)
總而言之,得力於時間格式,我們可以支援一些比較神奇的計算方法,具體方式可以看以下代碼:
讀者可以比較一下以上差異,當然最大的差別在於最小計算單位。其他方法中提到的Sys.Date(),其實也可以透過library(lubridate)中的today(), now()去取得資料,使得整個程式碼變得簡潔一些。
為甚麼要取對數?
在比較成長率的時候,我們很常看到分析師將資料取對數來做運算,而非傳統我們直覺上的(Pt - Pt-1)/Pt-1的形式。這個原因是因為,當我們將變數取自然對數以後再做一階差分時,就會得到變數的成長率近似值,差分的原因很簡單,我們想衡量變化率的大小,因此計算 f(x+ Δx) — f(x),非常直觀。
當我們把資料取對數的時候,基本上我們可以得出以下結論:
不想看沒關係,知道結論就行了,當我們把資料取對數的時候,會非常近似於變化率,可以看圖參考一下:
一樣用AAOI的股價來觀察,雖然極端部分有稍微放大的現象,但大致上十分一致,除了金融商品價格,許多總體經濟指標的變化率也會用這樣的方式來處理,比如通貨膨脹的年增長率等。
時間序列的動差與持續性
實際上,時間序列是一組隨機樣本,對於一組隨機樣本,我們可以透過動差的方式來了解均值與變異數,一樣不想看可以跳過無妨,不影響後面內容:
根據這些統計資料,我們進一步定義:
這兩個指標有甚麼意義呢?首先,我們可以檢驗一組資料的持續性(persistent),我們知道,一組時間序列的資料每一筆觀測值,實際上會與過去的資料有相關性,並受到外生衝擊(比方說川普當選)的影響,我們可以根據此建立一些迴歸模型去預測(後面幾篇會提到)。此時我們好奇一個資訊就是,當資料受到某種程度上的衝擊時,這個影響持續的時間有多長(同樣,後期我們會具體衡量這個時間)?
簡單來說,一筆資料的自我相關係數越大,表示序列的前後相關係數非常大,衝擊的影響就會持續得更久,當今天的股價受到法說行情的衝擊影響時,如果自我相關係數很大,比方說0.994,表示下一期的股價也有很大的部分會受到今天的股價影響,我們可以用acf()來看看AAOI的收盤價資料,預設看到滯後三十期的資料:
我們可以很明顯地看到,哪怕落後三十期資料都還有超過0.8的相關係數,這種負衰減且相關係數下降慢的現象能夠很好地幫助我們解釋後面幾章的AR(p)模型,這邊先不贅述,但我們可以合理地去理解資料的前後相關性。
定態時間序列(Stationary Time Series)
一組序列資料是否為定態,會大幅度影響到之後的模型設計,大部分的模型建構前期都有一個相對應的定態假設,為甚麼要有這些前置假設的原因是我們必須確定時間序列是"可預測的(Predictable)",這就好像最著名的投資人謬誤之一,錯把過去的歷史股價變化反應在未來變動上,而我們當然想避免這個謬誤。至於甚麼是定態,我們可以用以下的條件來衡量:
- 均數為常數,也就是一組序列資料的平均值並不會隨著時間改變,這很直觀的解釋了為甚麼我們看到很多時候一組資料可能有劇烈的上漲,但隨著時間變化又會下跌,換言之我們的資料是依據一個基準點在做波動的。
- 變異數為有限值。這也很正常,當我們確立了第一點之後,我們必須給波動的範圍下一個範圍,而我們說這個範圍是其變異數必須有限。
- 其自我共變異數為 k 的函數,與 t 無關,也就是 Cov(xt,xt-k) = f(k)
當這三個條件成立之後,我們就稱資料叫做弱定態或是簡稱定態(stationary),當然還有嚴格定態(strict stationary),其中的差異在於,聯合機率分配會不會隨著時間而改變。比方說(x2, x10)的機率分配與(x7,x16)的機率分配是一致的,實際上這個概念聽上去簡潔,但不好想像,因此在這裡介紹一個非常常見的嚴格定態序列:白雜訊(White Noise)
白雜訊在總體經濟的概念很常出現,簡而言之我們將他理解成世界萬物運轉時可能出現的隨機狀況(實際上不太可能真的隨機,但為了計算方便我們通常這樣假設),其序列{ε_t}的性質如下:
白雜訊通常被認為是隨機干擾項(Disturbance),實際上,在我們學過的線性模型中出現的隨機誤差(Random Error),通常也被假設成白雜訊。
如何檢驗資料定態性?
當然你可以選擇手動代入方程式檢驗,但既然我們有R語言這個統計軟體,我們當然要用程式的方式來解決,首先載入tseries與forecast套件,並輸入adf.test()函數來測試:
產出結果如下:
這個測試叫做增廣DF檢定,用來測試如果將AR模型套入時,是否存在單位跟(unit root),這是另一種檢驗定態的方法,但我們會放在AR模型一起討論,我們可以先看結果,最下面的 ”alternative hypothesis對立假設:平穩” 代表該檢定的測試對象,我們可以看到p-value為0.55,遠大於基準值0.05,不能推翻虛無假設,也就是對立假設並不成立,因此我們認為現在的序列並不是平穩的,而我們的資料長這樣:
很明顯不是定態,那如果對於非定態資料,我們應該怎麼處理?通常這種資料會帶有明顯的趨勢性(我們再後面幾章進一步討論各種趨勢消除的方式),我們在這邊導入astsa包並引入PACF(偏自我相關係數)來討論:
透過acf2()函數我們可以進一步看到PACF(偏自我相關係數)的情況,PACF在後面做ARMA模型時會大量應用,這邊我們先觀察就好,得到了PACF的情況之後,我們使用diff()函數把原始資料進行差分後作圖並重新觀察PACF:
我們可以看到,AAOI的序列資料變得相對平穩,而且PACF的情況趨近於ACF,這個情況我們稱作差分後定態,詳細的數學模型我們會在之後的篇章詳述,而實際上非定態的資料處理也絕不只有差分後定態一種,讀者只要先謹記可以透過差分去處理非定態資料,以及關於上述定態資料的特性與檢定方式即可,我們之後的模型都會先以定態來處理。
總結
說了這麼多,我們不難發現時間序列實質上要經過十分嚴格的事先檢驗,在序列相關性以及趨勢、季節性上面都會有非常多的事前工作要處理。我們之後會針對趨勢性、季節性以及非定態資料分別開闢篇章討論。
下一篇會是關於一些實用的圖表繪製方式,這是許多程式交易與資料分析必不可少的環節,也可以先讓我們短暫逃離數學的魔爪,如果你喜歡我的文章,還請不吝下面按拍手喔!