Лимит и ставка (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). - Залог оценивается по цене покупки оборудования. В банке была бы независимая оценка и дисконт на ликвидность.