2012-05-23 30 views
2

我有股票數據在勾號級別,並希望創建前10秒所有勾號的滾動列表。下面的代碼工作,但需要很長時間才能獲得大量數據。我想將這個過程向量化或者使其更快一些,但我沒有提出任何事情。任何建議或推動正確的方向將不勝感激。XTS中滾動列表在不平等時間

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 

回答

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 

所以,快了大約三分之一。但是,如果你真的想加快速度,並且你願意放棄毫秒精度(我認爲你的原始方法隱含地這樣做),那麼你可以在獨特的日期 - 小時 - 秒組合上運行循環,因爲他們將全部返回同一時間窗口。這應該加快大概二三十倍:

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 
+0

這是一個好點,這當然是我尋找的時間類型節省。謝謝! –