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

Синтетический мир

Генератор синтетических компаний, на которых работают мок-источники, обучение скоринговой карты и демо-персоны (SPEC §14). Только синтетические данные: никакой связи с реальными компаниями и людьми.

Сейчас в мире есть компании, скрытое качество q, отрасли и данные реестров (T01), кредиты компаний и обороты по счёту (T02), кредитные истории компаний и собственников (T03), мошеннические архетипы и клиенты с неполными данными (T04), исходы дефолта и разбиение на обучающую и отложенную выборки (T05), а также ответы остальных источников: карточка клиента, ФССП, арбитраж и Федресурс, 115-ФЗ (T06). Отдаёт их мок-сервис источников — apps/sources/. Из мира выбраны демо-персоны с ожидаемыми исходами и выписками из других банков (T12, PERSONAS.md).

Запуск

python -m apps.world --seed 42 --n 5000 --as-of 2026-10-01 --out apps/world/out

Все параметры необязательные, значения выше — по умолчанию. Результат:

  • meta.json — версия генератора, зерно, число компаний, дата среза as_of и параметры исходов, с которыми разыгран мир (outcomes, из config/world_outcomes.json);
  • companies.jsonl — по одной компании в строке.

Папка apps/world/out/ в git не попадает: мир всегда можно пересоздать из зерна. Из кода мир получают так: generate_world(seed, n, as_of); файлы читает read_world(path) из apps/world/__main__.py, обучающую и отложенную выборки отдаёт train_holdout(world).

Воспроизводимость

Результат зависит только от (seed, n, as_of) и параметров исходов в config/world_outcomes.json. Одинаковые параметры дают побайтно одинаковые файлы. Дата среза фиксированная, а не «сегодня».

У каждой компании свои независимые потоки случайных чисел: company_rng(seed, company_id, stream). T01 использует поток registry, T02 — потоки loans и turnovers, T03 — поток bki, T04 — поток archetype, T05 — поток outcome, T06 — потоки client_card, fssp, arbitration и aml, T12 — поток statement (выписки из других банков для демо-персон). Каждая задача заводит свои потоки, поэтому её добавление не меняет уже сгенерированные данные. По той же причине при увеличении n первые компании остаются прежними.

Исключения намеренные. Обороты T02 следуют за просрочками по кредитам из T03 (раздел «Счёт и БКИ согласованы»). T04 меняет данные компаний, которым выпал архетип (раздел «Мошеннические архетипы и неполные данные»), а обычные компании не трогает. Регрессионные тесты сверяют мир с хешами, посчитанными кодом из main до T04:

  • test_t01_data_is_unchanged — данные реестров у всех компаний, кроме «технических»;
  • test_t02_accounts_unchanged_where_payments_did_not_move — обороты обычных компаний и «завышателей», у которых ни один платёж по кредиту не сместился в другой месяц;
  • test_t03_reports_unchanged_except_shells — отчёты БКИ у всех компаний, кроме «технических».

Используется только стандартная библиотека Python, без numpy.

Что есть у компании

Поле Что это
company_id C00000, C00001, …
q Скрытое качество, N(0, 1). Движку не показывается, от него зависят остальные поля и вероятность дефолта
archetype Скрытый архетип (T04): regular, shell, inflater, main_bank_elsewhere, new_account или own_transfers. Как и q, движку не показывается
account_profile Скрытый профиль счёта (T04, хранится с T12): чем наш счёт отличается от всего бизнеса — our_share у основного счёта в другом банке, opened_at у недавно открытого счёта, inflated_months и inflation у раздутых своими переводами оборотов. У остальных — значения по умолчанию. Движку не показывается; по нему строятся выписки из других банков для демо-персон
industry Ключ отрасли из industries.py
legal_form ip или ooo; доля ИП своя у каждой отрасли (в среднем около половины)
size micro или small по 209-ФЗ (SPEC §3): до 15 / 100 сотрудников, выручка до 120 / 800 млн ₽
employees Численность; у многих ИП — 0, у «технической» компании — 1
annual_revenue Фактическая выручка за 12 месяцев до as_of, ₽. Основа для оборотов по счёту в T02. У «технической» компании — годовой объём транзита
revenue_growth Фактический годовой рост выручки; выше при высоком q. Задаёт тренд оборотов в T02
declared_annual_revenue Выручка, которую клиент указал бы в заявке (ApplicationRequest.declared_annual_revenue, T04)
egrul Ответ ЕГРЮЛ / ЕГРИП в формате контракта EgrulPayload
fns Ответ ФНС в формате контракта FnsPayload: ГИР БО за прошлый год для ООО, декларация для ИП
loans Кредиты и лизинг компании (WorldLoan из loans.py) вместе с их просрочками (late_payments, T03). Платежи по ним идут через счёт
accounts Обороты по счёту в формате контракта AccountsPayload: до 24 полных месяцев, категории поступлений и списаний, средний остаток, контрагенты за 12 месяцев
bki Отчёты БКИ в формате контракта BkiPayload: по компании и основному учредителю у ООО, по предпринимателю у ИП
client_card Карточка клиента в формате ClientCardPayload: продукты в нашем банке, внутренний стоп-лист (T06)
fssp Исполнительные производства в формате FsspPayload (T06)
arbitration Арбитражные дела и сообщения Федресурса о банкротстве в формате ArbitrationPayload (T06)
aml Ответ проверки по 115-ФЗ в формате AmlPayload: зона ЗСК, совпадения со списками, транзитные операции (T06)
pd_12m Истинная вероятность дефолта в течение 12 месяцев после as_of (T05). Скрыта от движка
default_12m Исход: просрочка 90+ дней в течение 12 месяцев после as_of (T05). Скрыт от движка
sample train или holdout: в какую выборку компания попадает при обучении скоринговой карты (T05)

