R语言中金融日内时间序列顺序事件检测方案咨询
检测R中时间序列的顺序事件:tidyverse实现方案
刚接触R不久就能用tidyverse处理金融时间序列,这点真的很不错!针对你要检测的「事件X发生后、事件Z发生前出现事件Y」的需求,其实用tidyverse自带的工具就能简洁实现,完全不需要额外安装包。我用你提供的示例数据来一步步拆解说明:
首先先加载数据(记得先加载tidyverse包):
library(tidyverse) df <- tribble( ~t, ~price, ~level1, ~level2, ~level3, as.POSIXct(strptime("2011-03-27 08:00:00", "%Y-%m-%d %H:%M:%S")), 5, 6, 8, 0, as.POSIXct(strptime("2011-03-27 09:00:00", "%Y-%m-%d %H:%M:%S")), 7, 6, 8, 0, as.POSIXct(strptime("2011-03-27 10:00:00", "%Y-%m-%d %H:%M:%S")), 9, 6, 8, 0, as.POSIXct(strptime("2011-03-27 11:00:00", "%Y-%m-%d %H:%M:%S")), 0, 6, 8, 0 )
第一步:标记每个时间点的事件状态
先把三个事件(X/Y/Z)转换成布尔值,方便后续判断:
df <- df %>% mutate( event_X = price > level1, # 事件X:价格突破level1 event_Y = price > level2, # 事件Y:价格突破level2 event_Z = price <= level3 # 事件Z:价格跌破或等于level3 )
第二步:核心逻辑:判断事件顺序
我们需要锁定「X发生后、Z发生前」的时间窗口,然后检查这个窗口内是否出现过Y。用tidyverse的累积函数就能高效实现:
result <- df %>% # 标记X发生后的所有时间点:一旦X出现,后续所有行都标记为TRUE mutate(after_X = cumsum(event_X) >= 1) %>% # 标记Z发生前的所有时间点:在第一个Z出现前,都标记为TRUE mutate(before_Z = cumsum(event_Z) == 0) %>% # 筛选出同时满足「X之后、Z之前」的时间段 filter(after_X & before_Z) %>% # 判断这段时间内是否有Y发生 summarise(condition_met = any(event_Y)) # 查看结果 result$condition_met # 输出:TRUE,和你示例中的预期一致
逻辑解释
cumsum(event_X)会对事件X的布尔值累积求和:一旦有一个event_X为TRUE,后续的累积和就会≥1,这样after_X就能精准标记X发生后的所有时间点。cumsum(event_Z) == 0则是在第一个Z事件发生前,保持TRUE,一旦Z出现,累积和变成1,之后的行就会被排除。- 最后用
any(event_Y)检查筛选出的窗口内是否存在Y事件,直接得到我们需要的结果。
扩展:处理多组独立序列
如果你的数据包含多个交易日或者多个独立的事件周期,可以通过分组来批量检测:
# 假设数据有多个日期,按日期分组检测每个区间的情况 df %>% mutate(date = as.Date(t)) %>% group_by(date) %>% mutate( after_X = cumsum(event_X) >= 1, before_Z = cumsum(event_Z) == 0 ) %>% filter(after_X & before_Z) %>% summarise(condition_met = any(event_Y))
额外提示
如果需要更复杂的规则(比如Y必须在X发生后的N个时间步内出现,或者Y需要连续出现多次),可以调整逻辑:比如用which(event_Y)定位Y的位置,再和X、Z的位置做对比,或者用roll_sum之类的滑动窗口函数来检测连续事件。
内容的提问来源于stack exchange,提问作者TommyF
相关产品推荐
相关产品推荐

