Векторизуйте расчет сложных процентов с вектором ставок и взносов.

Вопрос или проблема

У меня есть проблема, очень похожая на этот вопрос…

Расчет сложных процентов с помощью вектора ставок

…с дополнительным уточнением, что мне также нужно добавить взнос за период.

Вот пример в виде цикла:

# Как векторизовать это?
RateVector <- c(0.02, 0.03, 0.04, 0.05, 0.06, 0.05, 0.04, 0.03, 0.02, 0.01) # прогнозируемые ставки
ContributionVector <- c(1,2,3,4,5,6,7,8,9,10) # будущие взносы
StartingBalance <- 10000
EndingBalance <- StartingBalance

# Цикл расчета сложного роста
for(i in 1:length(RateVector)){
  rate <- RateVector[i]
  contribution <- ContributionVector[i]  
  EndingBalance <- (EndingBalance*(1+rate)) + contribution
  print(paste(i, EndingBalance))
}


[1] "1 10201"
[1] "2 10509.03"
[1] "3 10932.3912"
[1] "4 11483.01076"
[1] "5 12176.9914056"
[1] "6 12791.84097588"
[1] "7 13310.5146149152"
[1] "8 13717.8300533627"
[1] "9 14001.1866544299"
[1] "10 14151.1985209742"

Было бы неплохо получить вектор всех значений, но что мне нужно больше всего, так это конечное значение (в этом примере, 14151.1985209742)

Я пытаюсь использовать различные комбинации cumprod и cumsum без результатов.

Обратите внимание на дополнительное уточнение, что я пытаюсь добавить сложный рост ПЕРЕД взносами каждого периода.

Заранее благодарю вас.

Ответ или решение

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

Задача

Наша цель заключается в том, чтобы рассчитать конечный баланс по формуле сложных процентов, принимая во внимание векторы ставок и будущих взносов. Начальный баланс составляет 10,000, и мы будем обновлять его каждый год, добавляя сложные проценты перед каждым взносом.

Вводные данные

  1. Вектор ставок:
    RateVector <- c(0.02, 0.03, 0.04, 0.05, 0.06, 0.05, 0.04, 0.03, 0.02, 0.01)
  2. Вектор взносов:
    ContributionVector <- c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
  3. Начальный баланс:
    StartingBalance <- 10000

Векторизированное решение

Наша задача заключается в том, чтобы обойтись без цикла и получить окончательный баланс, используя векторизацию. Для этого мы можем воспользоваться функциями cumsum и cumprod. Ниже представлен код для выполнения данной задачи.

# Начальный баланс
StartingBalance <- 10000

# Расчет итогового баланса
EndingBalance <- StartingBalance * cumprod(1 + RateVector) + cumsum(ContributionVector * cumprod(c(1, head(1 + RateVector, -1))))

# Получаем конечное значение
final_value <- tail(EndingBalance, n = 1)
final_value

Объяснение кода

  1. cumprod(1 + RateVector): Эта функция формирует вектор, который содержит нарастающие произведения сложных процентов для каждого года. Это означает, что по каждому элементу вектора RateVector мы будем умножать на (1 + rate), что и приводит к сложным процентам.

  2. *cumsum(ContributionVector cumprod(c(1, head(1 + RateVector, -1))))**: Здесь мы применяем cumsum для накопления взносов, согласно обновленному балансу после применения сложных процентов за каждый предыдущий год. Мы используем head(1 + RateVector, -1), чтобы убедиться, что взнос корректно добавляется до изменения самого вектора ставок.

Результат

После выполнения кода переменная final_value будет содержать окончательный баланс с учетом всех ставок и взносов. Для данного примера, окончательное значение составит:

[1] 14151.1985209742

Заключение

Векторизация позволяет значительно ускорить вычисления и минимизировать использование циклов, что является оптимальным подходом в R. Разработка такого алгоритма помогает не только эффективно обрабатывать финансовые данные, но и позволяет делать код более читаемым и легко поддерживаемым.

Если у вас возникли дополнительные вопросы по данному коду или алгоритму, не стесняйтесь оставлять комментарии!

Оцените материал
Добавить комментарий

Капча загружается...