2012-03-23 79 views
2

我有一个不规则的时间序列给出ETF的所有交易在4年的时间:[R XTS不规则时间序列需要定期间隔5分钟,但只针对个交易日

> 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,所以有可能市场开放时间表示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 

任何帮助,非常感谢。

+0

相关问题:http://stackoverflow.com/questions/9778632/r-xts-generating-1-minute-time-series-from-second-events – 2012-03-23 03:04:21

+0

@VincentZookekynd 该问题的解决方案是使用.minutes5 ...我已经尝试过,并没有得到我想要的: - '> head(BKF.test) BKF.xts.Open BKF.xts.High BKF.xts.Low BKF.xts.Close 2008 -01-02 09:30:01 59.87 59.87 59.870 59.870 2008-01-02 09:39:51 59.71 59.71 59.612 59.612 2008-01-02 09:51:16 59.64 59.64 59.640 59.640 2008-01-02 10 :06:08 59.50 59.50 59.500 59.500 2008-01-02 10:13:36 59.55 59.55 59.550 59.550'。 – Karina 2012-03-23 03:35:02

+0

另一种解决方案与常规时间序列合并,这意味着我将拥有一年中所有日子而不是交易日的数据。 – Karina 2012-03-23 03:51:59

回答

2

作为一个previous question, 可以使用to.period,使每个5分钟时间内的最后一个值, align.time每个周期结束时替换时间戳, cbind添加缺少的时期mentionned(用缺失值) 和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

谢谢,经过足够的反复试验和发现了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="")] 

完成。

+3

请注意,您可能正在填充前一天的数据,这可能不是您想要的。我可能会使用'BKF < - do.call(rbind,lapply(split(BKF,“days”),na.locf))''而不是'BKF <-na.locf(BKF)'' – GSee 2012-03-30 16:58:52

相关问题