我只是从Bloomberg下载时间序列并尝试制作一个xts对象:
library(Rbbg)
conn <- blpConnect()
tickers = c("SPX Index","GX1 Index","VG1 Index","NK1 Index",
"SM1 Index","RM1 Index","LT01TRUU Index")
df <- bdh(conn,tickers,c("PX_OPEN","PX_HIGH", "PX_LOW", "PX_LAST", "Volume"),
"19980101", "20131020",option_names = "CDR", option_values = "US")
blpDisconnect(conn)
make.xts <- function(x, order.by) {
tzone = Sys.getenv('TZ')
orderBy = class(order.by)
index = as.numeric(as.POSIXct(order.by, tz = tzone))
if( is.null(dim(x)) ) {
if( len(orderBy) == 1 )
x = t(as.matrix(x))
else
dim(x) = c(len(x), 1)
}
x = as.matrix(x)
x = structure(.Data = x,
index = structure(index, tzone = tzone, tclass = orderBy),
class = c('xts', 'zoo'), .indexCLASS = orderBy, tclass=orderBy,
.indexTZ = tzone, tzone=tzone)
return( x )
}
data <- new.env()
for(s in unique(df$ticker)) {
temp = df[df$ticker == s,]
date = as.Date(temp$date)
temp = temp[,spl('PX_OPEN,PX_HIGH,PX_LOW,PX_LAST,Volume')]
colnames(temp) = spl('Open,High,Low,Close,Volume')
temp = make.xts(temp[], date)
if (length(grep('Index',s)) == 1) {
data[[ trim(gsub('Index', '', s)) ]] = temp[!is.na(temp$Close),]
} else {
data[[ trim(gsub('US Equity', '', s)) ]] = temp[!is.na(temp$Close),]
}
}
这是df对象(抱歉,但我不知道输入) https://dl.dropboxusercontent.com/u/102669/df.rdata
这是xts对象: https://dl.dropboxusercontent.com/u/102669/temp.rdata
所有数据都是CHR,但我想要数字数据。
我认为问题是NA。 我无法删除所有NA行,因为某些时间序列只有接近的价格。
所以规则可能是:当只存在收盘价时,将所有其他列等于收盘价,否则不算。如果任何列中存在一些Na值,则执行最后一个非NA值
最终结果应该是带有数字数据的xts对象。
请帮忙吗?
答案 0 :(得分:1)
保持简单,不要编写make.xts函数。
df<- xts(df[,2:7],order.by=as.Date(df[,1]))