R как преобразовать данные о тиках в данные OHLC за день, но за определенное время.IE 5:00 вечера по чикагскому времени? - PullRequest
0 голосов
/ 27 марта 2019

Мне нужно сделать это для акций, таких как мини-будущее Dow, которое открывается в 17:00, начиная с воскресенья, и закрывается в 16:00 по чикагскому времени на следующий день.

Ответ здесь: to.minutes с использованием пользовательских конечных точек предлагает скорректировать исходные данные на требуемый период времени. Поэтому я добавил 7 часов 5 вечера, чтобы сделать это в полночь. К сожалению, это не удается из-за перехода на летнее время. Мне нужно посмотреть на год или более данных, и мне нужно иметь правильное время, включая летнее время.

Контракты имеют закрытие или расчеты, которые отличаются от последней сделки дня. У меня есть отдельное со всеми этими расчетными данными. Организовано каждый день и в эти дни поселиться.

index(settles) = as.POSIXct(paste(as.character(index(settle)),"17:00:00",sep=" "),tz = 'America/Chicago')

Этот код заставляет мои даты и кончается к 5:00 вечера по чикагскому времени и правильно устанавливает CST или CDT. Это 5 часов вечера, когда вступают в силу расчеты, и должны быть временными рамками моих данных OHLC.

Кроме того, использование расчетов в качестве интервалов также будет правильно обрабатывать остановки и праздничные дни, которые могут длиться более 24 часов, но все это часть однодневного сеанса.

Единственный способ, которым я должен работать, - это цикл, который тянет данные между временами установления и вручную извлекает OHL для каждого дня или периода времени, который является чрезвычайно медленным.

Обновление 1:

Вот мой текущий код:

settles = settleList[[1]]
index(settles) = as.POSIXct(paste(as.character(index(settle)),"17:00:00",sep=" "),tz = 'America/Chicago')
OpenHLC = matrix(0,ncol = 3,nrow = nrow(settles))
OpenHLC = cbind(OpenHLC,settles)
colnames(OpenHLC) = c("Open","High","Low","Close")
for (ii in seq(1:length(settles)))
{
  inst = instList[[1]]
  if (ii > 0) {
    temp1 = inst[paste(index(settles[ii-1]),index(settles[ii]),sep = "/")]
  } else {
    temp1 = inst[paste(index(settles[ii])-60*60*24,index(settles[ii]),sep = "/")]
  }
  if (nrow(temp1) > 0) {
    OpenHLC$Open[ii] = temp1$Trade.Price[1]
    OpenHLC$High[ii] = max(temp1$Trade.Price,OpenHLC$Close[ii])
    OpenHLC$Low[ii] = min(temp1$Trade.Price,OpenHLC$Close[ii])
  } else {
    OpenHLC$Open[ii] = OpenHLC$High[ii] = OpenHLC$Low[ii] = OpenHLC$Close[ii]
  }
}

Это работает достаточно хорошо, и не очень медленно, так как выполняет операции по одному дню за раз. Я думаю, что должна быть намного лучшая векторизованная форма. И небольшой результат, который правильно пропускает праздники:

> OpenHLC
                     Open  High   Low Close
2018-12-20 17:00:00 23313 23428 22640 22997
2018-12-21 17:00:00 23015 23247 22373 22407
2018-12-24 17:00:00 22420 22572 21683 21700
2018-12-26 17:00:00 21743 22966 21453 22898
2018-12-27 17:00:00 22893 23197 22243 23153
2018-12-28 17:00:00 23121 23372 22958 23035
2018-12-31 17:00:00 23178 23349 23092 23268
2019-01-02 17:00:00 23305 23417 22791 23325
2019-01-03 17:00:00 23036 23123 22617 22659
2019-01-04 17:00:00 22693 23502 22565 23395

Создание ежедневного OHLC с пользовательским временем запуска , которое я нашел в связи с моим, - это очень похожий вопрос, где в ответе используются разные конечные точки. Я полагаю, что могу использовать индексные точки расчета в качестве конечных точек, но я пока не достиг того же результата.

...