R - Данные о торговле акциями в бинах по секундам, торговля VWAP, но общий объем

Не является дубликатом: Binning Dates in R или Биннинг данных о времени в R

Контекст

Я использую getMultipleTicks в Rblpapi для получения тиковых данных по акции (в данном примере 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. Цены (значения указаны в VWAP)
  3. Объемы (размеры) суммируются

Время вычислений не имеет значения.

Что я пробовал

Я наивно пытался использовать ?cut, но не смог добиться каких-либо значимых результатов на данные времени биннинга в R .

Коллега предложил использовать цикл for, но не знает, как начать его реализацию с указанными выше требованиями.


person Robert Tan    schedule 12.04.2017    source источник


Ответы (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
person Pierre Lapointe    schedule 12.04.2017
comment
На самом деле, это даже не обязательно. Я обновил код, чтобы удалить функцию floor_date. Сначала я подумал, что вам нужен VWAP поминутно, и это осталось в моем ответе. - person Pierre Lapointe; 13.04.2017
comment
Хорошо, это должно ускорить процесс, я считаю, что смазка существенно замедлила процесс. - person Robert Tan; 13.04.2017
comment
... но вы сказали: время вычислений не имеет значения :) - person Pierre Lapointe; 13.04.2017
comment
Действительно, я должен был быть более конкретным, так что это урок. Деталь: разница в несколько секунд (будь то 0,1 с или 5 с) не имеет значения. Но когда дельта скорости вычислений составляет (как в этом примере) от почти минуты до ‹5 секунд, тогда это интересно :p - person Robert Tan; 13.04.2017
comment
@RobertTan Я только что добавил решение в 12 раз быстрее с data.table - person Pierre Lapointe; 13.04.2017