Как q проявляется уже в T01:

  • у компаний с низким q чаще налоговая задолженность (в среднем у ~9% компаний), иногда с приостановкой операций по счетам;
  • они моложе в среднем, чаще меняют директора, у них ниже рентабельность и доля собственного капитала;
  • изредка (q < −1,5) — статус «в процессе ликвидации» или дисквалифицированный директор ООО.

Возраст: медиана около 3,5 лет, примерно 13% компаний моложе года и около 4% моложе полугода. Это нужно для уровней качества данных PARTIAL и THIN (SPEC §5.1). Компания, зарегистрированная в текущем году, ещё не сдавала отчётность: у неё нет ни ГИР БО, ни декларации.

Кредиты компании

loans.py, поток loans. Кредиты есть примерно у 40% компаний, у слабых (низкий q) — чаще. У компании от одного до трёх кредитов, выданных не раньше чем через 3 месяца после регистрации и не раньше чем за 5 лет до as_of.

  • Вид: кредит или лизинг. Лизинг бывает только у ООО, чаще в транспорте, строительстве, сельском хозяйстве и производстве.
  • Сумма — около 12% годовой выручки (у слабых больше), от 100 тыс. до 15 млн ₽. Один платёж не больше 10% среднемесячной выручки.
  • Ставка 17–32% годовых, у слабых выше. Срок: кредит 12–36 месяцев, лизинг 36–60.
  • Платёж аннуитетный. balance_after(n) даёт остаток долга после n платежей — по нему T03 считает остаток в отчёте БКИ.
  • Просрочки по кредиту (late_payments) разыгрывает T03, а payments() возвращает фактические платежи с их учётом: дату и сумму каждого.

Обороты по счёту

turnovers.py, поток turnovers. Формат — контракт AccountsPayload.

  • Счёт открыт в течение 45 дней после регистрации (кроме клиентов с недавно открытым счётом, T04). В выписке до 24 полных месяцев: от первого полного месяца после открытия до месяца перед as_of. Компании моложе 6 месяцев получают короткую историю — это клиенты уровня THIN по SPEC §5.1.
  • Поступления от покупателей = выручка / 12 × сезонность отрасли × тренд по revenue_growth × шум. Сезонность и тренд нормированы так, что за последние 12 месяцев поступления в среднем равны годовой выручке без наличной части. Новый бизнес первые 9 месяцев выходит на свой уровень.
  • Списания следуют структуре затрат отрасли: поставщики (доля себестоимости, с лагом в месяц), зарплата (если есть сотрудники; индексация в январе), налоги (взносы с зарплаты ежемесячно, налог с выручки по режиму — поквартально), аренда, фактические платежи по кредитам из loans (с учётом просрочек из T03), снятие наличных, прочие расходы.
  • Остаток моделируется помесячно. Излишек выше «подушки» уходит владельцу: у ИП — ежемесячно переводом на свою карту и наличными, у ООО — время от времени переводом на свой депозит. Нехватку покрывает владелец: взнос учредителя у ООО, перевод со своей карты у ИП.
  • Контрагенты за 12 месяцев: число покупателей и поставщиков зависит от отрасли и размера, доля крупнейшего покупателя выше, когда покупателей мало.

