r - 计算基于时间的移动平均线的快速有效方法

r - Fast and efficient way to calculate time-based moving averages

我下载了一些 EURUSD 报价数据 (source) 并且已经准备好,所以我现在有一个包含出价和要价以及日期时间的数据框。日期时间是用

创建的
options(digits.secs=3)
data$datetime <- as.POSIXct(strptime(as.character(data$datetime), format="%Y-%m-%d %H:%M:%OS"))

正如您从数据中看到的那样,每分钟可以包含不同数量的奖分(滴答)。

现在我想计算一个移动平均线,就好像数据会被压缩到一个 1 分钟的图表中一样,即对于每个分时奖励,我想计算过去 x 分钟的平均值,而只能使用当前奖品以及 (x-1) 最后分钟的 (x-1) 个最后奖品。也许用一个例子更容易解释。让我们考虑一下这个数据:

     bid       datetime
[1]  1.21332   2016-03-01 03:21:32.138
[2]  1.21333   2016-03-01 03:21:58.213
[3]  1.21328   2016-03-01 03:22:01.283
[4]  1.21325   2016-03-01 03:22:47.018
[5]  1.21330   2016-03-01 03:23:22.221
[6]  1.21331   2016-03-01 03:24:01.112

对于最后一个数据点 [6] 和周期 (x) 4,我现在想计算过去 3 分钟的平均值(使用每一分钟的最后出价奖金)以及当前值,即

mean = ([2] + [4] + [5] + [6]) / 4

我的方法是使用堆叠循环(一个遍历每个数据点,一个确定最后过去 (x-1) 分钟内的最后奖品变化)。但是,我敢打赌,使用 R 可以更快、更有效地完成此操作。

非常感谢您的帮助!

假设总是有最近3分钟的价格(即没有没有任何价格数据的分钟),您可以先提取每分钟的最新价格并滚动求和window大小,x-1。然后,使用非相等连接将此 table 与原始 table 连接,同时选择最近的最后 3 分钟总和,然后计算数据中每一行的所需结果。

library(data.table)
setDT(dat)

#find last price for each min
minlastprice <- dat[, c(.(DateTime=DateTime[.N]), .SD[.N]), 
    by=.(as.Date(DateTime), hour(DateTime), minute(DateTime))]

winsize <- 4

#calculate the price in last 3 min
library(RcppRoll)
minlastprice[, SumPrevMin := roll_sumr(Bid, winsize - 1)]

#perform a non-equi join to pick the sum of the last 3 minutes' prices
minlastprice[dat, on=.(DateTime < DateTime), mult="last",
    (SumPrevMin + i.Bid) / winsize, by=.EACHI]