R xts不规则时间序列需要定期5分钟间隔,但仅限于交易日

时间:2012-03-23 02:53:25

标签: r xts

我在一段时间内有一个特定ETF所有交易的不规则时间序列:

 > head(BKF.xts)
                    BKF.xts
2008-01-02 09:30:01  59.870
2008-01-02 09:38:04  59.710
2008-01-02 09:39:51  59.612
2008-01-02 09:51:16  59.640
2008-01-02 10:06:08  59.500
> tail(BKF.xts)
                    BKF.xts
2011-12-30 15:59:23   36.26
2011-12-30 15:59:53   36.26
2011-12-30 15:59:56   36.27
2011-12-30 15:59:57   36.27
2011-12-30 15:59:58   36.27
2011-12-30 16:00:00   36.33

我想要的是在所有交易日每隔5分钟获得一次价格。因为我正在处理交易所买卖基金,所以市场开放的日期可能是ETF没有交易的,因此我的样本中没有该日期的数据。但是我需要我的最后时间序列来计算所有交易日。我已经下载了同一时期的每日数据,因此我每个交易日都有另一个时间序列。不确定这是否有帮助。

此外,如果在5:00分钟的时间戳上没有特定的交易,我想要了解最近交易的价格。所以对于我上面发布的数据,我想要的是:

> head(BKF.xts)
                        BKF.xts
    2008-01-02 09:35:00  59.870
    2008-01-02 09:40:00  59.612
    2008-01-02 09:45:00  59.612
    2008-01-02 09:50:00  59.640
    2008-01-02 09:55:00  59.640

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

previous question所述, 您可以使用to.period在每个5分钟的时间段内获得最后一个值, align.time用每个句点结束时替换时间戳, cbind添加缺失的期间(缺少值) 并na.locf替换缺失的值。

# Sample data
library(quantmod)
days <- seq(Sys.Date(), by=1, length=20)
days <- days[ ! format(days, "%A") %in% c("Saturday", "Sunday") ]
timestamps <- ISOdatetime( 
  year(days), month(days), day(days), 
  9, 0, 0  # You may want/need to add the timezone
)
timestamps <- timestamps[-2] 
x <- lapply(timestamps, function(u) sort(u + sample(60*60*8,200)))
x <- do.call(c, x)
x <- xts(rnorm(length(x)), x)

# Value at the end of each 5-minute period
y <- to.minutes5(x)
y <- Cl(y)
y <- align.time(y, 5*60)

# All 5-minute periods, betweem 9am (excluded) 
# and 5pm (included) for each day 
z <- lapply(timestamps, function(u) u + 5*60*(1:(12*8)))
z <- do.call(c, z)
z <- cbind(y, xts(, z))

# Fill in missing values
z <- na.locf(z)

答案 1 :(得分:1)

谢谢,我经过足够的试验和错误并发现xts子集函数后,我自己想出来了。这是我做的:

    #BKF here is my data set
    BKF<-xts(BKF$PRICE,order.by=BKF$DATE)
    colnames(BKF)=c("Price")
    BKF<-to.minutes5(BKF)
    BKF<-align.time(BKF,5*60)

    #create a regular time series that has values for each 5 minute interval and use cbind to merge with my data
    tmp<-xts(,seq.POSIXt(start(BKF),end(BKF),by="5 mins"))
    BKF<-cbind(tmp,BKF)

    # subset data from 9:30am to 4:00pm and replace NA's with last observation
    BKF<-BKF["T09:30:00/T16:00:00"]
    BKF<-na.locf(BKF)

    # SP here is daily S&P data for the same sample period
    SP<-xts(order.by=as.Date(td$Date,tz="",format="%y-%m-%d"))

   # Subset observations for all trading days according to the daily S&P data
   test<-bt[as.Date(index(bt),tz="")%in%as.Date(index(td),tz="")]

完成。