Алгоритм расчета равноценного ежемесячного взноса (EMI)
Равноценный ежемесячный взнос (EMI, от англ. Equated Monthly Installment) — это фиксированная сумма платежа, которую заёмщик выплачивает кредитору в установленную дату каждого месяца до полного погашения долга.
Алгоритм основан на аннуитетной схеме погашения, при которой структура платежа меняется со временем: доля процентов уменьшается, а доля погашения основного долга увеличивается, при этом общая сумма платежа остается неизменной.
Подробное описание
Алгоритм EMI решает задачу равномерного распределения финансовой нагрузки на заёмщика в течение всего срока кредита. В отличие от дифференцированных платежей, где сумма выплат постепенно снижается, EMI обеспечивает предсказуемость расходов.
Постановка задачи: Даны основная сумма кредита (\(P\)), годовая процентная ставка (\(R\)) и срок кредита в годах (\(T\)). Необходимо рассчитать фиксированную ежемесячную сумму (\(E\)), которая позволит полностью погасить долг и начисленные проценты за указанный срок.
Ключевая идея: Использование формулы суммы геометрической прогрессии для дисконтирования будущих платежей к текущей стоимости кредита.
Принцип работы
Математическая формулировка
Расчет EMI производится по следующей формуле:
Где:
- \(E\) — размер ежемесячного платежа (EMI)
- \(P\) — основная сумма кредита (Principal)
- \(r\) — месячная процентная ставка (годовая ставка / 12 / 100)
- \(n\) — общее количество месяцев выплаты (срок в годах \(\times\) 12)
Для расчета структуры платежа (амортизации) в конкретном месяце \(k\):
- Проценты за месяц: \(I_k = B_{k-1} \times r\), где \(B_{k-1}\) — остаток долга на начало месяца.
- Погашение основного долга: \(Pr_k = E - I_k\).
- Новый остаток долга: \(B_k = B_{k-1} - Pr_k\).
Блок-схема алгоритма
flowchart TD
A[Начало] --> B[Ввод: P, R, T]
B --> C[Расчет: n = T * 12, r = R / 1200]
C --> D[Расчет EMI по формуле]
D --> E[Вывод результата EMI]
E --> F{Нужен график амортизации?}
F -->|Да| G[Цикл от 1 до n]
G --> H[Расчет процентов и тела долга]
H --> I[Обновление остатка]
I --> J[Сохранение данных]
J --> K{Конец цикла?}
K -->|Нет| G
K -->|Да| L[Построение графика/таблицы]
F -->|Нет| M[Конец]
L --> M
Пример реализации на Python
Ниже представлен полный код для расчета EMI, генерации графика амортизации и визуализации зависимости платежа от срока кредита.
import matplotlib.pyplot as plt
from typing import List, Tuple
def calculate_emi(principal: float, annual_rate: float, years: int) -> float:
"""
Рассчитывает ежемесячный аннуитетный платеж (EMI).
Args:
principal: Основная сумма кредита.
annual_rate: Годовая процентная ставка (в процентах, например, 12 для 12%).
years: Срок кредита в годах.
Returns:
Размер ежемесячного платежа.
"""
n = years * 12 # Общее количество месяцев
if n == 0:
return 0
r = annual_rate / 12 / 100 # Месячная процентная ставка
if r == 0:
return principal / n
emi = principal * (r * (1 + r)**n) / ((1 + r)**n - 1)
return emi
def generate_amortization_schedule(principal: float, annual_rate: float, years: int) -> List[Tuple[int, float, float, float]]:
"""
Генерирует график погашения кредита (амортизацию).
Returns:
Список кортежей: (месяц, платеж_по_телу, платеж_процентов, остаток_долга)
"""
n = years * 12
r = annual_rate / 12 / 100
emi = calculate_emi(principal, annual_rate, years)
schedule = []
balance = principal
for month in range(1, n + 1):
interest_payment = balance * r
principal_payment = emi - interest_payment
balance -= principal_payment
# Корректировка последнего платежа из-за ошибок округления
if balance < 0:
principal_payment += balance
balance = 0
schedule.append((month, principal_payment, interest_payment, balance))
return schedule
def plot_emi_dependency(principal: float, annual_rate: float, max_years: int = 10):
"""
Строит график зависимости размера EMI от срока кредита.
"""
years_range = list(range(1, max_years + 1))
emis = [calculate_emi(principal, annual_rate, y) for y in years_range]
plt.figure(figsize=(10, 6))
plt.plot(years_range, emis, marker='o', linestyle='-', color='#2c3e50')
plt.title(f"Зависимость EMI от срока кредита\n(Сумма: {principal:,.0f}, Ставка: {annual_rate}%)")
plt.xlabel("Срок кредита (лет)")
plt.ylabel("Ежемесячный платеж (руб.)")
plt.grid(True, linestyle='--', alpha=0.7)
plt.xticks(years_range)
plt.tight_layout()
plt.show()
if __name__ == "__main__":
# Входные данные
loan_amount = 1_000_000 # 1 млн руб.
interest_rate = 12 # 12% годовых
loan_term_years = 5 # 5 лет
# 1. Расчет базового EMI
monthly_payment = calculate_emi(loan_amount, interest_rate, loan_term_years)
print(f"Ежемесячный платёж (EMI): {monthly_payment:.2f} руб.")
print("-" * 30)
# 2. Вывод первых 3 месяцев амортизации
schedule = generate_amortization_schedule(loan_amount, interest_rate, loan_term_years)
print(f"{'Месяц':<6} | {'Тело долга':>10} | {'Проценты':>10} | {'Остаток':>12}")
print("-" * 45)
for month, pr_part, int_part, balance in schedule[:3]:
print(f"{month:<6} | {pr_part:>10.2f} | {int_part:>10.2f} | {balance:>12.2f}")
print("...")
# 3. Визуализация зависимости платежа от срока
plot_emi_dependency(loan_amount, interest_rate)
Достоинства и недостатки
Достоинства:
- Предсказуемость бюджета: Заёмщик точно знает сумму платежа на весь срок кредита, что упрощает финансовое планирование.
- Простота расчета: Формула универсальна и легко реализуется в любых программных системах.
- Равномерная нагрузка: Позволяет избежать пиковых нагрузок на бюджет в начале срока (в отличие от некоторых схем с большими первоначальными выплатами).
Недостатки:
- Высокая переплата в начале срока: В первые годы большая часть платежа уходит на погашение процентов, а не основного долга.
- Меньшая выгода при досрочном погашении: Если гасить кредит досрочно в первой половине срока, экономия на процентах будет меньше, чем могла бы быть при дифференцированной схеме (где тело долга гасится быстрее).
Области применения
- Экономика и финансы (расчет потребительских кредитов, ипотеки, автокредитов)
- Торговля и коммерция (предоставление рассрочки покупателям в интернет-магазинах и маркетплейсах)
- Банковский сектор (формирование кредитных продуктов и скоринг платежеспособности)