Как преобразовать хтс в более низкую частоту накопительным способом - PullRequest
3 голосов
/ 06 ноября 2011

Я пытаюсь преобразовать данные временных рядов xts в более низкую периодичность совокупным образом.

Например, используя to.weekly на примере данных (sample_matrix) из пакета xts, я получаю следующее:

library(xts)
data(sample_matrix)
to.weekly(as.xts(sample_matrix), name="")

> to.weekly(as.xts(sample_matrix), name="")
              .Open    .High     .Low   .Close
2007-01-08 50.03978 50.42188 49.95041 49.98806
2007-01-15 49.99489 50.68583 49.80454 50.48912
.....

Я бы хотел использовать немного другую функцию to.weekly.cumulative, которая бы вместо этого возвращала:

> to.weekly.cumulative(as.xts(sample_matrix), name="")
              .Open    .High     .Low   .Close
2007-01-02 50.03978 50.11778 49.95041 50.11778
2007-01-03 50.03978 50.42188 49.95041 50.39767
2007-01-04 50.03978 50.42188 49.95041 50.33236
2007-01-05 50.03978 50.42188 49.95041 50.33459
2007-01-06 50.03978 50.42188 49.95041 50.18112
2007-01-07 50.03978 50.42188 49.95041 49.99185
2007-01-08 50.03978 50.42188 49.95041 49.98806
2007-01-09 49.99489 49.99489 49.80454 49.91333
2007-01-10 49.99489 50.13053 49.80454 49.97246
2007-01-11 49.99489 50.23910 49.80454 50.23910
2007-01-12 49.99489 50.35980 49.80454 50.28519
2007-01-13 49.99489 50.48000 49.80454 50.41286
2007-01-14 49.99489 50.62395 49.80454 50.60145
2007-01-15 49.99489 50.68583 49.80454 50.48912
....

Эта функция будет возвращать данные не только для конечных точек, но и для всех строк в объекте xts. Например, я пытаюсь получить еженедельные бары из дневных баров (или 15-минутные бары из 1-минутных баров) таким образом, чтобы за каждый день (или минуту) я получал текущее (с того дня / минуты) развитие еженедельного (15 минутного) бара. Таким образом, в понедельник я получу в качестве еженедельного бара Open, High, Low, Close точно так же, как они были в понедельник, во вторник Open будет с понедельника, Close будет со вторника, а High будет вторником High, если больше понедельника High и минимум будет минимум вторника, если он ниже минимума понедельника ... и в пятницу я получу открытие с понедельника, максимум максимума всей недели, минимум минимума всей недели и закрытие закрытия пятницы. Данные за пятницу должны быть такими же, если бы я использовал функцию to.weekly из xts.

Итак, в основном, это не только данные в конечных точках (как это делает xts to.weekly), но и все временные шаги, доступные при периодичности исходного объекта xts. Так что каким-то образом фильм о развитии еженедельного бара по дням (каждый день я получаю, где недельный бар стоит на закрытии каждой недели).

Как это сделать (Как написать функцию в .weekly.cumulative?)?

Примеры того, как это сделать, высоко оценены.

РЕДАКТИРОВАТЬ: попытался объяснить немного больше на основе комментария DWin.

Ответы [ 2 ]

2 голосов
/ 06 ноября 2011

Не уверен, что это то, что вам нужно, но, возможно, вы можете выполнить эту работу следующим образом:

  1. Создайте циклический индекс (здесь, wday) для временных рядов.
  2. Используйте rollapplyr, используя wday в качестве ширины окна.

вот пример:

z <- as.xts(sample_matrix)
wday <- .indexwday(z) + 1
wday <- (wday-3)%%7 + 1 # rotate the wday index if need.

z2 <- data.frame(
  Open = rollapplyr(z$Open, wday, function(x) x[1], partial = TRUE),
  High = rollapplyr(z$High, wday, max, partial = TRUE),
  Low = rollapplyr(z$Low, wday, min, partial = TRUE),
  Close = z$Close
  )

z2 выглядит так:

> head(z2, 15)
               Open     High      Low    Close
2007-01-02 50.03978 50.11778 49.95041 50.11778
2007-01-03 50.03978 50.42188 49.95041 50.39767
2007-01-04 50.03978 50.42188 49.95041 50.33236
2007-01-05 50.03978 50.42188 49.95041 50.33459
2007-01-06 50.03978 50.42188 49.95041 50.18112
2007-01-07 50.03978 50.42188 49.95041 49.99185
2007-01-08 50.03978 50.42188 49.95041 49.98806
2007-01-09 49.99489 49.99489 49.80454 49.91333
2007-01-10 49.99489 50.13053 49.80454 49.97246
2007-01-11 49.99489 50.23910 49.80454 50.23910
2007-01-12 49.99489 50.35980 49.80454 50.28519
2007-01-13 49.99489 50.48000 49.80454 50.41286
2007-01-14 49.99489 50.62395 49.80454 50.60145
2007-01-15 49.99489 50.68583 49.80454 50.48912
2007-01-16 50.62024 50.73731 50.56627 50.67835
1 голос
/ 06 ноября 2011

Разделить на «недели», применить пользовательскую функцию к данным каждой недели, а затем повторно привязать результаты

to.weekly.cumulative <- function(xts.obj, name="") {
     out <- do.call(rbind, 
                   lapply(split(xts.obj, 'weeks'), 
                       function(x) cbind(rep(first(x[,1]), NROW(x[,1])), 
                                   cummax(x[,2]), cummin(x[,3]), x[,4])))
     colnames(out) <- paste(name, c("Open", "High", "Low", "Close"), sep=".")
     out
}

> library(quantmod)
> data(sample_matrix)
> myxts <- as.xts(sample_matrix)


> head(to.weekly.cumulative(myxts), 15)
              .Open    .High     .Low   .Close
2007-01-02 50.03978 50.11778 49.95041 50.11778
2007-01-03 50.03978 50.42188 49.95041 50.39767
2007-01-04 50.03978 50.42188 49.95041 50.33236
2007-01-05 50.03978 50.42188 49.95041 50.33459
2007-01-06 50.03978 50.42188 49.95041 50.18112
2007-01-07 50.03978 50.42188 49.95041 49.99185
2007-01-08 50.03555 50.10363 49.96971 49.98806
2007-01-09 50.03555 50.10363 49.80454 49.91333
2007-01-10 50.03555 50.13053 49.80454 49.97246
2007-01-11 50.03555 50.23910 49.80454 50.23910
2007-01-12 50.03555 50.35980 49.80454 50.28519
2007-01-13 50.03555 50.48000 49.80454 50.41286
2007-01-14 50.03555 50.62395 49.80454 50.60145
2007-01-15 50.61724 50.68583 50.47359 50.48912
2007-01-16 50.61724 50.73731 50.47359 50.67835
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...