我想将一个函数应用于价值 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 调用它。
这有两个问题:
- 天是天,不是交易日!因此,我得到的数据通常不到 4 周,而是不到 3 周。
- 截止时间是 UTC 午夜。我无法弄清楚如何将其更改为使用 22:00(或 21:00)截止。
更新:上面的问题1是错误的!XTS
endpoints
功能在交易日有效,而不是日历日。我不这么认为的原因是时区问题使它看起来像一个为期 6 天的交易周:周日到周五。一旦时区问题得到解决(见我的自我回答),使用width=20
并且on="days"
确实给了我 4 周的数据。
(通常很重要:当这 4 周内有交易假期时,我希望收到 4 周 1 天的数据,即总是正好 20 个交易日。)
我开始研究一个将数据切成几周的功能,以为我可以将它们分成五个 24 小时的块,但这感觉是错误的方法,肯定有人在我之前发明了这个轮子?