--- title: 【時間序列分析】Ch1:時間序列 101 image: https://i.imgur.com/OdcowMB.jpeg --- # 【時間序列分析】Ch1:時間序列 101 在傳統的統計分析中,我們常關注兩筆資料間的因果或相關關係,通常這樣的研究發生在某個特定時間點,我們將之稱為「橫斷面研究」。但是,若今天我們想要知道未來的某項指標,那勢必得使用到現在之前的某些資料來去「預測未來」該指標的數值,這就是「**時間序列分析**」也就是所謂「縱貫面研究」。 # 1.1 什麼是時間序列資料 在時間序列的資料中,我們認為資料是由某種資料生成過程 (Data Generating Process, DGP) 隨著時間動態地產生,若能夠透過過往歷史資料成功估計此 DGP,那我們即可透過此資訊調整現在的行為模式,不論是自身的投資策略、公司的經營策略或甚至是政府的總經政策皆是如此。 <img style="display: block; margin: auto;" src="https://hackmd.io/_uploads/BylwgI5QC.png" width="50%"> <p style="text-align: center;"> Google 搜尋上的台積電股價走勢圖 </p> 時間序列分析本就不是一門簡單的學問,希望透過這系列文章不僅能讓自己對這項技術更加熟稔,也能幫助到需要的人。本系列目標旨在科普時間序列的相關理論,並且輔以`R`語言程式碼的實踐,只要有基本的機率統計與數理觀念即可,若對基本統計概念及`R`語言不熟悉,可以參閱筆者先前於台大財金系擔任助教時為統計學課程所製作之相關[筆記與影片](https://oceanic-phosphorus-8b7.notion.site/111-1-7a1c9cae73d84d41a71a5c973d126309)。 # 1.2 時間序列資料的基本概念 簡而言之,時間序列資料就是紀錄某個數值或指標在不同時間點的值,可以是小朋友的身高紀錄、美國每季度的 GDP,也可以是股票的日內交易資料。 ## 1.2.1 時間序列資料的分類 由於技術限制,在實務上我們無法隨時隨地收取資料,不過隨著科技的進步,搜集資料的頻率也越來越即時 (如股票逐筆交易資料),也讓資料的樣子越來越接近理論上的連續時間資料。正如前述,時間序列資料可以依照資料搜集的頻率分為高頻資料與低頻資料: 1. 高頻資料 (high-freqency data): - 週資料、日資料、秒資料 (或即時交易資料) - 例:股票日收盤價、每日台幣兌日幣匯率、股票日內逐筆交易資料 2. 低頻資料 (low-freqency data): - 年資料、季資料、月資料 - 例:美國年度 GDP、台積電 Q3 營業收入、台北市 5 月降雨量 ## 1.2.2 如何記錄與使用時間序列資料 ### 1. 時間序列資料的表示 在過往學習基礎統計學時,我們多半使用的是「橫斷面」資料,比如 110 學年度 3 年 2 班共 40 位同學的國文期末考試成績,若以隨機變數來表示可以記錄成 $\{X_i \}_{i=1}^{40}$,下標的 $i$ 表示記載第 $i$ 位同學的成績。 但在時間序列資料中,資料是在不同時間點被記錄下來,因此通常會將資料記錄成 $\{Y_t \}_{t=1}^{T}$,其中 $t \in T$,基本上皆是離散時間資料,但在理論上也存在所謂「連續時間」資料,連續時間的假設在財務上有很多地方會使用到。 1. 離散時間 (discrete time)的表示: - $T = \{1,2,3,\dots\}= \mathbb{N}$ - $T = \{\dots,-2,-1,0,1,2,\dots\}= \mathbb{Z}$ 2. 連續時間 (continuous time)的表示: - $T = [0, \infty)$ - $T=(-\infty,\infty)=\mathbb{R}$ 為了簡單表示,若沒有特別說明,我們對於所蒐集到的時間序列資料的表示即為下列[隨機過程](https://zh.wikipedia.org/zh-tw/%E9%9A%8F%E6%9C%BA%E8%BF%87%E7%A8%8B)的實現:$\{y_1,y_2,y_3,\dots ,y_T \}$ ### 2. 時間序列資料的繪圖 在 `R` 中,`AirPassengers` 是時間序列分析領域大師 Box & Jenkins 所使用的美國國際航班旅客人數資料。在 `R` console 中輸入`AirPassengers` 即可瀏覽該筆資料,紀錄美國從 1949 年 1 月到 1960 年 12 月的美國國際航班旅客人數的月資料,單位為「千人」。 ``` Input: AirPassengers ``` ``` Output: Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec 1949 112 118 132 129 121 135 148 148 136 119 104 118 1950 115 126 141 135 125 149 170 170 158 133 114 140 1951 145 150 178 163 172 178 199 199 184 162 146 166 1952 171 180 193 181 183 218 230 242 209 191 172 194 1953 196 196 236 235 229 243 264 272 237 211 180 201 1954 204 188 235 227 234 264 302 293 259 229 203 229 1955 242 233 267 269 270 315 364 347 312 274 237 278 1956 284 277 317 313 318 374 413 405 355 306 271 306 1957 315 301 356 348 355 422 465 467 404 347 305 336 1958 340 318 362 348 363 435 491 505 404 359 310 337 1959 360 342 406 396 420 472 548 559 463 407 362 405 1960 417 391 419 461 472 535 622 606 508 461 390 432 ``` 使用 `R` 語言的好處之一,就是在 `R` 中針對時間序列資料的資料型態,我們可以針對 `AirPassengers` 做資料型態的查詢: ``` Input: str(AirPassengers) ``` ``` Output: Time-Series [1:144] from 1949 to 1961: 112 118 132 129 121 135 148 148 136 119 ... ``` 正如先前的台積電股價,通常我們會在橫軸部分放上時間,縱軸部分放上對應的數值,並且以折線圖的方式表現該筆資料的趨勢。由於 `AirPassengers` 在 `R` 中為 `Time-Series` 的資料型態,因此我們可以很輕易的在 `R` 中繪製每月旅客數的趨勢圖: ``` Input: par(family = "Heiti TC Light") #設定中文字體 plot(AirPassengers, ylab = "旅客數(千人)", main="1949年至1960年每月國際旅客變化量") ``` ``` Output: ``` ![AirPassengers](https://hackmd.io/_uploads/HkxxX53mR.png) 透過圖片,我們可以發現每月國際旅客人數有個成長的趨勢,同時又有週期性的表現,將趨勢圖畫出來就是進行時間序列研究的第一步! 而週期部分,可以嘗試將每個月份的平均人數(或中位數)計算出來,並且繪製出來看看變化的趨勢。 ``` Input: boxplot(AirPassengers ~ cycle(AirPassengers),xlab = '月份', ylab = '旅客數 (千人)',main='每月份旅客數盒狀圖') ``` ``` Output: ``` ![AP_box](https://hackmd.io/_uploads/H1SMI1670.png) ### 3. 成長率與差分 **i. 成長率** 給定時間序列資料 $\{Y_t \}_{t=1}^{T}$,我們稱 $Y_t$ 為第 t 期的資料,則前面一期的資料就紀錄成 $Y_{t-1}$,也就是 $Y_t$ 的「落後一期」資料 (first lag)。同理,$Y_{t-k}$ 就是 $Y_t$ 的「落後 $k$ 期」資料 (k-th lag)。 傳統上對於成長率的定義為: $$g_t = \frac{Y_t - Y_{t-1}}{Y_{t-1}}$$ 也就是 $Y_{t}$ 與自身的「落後一期資料」的差除上「落後一期資料」。 **ii. 差分** 在前面談到成長率的地方,可以看到分子部分為 $Y_{t}$ 減掉自身的「落後一期資料」,我們定義此為 $Y_{t}$ 的**一階差分 (first difference)**,並將其表示為: $$\Delta Y_t = Y_t - Y_{t-1}$$ 因此,成長率可以改寫成: $$g_t = \frac{Y_t - Y_{t-1}}{Y_{t-1}} = \frac{\Delta Y_t}{Y_{t-1}}$$ 近一步地,我們可以討論所謂 $Y_{t}$ 的**二階差分 (second difference)**,此為 「$Y_{t}$ 的一階差分」與 「$Y_{t-1}$ 的一階差分」之差。 $Y_{t}$ 的二階差分以數學的表示如下: $$\Delta^2 Y_t = \Delta Y_t -\Delta Y_{t-1}$$ :::success 💡 直觀的推導想法: $$\begin{align*} \Delta^2 Y_t &= \Delta (\Delta Y_t )\\ &= \Delta (Y_t - Y_{t-1} ) \\ &= \Delta Y_t -\Delta Y_{t-1} \\ &= (Y_t - Y_{t-1} ) - (Y_{t-1} - Y_{t-2} ) \\ &= Y_t - 2 Y_{t-1} + Y_{t-2} \end{align*} $$ ::: 雖然我們可以依循此方法計算出更高階的差分,但在時間序列分析中,更高階的差分不太容易會被使用到。 **iii. 任兩期之間的差值** 一階差分表示當期與前一期之間的差值,倘若我們想要知道當期與前 $s$ 期資料的差呢?我們改以下列形式表示: $$\Delta_s Y_t=Y_t-Y_{t-s}$$ 當 $s=1$就是一階差分。 如果我們現在有每月台積電股票的月收盤價,則 $$\Delta_{12} \ln Y_t=\ln Y_t-\ln Y_{t-12}$$ 這就是台積電股價的年增率 (Year on Year, YoY)。 **4. 成長率與自然對數** 在資料分析中,我們常常會將資料取自然對數 $\ln$,因為**取對數之後的數值變化量就是成長率的近似**,也就是說 $\ln Y_t - \ln Y_{t-1} \approx g_t$,如此在繪圖上就可以很清楚地看出哪一個時間段的成長率上升或下降地較為快速。 $$\begin{align*} g_t &= \frac{Y_t - Y_{t-1}}{Y_{t-1}} \\ &\approx \ln(1+\frac{Y_t - Y_{t-1}}{Y_{t-1}})\\ &= \ln(\frac{Y_t }{Y_{t-1}}) = \ln {Y_t } - \ln{Y_{t-1}} \\ &= \Delta \ln {Y_t } \end{align*}$$ :::success 💡 Proof : 對 $f(x) = \ln(1+x)$ 在 $x=0$ 附近做一階泰勒展開 $$f(x) \approx f(0) + f'(0) (x-0)$$ 也就是說 $$\begin{align*} \ln(1+x) &\approx \ln(1+0) + \frac{1}{1+0} (x-0) \\ &= 0 + x =x \end{align*} $$ ::: # 1.3 自我相關與動差 在處理橫斷面資料時,有個相當重要的假設,我們認為兩筆資料具有**獨立且同質分配** (Independent and identically distributed, **i.i.d.**),也就是說在抽樣或觀測發生之前,兩筆資料是具有相同分配,而在進行觀測時兩者也不互相干擾,互為獨立事件。 也就是說,在一組隨機變數 $\{X_i\}_{i=1}^N$ 中, $$Cov(X_i,X_j) =0,\ i\neq j$$ 然而,在處理時間序列資料上,通常都會認為兩期資料存在序列相關或稱**自我相關 (autocorrelation)**,比如今天股票漲停,則預期隔天還會繼續漲,或是週期性資料,季與季之間也會存有某種關聯性。 以共變異數來表示即為: $$Cov(Y_t,Y_{t-k}) \neq 0$$ 此為 $\{Y_t\}_{t=-\infty }^\infty$ 的 $k$ 階自我共變異數。 ## 1.3.1 時間序列的母體動差 一般來說,我們會假設時間序列 $\{Y_t\}$ 的抵住集合即為整條實數線,可能不會對其特別做設定,即 $\text{supp}(Y_t) = \{y_t| -\infty <y_t<\infty\}$。如同初等統計學,我們一樣會討論均數 (期望值) 以及變異數等等重要動差。 對於時間序列 $\{Y_t\}_{t=-\infty }^\infty$,我們可以求出下列動差: **1. 均數 (期望值) mean** $$\mu_t = E(Y_t) = \int_{t=-\infty }^\infty y_t f_{Y_t}(y_t)dy_t$$ **2. 變異數 variance** $$\sigma_t^2 = Var(Y_t) = \int_{t=-\infty }^\infty (y_t-\mu_t)^2 f_{Y_t}(y_t)dy_t$$ 正如前一小節所說,我們希望透過時間序列連結不同時間點的資料關係,因此我們透過自我共變異函數 (autocovariance function) 和自我相關函數 (autocorrelation function) 來描述序列相關性。 **3. 自我共變異數 autocovariance** 時間序列 $\{Y_t\}_{t=-\infty }^\infty$ 的 $k$ 階自我共變異數定義如下: $$\gamma(t,k)=Cov(Y_t,Y_{t-k}) =E[(Y_t-\mu_t)(Y_{t-k}-\mu_{t-k})] $$ 就如同橫斷面資料,自己與自己的共變異數就是自己的變異數: $$\gamma(t,0)=Cov(Y_t,Y_{t}) =E[(Y_t-\mu_t)(Y_{t}-\mu_{t})] = Var(Y_t) $$ **3. 自我相關係數 autocorrelation** 時間序列 $\{Y_t\}_{t=-\infty }^\infty$ 的 $k$ 階自我相關係數定義如下: $$\rho(t,k) = \frac{Cov(Y_t,Y_{t-k})}{\sqrt{Var(Y_t)}\sqrt{Var(Y_{t-k})}} , \rho \in [-1,1]$$ :::info 若 $\rho(t,1)$ 越靠近 1,則表示前後兩期有高度正相關,我們稱此現象為**高持續性 (high persistency)**。 ::: ## 1.3.2 時間序列的樣本動差 在前一小節,介紹了時間序列隨機變數 (隨機過程) 的母體動差,透過蒐集樣本,我們可以對這些參數進行估計。 對於隨機樣本 $\{Y_t \}_{t=1}^T$,樣本動差可以透過下列方式求得: **1. 樣本平均數** $$\bar{Y} = \frac{1}{T} \sum_{t=1}^T Y_t$$ **2. 樣本變異數** $$\hat{\gamma}(0) = \frac{1}{T} \sum_{t=1}^T (Y_t-\bar{Y})^2$$ **3. 樣本 k 階自我共變異數** $$\hat{\gamma}(k) =\widehat{Cov(Y_t,Y_{t-k})} = \frac{1}{T} \sum_{t=k+1}^T (Y_t-\bar{Y})(Y_{t-k}-\bar{Y})$$ :::info 上式中可以看到該共變異數是除上 $T$,而非 $T-k-1$ 不過為求簡化,我們在進行共變異數的計算就除上 $T$ 即可,公式中去除平均 (demean) 的部分就用全時間的平均數代表。(更多資料:[請點我](https://www.maths.usyd.edu.au/u/UG/SM/STAT3011/r/TS/NOTES2.pdf )) $$\bar{Y} = \frac{1}{T} \sum_{t=1}^T Y_t$$ ::: **4. 樣本 k 階自我相關係數** $$\hat{\rho}(k)= \frac{\widehat{Cov(Y_t,Y_{t-k})}}{\widehat{Var(Y_t)}} =\frac{\hat{\gamma}(k)}{\hat{\gamma}(0)} $$ ## 1.3.3 用 R 計算樣本動差 在 `R` 中可以使用 `acf()` 函數輕鬆地算出資料的 $k$ 階樣本自我變異數與自我相關係數。 譬如先前所使用的 `AirPassengers`,我們可以輕易地算出其樣本動差: ``` #1. 樣本平均數 mean(AirPassengers) #2. 樣本變異數 var(AirPassengers) #3. 1 階樣本自我變異數 acf(AirPassengers, lag.max = 1, type = "covariance", plot = F #表示不須繪圖 ) #4. 1 階樣本自我相關係數 acf(AirPassengers, lag.max = 1, type = "correlation", plot = F ) ``` # 參考資料 1. 陳旭昇(2022)。《時間序列分析: 總體經濟與財務金融之應用》(3版)。 1. 陳旭昇(2015)。《統計學: 應用與進階》(3版)。 1. 楊奕農(2017)。《時間序列分析: 經濟與財務上之應用》(3版)。 1. 葉小蓁(1998)。《時間序列分析與應用》。 1. [北京大學「金融時間序列分析」講義](https://www.math.pku.edu.cn/teachers/lidf/course/fts/ftsnotes/html/_ftsnotes/ftsnotes.pdf)。 1. Klaus Neusser (2015), Time Series Analysis in Economics, Springer. 1. Jonathan D. Cryer and Kung-Sik Chan (2008), Time Series Analysis with Applications in R, Springer. 1. Paul S.P. Cowpertwait and Andrew V. Metcalfe (2009), Introductory Time Series with R, Springer. 1. Walter Enders (2015), Applied Econometric Time Series, Wiley. 1. [Christoph Hanck, Martin Arnold, Alexander Gerber, and Martin Schmelzer(2024), Introduction to Econometrics with R.](https://www.econometrics-with-r.org/index.html) 1. Bruce E. Hansen (2021), Econometrics, Princeton University Press. <!-- (https://www.econometrics-with-r.org/14.1-using-regression-models-for-forecasting.html) :::success 你的文字內容 當然圖片也行 ::: krjirghioet[^註腳標籤] [^註腳標籤]: 註腳內容 -->