Синтетический мир¶
Генератор синтетических компаний, на которых работают мок-источники, обучение скоринговой карты и демо-персоны (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 в общую папку.