如何计算R中TimeDate Group的条件平均值(体积加权)?

时间:2015-08-17 02:43:30

标签: r aggregate mean

我正在尝试根据相同的DateTime组从交易数据计算成交量加权平均价格(VWAP)。来自小数据框(20,000个条目)的样本数据如下:

testdata[,c(5,8,10,11)]
               transactiontime price volume totalEquity
334 2014-12-01 01:30:00.110000 19330 500000      966500
335 2014-12-01 01:30:00.830000 19340   8000       15472
336 2014-12-01 01:30:00.830000 19340   1000        1934
337 2014-12-01 01:30:00.830000 19340   1000        1934
338        2014-12-01 01:30:01 19340    500         967
339        2014-12-01 01:30:01 19340   2000        3868
340        2014-12-01 01:30:01 19340   4000        7736
341        2014-12-01 01:30:01 19340  40000       77360
342        2014-12-01 01:30:01 19340 500000      967000
343        2014-12-01 01:30:01 19340  12000       23208

其中totalEquityworkdata$totalEquity <- (workdata$price)/10000 * (workdata$volume)

添加的列

我想按交易时间计算VWAP。使用aggregate很容易计算mean(totalEquity),但如何计算体积加权平均值,以实现以下目标:

group.1            transactiontime weightedPrice
1       2014-12-01 01:30:00.110000         1.933
2       2014-12-01 01:30:00.830000         1.934
3              2014-12-01 01:30:01         1.934

其中weightedPricesum(totalEquity)/sum(volume),按transactiontime分组。

我搜索了关于群体平均值的许多问题,但不知道如何正确地组合每个功能;我以前的尝试都没有起作用,如下所示,我非常沮丧:

volWeighted <- function(x=workdata$totalEquity,y=workdata$volume) {sum(x)/sum(y)}
aggregate(totalEquity~transactiontime, testdata, FUN=volWeighted)

library(data.table)
dt[,list(avg_tte <- sum(testdata$totalEquity)/sum(testdata$volume)),
'testdata$transactiontime']

setDT(testdata) [, time.diff :=max(time)-min(time), by=transactiontime]
                [, if(time.diff==0)
                      .( totalEquity = sum(totalEquity)/sum(volume))
                    else .SD, by = .(transactiontime, time.diff)]

这是我的第一个问题,我试图让它变得有效,但如果碰巧重复,请告诉我,我非常愿意从上一个问题中学习。

1 个答案:

答案 0 :(得分:0)

关闭所有尝试。

而不是aggregate尝试by

by(workdata, workdata$transactiontime, function (x) sum(x$totalEquity)/sum(x$volume))

这将只返回weightedPrice列中的值 - 由您决定是否将其添加到数据框中。

我推荐plyrdata.frame

之类的内容
library(plyr)
ddply(workdata, .(transactiontime), summarize,
      weightedPrice=sum(totalEquity)/sum(volume))

summarize函数会为每个唯一ddply计算一些摘要统计信息和summarize次调用transactiontime。计算有点像transform函数,如果你写weightedPrice=sum(totalEquity)/sum(volume),它会计算查找workdata中的列的表达式(因此不需要workdata$columnname),并指定它是一个名为weightedPrice的列。

如果data.table

library(data.table)
setDT(workdata) # turn workdata into data.table
workdata[, list(weightedPrice=sum(totalEquity)/sum(volume)), by=transactiontime]