R:聚合事件之间的数据

R: aggregating data between events

我有交易数据如下:

TradeNumber OpenTime               CloseTime       Profit     TradeHour Equity  
    1       01/01/2014 13:10    01/01/2014 14:40    10        13  520
    2       01/01/2014 13:25    01/01/2014 13:28    20        13  520
    3       01/01/2014 13:29    01/01/2014 15:40    -50       13  520
    4       01/01/2014 13:30    01/01/2014 14:05    -5        13  520
    5       01/01/2014 14:12    01/01/2014 14:40    12        14  560
    6       01/01/2014 14:21    01/01/2014 14:45    -16       14  560
    7       01/01/2014 14:50    01/01/2014 14:59    -14       14  560
    8       01/01/2014 14:58    01/01/2014 15:05    56        14  560

我希望为每笔交易找到在同一小时内但在该特定交易之前结束的所有其他交易的利润总和,并将其添加到交易时的权益中。因此,在给定的示例中,结果将是:

TradeNumber OpenTime              CloseTime       Profit    TradeHour   Equity
1           01/01/2014 13:10    01/01/2014 14:40    10         13   520
2           01/01/2014 13:25    01/01/2014 13:28    20         13   520
3           01/01/2014 13:29    01/01/2014 15:40    -50        13 520 + 20
4           01/01/2014 13:30    01/01/2014 14:05    -5         13   520 + 20
5           01/01/2014 14:12    01/01/2014 14:40    12         14   560
6           01/01/2014 14:21    01/01/2014 14:45    -16        14   560 - 5
7           01/01/2014 14:50    01/01/2014 14:59    -14        14   560+10-5+12-16
8           01/01/2014 14:58    01/01/2014 15:05    56         14   560+10-5+12-16

例如,交易编号 8 在 2014 年 1 月 1 日 14:58 开盘。在开盘前,该小时还有 4 笔其他交易(交易 1、4、5 和 6)关闭。因此,我想在一小时开始时将这 4 笔交易的利润添加到权益中,并将该数字放在交易数据的权益列中。

       for (i in 1:nrow(tradeData))
        {
          tradeData$EquityUSD1 [i] = tradeData$Equity [i] + sum(tradeData$Profit[tradeData$CloseTime <= tradeData$OpenTime[i] & tradeData$CloseTime >= tradeData$tradeHour[i,1]])
  }

这有效,但速度很慢,我想加快速度,因为有数万笔交易。

有什么想法吗?如果我遗漏了任何重要的内容,请告诉我 data/info

谢谢

还没有用更大的数据集测试速度..

dt
##   TradeNumber         OpenTime        CloseTime Profit TradeHour Equity
## 1           1 01/01/2014 13:10 01/01/2014 14:40     10        13    520
## 2           2 01/01/2014 13:25 01/01/2014 13:28     20        13    520
## 3           3 01/01/2014 13:29 01/01/2014 15:40    -50        13    520
## 4           4 01/01/2014 13:30 01/01/2014 14:05     -5        13    520
## 5           5 01/01/2014 14:12 01/01/2014 14:40     12        14    560
## 6           6 01/01/2014 14:21 01/01/2014 14:45    -16        14    560
## 7           7 01/01/2014 14:50 01/01/2014 14:59    -14        14    560
## 8           8 01/01/2014 14:58 01/01/2014 15:05     56        14    560

require(data.table)
setDT(dt)

dt[,OpenTime:=as.POSIXct(OpenTime,format="%m/%d/%Y %H:%M")]
dt[,CloseTime:=as.POSIXct(CloseTime,format="%m/%d/%Y %H:%M")]

dt[,Equity.new:=Equity+sum(dt$Profit[hour(OpenTime)==hour(dt$CloseTime) & OpenTime > dt$CloseTime]), by="TradeNumber"]

dt
##    TradeNumber            OpenTime           CloseTime Profit TradeHour Equity Equity.new
## 1:           1 2014-01-01 13:10:00 2014-01-01 14:40:00     10        13    520        520
## 2:           2 2014-01-01 13:25:00 2014-01-01 13:28:00     20        13    520        520
## 3:           3 2014-01-01 13:29:00 2014-01-01 15:40:00    -50        13    520        540
## 4:           4 2014-01-01 13:30:00 2014-01-01 14:05:00     -5        13    520        540
## 5:           5 2014-01-01 14:12:00 2014-01-01 14:40:00     12        14    560        555
## 6:           6 2014-01-01 14:21:00 2014-01-01 14:45:00    -16        14    560        555
## 7:           7 2014-01-01 14:50:00 2014-01-01 14:59:00    -14        14    560        561
## 8:           8 2014-01-01 14:58:00 2014-01-01 15:05:00     56        14    560        561

假设您的数据位于名为 tradedata:

的数据框中,以下代码似乎可以产生您想要的输出
ddply( tradedata , .(TradeHour) , 
       mutate, 
       Equity=Equity+ cumsum(Profit) - Profit ) 

如果您想包括特定交易的利润,请删除 -Profit。 您可以通过给 ddply .parallel=TRUE 选项并行 运行 这个。但是,使用 data.table 的答案可能会更快。看看哪个效果最好会很有趣。