R - 以秒为单位的 Bin 股票交易数据,VWAP 交易但交易量集中
R - Bin stock trade data by second, VWAP trade but clump volume
不重复:
Binning Dates 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 ...
Objective
这个数据需要从这个转换:
原始数据:
> 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
- 填写缺失的时间(以秒为单位)
- 价格(价值在 VWAP 中)
- 体积(大小)相加
计算时间不是问题。
我尝试过的东西
我天真地尝试使用 ?cut
但无法根据 获得任何有意义的结果。
一位同事建议使用 for 循环,但不确定如何根据上述要求开始实施。
给你。 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
不重复:
Binning Dates 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 ...
Objective
这个数据需要从这个转换:
原始数据:
> 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
- 填写缺失的时间(以秒为单位)
- 价格(价值在 VWAP 中)
- 体积(大小)相加
计算时间不是问题。
我尝试过的东西
我天真地尝试使用 ?cut
但无法根据
一位同事建议使用 for 循环,但不确定如何根据上述要求开始实施。
给你。 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