LOADING

GENERATING

set.seed(123)
 
dates <- seq(as.Date("2022-01-01"), as.Date("2022-02-28"), by = "day")  

data <- expand.grid(date = dates, stock = c("Stock_A", "Stock_B")) %>%  
  arrange(stock, date) %>%  
  mutate(close = round(runif(n(), 100, 200), 2))

head(data)  
##         date   stock  close
## 1 2022-01-01 Stock_A 128.76
## 2 2022-01-02 Stock_A 178.83
## 3 2022-01-03 Stock_A 140.90
## 4 2022-01-04 Stock_A 188.30
## 5 2022-01-05 Stock_A 194.05
## 6 2022-01-06 Stock_A 104.56

YTD

data_ytd <- data %>%  
  group_by(stock) %>%  
  arrange(date) %>%  
  mutate(ytd_avg = cummean(close)) %>%  
  ungroup()  

head(data_ytd, 10)  
## # A tibble: 10 × 4
##    date       stock   close ytd_avg
##    <date>     <fct>   <dbl>   <dbl>
##  1 2022-01-01 Stock_A  129.    129.
##  2 2022-01-01 Stock_B  137.    137.
##  3 2022-01-02 Stock_A  179.    154.
##  4 2022-01-02 Stock_B  167.    152.
##  5 2022-01-03 Stock_A  141.    149.
##  6 2022-01-03 Stock_B  109.    138.
##  7 2022-01-04 Stock_A  188.    159.
##  8 2022-01-04 Stock_B  138.    138.
##  9 2022-01-05 Stock_A  194.    166.
## 10 2022-01-05 Stock_B  127.    136.

SIX-DAY

data_results <- data_ytd %>%  
  group_by(stock) %>%  
  arrange(date) %>%  
  mutate(moving_avg_6d = zoo::rollapply(close,   
                                      width = 6,   
                                      FUN = mean,   
                                      align = "right",   
                                      fill = NA)) %>%  
  ungroup()  

head(data_results, 10)  
## # A tibble: 10 × 5
##    date       stock   close ytd_avg moving_avg_6d
##    <date>     <fct>   <dbl>   <dbl>         <dbl>
##  1 2022-01-01 Stock_A  129.    129.            NA
##  2 2022-01-01 Stock_B  137.    137.            NA
##  3 2022-01-02 Stock_A  179.    154.            NA
##  4 2022-01-02 Stock_B  167.    152.            NA
##  5 2022-01-03 Stock_A  141.    149.            NA
##  6 2022-01-03 Stock_B  109.    138.            NA
##  7 2022-01-04 Stock_A  188.    159.            NA
##  8 2022-01-04 Stock_B  138.    138.            NA
##  9 2022-01-05 Stock_A  194.    166.            NA
## 10 2022-01-05 Stock_B  127.    136.            NA

VISUALIZING

ggplot(data_results %>% filter(stock == "Stock_A"), aes(x = date)) +  
  geom_line(aes(y = close, color = "Daily Close")) +  
  geom_line(aes(y = ytd_avg, color = "YTD Average")) +  
  geom_line(aes(y = moving_avg_6d, color = "6-Day Moving Avg")) +  
  labs(title = "Stock A - Price and Moving Averages",  
       y = "Price",  
       color = "Metric") +  
  theme_minimal()  
## Warning: Removed 5 rows containing missing values or values outside the scale range
## (`geom_line()`).