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
