使用 lapply 执行先前的分时聚合并拆分
performing previous tick aggregation using lapply and split
过去 3 个月我一直在努力解决这个问题。请帮忙。
我有属于同一交易所的许多股票的报价数据(价格和数量)。每只股票在硬盘上都有自己的 .rds
文件。我有兴趣清理它:
取中位数合并多个相同的时间戳
仅交换时间的子集数据
通过之前的报价汇总在 20 分钟内对其进行汇总
我知道
function aggregatets in highfrequency package
可以执行之前的分时聚合操作。但是,该函数只需要一只股票一天的数据。
为了演示这个问题,我对单个股票使用原始报价数据(命名交易)。
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)
由于 aggreggets() 只需要 1 天的数据,我将 trade2 分成几天并将其应用于它们
trade3<-do.call(rbind, lapply(split(trade2, "days"), fundo))
但是我得到函数 aggregatets
:
的错误
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)
请建议如何解决此错误。
根据您提供的有限数据,此代码有效。您的错误是没有将对象传递给参数 ts
。 (同样在您的示例数据中,none 的滴答声发生在 9:30am 之前,因此为了该答案的可重复性,我将其更改为上午 8 点 30 分。即 trade2<-trade2["T08:30:00/T15:30:00"]
):
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))
过去 3 个月我一直在努力解决这个问题。请帮忙。
我有属于同一交易所的许多股票的报价数据(价格和数量)。每只股票在硬盘上都有自己的 .rds
文件。我有兴趣清理它:
取中位数合并多个相同的时间戳
仅交换时间的子集数据
通过之前的报价汇总在 20 分钟内对其进行汇总
我知道
function aggregatets in highfrequency package
可以执行之前的分时聚合操作。但是,该函数只需要一只股票一天的数据。
为了演示这个问题,我对单个股票使用原始报价数据(命名交易)。
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)
由于 aggreggets() 只需要 1 天的数据,我将 trade2 分成几天并将其应用于它们
trade3<-do.call(rbind, lapply(split(trade2, "days"), fundo))
但是我得到函数 aggregatets
:
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)
请建议如何解决此错误。
根据您提供的有限数据,此代码有效。您的错误是没有将对象传递给参数 ts
。 (同样在您的示例数据中,none 的滴答声发生在 9:30am 之前,因此为了该答案的可重复性,我将其更改为上午 8 点 30 分。即 trade2<-trade2["T08:30:00/T15:30:00"]
):
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))