时序数据处理tibbletime

#时序数据处理
library(tibbletime)
library(tidyverse)
# filter_time()函数:简洁的切片操作
# collapse_index()函数:根据时间(例如年、月、每两周等)对索引列进行分割,进而利用dplyr包的分组函数计算汇总数据
# as_period()函数:改变一个time tibble的时间间隔,让日数据变为周数据/月数据更为简单
# rolliyf()函数:滚动分析
# create_series()函数:快捷地创建tbl_time类型的时序数据
# 索引列完美支持Date和POSIXct类型,初步支持yearmon,yearqtr和hms类型。
data("FB")
#将常规的数据框转化为tbl_time
FB_tbl_time <- FB %>%
  as_tbl_time(index = date)

# 提取2013年3月至2015年的数据,这里`~`两边的时间/日期都包含在内
FB_tbl_time %>%
  filter_time(time_formula = '2013-03'~'2015')
# 提取2013年1月2日至2013年12月31日的数据
FB_tbl_time %>%
  filter_time(time_formula = "2013-01-02" ~ "2013-12-31")
# dplyr操作
# FB_tbl_time %>%
#   filter(date >= as.Date("2013-01-02"), date <= as.Date("2013-12-31"))
# 提取2013年一整年的数据
FB_tbl_time %>%
  filter_time(time_formula = "2013" ~ "2013")
FB_tbl_time %>%
  filter_time(time_formula = ~ "2013")
# 提取从序列开始到2015年的所有数据,包含2015年
FB_tbl_time %>%
  filter_time(time_formula = "start" ~ "2015")
# 提取从2015年到序列结束的所有数据,包含2015年
FB_tbl_time %>%
  filter_time(time_formula = "2015" ~ "end")

#对分组后的tbl_time对象进行取子集操作
data("FANG")
FANG %>%
  as_tbl_time(index = date) %>%
  group_by(symbol) %>%
  filter_time(time_formula = '2013-01-01' ~ '2013-01-04')

my_df <- tibble::tibble(
  date = lubridate::as_datetime(c("2018-01-05 20:54:16",
                                  "2018-01-05 20:54:18",
                                  "2018-01-05 20:55:54",
                                  "2018-01-05 20:54:24",
                                  "2018-01-05 20:55:44",
                                  "2018-01-05 20:54:34")), 
  x2 = rnorm(6)
)
#根据分钟/秒来提取子集
my_df %>%
  arrange(date) %>%
  as_tbl_time(index = date) %>%
  filter_time(time_formula = "2018-01-05 + 20:54:16" ~ "2018-01-05 + 20:54:44")

#tibbletime还支持常规的[操作
FB_tbl_time[~ "2013"]

# 将日数据转化为周数据
FB_tbl_time %>%
  as_period(period = "weekly", side = "start")
# 将日数据转化为月数据
FB_tbl_time %>%
  as_period("monthly", side = "end")
# 将日数据转化为季数据
FB_tbl_time %>%
  as_period(period = "quarterly", side = "start")
# 将日数据转化为年数据
FB_tbl_time %>%
  as_period(period = "yearly", side = "start")
# 将日数据转化为每4天一次
FB_tbl_time %>%
  as_period(period = "5 days", start_date = as.Date("2013-01-01"), side = "end"
     
#滚动计算     
# 计算5期的移动平均
mean_5 <- rollify(mean, window = 5) # `window`表示滚动窗口
tmp <- FB_tbl_time %>%
  mutate(roll_mean = mean_5(adjusted))
# 开盘价和收盘价均价的5期移动平均值
rolling_avg_sum <- rollify(~ mean(.x + .y), window = 5)
mutate(FB_tbl_time, avg_sum = rolling_avg_sum(open, close))

#创建tbl_time对象
# 创建一整年的数据,每2天为一个间隔
create_series(~'2013', period = '2 day')
# 2013年的日度数据
create_series(~'2013', period = 'daily')
# 2013年的季度数据
create_series(~'2013', period = '1 quarter')
# 2013年至2015年的季度数据
create_series('2013' ~ '2015', period = '1 day')
# 2012年1月至2012年2月每分钟的高频数据
create_series('2012-01' ~ '2012-02', period = '1 minute')
# 创建类型为`Date`的序列
create_series(~'2013', period = '1 day', class = "Date")
# 创建类型为`yearmon`的序列
create_series(~'2013', period = '1 month', class = "yearmon")
# 创建类型为`hms`的序列
# `time_formula`的格式为`HH:MM:SS`
create_series(time_formula = '00:00:00' ~ '12:00:00', period = '1 second' , class = "hms")

#分组操作
# 计算每个月的均值
FB_tbl_time %>%
  select(-symbol) %>%
  mutate(date = collapse_index(index = date, period = "monthly", side = "end")) %>%
  group_by(date) %>%
  summarise_all(mean)

# 等同于
FB_tbl_time %>%
  select(-symbol) %>%
  mutate(date = collapse_index(index = date, period = "1 month", side = "end")) %>%
  group_by(date) %>%
  summarise_all(mean)

#滚动回归
data("FB")
rolling_lm <- rollify(.f = function(close, high, low, volume) {
  lm(close ~ high + low + volume)
}, window = 5, unlist = FALSE)  # 将回归结果存储为一个`S3`对象
FB_reg <- mutate(FB, roll_lm = rolling_lm(close, high, low, volume))
FB_reg

评论

此博客中的热门博文

V2ray websocket(ws)+tls+nginx分流

Rstudio 使用代理