set.seed(42)
make_series <- function(symbol, start = as.Date("2022-01-01"), days = 180) {
dates <- seq.Date(start, by = "day", length.out = days)
steps <- rnorm(length(dates), 0, 1)
price <- cumsum(steps) + 100 + runif(1, -5, 5)
tibble(item = symbol, date = dates, price = round(price, 2))
}
df <- bind_rows(
make_series("AAPL"),
make_series("MSFT")
)
# Compute YTD average and 6-day moving average per item
out <- df %>%
arrange(item, date) %>%
group_by(item, yr = year(date)) %>%
mutate(ytd_avg = cummean(price)) %>% # resets each year within each item
ungroup() %>%
group_by(item) %>%
mutate(ma6 = slide_dbl(price, mean, .before = 5, .complete = TRUE)) %>%
ungroup()
# Peek
dplyr::glimpse(out)
## Rows: 360
## Columns: 6
## $ item <chr> "AAPL", "AAPL", "AAPL", "AAPL", "AAPL", "AAPL", "AAPL", "AAPL"…
## $ date <date> 2022-01-01, 2022-01-02, 2022-01-03, 2022-01-04, 2022-01-05, 2…
## $ price <dbl> 101.97, 101.41, 101.77, 102.40, 102.81, 102.70, 104.21, 104.12…
## $ yr <dbl> 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 2022, 20…
## $ ytd_avg <dbl> 101.9700, 101.6900, 101.7167, 101.8875, 102.0720, 102.1767, 10…
## $ ma6 <dbl> NA, NA, NA, NA, NA, 102.1767, 102.5500, 103.0017, 103.7300, 10…
# head(out, 12)