之前已經有寫過一篇文章介紹 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)![]()
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 語言的朋友們。