通过算法检测时间序列中的跳跃

时间:2019-05-07 17:41:23

标签: r algorithm optimization finance quantitative-finance

我有大约50个数据集,其中包括30个交易日内5个交易所中约10对的所有交易。所有对都属于同一资产类别,这意味着它们之间具有很强的相关性,并期望具有相似的属性,但是规模不同。这种数据的一个例子是

set.seed(1)

n <- 1000
dates <- seq(as.POSIXct("2019-08-05 00:00:00", tz="UTC"), as.POSIXct("2019-08-05 23:59:00", tz="UTC"), by="1 min")
x <- data.frame("t" = sort(sample(dates, 1000)),"p" = cumsum(sample(c(-1, 1), n, TRUE)))

Plot example

大约,我需要确定每天都会发生的相关局部最小值和最大值。黄色标记是我的关注点。与本示例不同,通常每天只有一个这样的点,我每天分别考虑。但是,很难从我的实际兴趣点中滤除噪声。

我的实际目标是找到那对开始跳跃的确切点和跳跃结束的确切点。这需要尽可能准确,因为我想观察哪个资产先移动,然后哪个资产在哪个时间点移动(如上所述,它们之间是高度相关的)。 在两个极限值之间,我想最小化距离并最大化相对/绝对变化,因为我的兴趣点通常彼此靠近并且它们之间的差异很大。

我已经看过其他问题,例如 Finding local maxima and minimaAlgorithm to locate local maxima以及具有相同目标的this算法。但是,我的数据集非常嘈杂。我已经将数据集缩短为5分钟间隔,但是,这导致省略了函数中的相关点以标识局部最小值和最大值。因此,鉴于我的目标,这不是一个很好的解决方案。

如何使用相当精确的算法实现我的目标?手动浏览所有时间序列不是一种选择,因为这将需要我手动评估50 * 30时间序列,这太浪费时间了。我真的很困惑,想寻找一个合适的解决方案一个星期。

如果需要更多代码片段,我很乐意分享,但是它们没有给我带来有意义的结果,这与提供最小工作示例的想法相反,因此,我决定暂时将它们省略

编辑: 首先,我更新了绘图并向数据集中添加了时间戳,以使您有所了解(实际分辨率)。理想情况下,该算法将检测左侧的两个跳跃。内部的两个点是因为它们靠得更近并且跳跃而不会被遮挡,而外部的两个点是因为它们的值更极端。实际上,这也许可以回答以下问题:该算法是否被允许展望未来。是的,如果存在另一个局部极值,例如30次观察(或30分钟),请忽略中间局部极值。 在我的数据中,跳跃幅度从2%到〜15%,因此必须考虑至少2%的跳跃幅度。并且只有在达到峰值和谷值之前/之后,在同一方向上连续进行15个阈值(这可能是可调整的)时。

一种非常幼稚的方法是在一天的全局最小值和最大值之间子集数据。在大多数情况下,这已对数据进行了去噪处理并作为指标。但是,当全局极值不在跳跃范围内时,这是不可靠的。

希望这可以弄清为什么这不是一个统计问题(有一些测试可以确定是否发生了跳跃,但不能确定跳跃到达时间afaik)。


如果有人想要一个真实的例子: this是对应的图,this是相关时期的原始数据,this是精简数据集。


1 个答案:

答案 0 :(得分:1)

也许作为起点,请看函数streaksPMwR包中(我维护)。条纹是 定义为指定大小的移动,即 不受大小相同的反缝的干扰。的 函数适用于收益,而不是差异,所以我添加 100。

例如:

set.seed(1)
n <- 1000
x <- 100 + cumsum(sample(c(-1, 1), n, TRUE))

plot(x, type = "l")
s <- streaks(x, 0.12, -0.12)
abline(v = s[, 1])
abline(v = s[, 2])

垂直线显示条纹的开始和结束。

Streaks

然后,您可以按照所需的条件(例如长度)来筛选已识别的条纹。要么 您可能会玩起不同的门槛 上下移动(尽管实际上不建议这样做 在当前的实现中,但也许结果 足够好)。例如,向上条纹可能如下所示。绿色垂直线表示开始出现条纹;红线显示其结束。

plot(x, type = "l")
s <- streaks(x, up = 0.12, down = -0.05)
s <- s[!is.na(s$state) & s$state == "up", ]
abline(v = s[, 1], col = "green")
abline(v = s[, 2], col = "red")

Up streaks