【问题标题】:How to Calculate Conditional Average (Volume Weighted) by TimeDate Group in R?如何在 R 中按 TimeDate 组计算条件平均值(体积加权)?
【发布时间】: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

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

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

【问题讨论】:

  • 试试setDT(testdata) [, list(avg_tte = sum(totalEquity)/sum(volume)), transactiontime]
  • 有一个weighted.meansapply(split(testdata, testdata$transactiontime), function(x) weighted.mean(x$price, x$volume))
  • 谢谢!两个论点都奏效了。 @ExperimenteR 更适合我对运行速度更快的需求,并且结果会生成数据表+框架。

标签: r aggregate mean


【解决方案1】:

结束所有尝试。

代替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 为每个唯一的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]

【讨论】:

  • 我完成了您提供的步骤,它们真的很有帮助。感谢详细教学!非常感谢! :)
猜你喜欢
  • 2012-06-14
  • 1970-01-01
  • 2010-10-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-09
  • 2015-12-10
  • 1970-01-01
相关资源
最近更新 更多