XTS:按交易日拆分FX日内酒吧数据

时间:2012-08-23 07:53:11

标签: r xts

我想将一个函数应用于20个交易日的小时外汇数据(作为众多的一个例子)。

我从rollapply(data,width=20*24,FUN=FUN,by=24)开始。这似乎运作良好,我甚至可以断言我总是有480条酒吧......直到我意识到这不是我想要的。由于夏令时和市场假期的变化,这些480条酒吧的开始和结束时间多年来一直在漂移。

所以,我想要的是一个功能,每天从22:00到22:00处理我们有数据的日期。 (N.Y。夏季21:00至21:00 - 我的数据时区为UTC,而daystart定义为美国东部时间下午5点)

所以,我自己制作了自己的rollapply函数:

 ep=endpoints(data,on=on,k=k) 
 sp=ep[1:(length(ep)-width)]+1
 ep=ep[(width+1):length(ep)]
 xx <- lapply(1:length(ep), function(ix) FUN(.subset_xts(data,sp[ix]:ep[ix]),...) )

然后我用on =“days”,k = 1和width = 20来调用它。

这有两个问题:

  1. 天是天,不是交易日!因此,我只获得不到3周的数据,而不是通常4周的数据。
  2. 截止时间是午夜UTC。我无法弄清楚如何更改它以使用22:00(或21:00)截止。
  3.   

    更新:上面的问题1错了! XTS endpoints函数 在交易日工作,而非日历日。我不这么认为的原因是时区问题让它看起来像是一个为期6天的交易   周:周日至周五。一旦时区问题得到解决(见我的   自我回答),使用width=20on="days"确实给了我4   几周的数据。

    通常重要的是:当这4周内有交易假期时,我希望收到4周1天的数据,即总是正好20个交易日。)

    我开始研究将数据切成几周的功能,以为我可以将它们切成五个24小时的块,但这感觉就像错误的方法,而且肯定有人在我之前发明了这个轮子?

1 个答案:

答案 0 :(得分:1)

以下是如何正确使用黎明:

x2=x
index(x2)=index(x2)+(7*3600)
indexTZ(x2)='America/New_York'

即。只需设置时区即可将黎明时间设为17:00;我们希望它在24:00,所以首先加7小时。

在以下帮助下: time zones in POSIXct and xts, converting from GMT in R

这是完整的功能:

rollapply_chunks.FX.xts=function(data,width,FUN,...,on="days",k=1){
data <- try.xts(data)

x2 <- data
index(x2) <- index(x2)+(7*3600)
indexTZ(x2) <- 'America/New_York'

ep <- endpoints(x2,on=on,k=k)    #The end point of each calendar day (when on="days").
    #Each entry points to the final bar of the day. ep[1]==0.

if(length(ep)<2){
    stop("Cannot divide data up")
}else if(length(ep)==2){  #Can only fit one chunk in.
    sp <- 1;ep <- ep[-1]
}else{
    sp <- ep[1:(length(ep)-width)]+1
    ep <- ep[(width+1):length(ep)]
}

xx <- lapply(1:length(ep), function(ix) FUN(.subset_xts(data,sp[ix]:ep[ix]),...) )
xx <- do.call(rbind,xx)   #Join them up as one big matrix/data.frame.

tt <- index(data)[ep]  #Implicit align="right". Use sp for align="left"
res <- xts(xx, tt)
return (res)
}

您可以看到我们使用已修改的索引来拆分原始数据。 (如果R在封面下使用copy-on-write,那么唯一的额外内存要求应该是索引的副本,而不是数据的副本。)

(法律位:请考虑在麻省理工学院获得许可,但如果需要,可以在GPL-2 XTS包中使用明确许可。)