我下载了一些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可以有更快,更高效的方法。
非常感谢您的帮助!
答案 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]