R cut - 标签具有前瞻偏差

Posted

技术标签:

【中文标题】R cut - 标签具有前瞻偏差【英文标题】:R cut - labels have look-ahead bias 【发布时间】:2021-09-04 09:21:45 【问题描述】:

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

我有分钟柱数据,我想对 15 个柱进行分组并对它们执行一个函数,然后生成 15 分钟柱数据。我得到的时间戳是期间的开始而不是结束。我在cut() 中尝试了rightinclude.lowest 参数,但这似乎不起作用。我还尝试了一些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 来自高频。问题是他们计算 *daily( 实现的方差。我想在不同的时间段内执行此操作(例如每小时实现的方差)。实现的方差只是回报的平方和一个周期(例如 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 分钟的简单方法会导致整个时间分量错位。

【问题讨论】:

值增加 14 秒 @HongOoi 您的意思是在时间值上增加 14 分钟?好的,看起来可以,但我觉得这样做有点脏。 【参考方案1】:

一个天真的答案是:

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"))

【讨论】:

如果我重新定义以下内容,那么求和会导致整个事情错位: 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)) 您不想仅仅更改cut 的标签吗? 我愿意,但不幸的是,在这种情况下,它必须对齐 N 分钟边界,即 15 分钟边界。碰巧我给出的示例从一个边界开始,因此添加 14 分钟的方法会将每个剪辑移动到正确的位置。如果数据不是从边界开始怎么办?如果从 3 分钟后开始,则晋级将不是 0-14、15-29、30-44、45-59,而是 3-17、18-32、33-47、48-02 您是否尝试像在编辑 1 中那样指定您想要的休息时间。这通常是一个很好的解决方案。 指定中断是否能解决您的问题?

以上是关于R cut - 标签具有前瞻偏差的主要内容,如果未能解决你的问题,请参考以下文章

具有前瞻性的 AWS WAF 正则表达式问题

URL 检测和 BB 样式标签(正则表达式、前瞻问题)

sed:具有反向前瞻匹配的嵌套组

否定前瞻断言在python中不起作用[重复]

JS 正则表达式否定匹配(正向前瞻)

SentinelOne在Gartner 2021年端点防护平台关键能力调查中获得A类用例(“具有前瞻性的”组织)最高分