2017-04-12 23 views
0

不是重複斌股票交易數據: Binning Dates in RBinning time data in R的R - 由第二,VWAP貿易,但叢成交量

語境

我在Rblpapi使用getMultipleTicks拉勾數據一個月內的股票(本例中爲TSLA):

rawData = getMultipleTicks("tsla us equity", eventType = "TRADE", startTime = as.POSIXlt("2017-03-10 13:30:00"), endTime = as.POSIXlt("2017-04-10 20:00:00"), tz="America/New_York")

> str(rawData) 
'data.frame': 1130690 obs. of 3 variables: 
$ times: POSIXct, format: "2017-03-10 08:30:07" ... 
$ value: num 246 246 246 246 246 ... 
$ size : num 58 42 80 5 9 1 4 73 100 941 ... 

目的

該數據需要從這個轉換:

原始數據:

> head(rawData, 5) 
    times     value size 
1 2017-04-10 09:30:00 309  1 
2 2017-04-10 09:30:00 309  1 
3 2017-04-10 09:30:02 309  1 
4 2017-04-10 09:30:02 308  1 
5 2017-04-10 09:30:04 309.38 1 

向該:

清潔數據:

> head (cleanData, 5) 
    times    value size 
1 2017-04-10 09:30:00 309  2 
2 2017-04-10 09:30:01   0 
3 2017-04-10 09:30:02 308.5 2 
4 2017-04-10 09:30:03   0 
5 2017-04-10 09:30:04 309.38 1 
  1. 缺少時間(以秒)填充在
  2. 價格(值以成交量加權平均價)
  3. 卷(尺寸)被加在一起

計算時間是不是一個問題。

事情我想

我天真地使用?cut嘗試,但未能達到每Binning time data in R任何有意義的結果。

一位同事建議使用for-loop,但不知道如何開始使用上述要求來實現。

回答

1

在這裏,你去。 value是每秒VWAP。

編輯快得多data.table解決方案:

library(data.table) 
times_all <- data.table(times = seq(min(rawData$times), 
         max(rawData$times), 
         by = "sec")) 
merged <- merge(times_all, rawData, all.x=TRUE) 
cleanData <- merged[, list(value=sum(value*size,na.rm=TRUE)/sum(size,na.rm=TRUE), 
         size=sum(size)), 
         by=list(times)] 
head(cleanData) 
       times value size 
1: 2017-03-10 08:30:07 246.4942 100 
2: 2017-03-10 08:30:08  NaN NA 
3: 2017-03-10 08:30:09  NaN NA 
4: 2017-03-10 08:30:10  NaN NA 
5: 2017-03-10 08:30:11  NaN NA 
6: 2017-03-10 08:30:12  NaN NA 

原始dplyr解決方案:

library(dplyr) 
cleanData <- rawData %>% 
    left_join(data.frame(times = seq(min(rawData$times), 
            max(rawData$times), 
            by = "sec")), .) %>% 
    group_by(times) %>% 
    summarize(value = sum(value*size,na.rm=TRUE)/sum(size,na.rm=TRUE), 
      size = sum(size,na.rm=TRUE)) 

head(cleanData) 
# A tibble: 6 × 3 
       times value size 
       <dttm> <dbl> <dbl> 
1 2017-03-10 08:30:07 246.4942 100 
2 2017-03-10 08:30:08  NaN  0 
3 2017-03-10 08:30:09  NaN  0 
4 2017-03-10 08:30:10  NaN  0 
5 2017-03-10 08:30:11  NaN  0 
6 2017-03-10 08:30:12  NaN  0 
+0

這也需要'庫(lubridate)',正確嗎? –

+0

Acutally,這甚至沒有必要。我更新了代碼以刪除'floor_date'函數。我最初以爲你想要分鐘的VWAP,這仍然在我的答案。 –

+0

好吧,這應該加快這個過程,我相信lubridate實質上減緩了事情 –