R 寻找连续运行
我有一个包含股票价格的数据框,比如:R 寻找连续运行,r,R,我有一个包含股票价格的数据框,比如: id date price 1 2/3/2016 4 1 2/4/2016 4.2 1 2/5/2016 3 2 2/4/2016 3 2 2/5/2016 4.1 2 2/6/2016 3 . . . . . . . . . 然而,并非所有股票
id date price
1 2/3/2016 4
1 2/4/2016 4.2
1 2/5/2016 3
2 2/4/2016 3
2 2/5/2016 4.1
2 2/6/2016 3
. . .
. . .
. . .
然而,并非所有股票都涵盖同一时间段,因为公司离开并加入交易所。我希望将我的数据子集为一个连续的时间序列,忽略周末。我面临着股票数量和时间长度之间的权衡,即时间序列越长,整个序列中可用数据的公司就越少
我相信挑选一个系列的最佳方法是,它包含一个股票运行的开始日期和一个可能不同的股票运行的结束日期。任何其他时间段都不会使时间覆盖率最大化。最后,我期待一个包含可能的开始日期、结束日期和公司数量的数据框架。然后我可以决定哪个时间范围最合适
我希望这是明确的,请让我知道,如果有任何澄清是必要的
编辑:这应该有帮助。这是一个粗略的数据框架
date1 <- seq(as.Date("2006/1/1"), as.Date("2010/1/1"), "days")
date2 <- seq(as.Date("2006/6/12"), as.Date("2008/1/1"), "days")
date3 <- seq(as.Date("2009/10/11"), as.Date("2010/12/1"), "days")
date4 <- seq(as.Date("2002/1/1"), as.Date("2007/1/13"), "days")
row_to_drop1 <- !(weekdays(as.Date(date1)) %in% c('Saturday','Sunday'))
row_to_drop2 <- !(weekdays(as.Date(date2)) %in% c('Saturday','Sunday'))
row_to_drop3 <- !(weekdays(as.Date(date3)) %in% c('Saturday','Sunday'))
row_to_drop4 <- !(weekdays(as.Date(date4)) %in% c('Saturday','Sunday'))
date1 <- date1[row_to_drop1]
date2 <- date2[row_to_drop2]
date3 <- date3[row_to_drop3]
date4 <- date4[row_to_drop4]
mydf <- rbind.data.frame(data.frame(id = 1, date = date1),data.frame(id=2,date=date2),data.frame(id=2,date=date3),data.frame(id=3,date=date4))
OFID只是编造出来的,但希望它能让人明白这一点。某些行将被删除,因为开始日期不能大于结束日期
以下是开始日期与所有结束日期的运行组合:
start end
1/1/2006 1/1/2010
6/12/2006 1/1/2010
10/11/2009 1/1/2010
1/1/2002 1/1/2010
1/1/2006 1/1/2008
6/12/2006 1/1/2008
1/1/2002 1/1/2008
1/1/2006 12/1/2010
6/12/2006 12/1/2010
10/11/2009 12/1/2010
1/1/2002 12/1/2010
1/1/2006 1/13/2007
6/12/2006 1/13/2007
1/1/2002 1/13/2007
这应该是14x3ids=42行。这里有两种汇总数据的方法。首先,你需要做一个市场何时开放的向量;这里我只使用工作日,但现实生活中的日历往往更复杂。获取这种向量的一个简单方法是,从quantmod或类似工具中提取你所知道的在该交易所持续交易的指数的数据,并提取日期
library(dplyr) # Use another grammar if you prefer
# Make a vector of dates the market is open
mkt_open <- seq(min(mydf$date), max(mydf$date), '1 day')
mkt_open <- mkt_open[!(weekdays(mkt_open) %in% c('Saturday','Sunday'))]
如果您只关心公司交易的运行情况,请使用filtertrading%>%选择交易
按交易公司数量运行
如果您更关心的是交易公司的数量,而不是单个交易,则可以首先聚合ID:
你想要的输出是什么?只是每个id的日期范围?这只是一个简单的聚合。@列出所有可能的范围以及该范围可用的id数。一个可能的范围是一个股票连续延伸的一对开始-结束日期,但不一定是同一个股票,我需要取所有开始和结束日期的笛卡尔乘积。你如何定义连续的?市场开放几天?这将需要另一个数据集,否则您必须从现有数据中推断出来。您应该编辑示例以使其生效,包括示例数据的所需结果。@alistaire连续的天数是市场开放的天数,这是除周末以外的所有天数。我已经编辑了我的示例,希望现在应该更清楚了。谢谢。好多了,但是大多数市场也因为一些假期而关闭。如果你能生成一个市场开放日向量,你可以检查每个id的开放日是否都在日期内,然后打电话给rle查看结果,看看最长的期限是多少。我想我从这里得到了它。在过滤交易==true后,我可以使用mydf$start并将其与mydf$stop交叉。然后,我将其与mydf交叉,并检查它是否在范围内。谢谢将%>%ungroup%%>%filtertrading%%>%selectstart,end%%>%unlist%%>%unique%%>%combn2%%>%。,[1,]<[2,]]]%%>%t%%>%作为数据帧%>%setNamesc'start',end%%>%mutate\u allas.Date%%>%arrangestart,end到第一个?我不知道你在寻找这些系列的产品。Max公司活跃吗?敏?这可能是更有用的,使一些可视化,以便您可以看到发生了什么。
library(dplyr) # Use another grammar if you prefer
# Make a vector of dates the market is open
mkt_open <- seq(min(mydf$date), max(mydf$date), '1 day')
mkt_open <- mkt_open[!(weekdays(mkt_open) %in% c('Saturday','Sunday'))]
mydf %>% mutate(trading = TRUE) %>% # Add index column which will add NAs in join
# Insert missing dates for each id
full_join(crossing(id = unique(.$id), date = mkt_open)) %>%
mutate(trading = coalesce(trading, FALSE)) %>% # Replace NAs with FALSE
group_by(id) %>%
arrange(date) %>% # Sort by date before calculating runs
group_by(run_id = data.table::rleid(trading), trading, add = TRUE) %>% # Add ID to separate runs
summarise(run_length = n(), # Count rows per group
start = min(date),
end = max(date))
#> Source: local data frame [9 x 6]
#> Groups: id, run_id [?]
#>
#> id run_id trading run_length start end
#> <dbl> <int> <lgl> <int> <date> <date>
#> 1 1 1 FALSE 1044 2002-01-01 2005-12-30
#> 2 1 2 TRUE 1045 2006-01-02 2010-01-01
#> 3 1 3 FALSE 238 2010-01-04 2010-12-01
#> 4 2 1 FALSE 1159 2002-01-01 2006-06-09
#> 5 2 2 TRUE 407 2006-06-12 2008-01-01
#> 6 2 3 FALSE 463 2008-01-02 2009-10-09
#> 7 2 4 TRUE 298 2009-10-12 2010-12-01
#> 8 3 1 TRUE 1314 2002-01-01 2007-01-12
#> 9 3 2 FALSE 1013 2007-01-15 2010-12-01
mydf %>% group_by(date) %>%
summarise(no_ids = n_distinct(id)) %>% # Count ids per date
full_join(data.frame(date = mkt_open)) %>% # Add any dates w/o trading
mutate(no_ids = coalesce(no_ids, 0L)) %>% # Fill NAs for days w/o trading with 0
arrange(date) %>%
group_by(run_id = data.table::rleid(no_ids), no_ids) %>%
summarise(run_length = n(),
start = min(date),
stop = max(date))
#> Source: local data frame [7 x 5]
#> Groups: run_id [?]
#>
#> run_id no_ids run_length start stop
#> <int> <int> <int> <date> <date>
#> 1 1 1 1044 2002-01-01 2005-12-30
#> 2 2 2 115 2006-01-02 2006-06-09
#> 3 3 3 155 2006-06-12 2007-01-12
#> 4 4 2 252 2007-01-15 2008-01-01
#> 5 5 1 463 2008-01-02 2009-10-09
#> 6 6 2 60 2009-10-12 2010-01-01
#> 7 7 1 238 2010-01-04 2010-12-01