xts: time series data
create/input
- create 建立
- input 讀入
select elements 選擇元素
modify
- add 增加
- delete 刪除
- replace 取代
- 更新
operate
- 運算:+-*/
- Iteration: loop, 反覆運算,疊代,迭代
output
- output:輸出
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.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
data() 函數取出某段時間的資料
- 除了可以利用 zoo 的 window() 函數外, - xts 有另外更容易的方法: data() 函數 - 下面的例子用的 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 語言的朋友們。
# convert factor to date
DJIcsv[,1] <- as.Date(DJIcsv[,1], format = "%Y/%m/%d")
# convert dataframe to xts
DJIxts <- xts(DJIcsv[,-1], order.by=DJIcsv[,1])
Merge new row into an existing xts ( purpose: to add current stock quote to historical object from quantmod)
You just need to create a new xts object from the quote data and rbind it to the historical data.
require(quantmod)
x <- getSymbols("AAPL", from = "2014-10-27" ,auto.assign=FALSE)
q <- getQuote('AAPL')
qCols <- c("Open","High","Low","Last","Volume","Last")
qx <- xts(q[,qCols], as.Date(q[,"Trade Time"]))
y <- rbind(x, qx)