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()`).
