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

时间:2018-08-16 00:08:34

标签: r performance datetime moving-average

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

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

从数据中可以看到,每分钟可以包含不同数量的奖励积分(滴答声)。

现在,我想计算移动平均值,就好像数据将被压缩到1分钟图表中一样,也就是说,对于每个tick奖,我想计算最近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可以有更快,更高效的方法。

非常感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

假设最后3分钟始终有价格(即没有任何价格数据的分钟),您可以首先提取每分钟的最新价格,并使用x-1大小的窗口进行累加。然后,使用非等距联接将此表与原始表联接,同时选择最近的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]