Перейти к содержанию

Лимит и ставка (T16)

Три модуля считают лимит и цену кредита по SPEC §9:

  • limits.py — входные данные лимита, шесть ограничений и quote — лимит и ставка для одного варианта;
  • pricing.py — ставка по составляющим и аннуитетная математика;
  • credit_policy.py — читает политику из config/credit_policy.json.

Результат — контракты LimitBreakdown и PriceBreakdown (docs/v2/CONTRACTS.md). Модули не собирают предложения, это делает генератор предложений offers.py (T17, OFFERS.md): он решает, какие варианты показать, и кладёт результат quote в Offer.

Входные данные: CashFlow

cash_flow_from_responses(enrichment.responses, data_quality) считает их один раз на заявку. Уровень качества данных берётся из data_quality_from_responses (T09).

Поле Как считается
Операционный поток за месяц Поступления от покупателей − расходы без платежей по кредитам и переводов между своими счетами
median_operating_flow, cv Медиана и коэффициент вариации (σ / среднее) потока за последние 12 месяцев или за все месяцы при истории короче. Если средний поток не положителен, cv = null и берётся максимальный дисконт
cfads Медиана × (1 − min(0,5; CV)), округление до 100 ₽. При уровне THIN не считается
current_payments, current_debt Ежемесячные платежи и остатки открытых кредитов бизнеса по БКИ: отчёт компании для ООО, личный отчёт для ИП; выданные гарантии не учитываются
annual_revenue Выручка по ФНС за год (fns_revenue(...).annualized, та же, что в признаке debt_to_revenue). Если отчётности ещё нет — поступления от покупателей на наш счёт за последние 12 месяцев как есть, без пересчёта на год
average_monthly_inflows Средние поступления от покупателей в месяц, для овердрафта

Без БКИ лимит не считается (ValueError): по SPEC §5 без БКИ решение не принимается. Заявленная клиентом выручка в лимит не попадает никогда (SPEC §1.1).

Ограничения лимита

Лимит — минимум из применимых ограничений (LimitConstraint.value = null значит «не применяется»):

Ограничение Формула Когда не применяется
cash_flow PV(P_max, ставка, срок), P_max = CFADS / DSCR_min(грейд) − текущие платежи; округление вниз до 10 000 ₽; при P_max ≤ 0 — 0 THIN
leverage множитель × годовая выручка − текущий долг; множитель 0,5, для инвестиционного кредита 0,7. Без подтверждённой выручки — 0 —
collateral Залог оборудования: min(0,7 × цена; цена − собственный взнос). Взнос меньше 15% цены — 0 Нет залога оборудования
turnover 0,5 × средние поступления в месяц Не овердрафт
product_max Максимум продукта —
requested Запрошенная сумма, только верхняя граница Нет заявки (предодобрение, PREAPPROVAL.md)

DSCR_min: A 1,2 · B 1,3 · C 1,5 · D 1,75 · E 2,0. При уровне PARTIAL поток берётся только по нашему счёту, без экстраполяции на обороты в других банках. Это отмечено в note ограничения.

Если несколько ограничений равны лимиту, определяющим называется то, что ниже в списке. Поэтому при совпадении с потоком клиент видит «как запрошено».

Ставка

ставка = фондирование (ключевая 14% + 1,5%) + PD × LGD + расходы на обработку + капитал 1,5% + маржа 2%
  • LGD — лучшее из обеспечения: без обеспечения 0,65, поручительство 0,55, залог оборудования 0,35. Гарантия Корпорации МСП умножает LGD на 0,5; её комиссия 1% годовых идёт в Offer.guarantee_fee, а не в ставку.
  • Расходы на обработку — стоимость маршрута (автомат 3 тыс. ₽, андеррайтер 25 тыс. ₽, комитет 60 тыс. ₽), делённая на средний остаток долга и срок в годах. Средний остаток — среднее остатков на начало каждого месяца аннуитетного графика.
  • Каждая составляющая округляется до 4 знаков, ставка — их сумма, поэтому составляющие в досье сходятся с итогом.
  • PD и грейд берутся только из ScoreResult основной модели. Результат претендента (Decision.challenger) в цену не попадает.
  • within_cap: ставка вместе с комиссией гарантии МСП не выше 30%. Выше потолка генератор предложений пробует гарантию МСП, а если она не помогает, вариант не предлагается (OFFERS.md).

Пример SPEC §9.2 считает средний остаток кредита 1 млн ₽ на 12 месяцев как «около 540 тыс. ₽». Точный график даёт около 559 тыс. ₽, поэтому наши ставки ниже табличных до 0,2 п. п.: 20,8% вместо 20,9%, 27,3% вместо 27,5%. Числа в примерах tests/fixtures/decision_*.json посчитаны по точному графику и совпадают с кодом до рубля.

quote: лимит и ставка вместе

Ограничение по потоку зависит от ставки, а ставка — от суммы (через расходы на обработку). quote(cash_flow, score, product, term, route, collateral, requested, equipment) повторяет расчёт, пока сумма не перестанет меняться. Итоговое ограничение по потоку всегда посчитано по ставке самого предложения.

  • Сумма — запрошенная, если лимит её покрывает; иначе лимит, округлённый вниз до 10 000 ₽.
  • Если лимит 0, то amount = 0, price = null: этот вариант предложить нельзя.
  • below_product_minimum — сумма меньше минимума продукта; within_cap — ставка под потолком; expected_profit — маржа × средний остаток × срок в годах (только для сотрудников).
  • Маршрут (Route) задаёт стоимость обработки. Его определяет маршрутизация (routing.py, T18, ROUTING.md), а он сам зависит от суммы.
  • Срок вне диапазона продукта — ValueError.

Политика: config/credit_policy.json

Все пороги и ставки SPEC §4 и §9 лежат в файле: DSCR по грейдам, множители, LTV, составляющие ставки, таблица LGD, стоимость обработки, потолок ставки, диапазоны сумм и сроков продуктов. Значения отвечает экономический блок. version (сейчас credit_policy_v0) обозначает версию политики. Правка файла не требует переобучать скоринговую карту.

Что видно на синтетическом мире

Зерно 7, 1500 компаний, оборотный кредит на 12 месяцев с поручительством, автомат: медианная операционная маржа (поток / поступления) — 3,2%. У 98% компаний с уровнем не THIN CV потока не меньше 0,5, то есть дисконт максимальный. У 59% лимит по потоку нулевой, сумму от 100 тыс. ₽ получают 27%. Формулы следуют SPEC; низкие лимиты — следствие тонкой маржи в мире (apps/world/turnovers.py). Вопрос передан экономическому блоку и задаче T12.

Упрощения

  • # SIMPLIFICATION: фондирование — ключевая ставка плюс постоянный спред. В банке казначейство задаёт трансфертную цену по срокам.
  • # SIMPLIFICATION: возобновляемый лимит (овердрафт, кредитная линия) считается как аннуитет на 12-месячный срок лимита. Банк рассчитывал бы его по условиям траншей и ожидаемому использованию.
  • # MOCK: гарантия Корпорации МСП — множитель к LGD и фиксированная комиссия, без интеграции с Корпорацией.
  • Текущие платежи и долг — только по кредитам самого бизнеса. Личные кредиты собственника ООО и связанные компании не учитываются (business_debt, apps/api/features/credit.py).
  • Залог оценивается по цене покупки оборудования. В банке была бы независимая оценка и дисконт на ликвидность.