R xts不规则时间序列需要有规律的5分钟间隔,但仅适用于交易日

R xts不规则时间序列需要有规律的5分钟间隔,但仅适用于交易日,r,xts,R,Xts,我有一个特定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)

我有一个特定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
非常感谢您的帮助。

如a中所述, 您可以使用
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)
#示例数据
图书馆(quantmod)

天谢谢,经过充分的尝试和错误,发现了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="")]
这是我的数据集
BKF相关问题:@VincentZookekyn该问题的解决方案是使用to.minutes5。。。我已经试过了,但没有得到我想要的:–
>头(BKF.test)2008-01-02 09:30:01 59.87 59.87 59.87 59.87 2008-01-02 09:39:51 59.71 59.71 59.612 59.612 2008-01-02 09:51:51 59.64 59.64 59.640 59.640 2008-01-02 10:06:08 59.50 59.50 59.50059.500 2008-01-02 10:13:36 59.55 59.55 59.550 59.550
。另一种解决方案与常规时间序列合并,这意味着我将拥有一年中所有日期的数据,而不是交易日。该问题的答案还建议使用
align.time
将时间戳精确地设置在每5分钟,使用
cbind
将结果与一个具有所有所需时间戳的emtpy时间序列合并(在您的情况下,“所有交易日”的时间戳间隔为5分钟——您需要定义“交易日”的含义,这取决于市场),并用
na.locf
填充缺少的值。然后,您可以使用
Cl
提取美国所有交易日的最后一列。正如我所解释的,我还有另外一个时间序列,它记录了市场开放的所有日期。目前,我能想到的唯一解决方案是合并一个空的时间序列,并使用循环删除市场未开放的所有值(根据我的其他时间序列)。这将需要很长时间,因为我的样本量超过5500万。这就是为什么我问是否有更简单的方法。小心,你可能正在填写前一天的远期数据,这可能不是你想要的。我可能会使用
BKF