Почему расчет процентной ставки в python с l oop и формулой отличается? - PullRequest
0 голосов
/ 15 января 2020

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

Например: я начинаю с 50 000 $ и имею процентную ставку 10% в течение 5 лет. Результат с формулой classi c выглядит следующим образом: 50 000 $ * 1,10 ^ 5 = 80 525,5 $

Но с python я получаю следующий результат:

kapital_from_start = 50000.00
intrest_rate_per_year = 10.00
intrest_rate_per_month = (((intrest_rate_per_year / 12.0) / 100.0) + 1.0)
additional_monthly_increase = 00.00
duration_in_years = 5.0
duration_in_months = duration_in_years * 12.0

i = 1
result = 0.0
while i <= duration_in_months:
    if i == 1: #First month.
        result = kapital_from_start * intrest_rate_per_month
    else:
        result *= intrest_rate_per_month
    i += 1

print("\n\n######################################################\n")
print("Resulting kapital: " + str(result) + " $.")
print("\n######################################################\n\n")

Я получаю результат: 82265,44673892925 Что дает 82 300 $ вместо 80 525,5 $

Кто-нибудь знает, что происходит с этими числами? Почему они так сильно отличаются? Если мои расчеты верны, означает ли это, что на самом деле циклическое прохождение этих процентных ставок является более точным, чем формула, которую предоставляют школьные учебники и банки на своих домашних страницах, чтобы люди могли рассчитывать свои ставки?

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Вы можете получить значение (значение), используя Numpy

from numpy import fv

fv(.1/12, 5*12, 0, 50000)

( результат) = -82265.44673892927

Подпись fv равна fv(rate, nper, pmt, pv[, when])

Сумма, составленная в год, составит:

>>> fv(.1,5,0,50000)
-80525.50000000003
0 голосов
/ 15 января 2020

Просто суммируем все, что написано в комментариях:

Если вы используете сложный процент , ваша функция экспоненциальная, а не линейная. Это означает, что разделение годовой ставки не поможет.

Вам следует подумать о том, что ежемесячный сложный процент, применяемый 12 раз, будет таким же, как и весь год. Это в форме уравнения будет выглядеть примерно так:

yearly = monthly **12 # Because this is compound there is an exponential

# That´s equivalent to

monthly = yearly ** (1/12)

Так что вам просто нужно изменить расчет ежемесячного процента.

intrest_rate_per_month = ((intrest_rate_per_year / 100) + 1) ** (1/12)

И окончательный код с правильным результатом

kapital_from_start = 50000.00
intrest_rate_per_year = 10.00
intrest_rate_per_month = ((intrest_rate_per_year / 100) + 1) ** (1/12)
additional_monthly_increase = 00.00
duration_in_years = 5.0
duration_in_months = duration_in_years * 12.0

i = 1
result = 0.0
while i <= duration_in_months:
    if i == 1: #First month.
        result = kapital_from_start * (intrest_rate_per_month)
    else:

        result *=intrest_rate_per_month

    i += 1

print("\n\n######################################################\n")
print("Resulting kapital: " + str(result) + " $.")
print("\n######################################################\n\n")

Очистка кода

Также учтите, что вы можете просто сделать не итеративное решение, избавиться от него, пока l oop, поэтому этот кусок кода:

result = kapital_from_start * (intrest_rate_per_month) ** duration_in_months

Избавляется от всего этого целого, пока l oop:

i = 1
result = 0.0
while i <= duration_in_months:
    if i == 1: #First month.
        result = kapital_from_start * (intrest_rate_per_month)
    else:

        result *=intrest_rate_per_month

    i += 1

С окончательным кодом, результатом которого будет:

kapital_from_start = 50000.00
intrest_rate_per_year = 10.00
intrest_rate_per_month = ((intrest_rate_per_year / 100) + 1) ** (1/12)
additional_monthly_increase = 00.00
duration_in_years = 5.0
duration_in_months = duration_in_years * 12.0

result = kapital_from_start * (intrest_rate_per_month) ** duration_in_months

print("\n\n######################################################\n")
print("Resulting kapital: " + str(result) + " $.")
print("\n######################################################\n\n")
##### ##################################################

Результирующий капитал: 80525.50000000012 $.

################################################### ###

Также ваше соглашение об именах выглядит для меня многословным, но это похоже на еще одну проблему.


EDIT : Извините за этот ответ тоже долго, но на случай, если кто-то придет сюда с той же проблемой и не поймет, что происходит, я нашел хороший график из Википедии, который иллюстрирует совершенство почему ваш код был неправильным. Example of Frequency

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