Возможно, вы допустили ошибку в том смысле, что вы не ищете минимальную разницу в пределах разницы в 60 секунд, как описано, но вместо этого вы ищете сделку, которая имела место как можно ближе к 60 секундам в прошлом или будущем:
idx <- which.closest(diffs,x=c)
Если использовать эту сделку, которая состоялась 1 секунду назад, она будет отброшена для сделки, которая произошла ближе к 60 секундам, я не думаю, что это то, что вы хотите.Вы, вероятно, хотите наименьшую разницу в цене для всех сделок в течение 60 секунд, которую можно выполнить:
res$idx[i] <<- which.min(pricediff)[1]
См. Код ниже:
library(lubridate)
library(dplyr)
ndf$datetime <- ymd_hms(ndf$PriorityDateTime)
res <- ndf %>% data.frame(stringsAsFactors = F)
res$dspread <- res$idx <- res$spread <- NA
sapply(1:nrow(res),function(i){
within60 <- abs(difftime(ndf$datetime[i],ndf$datetime,"secs"))<=60
samesymbol <- res$InstrumentSymbol[i]==res$InstrumentSymbol
isdifferenttrade <- 1:nrow(res)!=i
pricediff <- ifelse(within60&samesymbol&isdifferenttrade,abs(res$TradePrice[i]-res$TradePrice), Inf)
res$dspread[i] <<- min(pricediff)
res$idx[i] <<- which.min(pricediff)[1] #in case several elements have same price
res$spread[i] <<- 2*abs(log(res$TradePrice[i])-log(res$TradePrice[res$idx[i]]))
} )
head(res)
То, что я использовал, было apply
, котороеаналогично (и может быть даже медленнее, чем) for
циклов.Если для ваших реальных данных это происходит быстрее, то это потому, что я выполнял операции так, что требовалось меньше шагов.
Дайте мне знать, в противном случае вы можете попробовать то же самое в цикле for
, или нам придется попробовать с data.table
, с которым я менее знаком.Конечно, обычно это отнимает много времени, потому что вам нужно определять условия на основе каждой строки данных.
PriorityDateTime TradePrice InstrumentSymbol id datetime spread idx
1 2018-10-27 10:00:00 1 asset1 1 2018-10-27 10:00:00 2.1972246 3
2 2018-10-27 10:00:30 2 asset2 2 2018-10-27 10:00:30 1.3862944 4
3 2018-10-27 10:01:00 3 asset1 3 2018-10-27 10:01:00 2.1972246 1
4 2018-10-27 10:01:30 4 asset2 4 2018-10-27 10:01:30 1.3862944 2
5 2018-10-27 10:02:00 5 asset1 5 2018-10-27 10:02:00 1.0216512 3
6 2018-10-27 10:02:30 6 asset2 6 2018-10-27 10:02:30 0.8109302 4
dspread
1 2
2 2
3 2
4 2
5 2
6 2