在R中使用XTS/ZOO等从股票价格时间序列中获取日内交易量数据的最佳方法是什么?

n.e*_*e.w 6 r time-series quantitative-finance zoo xts

例如,假设您xts从上午9:30到下午4:30 ,每天1分钟的仪器x数据的数据为10年,如下(格式):

    Date.Time               Volume        
    2001-01-01 09:30:00     1200
    2001-01-01 09:31:00     1110
    2001-01-01 09:32:00     1303
Run Code Online (Sandbox Code Playgroud)

一直到:

    2010-12-20 16:28:00     3200
    2010-12-20 16:29:00     4210
    2010-12-20 16:30:00     8303
Run Code Online (Sandbox Code Playgroud)

我想要:

  • 获得整个系列的每分钟平均音量(即9:30,9:31,9:32 ...... 16:28,16:29,16:30的所有10年的平均音量)

我该怎么做才能最好:

  • 将数据聚合到一分钟桶中
  • 获得这些桶的平均值
  • 将这些"平均"桶重新组合成单​​个xts/zoo时间序列?

我有一个很好的戳周围aggregate,sapply,period.apply功能等,但只是似乎无法"bin"的数据正确.

用循环解决这个问题很容易,但速度很慢.我宁愿避免使用程序化解决方案并使用利用C++架构的功能(即xts基于解决方案)

有人可以提供一些建议/解决方案吗?

非常感谢提前.

G. *_*eck 5

首先让我们创建一些测试数据:

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")))
Run Code Online (Sandbox Code Playgroud)

1)aggregate.zoo.现在尝试将其转换为times类并使用此单行聚合:

aggregate(as.zoo(x), times(format(time(x), "%H:%M:%S")), mean)
Run Code Online (Sandbox Code Playgroud)

1a)aggregate.zoo(变体).或者这种变化将较短的聚合系列转换times为避免必须在较长的原始系列上进行:

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

2)tapply.另一种选择tapply可能更快:

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

编辑:简化(1)并添加(1a)和(2)