Расчет Spotvol на объекте xts продолжает генерировать POSIX и Error в множестве ошибок - PullRequest
0 голосов
/ 03 февраля 2020

Я пытаюсь рассчитать дневную реализованную / историческую волатильность для большого набора данных по акциям, используя функцию spotvol из высокочастотного пакета. По какой-то причине я продолжаю получать ошибки POSIX (временная метка) и пробовал несколько различных методов для преобразования моего образца в объект xts.

Образец набора данных:

2015-01-02 10:00:00  80.15
2015-01-02 11:00:00  81.00
2015-01-02 12:00:00  80.50
2015-01-02 13:00:00  80.40
2015-01-02 14:00:00  80.15
2015-01-02 15:00:00  81.00
2015-01-02 16:00:00  80.50
2015-01-05 10:00:00  80.40
2015-01-05 11:00:00  80.95
2015-01-05 12:00:00  81.05
2015-01-05 13:00:00  80.85
2015-01-05 14:00:00  80.50
2015-01-05 15:00:00  80.40
2015-01-05 16:00:00  80.95

Код, который я использовал для преобразования в объект xts, выглядит следующим образом:

vol_df2 <- vol_df1 %>%
  mutate(time_stamp = as.POSIXct(time_stamp, format = "%Y-%m-%d %H:%M:%S"))

vol_df3 <- as.xts(vol_df2, order.by = vol_df2$time_stamp, tz = "", unique = F)

Код для попытки расчета дневного спотвола из часовых периодов времени выглядит следующим образом: ПРИМЕЧАНИЕ: Мои фактические данные носят высокочастотный характер, поэтому я предоставил агрегированные данные за каждый час за 2 дня.

  spotvol(vol_df3, method = "detper", on = "hours", k = 1,
          marketopen = "10:00:00", marketclose = "16:00:00")

Я получаю следующие ошибки:

Error in as.POSIXlt.character(x, tz, ...): 
character string is not in a standard unambiguous format
  do not know how to convert 'time' to class “POSIXct”
In addition: Warning messages:
1: All formats failed to parse. No formats found. 
2: All formats failed to parse. No formats found. 
3: In min.default(numeric(0), na.rm = FALSE) :
  no non-missing arguments to min; returning Inf
4: In max.default(numeric(0), na.rm = FALSE) :
  no non-missing arguments to max; returning -Inf
5: All formats failed to parse. No formats found.

и

Error in set(x, j = name, value = value) : 
Supplied 1054304 items to be assigned to 1054377 items of column
'PRICE'. If you wish to 'recycle' the RHS please use rep() to make this
intent clear to readers of your code.

Проведенное мною исследование ничего не дало, поскольку я просто следовал инструкциям по преобразованию своей временной метки, а также преобразованию в объект xts. Поскольку я использую систему Linux, я столкнулся с этим: https://github.com/Rdatatable/data.table/issues/1619

Я также попытался использовать метод data.table, и это также выдает ошибку, касающуюся однозначного формата метка времени POSIX.

Как будто я пропускаю аргументы в командах для spotvol, однако я не мог выяснить, есть ли значения по умолчанию, которые можно изменить из документации, найденной здесь: https://www.rdocumentation.org/packages/highfrequency/versions/0.6.3/topics/spotvol

РЕДАКТИРОВАТЬ: единственная ошибка, которую я получаю сейчас, является последней в списке, касающейся ошибки в наборе ... Когда я изменяю fill=TRUE на fill=FALSE в aggregatePrice часть spotvol функции, которую spotvol, кажется, хочет вычислить немного, но все равно выдает ошибку Error in set.

Любая помощь по этому вопросу будет принята с благодарностью. Ура:)

1 Ответ

0 голосов
/ 03 февраля 2020

Проблема заключается в этой строке кода:

vol_df3 <- as.xts(vol_df2, order.by = vol_df2$time_stamp, tz = "", unique = F)

Если вы посмотрите на то, что он содержит, то это:

                    time_stamp            PRICE  
2015-01-02 10:02:00 "2015-01-02 10:02:00" "80.15"
2015-01-02 11:15:00 "2015-01-02 11:15:00" "81.00"
2015-01-02 12:31:00 "2015-01-02 12:31:00" "80.50"
2015-01-02 15:59:00 "2015-01-02 15:59:00" "80.40"
2015-01-05 10:01:00 "2015-01-05 10:01:00" "80.40"
2015-01-05 11:24:00 "2015-01-05 11:24:00" "80.95"
2015-01-05 14:21:00 "2015-01-05 14:21:00" "81.05"
2015-01-05 15:59:00 "2015-01-05 15:59:00" "80.85"

XTS объекты являются матрицей, и если вы просто выберите весь data.frame, включая метку времени, это будет символьная матрица. Вам необходимо исключить столбец отметки времени следующим образом:

vol_df3 <- as.xts(vol_df2[, names(vol_df2) != "time_stamp"], 
                          order.by = vol_df2$time_stamp, tz = "", unique = F)

, что приводит к следующему:

                     [,1]
2015-01-02 10:02:00 80.15
2015-01-02 11:15:00 81.00
2015-01-02 12:31:00 80.50
2015-01-02 15:59:00 80.40
2015-01-05 10:01:00 80.40
2015-01-05 11:24:00 80.95
2015-01-05 14:21:00 81.05
2015-01-05 15:59:00 80.85

И тогда spotvol не вернется с ошибкой.

...