В этом разборе мы рассмотрим только два примера, так как мы воспользуемся только одним методом расчета нужных нам показателей, а все вычисления достаточно однотипны
Для начала загрузим соотвествующие пакеты (для работы с графиками вида dygraph) и данные, которые были спарсены с сайта Yahoo Finance.
Потом посмотрим на структуру датасета и заметим одну важную деталь - даты представлены в строковом формате, приведём их к нужному нам формату ‘Date’.
library(dplyr)
library(lubridate)
library(ggplot2)
library(xts)
library(plotly)
library(dygraphs)
df = read.csv('SPX.csv')
df %>% str()
## 'data.frame': 23323 obs. of 7 variables:
## $ Date : chr "1927-12-30" "1928-01-03" "1928-01-04" "1928-01-05" ...
## $ Open : num 17.7 17.8 17.7 17.5 17.7 ...
## $ High : num 17.7 17.8 17.7 17.5 17.7 ...
## $ Low : num 17.7 17.8 17.7 17.5 17.7 ...
## $ Close : num 17.7 17.8 17.7 17.5 17.7 ...
## $ Adj.Close: num 17.7 17.8 17.7 17.5 17.7 ...
## $ Volume : num 0 0 0 0 0 0 0 0 0 0 ...
df$Date = ymd(df$Date)
df %>% str()
## 'data.frame': 23323 obs. of 7 variables:
## $ Date : Date, format: "1927-12-30" "1928-01-03" ...
## $ Open : num 17.7 17.8 17.7 17.5 17.7 ...
## $ High : num 17.7 17.8 17.7 17.5 17.7 ...
## $ Low : num 17.7 17.8 17.7 17.5 17.7 ...
## $ Close : num 17.7 17.8 17.7 17.5 17.7 ...
## $ Adj.Close: num 17.7 17.8 17.7 17.5 17.7 ...
## $ Volume : num 0 0 0 0 0 0 0 0 0 0 ...
Первым примером будет самый первый и длительный кризис из таблицы с условия задания
Сначала выделим нужную нам подвыборку данных, т.е наблюдения до 22 сентября 1954 года
df_greatcrash = df %>% filter(Date<=as.Date('1954-09-22'))
Построим интерактивный график индекса SPX
df_greatcrash = df_greatcrash %>% select(Close, Date)
don <- xts(x = df_greatcrash$Close, order.by = df_greatcrash$Date)
p <- dygraph(don)
p
Выделим нужные нам точки и рассчитаем падение индекса по формуле
\(I = \frac{P_0-P_1}{P_1}\)
Эта формула показывает пропорциональное падение индекса относительно значения в первый день кризисного периода
initial_point = df_greatcrash %>% filter(Date == as.Date('1929-09-16'))
all_time_low = df_greatcrash %>% filter(Close==min(df_greatcrash$Close))
decrease_rate = (initial_point$Close-all_time_low$Close)/initial_point$Close
decrease_rate
## [1] 0.8618958
\(I = \frac{31.86-4.4}{31.86} = 0.86189\)
То есть падение составило 86% от начального значения
Повторим аналогичную процедуру для второго случая и получим сокращение в 49%
dot_com = df %>% filter(Date> as.Date('2000-01-01') & year(Date) < year("2008-01-01"))
don <- xts(x = dot_com$Close, order.by = dot_com$Date)
p <- dygraph(don)
p
initial_point = dot_com %>% filter(Date == as.Date('2000-03-24'))
all_time_low = dot_com %>% filter(dot_com$Close==min(dot_com$Close))
decrease_rate = (initial_point$Close-all_time_low$Close)/initial_point$Close
decrease_rate
## [1] 0.4914695
Остальное должно совпасть, если всё совпало в первых двух кейсах