Для нерегулярных временных рядов нужны регулярные 5-минутные интервалы, но только для торговых дней.

У меня есть нерегулярный временной ряд всех сделок данного ETF за 4 года:

 > 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

Любая помощь приветствуется.


r xts
person Karina    schedule 23.03.2012    source источник
comment
Связанный вопрос: stackoverflow.com/questions/9778632/   -  person Vincent Zoonekynd    schedule 23.03.2012
comment
@VincentZookekynd Решение этого вопроса состоит в том, чтобы использовать to.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.   -  person Karina    schedule 23.03.2012
comment
А другое решение объединяется с обычным временным рядом, что означает, что у меня будут данные за ВСЕ дни года, а не торговые дни.   -  person Karina    schedule 23.03.2012
comment
В ответах на этот вопрос также предлагалось использовать align.time для получения временных меток точно в конце каждого 5-минутного периода, использовать cbind для объединения результата с пустым временным рядом со всеми желаемыми временными метками (5-минутными временными метками, для всех торговых дней, в вашем случае - вам нужно определить, что вы подразумеваете под торговым днем, это зависит от рынка), и заполнить недостающие значения с помощью na.locf. Затем вы можете извлечь последний столбец с помощью Cl.   -  person Vincent Zoonekynd    schedule 23.03.2012
comment
За все торговые дни в США. Как я объяснил, у меня есть еще один временной ряд всех дат, когда рынок был открыт. Прямо сейчас единственное решение, которое я могу придумать, - это объединиться с пустым временным рядом и использовать цикл для удаления всех значений, где рынки не были открыты (согласно другим моим временным рядам). Это займет очень много времени, так как размер моей выборки превышает 55 миллионов. Поэтому я и спросил, есть ли более простой способ.   -  person Karina    schedule 23.03.2012


Ответы (2)


Как упоминалось в предыдущем вопросе, вы можно использовать 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)
person Vincent Zoonekynd    schedule 23.03.2012

Спасибо, я на самом деле понял это самостоятельно после достаточного количества проб и ошибок и обнаружения функции подмножества 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="")]

Сделанный.

person Karina    schedule 23.03.2012
comment
Будьте осторожны, возможно, вы вводите форвардные данные за предыдущий день, а это может быть не то, что вам нужно. Я бы, наверное, использовал BKF <- do.call(rbind, lapply(split(BKF, "days"), na.locf)) вместо BKF<-na.locf(BKF) - person GSee; 30.03.2012