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

Например, предположим, что у вас есть ~ 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)

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

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


person n.e.w    schedule 24.02.2012    source источник


Ответы (2)


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

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) aggregate.zoo (вариант). или этот вариант, который преобразует более короткий совокупный ряд в times, чтобы избежать необходимости делать это с более длинным исходным рядом:

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

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

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

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

person G. Grothendieck    schedule 24.02.2012
comment
Спасибо, что разместили это очень элегантное решение. - person n.e.w; 27.02.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") )
person Vincent Zoonekynd    schedule 24.02.2012
comment
Спасибо за это. Я имел в виду sqldf, но это казалось обманом для того, чего я пытался достичь. Теперь к вашему коду. Это хорошо работает вплоть до использования ddply (т. Е. Я построил фрейм данных с минутами и значением (структурированными как chr и num соответственно). Однако он просто возвращает NA для столбца (среднего) значения. Есть идеи? - person n.e.w; 24.02.2012
comment
Извините, я должен заявить, что код вашей модели отлично работает во всем. Однако он не работает с моими данными. str() вызов данных тома возвращает: num [1: 976638, 1] 46 32 24 7 34 27 9 18 2 24 ... - attr (*, dimnames) = Список из 2 .. $: NULL .. $: chr Volume /// и index моих данных: Формальный класс timeDate [пакет fCalendar] с 3 слотами .. @ Data: POSIXct [1: 976638], формат: 2001-07-02 09:51:00 2001- 07-02 09:52:00 02-07-2001 09:53:00 02-07-2001 09:54:00 ... .. @ формат: chr% Y-% m-% d% H:% M :% S - person n.e.w; 24.02.2012
comment
Ошибка, возвращаемая в моей адаптации: In mean.default (value, na.rm = TRUE): аргумент не является числовым или логическим: возвращается NA - person n.e.w; 24.02.2012
comment
Я пробовал использовать timeDate объектов для индекса (library(timeDate); d <- seq(Sys.timeDate(), by=60, length=10); d <- xts(...)), но он работает нормально. Однако ваши timeDate объекты, похоже, происходят из устаревшего пакета fCalendar: он был заменен на timeDate. - person Vincent Zoonekynd; 24.02.2012