【问题标题】:R: aggregating data between eventsR:在事件之间聚合数据
【发布时间】:2015-03-22 12:01:49
【问题描述】:

我的交易数据如下:

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]])
  }

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

有什么想法吗?如果我遗漏了任何重要数据/信息,请告诉我

谢谢

【问题讨论】:

标签: r aggregate


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    假设您的数据位于名为tradedata 的数据框中,以下代码似乎产生了您想要的输出:

    ddply( tradedata , .(TradeHour) , 
           mutate, 
           Equity=Equity+ cumsum(Profit) - Profit ) 
    

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

    【讨论】:

    • 感谢您的回答!我选择了上面的数据表解决方案,因为它看起来要快一些。再次感谢!
    • 是的,学习数据表绝对是最好的选择。不过,对于只需要实施一次的任何人来说,这是一个快速解决方案!
    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-24
    • 1970-01-01
    • 2015-06-28
    相关资源
    最近更新 更多