В опубликованных ранее уроках из обучающих подборок "Циклы в python", "Условные конструкции в Python" и "Массивы в Python" были разобраны основные конструкции, которые позволяют перейти к решению практических задач, которые можно использовать в быту.
Для любителей видео в ближайшее время появится версия в формате видео.
Начнем с актуальной в сложившейся на финансовом рынке ситуации, когда необходимо взять кредит или, наоборот, положить деньги в банк под проценты, и посчитать, какие условия более выгодные.
Зачем нам самим что-то писать, когда на сайте каждого банка есть уже готовый кредитный калькулятор, скажете Вы? И будете неправы!
Это раньше у кредитных калькуляторов на сайтах финансовых организаций было множество входных параметров, которые можно было настроить под себя и подобрать кредит, который будет выгоден именно Вам. Теперь максимум, что Вы сможете рассчитать это ежемесячный платеж и переплату за весь срок кредита. Остальное увидите в кредитном договоре после оформления заявки.
Та же история и с предложениями банков. Приходит смс с суммой кредита и ежемесячным платежом с учетом страховки. Какой там реально процент получается, считайте сами. Вот именно этим мы и займемся.
Рассмотрим стандартное предложения банка по потребительскому кредиту.
Исходные данные:
- Сумма кредита, которую клиент получает на руки
- Сумма, которая уходит на оплату страхования, предусмотренного страховой программой, если клиент на неё согласился
- Годовой процент
- Вид платежей (аннуитетные, в большинстве случаев, или нет)
- Срок кредита
Все остальные параметры рассчитываются на основе параметров, приведенных выше.
Сумма задолженности клиента перед банком состоит из двух составляющих:
- суммы, оставшейся от исходной суммы задолженности на дату, для которой проводится расчет, эта сумма обычно называется основным долгом,
- процентов, набежавших к дате, для которой проводится расчет.
В день оформления кредита сумма основного долга может быть рассчитана путем сложения суммы, которую клиент получил на руки, и суммы, отправленной на оплату страховой программы.
Начисление процентов на остаток основного долга происходит ежедневно, поэтому необходимо рассчитать не годовой процент, а дневной процент, который можно получить путем деления годового процента на количество дней в году. Зная дневной процент, используя цикл, можно легко рассчитать проценты, набежавшие на основной долг к любой дате. Цикл, используемый для ежедневных процентов будет внутренним циклом.
Давайте напишем этот цикл.
Обозначим сумму основного долга на момент запуска цикла как debt.
Количество итераций внутреннего цикла равно количеству дней, которые прошли с момента последнего обновления суммы основного долга. Обозначим его как days.
Ежедневный процент обозначим переменной dayPercent.
Также нам понадобится переменная, в которой мы будем хранить данные о процентах, набежавших с момента последнего обновления суммы основного долга. Пусть это будет переменная percents.
Начальное значение переменной percents будет равно нулю, переменная days представляет собой какое-то целое неотрицательное число, а переменные debt и dayPercent какие-то числа, не более чем с двумя цифрами после запятой.
Код цикла в Python будет выглядеть следующим образом:
percents = 0
for i in range(days):
percents = percents + debt*dayPercent/100
Ежемесячно происходит внесение платежа клиентом, часть которого идет на погашение набежавших к дате платежа процентов, а оставшиеся средства идут на уменьшение основного долга. Ежемесячное погашение процентов и части основного долга также можно описать с помощью цикла. Если внесение ежемесячного платежа происходит всегда в одно и то же число месяца, то промежуток времени между погашениями ежемесячного платежа будет немного отличаться в разные месяцы и годы. Предположим, что у нас есть массив с указанием количества дней для каждого из периодов на протяжении всего срока кредита. Цикл, описывающий внесение ежемесячного платежа, будет внешним циклом, внутри которого будет цикл, написанный ранее.
Напишем этот цикл.
Количество итераций внешнего цикла определяется сроком кредита, который обычно исчисляется в месяцах. Обозначим его как months.
Массив с указанием количества дней для каждого месяца назовем days, так как элемент данного массива для текущего месяца заменит переменную days, которая использовалась во внутреннем цикле.
Размер ежемесячного платежа обозначим как payment.
Начальное значение переменной months Представляет собой целое неотрицательное число, элементами массива days также являются целые неотрицательные числа, а payment является неотрицательным числом с двумя цифрами после запятой.
Код цикла в Python будет выглядеть следующим образом:
for j in range(months):
percents = 0
for i in range(days[j]):
percents = percents + debt*dayPercent/100
debt = debt - (payment - percents)
Приведенный выше код позволяет рассчитать сумму основного долга и процентов в любой момент времени при известных исходных данных.
Обычно перед кредитным калькулятором ставится задача расчета одного неизвестного исходного параметра по известным остальным.
Наиболее простым вариантом расчета является вычисление срока кредита при известном годовом проценте, сумме основного долга и размере аннуитетного платежа.
Для такого расчета внешний цикл из предыдущего примера необходимо заменить на цикл while, условием выхода из которого является уменьшение суммы основного долга ниже размера ежемесячного платежа. В этом случае последний платеж будет не равен всем остальным платежам, а оставшейся на момент выхода из цикла сумме основного долга.
Переменная months в этом случае в начале расчета равна нулю, а debt сумме основного долга на момент выдачи кредита.
Код программы для расчета в Python будет выглядеть следующим образом:
debt = 1000000 # основной долг на момент выдачи кредита
payment = 40000 # ежемесячный аннуитетный платеж
days = 30 # среднее количество дней в месяце (если известна дата выдачи кредита, то можно рассчитать количество дней в каждом периоде)
months = 0
dayPercent = 0.1 # ежедневный процент
while (debt > payment) :
percents = 0
for i in range(days):
percents = percents + debt*dayPercent/100
debt = debt - (payment - percents)
months = months + 1
months = months + 1
print(months)
Для представленных выше исходных данных срок кредита будет равен 47 месяцам.
Если в этот же код добавить вывод промежуточных результатов на каждой итерации цикла, то можно вывести график платежей для рассчитанного кредита.
Код программы для расчета в Python будет выглядеть следующим образом:
debt = 1000000 # основной долг на момент выдачи кредита
payment = 40000 # ежемесячный аннуитетный платеж
days = 30 # среднее количество дней в месяце (если известна дата выдачи кредита, то можно рассчитать количество дней в каждом периоде)
months = 0
dayPercent = 0.1 # ежедневный процент
while (debt > payment) :
percents = 0
for i in range(days):
percents = round(percents + debt*dayPercent/100,3)
debt = round(debt - (payment - percents),3)
months = months + 1
print( 'Номер периода ' + str(months) + ' проценты ' + str(percents) + ' размер платежа ' + str(payment) + ' остаток основного долга ' + str(debt))
months = months + 1
print( 'Номер периода ' + str(months) + ' проценты ' + str(percents) + ' размер платежа ' + str(debt) + ' остаток основного долга 0')
В следующих частях рассмотрим другие варианты расчета, а также введем такие дополнительные параметры как размер переплаты.