Как q проявляется в оборотах:

  • у слабых компаний сильнее колеблются поступления (медианный коэффициент вариации за 12 месяцев — около 0,26 при q < −1 против 0,12 при q > 1) и чаще бывают месяцы без поступлений;
  • они чаще задерживают зарплату и налоги; у компании с налоговой задолженностью в ФНС налоговые платежи за последние полгода почти прекращаются;
  • у них тоньше «подушка» на счёте, поэтому чаще нужны деньги владельца: около 9% поступлений против 1–2% у сильных компаний.

У обычных компаний при зерне 7 и 3000 компаниях по порогам SPEC §5.1 получается около 74% FULL, 19% PARTIAL и 7% THIN. THIN — в основном молодые компании, PARTIAL среди компаний с 24 месяцами истории — в основном отрасли с наличной выручкой (салоны красоты, розница, автосервис), где покрытие выручки ниже 70%. Ещё около 4% обычных компаний попадают в PARTIAL из-за доли операционных поступлений: за последние 12 месяцев они получили кредит или взнос учредителя. Клиенты с неполными данными из T04 добавляют PARTIAL и THIN. Уровень считает apps/api/features/data_quality.py (T09), см. apps/api/features/README.md.

Кредитные истории (БКИ)

bki.py, поток bki. Формат — контракт BkiPayload (SPEC §5).

  • Отчёты. У ООО два отчёта: по компании и по основному учредителю (первый в founders, у него наибольшая доля). У ИП один отчёт owner по ИНН предпринимателя, в нём и кредиты бизнеса, и личные.
  • Продукты компании — кредиты и лизинг из loans с остатком на дату среза. У части компаний, чаще у слабых, есть ещё овердрафт или кредитная линия в другом банке: лимит около 6% годовой выручки, обязательный платёж — проценты по ставке 24% годовых.
  • Личные продукты собственника — кредитные карты (хотя бы одна у 60% собственников, лимит около 120 тыс. ₽, обязательный платёж — 5% задолженности) и потребительские кредиты (чаще у слабых). Они открыты не раньше чем за 7 лет до среза, часть уже закрыта.
  • Возобновляемые продукты (овердрафт, кредитная линия, карта): amount — лимит, balance — использованная часть. У слабых лимиты использованы сильнее.
  • Закрытый продукт: заполнен closed_at, balance и monthly_payment равны 0, история просрочек остаётся. Поэтому сумма monthly_payment по отчёту — текущая долговая нагрузка.

Просрочки

Платёж по графику приходится на день открытия продукта в каждом следующем месяце (не позже 28-го). Просрочки бывают трёх видов:

  • техническая — 1–5 дней;
  • недоплаченный небольшой остаток — меньше 1 000 ₽ или меньше 1% платежа, 6–60 дней;
  • настоящая — от 6 дней, длительность логнормальная, у слабых дольше. Платежи, которые наступили за это время, тоже просрочены и гасятся вместе в день погашения.

Кроме того, у действующего продукта может быть текущая просрочка: платежи прекратились за некоторое время до среза. Она видна в current_overdue_days и current_overdue_amount, а также последней записью в delinquencies с длительностью до даты среза.

Поля записи Delinquency: started_at — дата платежа, не внесённого вовремя; days — дней до погашения (у текущей просрочки — до среза); amount — просроченная сумма на пике (все пропущенные платежи или недоплаченный остаток); payment_due — платёж по графику.

Правила по просрочкам из SPEC §5 (технические задержки, мелкие суммы, вес старых эпизодов) применяет библиотека признаков (apps/api/features/credit.py, T08), а не мир. Мир только гарантирует, что для каждого правила есть случаи. Это проверяет test_world_has_cases_for_every_overdue_rule.

Счёт и БКИ согласованы

Просрочки по кредитам из loans разыгрываются до оборотов (add_late_payments), а счёт показывает фактические платежи (WorldLoan.payments()). Просроченный платёж уходит в месяц погашения, при текущей просрочке платежей по кредиту на счёте нет. Поэтому разница между тем, что положено заплатить по графику до среза, и тем, что прошло через счёт, ровно равна current_overdue_amount в БКИ, а остаток долга в БКИ равен balance_after(число оплаченных платежей).

