r语言 - 过去 x 分钟间隔内时间序列的滚动最大值/最小值/总和



我有一个微秒级精度的金融时间序列数据帧:

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 表示为许多观测值,而不是分钟数。

我需要计算运行/滚动最大值、价格系列的最小值和交易量序列的运行/滚动总和,如下所示:

  1. 从时间戳开始,正好在时间序列开始后 5 分钟
  2. 对于以下每个时间戳:回顾 5 分钟间隔和
  3. 计算滚动统计信息。

如何有效地计算这一点?

您的数据

我无法捕获毫秒(但解决方案应该仍然有效)

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 分钟。

任何想法如何优化它?谢谢!

最新更新