Существует несколько функций в R в библиотеках xts и zoo, которые пытаются агрегировать финансовые данные OHLC (V) от более низкой до более высокой степени детализации, а также новый элемент tibbletime :: to_period, который выполняет ту же задачу для таблицы.Все они, однако, страдают от одной и той же неэффективности: при агрегировании, скажем, за один час, они принимают круглое время в качестве начальной и конечной точек интервалов, то есть границы будут 8 утра, 9 утра, 10 утра., ... Если у меня есть данные с 15-минутными свечами, как я могу агрегировать OHLC (V), чтобы он агрегировался по интервалам 1 H, а не по временам округления?
Time <- seq(from = as.POSIXct("2018-12-28 12:00:00"), to = as.POSIXct("2019-01-02 13:30:00"), by = 900)
Price_Data <- tibble::tibble(Time = Time,
Open = 100 + rnorm(n = length(Time)),
High = 100 + rnorm(n = length(Time)),
Low = 100 + rnorm(n = length(Time)),
Close = 100 + rnorm(n = length(Time)),
Volume = rpois(n = length(Time), lambda = 5000))
tail(Price_Data)
1 2019-01-02 12:15:00 99.7 5074
2 2019-01-02 12:30:00 99.9 4925
3 2019-01-02 12:45:00 101. 5070
4 2019-01-02 13:00:00 98.6 4919
5 2019-01-02 13:15:00 98.6 4925
6 2019-01-02 13:30:00 99.5 5046
Как я могуусугубить вышеупомянутое tibble до 30M, 1H, 2H и 4H, так что группы будут желаемой длины?Например, последняя группа в агрегации по 1H будет принимать 4 свечи с 12:45:00 до 13:30:00, 2H с 11:45:00, ... Я пробовал
purrr::map(c("30 M","1 H","2 H","4 H")), function(Period) Price_Data %>%
na.omit() %>% tibbletime::tbl_time(., index = Time) %>%
tibbletime::collapse_by(Period, side = "end", clean = T) %>%
dplyr::group_by(Time) %>%
dplyr::mutate(Open = dplyr::first(Open),
High = max(High),
Low = min(Low),
Close = dplyr::last(Close),
Volume = sum(Volume)) %>%
dplyr::slice(n = n()) %>% dplyr::ungroup())
с различными комбинациями параметров, но ничего не дает желаемого результата.Также не помогает группировка по количеству свечей за определенный интервал, поскольку в реальных данных есть пробелы.