Если ни один платёж не сместился в другой месяц, обороты компании побайтно совпадают с T02. При зерне 11 и 300 компаниях обороты изменились у 29.

Запросы кредитной истории

В отчёте — запросы за последний год:

  • перед каждым новым продуктом — запрос его кредитора, часто ещё один-два от других;
  • запросы, которые ни к чему не привели: около одного в год при q = 0, у слабых больше и чаще от МФО;
  • у части слабых — «хождение по банкам»: 3–6 запросов за последние 4 недели перед заявкой к нам (флаг SPEC §7).

Как q проявляется в кредитной истории

Платёжная дисциплина собственника связана с q компании (корреляция 0,7), но не совпадает с ним. При зерне 7 и 3000 компаниях:

q < −1 q > 1 Все
Просрочка 30+ дней за 24 месяца 37% 3% 14%
Просрочка 90+ дней за 24 месяца (стоп-фактор) 16% 0,2% 4%
Текущая просрочка больше 30 дней (стоп-фактор) 7% 0% 2%
3 и больше запросов за 30 дней (флаг) 13% 2% 6%
Запросов за 3 месяца, в среднем 1,4 0,35 0,75
Использование лимитов 59% 20% 38%

Хотя бы один продукт в БКИ есть у 85% компаний; чаще всего это карта собственника.

Мошеннические архетипы и неполные данные (T04)

archetypes.py, поток archetype. У каждой компании ровно один скрытый архетип (SPEC §1.2, §5.1, §14). Движок его не видит и должен найти признаки в данных. Мошеннические архетипы разыгрываются по данным реестров, архетипы неполных данных — после отчёта БКИ.

Архетип Доля Кто Что в данных Что должен увидеть конвейер
shell — «техническая» компания 1,5% ООО, микро, 6–36 месяцев с регистрации Деньги приходят от 2–8 «покупателей» и за 1–2 дня уходят «поставщикам» и наличными. Налоги — 0,1–0,3% оборота; нет зарплаты, аренды и кредитов у нас; один сотрудник. Массовый адрес: fns.mass_address, в одном здании зарегистрированы несколько таких компаний. В ГИР БО себестоимость 96–99% выручки, прибыль около нуля, капитал — уставные 10 тыс. ₽ Флаг транзитных операций (SPEC §7), массовый адрес, почти нет налогов. Уровень данных при этом чаще FULL: поступления выглядят как выручка
inflater — «завышатель» 3% Чаще слабые (низкий q) Данные как у обычной компании, но заявленная выручка в 1,5–2 раза больше реальной Флаг «заявленная выручка отличается от подтверждённой больше чем на 30%»
main_bank_elsewhere — основной счёт в другом банке 6% Чаще те, у кого в БКИ действующий овердрафт или кредитная линия в другом банке (18% против 4%) Через наш счёт идёт 10–60% безналичного бизнеса: поступлений, платежей поставщикам, зарплаты и налогов Покрытие выручки ниже 70% → PARTIAL или THIN
new_account — недавно открытый счёт 2,5% Бизнесу больше 400 дней, кредитов у нас нет Счёт открыт 20–330 дней назад; бизнес к этому времени уже работает в полную силу История меньше 12 месяцев → PARTIAL или THIN
own_transfers — обороты раздуты своими переводами 3% Чаще слабые Последние 4–12 месяцев приходят деньги со своих счетов в других банках, у ООО ещё и займы учредителя: в сумме 3,5–12 месячных поступлений. Почти всё уходит обратно в том же месяце Доля операционных поступлений ниже 80% → PARTIAL или THIN
regular 83% Все остальные Как в T01–T03 —

Доли — при зерне 7 и 3000 компаниях. Каждый архетип, кроме «технической» компании, есть и среди ИП, и среди ООО.

По порогам SPEC §5.1 весь мир при зерне 7 и 3000 компаниях — это 65% FULL, 22% PARTIAL и 13% THIN (у обычных компаний — 74%, 19% и 7%). Клиенты с основным счётом в другом банке почти все PARTIAL или THIN (FULL — 2%), с недавно открытым счётом и с раздутыми оборотами — все.

Заявленная выручка

У каждой компании есть declared_annual_revenue — реальная выручка за 12 месяцев, как её называет человек по памяти: две значащие цифры (12 345 678 → 12 000 000), обычно с ошибкой около ±10%. 6% честных клиентов завышают выручку на 15–50%: считают наличные, НДС или свои переводы. Поэтому больше чем на 30% от реальной выручки отличается заявленная у 4% честных клиентов и у всех «завышателей», и флаг сам по себе не доказывает мошенничество.

