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 

つまり、約 3 分の 1 速くなります。

しかし、本当にスピードアップしたい場合、ミリ秒単位の精度を放棄しても構わないと思っている場合 (元のメソッドは暗黙的にそうしていると思います)、一意の日付 - 時間 - 秒の組み合わせでループを実行できます。それらはすべて返されるためです。同じ時間枠。これにより、およそ 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 に答える