2015-01-23 11 views
2

У меня есть торговые данные следующим образом:R: агрегирование данных между событиями

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, например, открыт в 14:58 на 01/01/2014. До открытия было еще 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]]) 
    } 

Это работает, но довольно медленно, и я хотел бы, чтобы ускорить его, так как есть десятки тысяч сделок.

Любые идеи? Пожалуйста, дайте мне знать, если я опустил важные данные/информацию

Благодаря

+0

Функции окна 'dplyr' могут помочь вам http://cran.r-project.org/web/packages/dplyr/vignettes/window-functions.html – ckluss

ответ

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 
+0

Спасибо, отлично работает! – Mike

1

Следующий код кажется, производить вывод, который вы хотите, предполагая, что ваши данные в кадре данных называется tradedata:

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

Если вы хотите включить прибыль в данной отрасли торговли, удалите -Profit. Вы можете запустить это параллельно, указав ddply опцию .parallel=TRUE. Однако ответ с data.table может быть более быстрым. Было бы интересно посмотреть, какая из них лучше всего работает.

+0

Спасибо за ответ! Я пошел с решением таблицы данных выше, поскольку это кажется немного быстрее. Еще раз спасибо! – Mike

+0

Да, изучение таблиц данных, безусловно, лучший вариант. Это быстрое решение, однако, для тех, кому только нужно его реализовать! – dwcoder

Смежные вопросы