【问题标题】:R - Bin stock trade data by second, VWAP trade but clump volumeR - 按秒统计的 Bin 股票交易数据,VWAP 交易但成交量
【发布时间】:2017-04-12 19:42:06
【问题描述】:

不重复: Binning Dates in R 或者 Binning time data in R

上下文

我正在使用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. 价格(价值以 VWAP 为单位)
  3. 体积(大小)相加

计算时间不是问题。

我尝试过的事情

我天真地尝试使用 ?cut,但无法根据 Binning time data in R 获得任何有意义的结果。

一位同事建议使用 for 循环,但不知道如何根据上述要求开始实施。

【问题讨论】:

    标签: r bloomberg binning stockquotes rblpapi


    【解决方案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
    

    【讨论】:

    • 实际上,这甚至没有必要。我更新了代码以删除 floor_date 函数。我最初以为你想要按分钟计算 VWAP,这仍然在我的回答中。
    • 好的,这应该加快进程,我相信 lubridate 大大减慢了速度
    • ...但您说:“计算时间不是问题”:)
    • 确实,我应该更具体一些,这样才能吸取教训。细节:几秒钟的差异(无论是 0.1 秒还是 5 秒)都不是问题。但是当计算速度增量(如本例中)从接近一分钟到
    • @RobertTan 我刚刚用data.table添加了一个快12倍的解决方案@
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-26
    • 2021-04-07
    • 2010-09-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多