Что из этого нужно следующим задачам

  • T05: архетип стоит учесть в исходе: «техническая» компания возвращать кредит не собирается, а «завышатель» — настоящий бизнес со своим q.
  • T06: сделано, ответ 115-ФЗ выводится из архетипа — см. раздел «Остальные источники (T06)».
  • T12: сделано, демо-персоны — в разделе «Демо-персоны (T12)». Для каждого архетипа есть кандидаты и среди ИП, и среди ООО; «техническая» компания — только ООО.

Исходы дефолта и выборки (T05)

outcomes.py, поток outcome. Исход — дефолт в течение 12 месяцев после даты среза: просрочка 90+ дней (SPEC §8, §14). Как q и архетип, он скрыт от движка; по нему обучается скоринговая карта (T10) и считается валидация (T11). Демо-персоны (T12) его не читают.

pd_12m      = sigmoid(a + b·q + поправка отрасли)
default_12m ~ Bernoulli(pd_12m)
  • Параметры — в config/world_outcomes.json, их задаёт экономический блок. Мир записывает их в meta.json.
Параметр Значение Что задаёт
target_default_rate 0,065 Ожидаемая доля дефолтов среди всех компаний, кроме «технических»
quality_slope −1,1 b: насколько падает логарифм шансов дефолта при росте q на 1
shell_default_probability 0,7 PD «технической» компании
holdout_share 0,3 Доля отложенной выборки
industry_default_offsets от −0,2 (IT) до +0,5 (рестораны) Поправка отрасли: насколько отрасль рискованнее остальных при том же q. Указывается для каждой отрасли из industries.py, ни одну нельзя пропустить
  • Свободный член a вручную не задаётся. Он подбирается так, чтобы ожидаемая доля дефолтов по совокупности (q ~ N(0, 1), отрасли по их долям в мире) равнялась target_default_rate. При текущих параметрах a ≈ −3,32. Он зависит только от конфигурации, а не от сгенерированных компаний, поэтому при увеличении n исходы первых компаний не меняются.
  • Поправки отраслей сдвигают риск между отраслями, а общий уровень дефолтов задаёт target_default_rate: если поднять поправку одной отрасли, a уменьшится, и остальные отрасли станут чуть надёжнее.
  • Архетипы. «Техническая» компания возвращать кредит не собирается: её PD — shell_default_probability. «Завышатель» и клиенты с неполными данными — настоящий бизнес, для них работает та же формула со своим q: неполные данные сами по себе риском не являются (SPEC §1.2).
  • Выборки. Каждая компания попадает в обучающую (train) или отложенную (holdout) выборку независимо от исхода. Обе величины разыгрываются из одного потока: сначала дефолт, потом выборка. Поэтому повышение целевой доли дефолтов только добавляет дефолты и не переносит компании между выборками, а изменение доли отложенной выборки не меняет исходы.

При зерне 7 и 3000 компаниях (строки по q — без «технических» компаний):

Доля компаний Доля дефолтов
q < −1 16% 20%
−1 ≤ q ≤ 1 68% 5,5%
q > 1 16% 0,4%
Все, кроме «технических» 98,5% 7,0% (средняя PD — 6,6%)
«Технические» компании 1,5% 77%
Весь мир 100% 8,0%

Распределение по грейдам SPEC §8 по истинной PD (без «технических» компаний): A — 19%, B — 21%, C — 24%, D — 21%, E — 15%. Обученная карта будет различать заёмщиков хуже истинной PD, поэтому её грейды лягут плотнее к середине, но заёмщики всех грейдов в мире есть. Gini истинной PD без «технических» компаний — 0,52 (зерно 7) и 0,60 (зерно 42): выше него не поднимется ни одна модель, обученная на этом мире.

Отложенная выборка: 903 компании и 89 дефолтов (9,9% против 7,2% в обучающей — случайное расхождение выборок, см. «Известные ограничения»). В мире по умолчанию (зерно 42, 5000 компаний) — 1508 компаний и 111 дефолтов, 7,4% против 6,7%.

Исход зависит только от q, отрасли и архетипа. Движок q не видит, поэтому модель учится по признакам, которые зависят от q: просрочкам, налоговой задолженности, колебаниям оборотов и т. д. Например, у компаний с налоговой задолженностью дефолтов примерно вдвое больше: 13% против 6% при зерне 7. Это проверяет test_observable_signals_carry_the_outcome.

