我正在尝试根据相同的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)]
这是我的第一个问题,我试图让它变得有效,但如果碰巧重复,请告诉我,我非常愿意从上一个问题中学习。
答案 0 :(得分:0)
关闭所有尝试。
而不是aggregate
尝试by
:
by(workdata, workdata$transactiontime, function (x) sum(x$totalEquity)/sum(x$volume))
这将只返回weightedPrice
列中的值 - 由您决定是否将其添加到数据框中。
我推荐plyr
或data.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]