首页 > 解决方案 > R cut - 标签具有前瞻偏差

问题描述

我就是无法让这种微不足道的行为发挥作用。我已经包含了很多例子来说明这个问题。

我有分钟柱数据,我想对 15 个柱进行分组并对它们执行一个函数,然后生成 15 分钟柱数据。我得到的时间戳是期间的开始而不是结束。我尝试了rightandinclude.lowest参数,cut()但这似乎不起作用。我还尝试了一些dplyr排列,但无法使其正常工作。

set.seed(4984)
dat = data.frame(time=seq(as.POSIXct("2016-05-01"), as.POSIXct("2016-05-01") + 60*99, by=60),
                 ret=rnorm(100))
dat$by15 = cut(dat$time, breaks="15 min")
dat.summary = aggregate(ret ~ by15, FUN=sum, data=dat)


> head(dat)
                 time        ret
1 2016-05-01 00:00:00 -0.1739740
2 2016-05-01 00:01:00  0.2906288
3 2016-05-01 00:02:00 -1.0067554
4 2016-05-01 00:03:00  0.3887459
5 2016-05-01 00:04:00  0.2865937
6 2016-05-01 00:05:00 -0.4570531

并汇总:

> head(dat.summary)
                 by15        ret
1 2016-05-01 00:00:00  0.6711667
2 2016-05-01 00:15:00 -1.4344507
3 2016-05-01 00:30:00  3.0797471
4 2016-05-01 00:45:00  3.7564378
5 2016-05-01 01:00:00 -2.1308232
6 2016-05-01 01:15:00 -3.7179450

问题是时间戳被视为周期的开始。在上面的示例中,dat.summary应该如下所示:

> head(dat.summary)
                 by15        ret
1 2016-05-01 00:14:00  0.6711667
2 2016-05-01 00:29:00 -1.4344507
3 2016-05-01 00:44:00  3.0797471
4 2016-05-01 00:59:00  3.7564378
5 2016-05-01 01:14:00 -2.1308232
6 2016-05-01 01:29:00 -3.7179450

更长的故事如下。我想计算实现的方差。R中有一个功能:rRealizedVariance来自实现的包和rRVar高频。问题是他们计算*每天(实现的方差。我想在不同的时间段(例如每小时实现的方差)执行此操作。实现的方差只是一段时间内(例如 60 分钟)回报的平方和. 在python中,每日实现方差计算为:

    return returns.resample('D').agg(lambda x: x.pow(2).sum())

我可以在 60 分钟的基础上计算它:

    return returns.resample('60min').agg(lambda x: x.pow(2).sum())

我正试图让它在 R 中工作。

编辑:我想在 15 分钟边界上对齐时间,例如,如果dat不是从干净的 15 分钟边界点开始:

dat = data.frame(time=seq(as.POSIXct("2016-05-01 00:03:00"), as.POSIXct("2016-05-01 00:03:00") + 60*99, by=60),
                 ret=rnorm(100))

添加 14 分钟的简单方法会导致整个时间组件错位。

标签: rxtscran

解决方案


一个天真的答案是:

set.seed(4984)
dat = data.frame(time=seq(as.POSIXct("2016-05-01"), as.POSIXct("2016-05-01") + 60*99, by=60),
                 ret=rnorm(100))
dat$by15 = cut(dat$time, breaks="15 min")

# add 14 minutes
dat$by15 <- as.POSIXct(as.character(dat$by15)) + 60 * 14

dat.summary = aggregate(ret ~ by15, FUN=sum, data=dat)

编辑 1:

min_date <- "2016-05-01"
max_date <- "2016-06-01"
dat$by15 = cut(dat$time, breaks=seq(as.POSIXct(paste(min_date, "00:00:00")),
                                    as.POSIXct(paste(max_date, "00:15:00")), by = "15 min"))

推荐阅读