【发布时间】:2017-03-12 01:21:14
【问题描述】:
在过去的 3 个月里,我一直在努力解决这个问题。请帮忙。
我有属于一个交易所的许多股票的报价数据(价格和交易量)。每只股票在硬盘上都有自己的.rds 文件。我有兴趣清理它:
通过取中位数合并多个相同的时间戳
仅限交换时间的子集数据
按之前的刻度聚合在 20 分钟内聚合它
我知道
高频包中的函数聚合
可以执行之前的tick聚合操作。但是,该函数只取一只股票一天的数据。
为了演示这个问题,我使用单个股票的原始分时数据(命名交易)。
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)
由于 aggregatets() 只需要 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)
请建议如何解决此错误。
【问题讨论】:
-
你能用一些样本数据重新做你的例子吗?
-
@Konrad 我添加了一些数据,请参阅。
-
您正在引用将失败的文件和文件名列表
all.stocks.list<-list(); listofnames<- list.files(pattern="*.rds"); for(Q in 1:length(listofnames))没有这些文件可用。如果你重做这个问题,人们会更容易参与到这个问题中,这样它就可以被复制并粘贴到 R 脚本中。旁白,函数很简单:highfrequency::previoustick,返回a的最后一个元素。我猜它被传递给它并不适合简单的操作。查看传递对象的 class 并尝试a = as.vector(a); b = a[length(a)]。 -
@Konrad 请查看我使用的产生错误的代码。请详细说明一下。谢谢
-
split(trade2, "days")产生错误;没有可用的对象传递给aggregates。