2

我有分时级别的股票数据,想创建一个前 10 秒所有分时的滚动列表。下面的代码有效,但需要很长时间才能处理大量数据。我想将此过程矢量化或以其他方式使其更快,但我没有提出任何建议。任何朝着正确方向提出的建议或推动将不胜感激。

library(quantmod)
set.seed(150)

# Create five minutes of xts example data at .1 second intervals
mins  <- 5
ticks <- mins * 60 * 10 + 1


times <- xts(runif(seq_len(ticks),1,100), order.by=seq(as.POSIXct("1973-03-17 09:00:00"),
                                                       as.POSIXct("1973-03-17 09:05:00"), length = ticks))

# Randomly remove some ticks to create unequal intervals
times <- times[runif(seq_along(times))>.3]

# Number of seconds to look back
lookback  <- 10
dist.list <- list(rep(NA, nrow(times)))

system.time(
  for (i in 1:length(times)) {

    dist.list[[i]] <- times[paste(strptime(index(times[i])-(lookback-1), format = "%Y-%m-%d %H:%M:%S"), "/",
                                  strptime(index(times[i])-1, format = "%Y-%m-%d %H:%M:%S"), sep = "")]
  }
)
>  user  system elapsed 
   6.12    0.00    5.85 
4

1 回答 1

3

你应该检查一下这个window功能,它会让你对日期的子选择更容易。以下代码用于lapply执行 for 循环的工作。

# Your code
system.time(
  for (i in 1:length(times)) {

    dist.list[[i]] <- times[paste(strptime(index(times[i])-(lookback-1), format = "%Y-%m-%d %H:%M:%S"), "/",
                                  strptime(index(times[i])-1, format = "%Y-%m-%d %H:%M:%S"), sep = "")]
  }
  )

#    user  system elapsed 
#    10.09    0.00   10.11

# My code 
system.time(dist.list<-lapply(index(times),
    function(x) window(times,start=x-lookback-1,end=x))
)
#    user  system elapsed 
#    3.02    0.00    3.03 

因此,大约快了三分之一。

但是,如果你真的想加快速度,并且你愿意放弃毫秒精度(我认为你的原始方法隐含地这样做),你可以只在独特的日期-小时-秒组合上运行循环,因为它们都会返回同一时间窗口。这应该会加快大约 20 或 30 倍的速度:

dat.time=unique(as.POSIXct(as.character(index(times)))) # Cheesy method to drop the ms.
system.time(dist.list.2<-lapply(dat.time,function(x) window(times,start=x-lookback-1,end=x)))

# user  system elapsed 
# 0.37    0.00    0.39 
于 2012-05-23T17:00:00.047 回答