2017-04-12 6 views
0

ないの重複によって、ビン株式取引データ:私はのためのデータをチェックプルするRblpapigetMultipleTicksを使用していますR - 二、VWAP取引が、塊のボリューム

Binning Dates in R または Binning time data in R

コンテキスト1ヶ月以上の株式(この例では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 

のClean Data:

> 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. ボリューム(サイズが)

計算時間が問題ではありません一緒に加算される(値はVWAPです)。

物事は私が、私は単純に?cutを使用して試みたが、Binning time data in Rあたりの任意の意味のある結果を得ることができませんでした

を試してみました。

同僚はforループを使用することを推奨しましたが、上記の要件を実装する方法を開始する方法がわかりません。

答えて

1

ここに行きます。 valueはVWAP /秒です。

EDITはるかに高速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

要するに、それは必要でさえありません。 'floor_date'関数を削除するようにコードを更新しました。私は当初VWAPを分単位で望んでいると思っていましたが、これは私の答えにとどまりました。 –

+0

さて、これはプロセスのスピードを速めるはずですが、私は潤滑剤がかなり減速したと信じています –

関連する問題