【问题标题】:XTS: split FX intraday bar data by trading daysXTS:按交易日分割外汇盘中柱数据
【发布时间】:2012-08-23 07:53:11
【问题描述】:

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

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

所以,我想要的是一个函数,它将一天视为我们有数据的每一天的 22:00 到 22:00。 (纽约夏令时 21:00 到 21:00 - 我的数据时区是 UTC,开始时间是美国东部时间下午 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. 天以天为单位,而不是交易日!因此,我获得的数据通常不到 4 周,而通常不到 3 周。
  2. 截止时间为 UTC 午夜。我不知道如何将其更改为使用 22:00(或 21:00)截止时间。

更新:上面的问题1是错误的! XTS endpoints 函数确实在交易日工作,而不是日历日。我不这么认为的原因是时区问题使它看起来像一个 6 天的交易 周:周日至周五。修复时区问题后(请参阅我的 自我回答),使用 width=20on="days" 确实给了我 4 数周的数据。

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

我开始研究一个将数据分成几周的函数,我想我可以将它们分成五个 24 小时的块,但这感觉是错误的方法,肯定有人在我之前发明了这个轮子? em>

【问题讨论】:

  • 不确定这有多大帮助,但您可以在 splitting 几天之前按一天中的时间进行子集。假设一天结束是EOD &lt;- "22:00:00"。一种(不是非常有效的)方法来获得当天的端点是dep &lt;- index(do.call(rbind, lapply(split(dat[paste0("T00:00:00/T", EOD)], 'days'), 'last')))

标签: r xts


【解决方案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)
}

您可以看到我们使用 modified 索引来拆分 原始 数据。 (如果 R 在后台使用写时复制,那么唯一的额外内存需求应该是索引的副本,而不是数据的副本。)

(法律位:请认为它在 MIT 下获得许可,但如果需要,请明确允许在 GPL-2 XTS 包中使用。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-04
    • 2014-04-05
    相关资源
    最近更新 更多