我有一个微秒级精度的金融时间序列数据帧:
timestamp price volume
2017-08-29 08:00:00.345678 99.1 10
2017-08-29 08:00:00.674566 98.2 5
....
2017-08-29 16:00:00.111234 97.0 3
2017-08-29 16:00:01.445678 96.5 5
总计:每天约10万条记录。
我看到了几个函数,我可以在其中指定滚动窗口的宽度,例如 k = 10。但是 k 表示为许多观测值,而不是分钟数。
我需要计算运行/滚动最大值、价格系列的最小值和交易量序列的运行/滚动总和,如下所示:
- 从时间戳开始,正好在时间序列开始后 5 分钟
- 对于以下每个时间戳:回顾 5 分钟间隔和
- 计算滚动统计信息。
如何有效地计算这一点?
您的数据
我无法捕获毫秒(但解决方案应该仍然有效)
library(lubridate)
df <- data.frame(timestamp = ymd_hms("2017-08-29 08:00:00.345678", "2017-08-29 08:00:00.674566", "2017-08-29 16:00:00.111234", "2017-08-29 16:00:01.445678"),
price=c(99.1, 98.2, 97.0, 96.5),
volume=c(10,5,3,5))
咕噜咕噜和滴状体解决方案
library(purrr)
library(dplyr)
timeinterval <- 5*60 # 5 minute
筛选时间间隔内观测值的df
,另存为列表
mdf <- map(1:nrow(df), ~df[df$timestamp >= df[.x,]$timestamp & df$timestamp < df[.x,]$timestamp+timeinterval,])
列表中每个数据帧的摘要
statdf <- map_df(mdf, ~.x %>%
summarise(timestamp = head(timestamp,1),
max.price = max(price),
max.volume = max(volume),
sum.price = sum(price),
sum.volume = sum(volume),
min.price = min(price),
min.volume = min(volume)))
输出
timestamp max.price max.volume sum.price sum.volume
1 2017-08-29 08:00:00 99.1 10 197.3 15
2 2017-08-29 08:00:00 98.2 5 98.2 5
3 2017-08-29 16:00:00 97.0 5 193.5 8
4 2017-08-29 16:00:01 96.5 5 96.5 5
min.price min.volume
1 98.2 5
2 98.2 5
3 96.5 3
4 96.5 5
由于我正在寻找向后计算(从时间戳开始,然后向后看 5 分钟),我通过 #CPak 的方式稍微修改了这个伟大的解决方案,如下所示:
mdf <- map(1:nrow(df), ~df[df$timestamp <= df[.x,]$timestamp & df$timestamp > df[.x,]$timestamp - timeinterval,])
statdf <- map_df(mdf, ~.x %>%
summarise(timestamp_to = tail(timestamp,1),
timestamp_from = head(timestamp,1),
max.price = max(price),
min.price = min(price),
sum.volume = sum(volume),
records = n()))
此外,我添加了 records = n() 以查看间隔中使用了多少条记录。
一个警告:在具有 100K+ 记录的数据集上,代码在 mdf 上需要 10 分钟,对于 statdf 需要另外 6 分钟。
任何想法如何优化它?谢谢!