Для нерегулярных временных рядов нужны регулярные 5-минутные интервалы, но только для торговых дней - PullRequest
2 голосов
/ 23 марта 2012

У меня есть нерегулярный временной ряд всех сделок данного 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

Любая помощь очень ценится.

Ответы [ 2 ]

2 голосов
/ 23 марта 2012

Как упоминалось в предыдущем вопросе , вы можете использовать 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 голос
/ 24 марта 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="")]

Готово.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...