Остальные источники (T06)

registries.py. Карточка клиента, ФССП, арбитраж с Федресурсом и 115-ФЗ строятся из уже готовых данных компании, у каждого источника свой поток. Поэтому данные T01–T05 не меняются: это проверяют те же хеш-тесты.

  • Карточка клиента. client_since — дата открытия счёта. Продукты:
  • счёт с остатком последнего месяца;
  • действующие кредиты из loans с остатком и платежом, как в БКИ;
  • бизнес-карта у половины клиентов;
  • депозит у ООО, которое переводит излишек «на свой депозит» (T02).

Лизинг в карточку не попадает: его даёт лизинговая компания, а не банк. Внутренний стоп-лист — у 0,3% компаний; у «технических» компаний — у 15%: часть из них комплаенс банка уже поймал. - ФССП. Открытые исполнительные производства за последние два года, по компании и собственнику (у ИП — только owner). Откуда они берутся: - налоговая задолженность из ФНС передаётся приставам в 35% случаев, а при приостановленных операциях по счетам — в 80%; - текущая просрочка 90+ дней в БКИ — в половине случаев; - долги по договорам, коммунальные платежи и штрафы — чаще у слабых компаний.

Часть долга может быть уже погашена: remaining ≤ amount. - Арбитраж и Федресурс. Дела за последние три года: - в роли истца — обычное дело в B2B-отраслях, компания взыскивает долги с покупателей; - в роли ответчика — чаще у слабых компаний, и иски у них крупнее; плюс иск кредитора при просрочке 90+ дней; - в роли третьего лица — изредка.

Номер дела — с кодом арбитражного суда региона (А45-… — Новосибирская область). Дела моложе полугода в основном не рассмотрены. Сообщение о намерении кредитора подать на банкротство появляется редко: в основном при длинной просрочке в БКИ или у ликвидируемой компании. Через 15 дней за ним может последовать заявление (filing). - 115-ФЗ. # MOCK: ответ выводится из скрытого архетипа, как вердикт настоящей системы ПОД/ФТ следовал бы за настоящим поведением: - у «технической» компании признаки транзитных операций находятся в 85% случаев, зона ЗСК — красная или жёлтая; - у остальных — редкие ложные срабатывания, чаще у клиентов, которые раздувают обороты своими переводами (их деньги тоже приходят и уходят в том же месяце); - совпадения со списками — у 0,2% компаний и у 5% «технических».

При зерне 7 и 3000 компаниях (строки по q — без «технических» компаний):

q < −1 q > 1 Все
Есть исполнительные производства (флаг SPEC §7) 26% 1,7% 9,5%
Компания — ответчик в арбитраже 18% 1,3% 6,2%
Иски к компании больше 10% выручки (флаг) 6,5% 0% 1,4%
Сообщение о банкротстве (стоп-фактор) 2,5% 0% 0,5%
Совпадение со списками 115-ФЗ (стоп-фактор) 0,5%
Внутренний стоп-лист (стоп-фактор) 0,3%
Транзитные операции по 115-ФЗ (флаг) 1,7% (у «технических» — 73%)

Для каждого стоп-фактора и флага SPEC §7, который читает эти источники, в мире есть случаи. Это проверяет test_world_has_cases_for_every_source_stop_factor_and_flag.

Демо-персоны (T12)

personas.py выбирает из мира по умолчанию по одной компании на каждый исход демо и записывает их с ожидаемыми решениями конвейера в demo/personas.json; выписки из других банков для персон PARTIAL и THIN строит statements.py (поток statement) и кладёт в demo/statements/. Пересоздать: python -m apps.world.personas. Таблица ожидаемых исходов, правила отбора и ограничения — в PERSONAS.md.

Чтобы выписку можно было построить из мира, T12 сохраняет у компании профиль счёта (account_profile), который T04 раньше только использовал. Данные компаний от этого не меняются, но версия генератора поднята до world-t12-1: мир в apps/world/out старой версии пересоздаётся при запуске.

Отрасли

industries.py — 12 отраслей. У каждой: основной и дополнительные ОКВЭД, доля в мире, доля ИП, медианная выручка, выручка на сотрудника, доля себестоимости, активы к выручке, сезонность по месяцам (среднее по году — 1) и параметры оборотов для T02: доля наличной выручки, доли аренды и зарплаты в выручке, типичное число покупателей и поставщиков.

