R 使用lappy和split执行上一个勾号聚合
在过去的三个月里,我一直在努力解决这个问题。请帮忙 我有属于同一交易所的许多股票的滴答数据(价格和成交量)。每个股票在硬盘上都有自己的R 使用lappy和split执行上一个勾号聚合,r,aggregate,xts,lapply,R,Aggregate,Xts,Lapply,在过去的三个月里,我一直在努力解决这个问题。请帮忙 我有属于同一交易所的许多股票的滴答数据(价格和成交量)。每个股票在硬盘上都有自己的.rds文件。我有兴趣清理它: 通过取中间值合并多个相同的时间戳 仅用于exchange小时数的子集数据 通过上一次勾选聚合在20分钟内进行聚合 我知道 高频封装中的函数集合 可以执行上一个勾号聚合操作。但是,该函数只获取一个股票的一天数据 为了说明这个问题,我使用了单个股票的原始交易数据(命名交易) dput(head(trade,50)) struct
.rds
文件。我有兴趣清理它:
dput(head(trade,50))
structure(c(54.7, 54.7, 54.5, 54.5, 54.5, 54.6, 54.6, 54.65,
54.65, 54.6, 54.65, 54.65, 54.65, 54.65, 54.7, 54.7, 54.8, 54.8,
54.85, 54.85, 54.85, 54.85, 54.8, 54.8, 54.8, 54.8, 54.65, 54.65,
54.8, 54.8, 54.8, 54.8, 54.65, 54.65, 54.65, 54.75, 54.65, 54.7,
54.7, 54.7, 54.75, 54.75, 54.75, 54.75, 54.75, 54.7, 54.7, 54.7,
54.65, 54.65, 8, 542, 110, 600, 88, 200, 150, 100, 700, 250,
75, 100, 25, 200, 100, 600, 1546, 940, 100, 6250, 89, 6911, 89,
211, 100, 50, 1410, 1090, 913, 4737, 50, 300, 2486, 400, 25,
85, 250, 168, 50, 100, 40, 40, 60, 50, 40, 10, 91, 6072, 229,
1000), class = c("xts", "zoo"), .indexCLASS = c("POSIXct", "POSIXt"
), tclass = c("POSIXct", "POSIXt"), .indexTZ = "Asia/Calcutta", tzone = "Asia/Calcutta", index = structure(c(1459481853,
1459481853, 1459482302, 1459482302, 1459482305, 1459482306, 1459482306,
1459482307, 1459482307, 1459482308, 1459482312, 1459482314, 1459482314,
1459482315, 1459482317, 1459482317, 1459482318, 1459482318, 1459482319,
1459482319, 1459482320, 1459482320, 1459482322, 1459482322, 1459482330,
1459482330, 1459482331, 1459482331, 1459482336, 1459482336, 1459482337,
1459482337, 1459482338, 1459482338, 1459482339, 1459482340, 1459482344,
1459482348, 1459482351, 1459482351, 1459482356, 1459482357, 1459482357,
1459482361, 1459482362, 1459482364, 1459482367, 1459482367, 1459482369,
1459482369), tzone = "Asia/Calcutta", tclass = c("POSIXct", "POSIXt"
)), .Dim = c(50L, 2L), .Dimnames = list(NULL, c("value", "size"
)))
我使用以下代码以20分钟为间隔进行先前的勾号聚合:
require(xts)
require(highfrequency)
trade<-xts(trade[,-1], order.by = trade[,1])
trade2<-do.call(rbind, lapply(split(trade,"days"), mergeTradesSameTimestamp))
colnames(trade)[c(1,2)]<-c("PRICE", "SIZE")
trade2<-trade2["T09:30:00/T15:30:00"]
trade2<-trade2[,1]
fundo=function(x) aggregatets(FUN = previoustick,on="minutes",k=20, dropna =F)
请建议如何解决此错误。基于您提供的有限数据,此代码有效。您的错误是因为没有将对象传递给参数
ts
。(同样在你的样本数据中,没有一个滴答声发生在上午9:30之前,因此为了这个答案的再现性,我将其改为上午8:30。也就是说,trade2你能通过重新使用一些样本数据使你的示例再现吗?@Konrad我添加了一些数据,请参见。你正在引用的文件和文件名列表将失败all.st。)奥克斯。list@Konrad请参阅我使用的产生错误的代码。请详细说明这一点。感谢split(trade2,“days”)
产生错误;没有可用的对象传递给aggregates
。我们可以使用aggregateTrades()而不是aggregatets()吗?@runjumpfly我不明白你在问什么。lappy
可以使用任何有意义的函数。在你的情况下,只需相应地更新fundo
。fundo=function(x)aggregateTrades(tdata=x,FUN=“previoustick”,on=“minutes”,k=20,marketopen=“09:15:00”,marketclose=“15:30:00”)trade 3
trade3<-do.call(rbind, lapply(split(trade2, "days"), fundo))
trade3<-do.call(rbind, lapply(split(trade2, "days"), fundo))
Error in FUN != "previoustick" :
comparison (2) is possible only for atomic and list types
Called from: aggregatets(FUN = previoustick, on = "minutes", k = 20, dropna = F)
trade <- structure(c(54.7, 54.7, 54.5, 54.5, 54.5, 54.6, 54.6, 54.65,
54.65, 54.6, 54.65, 54.65, 54.65, 54.65, 54.7, 54.7, 54.8, 54.8,
54.85, 54.85, 54.85, 54.85, 54.8, 54.8, 54.8, 54.8, 54.65, 54.65,
54.8, 54.8, 54.8, 54.8, 54.65, 54.65, 54.65, 54.75, 54.65, 54.7,
54.7, 54.7, 54.75, 54.75, 54.75, 54.75, 54.75, 54.7, 54.7, 54.7,
54.65, 54.65, 8, 542, 110, 600, 88, 200, 150, 100, 700, 250,
75, 100, 25, 200, 100, 600, 1546, 940, 100, 6250, 89, 6911, 89,
211, 100, 50, 1410, 1090, 913, 4737, 50, 300, 2486, 400, 25,
85, 250, 168, 50, 100, 40, 40, 60, 50, 40, 10, 91, 6072, 229,
1000), class = c("xts", "zoo"), .indexCLASS = c("POSIXct", "POSIXt"
), tclass = c("POSIXct", "POSIXt"), .indexTZ = "Asia/Calcutta", tzone = "Asia/Calcutta", index = structure(c(1459481853,
1459481853, 1459482302, 1459482302, 1459482305, 1459482306, 1459482306,
1459482307, 1459482307, 1459482308, 1459482312, 1459482314, 1459482314,
1459482315, 1459482317, 1459482317, 1459482318, 1459482318, 1459482319,
1459482319, 1459482320, 1459482320, 1459482322, 1459482322, 1459482330,
1459482330, 1459482331, 1459482331, 1459482336, 1459482336, 1459482337,
1459482337, 1459482338, 1459482338, 1459482339, 1459482340, 1459482344,
1459482348, 1459482351, 1459482351, 1459482356, 1459482357, 1459482357,
1459482361, 1459482362, 1459482364, 1459482367, 1459482367, 1459482369,
1459482369), tzone = "Asia/Calcutta", tclass = c("POSIXct", "POSIXt"
)), .Dim = c(50L, 2L), .Dimnames = list(NULL, c("value", "size"
)))
# mergeTradesSameTimestamp wants "PRICE" column, so rename now:
colnames(trade) <- c("PRICE", "SIZE")
trade2<-do.call(rbind, lapply(split(trade,"days"), mergeTradesSameTimestamp))
trade2<-trade2["T08:30:00/T15:30:00"]
# Your error was from not passing through x to argument ts:
fundo=function(x) aggregatets(ts = x, FUN = "previoustick",on="minutes",k=20, dropna =F)
trade3<-do.call(rbind, lapply(split(trade2, "days"), fundo))