Данные временных рядов группы OHLC по выбранному периоду в R - PullRequest
0 голосов
/ 02 февраля 2019

Существует несколько функций в 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())

с различными комбинациями параметров, но ничего не дает желаемого результата.Также не помогает группировка по количеству свечей за определенный интервал, поскольку в реальных данных есть пробелы.

...