Это параметры синтетического мира, а не кредитная политика, поэтому они лежат здесь, а не в config/. Исключение — параметры исходов (T05), в том числе поправки отраслей к уровню дефолтов: их задаёт экономический блок, поэтому они в config/world_outcomes.json.

Упрощения

В коде помечены # SIMPLIFICATION:.

Упрощение Как было бы в реальности
ИНН и ОГРН устроены как настоящие и проходят проверку контрольных цифр, но коды инспекций берутся из короткого списка, а номера идут подряд Реальные номера из реестров
12 отраслей с параметрами, заданными вручную Полное дерево ОКВЭД, параметры откалиброваны по статистике портфеля банка
Выручка — логнормальная вокруг медианы отрасли со сдвигом по q; молодые компании меньше Распределения по реальным данным банка
Последний отчётный год — всегда прошлый календарный; срок сдачи отчётности не учитывается ГИР БО и декларации появляются с задержкой и по срокам ФНС
Имена людей и названия компаний собраны из коротких списков слов — (реальные данные запрещены условиями кейса)
Массовый адрес только у «технических» компаний: два здания в каждом городе Адрес из списка адресов массовой регистрации ФНС; такой адрес бывает и у обычного бизнеса (виртуальный офис)
Обычный клиент открывает счёт сразу после регистрации и проводит через него всю безналичную выручку; клиент с основным счётом в другом банке проводит через наш одну и ту же долю всех операций Через разные банки идут разные покупатели и платежи, клиенты переходят из банка в банк постепенно
У компании не больше одного архетипа «Завышатель» может держать основной счёт в другом банке, а «техническая» компания — раздувать обороты своими переводами
Доли архетипов фиксированные Доля мошенничества неизвестна и меняется со временем
«Техническая» компания: транзит за 1–2 дня, налоги — плоская доля оборота Цепочки посредников, обналичивание через несколько компаний, налоги по декларациям с фиктивными вычетами
Свои переводы и займы учредителя приходят и уходят в том же месяце Деньги ходят по кругу с разными сроками
Заявленная выручка — реальная с шумом; других заявленных значений нет Клиент заявляет и другие значения, например численность
Наличная выручка не попадает на счёт, остальная попадает целиком; эквайринг и СБП разнесены по отдельным покупателям Наличные частично вносятся на счёт, эквайринг приходит одной суммой от банка-эквайера
Затраты — постоянные доли выручки по отрасли, налог с выручки — плоская ставка по режиму, у ООО — одна общая ставка Реальная структура затрат компании, НДС, вычеты и сроки уплаты по Налоговому кодексу
Новый бизнес выходит на свой уровень выручки линейно за 9 месяцев Разные траектории запуска бизнеса
Кредиты компании в нашем банке (loans) — только кредиты и лизинг, все платежи через наш счёт Кредиты, которые обслуживаются с других счетов
Срок платежа — день открытия продукта, не позже 28-го Дата платежа по графику договора
Просрочка гасится одним платежом, без пени; график после неё не сдвигается Пени и штрафы по договору, реструктуризация, распределение платежа между процентами и основным долгом
Овердрафт и кредитная линия в другом банке обслуживаются со счёта в том банке, наш счёт их не видит Компания с продуктами в другом банке часто переводит туда и часть оборотов. В мире это учтено только вероятностью архетипа main_bank_elsewhere (T04)
Использованная часть лимита и обязательный платёж по возобновляемым продуктам постоянны на всём сроке Помесячная история использования лимита
У собственника только карты и потребительские кредиты Ипотека, автокредиты, поручительства собственника по чужим кредитам
Отчёт ООО — только по основному учредителю Отчёты по всем значимым учредителям и поручителям
Исход разыгрывается по истинной PD, а не по помесячным платежам за следующие 12 месяцев Исход берётся из кредитного портфеля: первая просрочка 90+ дней после выдачи
Исход есть у каждой компании мира, как будто банк выдал кредит всем Исходы известны только по выданным кредитам; по отказанным заявкам их восстанавливают (reject inference). Скоринговая карта (T10) обучается на всех компаниях обучающей выборки, см. apps/ml/README.md
Вероятность дефолта зависит только от q, отрасли и архетипа Дефолт вызывают и события после выдачи: потеря крупного покупателя, рост долговой нагрузки, кризис в отрасли
Выборки — случайное разбиение на одну дату среза Отложенная выборка по более позднему периоду (out-of-time), чтобы проверить и стабильность модели
В отчёте запросы за последний год и личные продукты за 7 лет Отчёт содержит всю историю, которую хранит БКИ
Связанных компаний нет: у каждой компании свои люди Группы компаний с общими собственниками и директорами
Депозит ООО хранит ровно то, что ушло «на свой депозит» и не вернулось, без процентов Депозиты со своими сроками, процентами и пополнениями
ФССП и арбитраж: частота и суммы разыгрываются от q, налоговой задолженности и просрочек, а не от событий на счёте Производства и иски возникают из конкретных неоплаченных счетов и договоров
115-ФЗ: ответ выводится из скрытого архетипа (# MOCK:) Платформа ЦБ «Знай своего клиента», проверка по перечням Росфинмониторинга и собственный мониторинг операций банка
Выписки из других банков (T12): один выдуманный банк; клиент с недавно открытым счётом перевёл к нам весь бизнес сразу, прежний счёт остался без оборотов Выписки разных банков в их собственных форматах; переход клиента из банка в банк растягивается на месяцы
Демо-персоны отбираются по скрытому архетипу (T12) Персоны для демо и тестов — обезличенные реальные кейсы, отобранные риск-менеджером

Известные ограничения

Сейчас не мешают, но к ним стоит вернуться, если понадобится.

  • Численность малых компаний скапливается у нижней границы. Численность выводится из выручки, поэтому у многих малых компаний она упирается в минимум 16 человек (при зерне 42 и 5000 компаниях — у 86 из 320). Для скоринга это не важно, но разброс нереалистичный. Если понадобится, численность малых компаний можно тянуть из своего распределения в диапазоне 16–100.
  • Молодых компаний немного. Моложе полугода около 4% компаний, моложе года — около 13%. Для демо-персон (T12) этого хватило: персона THIN — клиент с недавно открытым счётом (T04). Если понадобится больше молодых компаний, надо сдвинуть распределение возраста в _company или добавить отдельную группу молодых компаний.
  • Заявленная выручка — за последние 12 месяцев, а выручка в ФНС — за прошлый календарный год. У компании, зарегистрированной в прошлом году, отчётность только за часть года, у остальных выручка успевает вырасти или упасть. Поэтому даже у честных клиентов заявленная выручка расходится с ФНС больше чем на 30% часто: у 21% компаний с отчётностью за полный год и у 82% зарегистрированных в прошлом году (34% всех обычных компаний с отчётностью, зерно 7, 3000 компаний). Если сравнивать в лоб, флаг SPEC §7 будет срабатывать слишком часто. Библиотека признаков (T08, apps/api/features/revenue.py) пересчитывает неполный год на полный и переносит выручку на последние 12 месяцев по динамике поступлений; с этой оценкой расхождение больше 30% остаётся у 7% и 15% честных клиентов соответственно. Флаг (T14) должен сравнивать заявленную выручку с ней, а не с выручкой ФНС как есть.
  • Просрочка по кредиту не меняет остальное поведение компании. Деньги пропущенного платежа остаются на счёте, но зарплата, налоги и поставщики в эти месяцы не меняются; просрочки связаны с ними только через q. Так же только через q кредитная история связана с налоговой задолженностью в ФНС.
  • Заявка к нам не оставляет запроса в БКИ. Запросы в мире — до даты среза, и мок-сервис (T06) тоже не дописывает запрос нашего банка: флаг «3 и больше запросов за 30 дней» (T14) в любом случае должен считать только чужие запросы. Если отчёт в досье должен показывать и наш запрос, его можно добавить в адаптере БКИ (T07).
  • Налоговая задолженность и пропуски налоговых платежей связаны только качественно. Пропущенные платежи на счёте не складываются ровно в tax_debt из ФНС.
  • Разбиение на выборки не стратифицировано по исходу. Каждая компания попадает в выборку сама по себе: так при увеличении n первые компании остаются прежними. Цена — случайное расхождение долей дефолтов: при зерне 7 и 3000 компаниях в отложенной выборке 9,9% против 7,2% в обучающей. Если T11 понадобится одинаковая доля, стратифицировать можно при обучении, не меняя мир.
  • ИНН и ОГРН в tests/fixtures/ не проходят проверку контрольных цифр, а сгенерированные — проходят. Если интерфейс начнёт проверять контрольные цифры, примеры придётся исправить отдельным PR в общую папку.