我有大约50个数据集,包括5个交易所中10个货币对在30天时间内的所有交易。所有货币对属于同一资产类别,意味着它们具有强相关性,并且预计具有相似的属性,但处于不同的规模上。此类数据的一个例子如下:
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)))
大致上,我需要识别每天发生的相关局部极小值和极大值。黄色标记是我感兴趣的点。与此示例不同,通常每天只有一个这样的点,并且我将每天单独考虑。然而,过滤掉我的实际兴趣点中的噪音很难。我的实际目标是找到成对资产开始跳跃的确切点以及跳跃结束的确切点。这需要尽可能准确,因为我想观察哪种资产先移动,哪种资产在哪个时间点后跟随(如上所述,它们高度相关)。在两个极值之间,我想最小化距离并最大化相对/绝对变化,因为我的兴趣点通常彼此靠近,它们的差异相当大。
我已经查看了其他类似的问题,例如寻找局部最大值和最小值和定位局部极大值的算法以及这个有着相同目标的算法。然而,我的数据集非常嘈杂。我已经将数据集减少到5分钟间隔,但这导致省略了识别局部极小值和极大值函数中的相关点。因此,这不是一个对我的目标有益的解决方案。
如何使用相当精确的算法实现我的目标?手动浏览所有时间序列不是一个选项,因为这需要我手动评估50 * 30个时间序列,这太耗时了。我很困惑,正在尝试找到一个合适的解决方案已经一个星期了。
如果需要更多的代码片段,我很乐意分享,但它们并没有给我有意义的结果,这与提供一个最小工作示例的想法相反,因此我决定暂时将它们留出来。
编辑:
首先,我更新了绘图并添加了数据集的时间戳以让您了解(实际分辨率)。理想情况下,算法将检测到左侧的两个跳跃点。内部的两个点因为它们更接近且没有拦截而跳跃,而外部的点因为值更极端。事实上,这也回答了算法是否允许看到未来的问题。是的,如果在范围内有另一个局部极值点,比如说30个观察值(或30分钟)之内,则忽略中间的局部极值点。 在我的数据中,跳跃大小从2%-〜15%不等,因此需要至少为2%才能考虑跳跃。只有在达到相同方向上15(可能是可适应的)个连续步骤的峰和谷之前/之后的阈值时才考虑。非常幼稚的方法是将数据分成一天的全局最小值和最大值的子集。在大多数情况下,这样会使数据去噪并起到指示作用。然而,当全局极值不在跳跃范围内时,这种方法并不稳健。
希望这澄清了为什么这不是统计问题(有一些测试可以确定是否发生了跳跃,但不知道跳跃到达时间的测试)。
如果有人需要一个真实的例子: this 是相应的图表,this 是相关时期的原始数据,this 是精简数据集。