В этом разборе мы рассмотрим только два примера, так как мы воспользуемся только одним методом расчета нужных нам показателей, а все вычисления достаточно однотипны

Данные и пакеты

Для начала загрузим соотвествующие пакеты (для работы с графиками вида 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 ...

Black Tuesday/Great Crash

Первым примером будет самый первый и длительный кризис из таблицы с условия задания

Сначала выделим нужную нам подвыборку данных, т.е наблюдения до 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% от начального значения

Dot Com Bubble

Повторим аналогичную процедуру для второго случая и получим сокращение в 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

Остальное должно совпасть, если всё совпало в первых двух кейсах