R 語言時間資料處理套件 xts

之前已經有寫過一篇文章介紹 zoo 這個套件,在 zoo 套件當中,先給向量資料一個有序的 index 而建立類別為 zoo 的物件,再利用有對 zoo定義方法的函數來處理該物件。今天要再介紹另一個時間資料處理套件,特別是金融相關的資料更適合利用xts套件來整理資料。

xts 全名是 eXtensible Time Series 可擴展時間序列,在 xts 套件當中,可以利用 xts() 函數建立名為 xts 類別的物件,暫且稱之為 xts 物件。產生 xts 物件和 zoo 的方法很相似,但是 xts 物件的 index 只能是時間資料:

> install.packages("xts")
> require(xts)
> x.date <- as.Date("2016-09-08") + 1:5
> x <- 1:5
> x.xts <- xts(x = x, order.by = x.date)
> x.xts

           [,1]
2016-09-09    1
2016-09-10    2
2016-09-11    3
2016-09-12    4
2016-09-13    5

其中 xts 物件繼承 zoo 的類別,所以有對 zoo 定義方法的泛型函數也可用在 xts 物件上。

> class(x.xts)
[1] "xts" "zoo"
> par(mfcol = c(1, 2))
> plot.xts(x.xts)
> plot.zoo(x.xts)

plot-zoo-xts

merge 也是一個有對 zoo 與 xts 定義方法的函數,merge.xts() 可以將多個 xts 物件資料依照時間合併:

> y.xts <- xts(x = 11:15, order.by = as.Date("2016-09-08")+3:7)
> merge.xts(x.xts, y.xts, join = "outer")

                      x.xts y.xts
2016-09-09     1    NA
2016-09-10     2    NA
2016-09-11     3    11
2016-09-12     4    12
2016-09-13     5    13
2016-09-14    NA    14
2016-09-15    NA    15

> merge.xts(x.xts, y.xts, join = "inner")

                      x.xts y.xts
2016-09-11     3    11
2016-09-12     4    12
2016-09-13     5    13

想要取出某段時間的資料除了可以利用 zoo 的 window() 函數外,xts 有另外更容易的方法。下面的例子用的 sample_matrix 是附在 xts 套件的模擬股價日資料,使用 data() 函數可以讀取該資料。

> data("sample_matrix")
> class(sample_matrix)

[1] "matrix"

> x.xts <- as.xts(sample_matrix)
> window(x.xts, start = "2007-03-28", end ="2007-04-01")

                        Open     High      Low    Close
2007-03-28 48.33090 48.53595 48.33090 48.53595
2007-03-29 48.59236 48.69988 48.57432 48.69988
2007-03-30 48.74562 49.00218 48.74562 48.93546
2007-03-31 48.95616 49.09728 48.95616 48.97490
2007-04-01 48.94407 48.97816 48.80962 48.87032

> x.xts["2007-03-28/2007-04-01"]

                        Open     High      Low    Close
2007-03-28 48.33090 48.53595 48.33090 48.53595
2007-03-29 48.59236 48.69988 48.57432 48.69988
2007-03-30 48.74562 49.00218 48.74562 48.93546
2007-03-31 48.95616 49.09728 48.95616 48.97490
2007-04-01 48.94407 48.97816 48.80962 48.87032

若xts物件有分鐘資料也可以輸入日期與時間找出時間區間內的資料。但因為這份資料只有日資料,輸入的時間2007-03-28 11:25:10會大於2007-03-28 00:00:00,所以2007-03-28的資料不會被挑出來;相對的2007-04-01 11:26:10大於2007-04-01 00:00:00,所以有包含2007-04-01的資料。

> x.xts["2007-03-28 11:25:10/2007-04-01 11:26:10"]

                        Open     High      Low    Close
2007-03-29 48.59236 48.69988 48.57432 48.69988
2007-03-30 48.74562 49.00218 48.74562 48.93546
2007-03-31 48.95616 49.09728 48.95616 48.97490
2007-04-01 48.94407 48.97816 48.80962 48.87032

接下來是小編認為 xts 套件當中最重要的 apply 系列函數,除了之前介紹的 zoo 套件當中  rollapply() 函數可以使用外,另外 xts 套件還有 apply.daily(),apply.monthly(),apply.weekly(),apply.quarterly(),apply.yearly() 函數可以使用。可以依照函數字面上的意思來了解 xts 套件中 apply 系列函數是依照某些特定時間間隔來分群並且自訂函數來處理時間序列資料。

> apply.quarterly(x.xts[, "Open"], FUN = mean)

               Open
2007-03-31 50.15493
2007-06-30 48.47278


> apply.monthly(x.xts[, "Close"], FUN = function(month){
+  coredata(month[length(month)]) / coredata(month[1])
+ })

               Close
2007-01-31 1.0021550
2007-02-28 1.0082025
2007-03-31 0.9684433
2007-04-30 1.0096055
2007-05-31 0.9649579
2007-06-30 1.0024336

以上是小編常用 xts 套件裡的函數。如果想要詳細了解 xts 套件,可以在 R 程式裡搜尋 xts 的說明文件。本篇文章的函數功能都可以用 R 內建的函數來完成,但是要做到和 xts 套件一樣的事情,所花費的時間將會非常可觀而且很可能會出錯,光是整理資料就會搞得精疲力盡的,很難再花心力去想出統計模型來預測金融商品的價格。自從知道 xts 套件後,一拿到金融商品相關的時間序列資料都會先轉成 xts 物件再做整理,所以小編很推薦 xts 套件給想要使用 R 語言的朋友們。

發表迴響

在下方填入你的資料或按右方圖示以社群網站登入:

WordPress.com 標誌

您的留言將使用 WordPress.com 帳號。 登出 /  變更 )

Google photo

您的留言將使用 Google 帳號。 登出 /  變更 )

Twitter picture

您的留言將使用 Twitter 帳號。 登出 /  變更 )

Facebook照片

您的留言將使用 Facebook 帳號。 登出 /  變更 )

連結到 %s