如何在 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
其中 weightedPrice
是 sum(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
列中的值 - 由您将其添加到数据框。
我推荐 plyr
或 data.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]
我正在尝试根据相同的 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
分组。
我搜索了很多关于组均值的问题,但不知道如何正确组合每个函数; 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
列中的值 - 由您将其添加到数据框。
我推荐 plyr
或 data.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]