Как создать колонку «Dynami c» в R? - PullRequest
0 голосов
/ 07 марта 2020

Я пишу инструмент анализа портфеля на основе бэк-тестов. Короче говоря, я хочу добавить столбец, который начинается со значения X, которое будет начальным капиталом плюс результат первой сделки, а остальные значения будут обновляться с учетом% изменения каждой сделки, но я не отсортировал способ поместить эту логику c в код. Следующий код является упрощенным примером.

profit <- c(10, 15, -5, -6, 20)
change <- profit / 1000
balance <- c(1010, 1025, 1020, 1014, 1036)

data <- data.frame(profit, change, balance)

Пока что я могу думать только о том, чтобы создать отдельный вектор, который увеличивается или уменьшается на основе столбца изменений, но я не уверен, как сделать это так, чтобы оно учитывало аналогично предыдущему значению, то есть balance = start_capital * (1 + change), что давало бы пропорциональное увеличение, всегда учитывающее одно и то же начальное значение, а не предыдущее значение плюс изменение нового (надеюсь, Я объяснил себе).

Спасибо, Фернандо.

РЕДАКТИРОВАТЬ

У меня есть правильное значение изменения в реальной программе, так как каждый бэк-тест обновляет баланс с результатом каждая новая сделка, поэтому столбец изменений на реальных данных корректен, так как он корректно обновляется, но мой код объединяет несколько бэк-тестов и, поскольку обновление баланса предназначено для каждого отдельного бэк-теста, а не для комбинированного, его нельзя использовать, когда комбинируя все, поэтому я добавил столбец изменений.

1 Ответ

3 голосов
/ 07 марта 2020

Если вы хотите сделать это через столбец change, мы можем использовать Reduce

start_capital <- 1000
Reduce(function(x, y) x + x*y, data$change, init = start_capital, accumulate = TRUE)[-1]
#[1] 1010.000 1025.150 1020.024 1013.904 1034.182

Reduce, при этом accumulate = TRUE дает вывод в накопительной форме, принимая выходные данные текущей итерации как вход к следующему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...