library(quantmod)
library(ggplot2)
library(zoo)
library(dplyr)

SPX <- getSymbols("^GSPC", from = "2023-11-01", to = "2024-10-20", auto.assign = FALSE)

data <- data.frame(SPX = SPX$GSPC.Close)
colnames(data) <- c("SPX")

# Рассчет 30-дневного скользящего среднего
data$rolling_mean <- rollmean(data$SPX, k = 30, fill = NA, align = "right")

# Рассчет 30-дневного максимума
data$rolling_max <- rollapply(data$SPX, width = 30, FUN = max, fill = NA, align = "right")
data$rolling_min <- rollapply(data$SPX, width = 30, FUN = min, fill = NA, align = "right")

data$date <- rownames(data)

data1 <- data %>% na.omit() #убираем NA
data1$date <- as.Date(data1$date)
head(data1)
##                SPX rolling_mean rolling_max rolling_min       date
## 2023-12-13 4707.09     4503.515     4707.09     4237.86 2023-12-13
## 2023-12-14 4719.55     4519.571     4719.55     4317.78 2023-12-14
## 2023-12-15 4719.19     4532.952     4719.55     4347.35 2023-12-15
## 2023-12-18 4740.56     4545.692     4740.56     4347.35 2023-12-18
## 2023-12-19 4768.37     4559.105     4768.37     4347.35 2023-12-19
## 2023-12-20 4698.35     4569.771     4768.37     4347.35 2023-12-20
# Построение графика
str(data1)
## 'data.frame':    214 obs. of  5 variables:
##  $ SPX         : num  4707 4720 4719 4741 4768 ...
##  $ rolling_mean: num  4504 4520 4533 4546 4559 ...
##  $ rolling_max : num  4707 4720 4720 4741 4768 ...
##  $ rolling_min : num  4238 4318 4347 4347 4347 ...
##  $ date        : Date, format: "2023-12-13" "2023-12-14" ...
##  - attr(*, "na.action")= 'omit' Named int [1:29] 1 2 3 4 5 6 7 8 9 10 ...
##   ..- attr(*, "names")= chr [1:29] "2023-11-01" "2023-11-02" "2023-11-03" "2023-11-06" ...
ggplot(data1, aes(x = date)) +
  geom_line(aes(y = SPX), color = "darkblue") + 
  geom_line(aes(y = rolling_mean), color = "red", linetype = "dashed", size = 1) +  # пунктирная линия для rolling_mean
  geom_ribbon(aes(ymin = rolling_min, ymax = rolling_max), fill = "lightblue", alpha = 0.5) +  # Заполнение области между минимумы и максимумы
  labs(title = "Значения индекса S&P 500 
с начала 2024 года",
       x = "Месяц",
       y = "Котировки") +
  theme_minimal() +
  theme(plot.title = element_text(hjust = 0.5),  # центрирование заголовка
        legend.position = "bottom") +
  scale_y_continuous(labels = scales::number_format(accuracy = 0.1))  # Форматирование оси Y