如何在 R 中按 TimeDate 组计算条件平均值(成交量加权)?

How to Calculate Conditional Average (Volume Weighted) by TimeDate Group in R?

我正在尝试根据相同的 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

其中 totalEquity 是由 workdata$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 分组。

我搜索了很多关于组均值的问题,但不知道如何正确组合每个函数; none 我之前的尝试成功了,如下所示,我非常沮丧:

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

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

完成所有尝试。

而不是 aggregate 试试 by:

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

这将 return 只是 weightedPrice 列中的值 - 由您将其添加到数据框。

我推荐 plyrdata.frame

library(plyr)
ddply(workdata, .(transactiontime), summarize,
      weightedPrice=sum(totalEquity)/sum(volume))

summarize 函数计算一些汇总统计数据,ddply 为每个唯一的 transactiontime 调用 summarize。计算有点像 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]