【发布时间】:2015-11-09 14:23:26
【问题描述】:
我正在尝试根据相同的 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
其中weightedPrice 是sum(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)]
这是我的第一个问题,我试图使其高效,但如果它恰好是重复的,请告诉我,我非常愿意从上一个问题中学习。
【问题讨论】:
-
试试
setDT(testdata) [, list(avg_tte = sum(totalEquity)/sum(volume)), transactiontime] -
有一个
weighted.mean,sapply(split(testdata, testdata$transactiontime), function(x) weighted.mean(x$price, x$volume)) -
谢谢!两个论点都奏效了。 @ExperimenteR 更适合我对运行速度更快的需求,并且结果会生成数据表+框架。