просадка прибыли каждого столбца в data.frame

Я хочу рассчитать прибыль/просадку каждого столбца A:C в кадре данных ниже. Заголовок от A до C можно рассматривать как символ биржевого тикера. Каждую строку можно считать почасовой ценой закрытия. Цена, дата и час могут быть объединены, чтобы сформировать временную метку для этого временного ряда данных.

Я пытался использовать пакеты fTrading и PerformanceAnalytics для расчета максимальной просадки, но продолжал получать ошибки. Меня не волнует, когда происходит максимальная просадка. Мне просто нужна сумма максимальной просадки, чтобы я мог использовать ее для расчета соотношения прибыль/просадка (прибыль, деленная на максимальную просадку).

Данные:

hourlyclose <- data.frame(pricedate = as.Date('2019-12-18'), hour = c(1,2,3,4,5), A = c(3,5,6,2,4), B = c(1,9,7,11,4), C = c(0,2,5,4,9))

Мне нужен вывод второго data.frame со столбцом для каждого символа акции, коэффициента просадки прибыли и просто прибыли (которая является последней строкой минус первая строка в моем примере, почасовом закрытии data.frame).

Результирующий data.frame должен выглядеть так:

Stock     pdd      profit
 A        0.25        1
 B        0.43        3
 C        9.0         9

Я бы предпочел использовать tidyverse и любой из этих финансовых пакетов для операций как можно чаще.

Определение просадки: Просадка — это мера того, насколько цена падает, прежде чем достигнет или превысит ранее высокую цену.

Максимальные просадки для каждого столбца:

Для «А» максимальная просадка равна 4, потому что А был на максимуме 6, а затем упал до 2.

Для "B" есть две просадки, но только одна максимальная просадка. Цена акции снижается с 9 до 7, что соответствует просадке 2. Но акция достигает нового максимума в следующем ряду до 11, но затем снижается до 4, что соответствует просадке 7. Таким образом, максимальная просадка равна 7. для "Б".

Для «C» цена акции уменьшилась с 5 до 4 при максимальной просадке в 1.


person otterdog2000    schedule 31.12.2019    source источник


Ответы (1)


Мы можем получить данные в длинном формате, group_by name, и вычислить значение drawdown, используя cummax и max. Profit вычисляется путем вычитания last из значения first, а pdd представляет собой деление profit на drawdown.

library(dplyr)

hourlyclose %>%
  tidyr::pivot_longer(cols = A:C) %>%
  group_by(name) %>%
  summarise(drawdown = max(cummax(value) - value), 
            profit  = last(value) - first(value), 
            pdd = profit/drawdown)

# A tibble: 3 x 4
#  name  drawdown profit   pdd
#  <chr>    <dbl>  <dbl> <dbl>
#1 A            4      1 0.25 
#2 B            7      3 0.429
#3 C            1      9 9    
person Ronak Shah    schedule 31.12.2019
comment
Правильно ли он рассчитывает просадку? Просадка — это не просто максимум минус минимум. Если B = c(9, 2, 15, 14, 13), максимальная просадка составит 7. Порядок цен имеет значение. - person otterdog2000; 31.12.2019
comment
@otterdog2000 otterdog2000 Я не рассчитываю максимум-минимум для drawdown. diff вычисляет разницу последовательных значений. Вы можете попробовать с B = c(9, 2, 15, 14, 13), а затем -min(diff(B)) вернет 7. Дайте мне знать, правильно ли я понимаю. - person Ronak Shah; 31.12.2019
comment
Хорошо, просадка не только для последовательных значений. Просадка по-прежнему равна 7 для B = c(9, 5, 2, 7, 8). Просадка — это мера того, насколько цена падает, прежде чем достигнет или превысит свое прежнее высокое значение, если это вообще произойдет. - person otterdog2000; 31.12.2019
comment
Я понимаю. Тогда я неправильно понял drawdown концепцию. Я обновил ответ, используя cummax. Вы можете проверить это сейчас? - person Ronak Shah; 31.12.2019