y_symbol(
mapping = aes(
x = date, y = adjusted, color = symbol)) +
labs(
title = "Periodicity Change from Daily to Monthly") +
geom_point()
让我们提升一个档次。那么每两个月一次呢? 只需使用函数标记 2 m
即可。
# Convert from daily to bi-monthly periodicity
FANG_tbl_time_d %>%
as_period(period = '2 m') %>%
# Plotting
ggplot_facet_by_symbol(
mapping = aes(
x = date, y = adjusted, color = symbol)) +
labs(
title = "Periodicity Change to Daily to Bi-Monthly",
subtitle = "2~m") +
geom_point()
让我们继续。那么每半年一次呢? 只需使用 6 m
即可。
# Convert from daily to bi-annually periodicity
FANG_tbl_time_d %>%
as_period(period = '6 m') %>%
# Plotting
ggplot_facet_by_symbol(
mapping = aes(
x = date, y = adjusted, color = symbol)) +
labs(
title = "Periodicity Change to Daily to Bi-Annually",
subtitle = "6~m") +
geom_point()
函数标记几乎提供了无限可能,感兴趣的话可以查看 vignette on periodicity change with tibbletime。
rollify
rollify()
函数是一个副词(tidyverse
中的一种特殊类型的函数,用于修改另一个函数)。rollify()
的作用是将任何函数转换为自身的滚动版本。
# Rolling 60-day mean
roll_mean_60 <- rollify(
mean, window = 60)
FANG_tbl_time_d %>%
mutate(
mean_60 = roll_mean_60(adjusted)) %>%
select(-c(open:volume)) %>%
# Plot
ggplot_facet_by_symbol(
mapping = aes(
x = date, y = adjusted, color = symbol)) +
geom_line(
aes(y = mean_60),
color = palette_light()[[6]]) +
labs(
title = "Rolling 60-Day Mean with rollify")
我们甚至可以做出更复杂的滚动功能,例如相关性。我们在 rollify()
中使用函数形式 .f = ~fun(.x,.y,...)
。
# Rolling correlation
roll_corr_60 <- rollify(
~ cor(.x, .y, use = "pairwise.complete.obs"),
window = 60)
FANG_tbl_time_d %>%
mutate(
cor_60 = roll_corr_60(
open, close)) %>%
select(-c(open:adjusted)) %>%
# Plot
ggplot_facet_by_symbol(
mapping = aes(
x = date, y = cor_60, color = symbol)) +
labs(
title = "Rollify: 60-Day Rolling Correlation Between Open and Close Prices")
我们甚至可以返回多个结果。例如,我们可以创建滚动分位数。
首先,创建一个返回分位数的函数。
# Quantile tbl function
quantile_tbl <- function(x)
{
q <- quantile(x)
tibble(
quantile_name = names(q),
quantile_value = q)
}
# Test the function
quantile_tbl(1:100)
## # A tibble: 5 x 2
## quantile_name quantile_value
## <chr> <dbl>
## 1 0% 1.00
## 2 25% 25.75
## 3 50% 50.50
## 4 75% 75.25
## 5 100% 100.00
很好,它可以工作。接下来,使用 rollify
创建滚动版本。我们设置 unlist = FALSE
来返回列表列。
# Rollified quantile function
roll_quantile_60 <- rollify(
quantile_tbl, window = 60, unlist = FALSE)
接下来,在 mutate()
中应用滚动分位数函数来获得滚动分位数。确保你已经用 select()
、filter()
和 unnest()
删除了不必要的列,过滤了 NA
值,并展开列表列。现在每个日期有五个分位数值。
# Apply rolling quantile
FANG_quantile_60 <- FANG_tbl_time_d %>%
mutate(
rolling_quantile = roll_quantile_60(adjusted)) %>%
select(-c(open:adjusted)) %>%
filter(!is.na(rolling_quantile)) %>%
unnest()
FANG_quantile_60
## # A time tibble: 13,940 x 4
## # Index: date
## # Groups: symbol [4]
## symbol date quantile_name quantile_value
## * <chr> <date> <chr> <dbl>
## 1 FB 2014-03-28 0% 53.5300
## 2 FB 2014-03-28 25% 57.8750
## 3 FB 2014-03-28 50% 64.2100
## 4 FB 2014-03-28 75% 68.6275
## 5 FB 2014-03-28 100% 72.0300
## 6 FB 2014-03-31 0% 53.5300
## 7 FB 2014-03-31 25% 57.9350
## 8 FB 2014-03-31 50% 64.2100
## 9 FB 2014-03-31 75% 68.6275
## 10 FB 2014-03-31 100% 72.0300
## # ... with 13,930 more rows
最后,画出结果。
FANG_quantile_60 %>%
ggplot_facet_by_symbol(
mapping = aes(
x = date, y = qu