Какова правильная формула для расчета будущей стоимости сложных процентов с депозитами на конец периода - PullRequest
2 голосов
/ 25 апреля 2019

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

Вот моя функция ...

def compound_interest(principal, pmt, rate, frequency, period, time):

    contribution_frequencies = {'weekly' : 52, 'biweekly' : 26, 'monthly' : 12, 'quarterly' : 4, 'semiannually' : 2, 'yearly' : 1}
    compounding_periods = {'monthly' : 12, 'quarterly' : 4, 'semiannually' : 2, 'yearly' : 1}

    frequency = contribution_frequencies[frequency]
    period = compounding_periods[period]

    rate = rate / 100

    principal_interest = principal * (1 + (rate / period)) ** (period * time)
    fv =  (pmt * frequency) / period  * ((1 + (rate / period)) ** (period * time) - 1) / (rate / period)

    total = principal_interest + fv

    return round(total, 2)

Вот мои тесты, в которых частота депозитов совпадает с периодами начисления ...

print(compound_interest(5000, 100, 5, 'monthly', 'monthly', 15))
print(compound_interest(5000, 100, 5, 'yearly', 'yearly', 15))
print(compound_interest(5000, 100, 5, 'quarterly', 'quarterly', 15))
print(compound_interest(5000, 100, 5, 'semiannually', 'semiannually', 15))

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

37297.41
12552.5
19393.36
14878.11

Для случаев, отличных от указанных выше, фактические значения тестов не совпадают со значениями для связанного приложения. Например ....

print(compound_interest(5000, 100, 5, 'weekly', 'monthly', 15))

возвращается ...

126393.73

тогда как связанное приложение возвращает ...

126579.19

Имейте в виду, что мое уравнение рассчитывает для дополнительных депозитов, внесенных в конце периода начисления процентов (или примерно так: говорит ), который, по-видимому, такой же, как в связанном приложении.

Как бы я переписал свою функцию так, чтобы ее возвращенные фактические значения совпадали с фактическими значениями связанного приложения для всех комбинаций частоты внесения и периодов начисления?

Спасибо!

1 Ответ

1 голос
/ 02 мая 2019

Кажется, я вижу ошибку в функции. Обычно (то есть, когда составление и дополнительные вклады происходят с одной и той же частотой), коэффициент периода составления действительно равен rate/period. Таким образом, номинальная годовая ставка 5%, сложенная, например, ежеквартально, может быть разделена на 4 для ежеквартального начисления процентов (то есть 1,25% в квартал, что составляет rate), что дает эффективную годовую ставку 5,095%.

Однако, когда период взноса изменяется на ежемесячный, например, без эквивалентного изменения в периоде начисления процентов, эффективная годовая ставка остается той же . Таким образом, простое деление номинальной ставки на 12 (чтобы rate составляло 0,41667%) завышает процент, который вы зарабатываете.

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

Так, например, будущая стоимость в размере 1000 долларов США с номинальной годовой 5% -ной долей, составленной ежеквартально (без взносов), составляет 1 050,95 долларов США (что отражает эффективную годовую ставку, упомянутую выше). Чтобы получить ту же будущую стоимость с той же процентной ставкой, но с ежемесячным начислением процентов, ваш ежемесячный rate составит 0,41494%, что на меньше , чем ставка, которую вы получите, поделив номинальную годовую ставку на 12. Если вы проверьте этот сценарий на сайте калькулятора, это результат, который вы увидите.

Чтобы сделать это правильно, вам необходимо разработать формулы для преобразования между каждой парой периода начисления / взноса (полугодовой / месячный, полугодовой / квартальный и т. Д.). Они могут существовать там, но я не мог их найти. Получив эти формулы, вы должны будете включить их в свою функцию.

Наконец, чтобы сделать вещи еще более сложными, вам придется столкнуться с проблемой еженедельных вычислений. Хотя каждый год делится на ровно 4 квартала и 12 месяцев, он не делится на ровно 52 недели. Так, например, 15 лет имеют 782,143 недели, а не 780. Это необходимо учитывать отдельно.

Надеюсь - если вы все еще пытаетесь это сделать - это не заставит вас бросить. В конце концов, это интересный проект.

...