Каков наилучший способ связать внутридневные цифры объема из временных рядов цены акций с использованием XTS / ZOO и т. Д. В R? - PullRequest
6 голосов
/ 24 февраля 2012

Например, предположим, у вас есть ~ 10 лет ежедневных 1-минутных данных для объема инструмента x следующим образом (в формате xts) с 9:30 до 16:30:

    Date.Time               Volume        
    2001-01-01 09:30:00     1200
    2001-01-01 09:31:00     1110
    2001-01-01 09:32:00     1303

До:

    2010-12-20 16:28:00     3200
    2010-12-20 16:29:00     4210
    2010-12-20 16:30:00     8303

Я бы хотел:

  • Получите средний объем в каждую минуту для всей серии (т. Е. Средний объем за все 10 лет в 9:30, 9:31, 9:32 ... 16:28, 16:29, 16:30)

Как мне лучше поступить:

  • Объединение данных в одну минуту.
  • Получение среднего из этих ведер
  • Восстановление этих "средних" сегментов обратно в один временной ряд xts / zoo?

Я хорошо разбираюсь с aggregate, sapply, period.apply функциями и т. Д., Но просто не могу "правильно" скопировать данные.

Это достаточно легко решить с помощью цикла, но очень медленно. Я бы предпочел избегать программного решения и использовать функцию, которая использует преимущества архитектуры C ++ (то есть xts решение на основе)

Может кто-нибудь предложить какой-нибудь совет / решение?

Заранее большое спасибо.

Ответы [ 2 ]

5 голосов
/ 24 февраля 2012

Сначала давайте создадим некоторые тестовые данные:

library(xts) # also pulls in zoo
library(timeDate)
library(chron) # includes times class

# test data
x <- xts(1:3, timeDate(c("2001-01-01 09:30:00", "2001-01-01 09:31:00", 
    "2001-01-02 09:30:00")))

1) aggregate.zoo . Теперь попробуйте преобразовать его в класс times и выполнить агрегацию с использованием одной строки:

aggregate(as.zoo(x), times(format(time(x), "%H:%M:%S")), mean)

1a) агрегат.зоо (вариация) . или это изменение, которое преобразует более короткий совокупный ряд в times, чтобы избежать необходимости делать это в более длинном исходном ряду:

ag <- aggregate(as.zoo(x), format(time(x), "%H:%M:%S"), mean)
zoo(coredata(ag), times(time(ag)))

2) tapply . Альтернативой будет tapply, что, вероятно, быстрее:

ta <- tapply(coredata(x), format(time(x), "%H:%M:%S"), mean)
zoo(unname(ta), times(names(ta)))

РЕДАКТИРОВАТЬ: упрощено (1) и добавлено (1a) и (2)

3 голосов
/ 24 февраля 2012

Вот решение с ddply, но вы также можете использовать sqldf, tapply, aggregate, by и т. Д.

# Sample data
minutes <- 10 * 60
days <- 250 * 10
d <- seq.POSIXt( 
  ISOdatetime( 2011,01,01,09,00,00, "UTC" ), 
  by="1 min", length=minutes 
)
d <- outer( d, (1:days) * 24*3600, `+` )
d <- sort(d)
library(xts)
d <- xts( round(100*rlnorm(length(d))), d )

# Aggregate
library(plyr)
d <- data.frame( 
  minute=format(index(d), "%H:%M"), 
  value=coredata(d) 
)
d <- ddply( 
  d, "minute", 
  summarize, 
  value=mean(value, na.rm=TRUE) 
)

# Convert to zoo or xts
zoo(x=d$value, order.by=d$minute) # The index does not have to be a date or time
xts(x=d$value, order.by=as.POSIXct(sprintf("2012-01-01 %s:00",d$minute), "%Y-%m-%d %H:%M:%S") )
...