AAYMA
RU
Войти

Граф денег

Анализ транзакционной сети 81 seed-клиента (2 248 узлов): роли узлов, кластеры Louvain с гипотезами, топ-50 приоритетов проверки, интерактивный граф…

Доведённый продукт
Команда «ООО «Бнал»» 4💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: ООО «Бнал»
Кейс HackAlem.ai: Финансы — Freedom
Стадия: Доведённый продукт

Задача кейса: «Граф денег»: восстановить структуру организованной группы по сети транзакций (AML)

Суть

Анализ транзакционной сети 81 seed-клиента (2 248 узлов): роли узлов, кластеры Louvain с гипотезами, топ-50 приоритетов проверки, интерактивный граф и AI-помощник.

Как устроено

Parquet/CSV (nodes, edges, transactions) валидируются, строится граф NetworkX с метриками (PageRank, betweenness, потоки, haircut-атрибуция). Правила из config.yaml назначают роли consolidator/distributor/transit/terminal/coordinator/peripheral с баллом и обоснованием, Louvain выделяет кластеры, приоритет — взвешенная сумма перцентилей seed-оборота, PageRank/betweenness и роли. Дополнительно ищутся циклы до 5, повторяющиеся цепочки A→B→C, дробление платежей, устойчивость сети; AI-помощник на gpt-4.1-mini с function calling по графу, офлайн-фолбэк.

Ключевые решения

  • NetworkX
  • Louvain
  • PageRank
  • betweenness
  • rule-based role scoring
  • haircut attribution
  • cycle detection
  • function calling

Метрики

Расчёт ≈2 мин (<5 мин) на 2 248 узлах/3 119 связях/4 840 транзакциях; найдено 120 повторяющихся цепочек и 7 групп дробления

Особенности

Прозрачные настраиваемые правила ролей и формула приоритета; защита граничных узлов 4-го колена от ложной роли terminal; помимо обязательных CSV выдаёт next_requests.csv — список следующих запросов данных для аналитика. Есть онлайн-демо на Vercel и видео.

Стек

Python · pandas · PyArrow · NumPy · SciPy · NetworkX · FastAPI · vis-network · Vercel · Streamlit · pyvis · Altair · pytest

Модели

gpt-4.1-mini


Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-db041ec5-team.

README

README.md

Граф денег — HackAlem AI

Трек: Финансы · Кейс: восстановление финансовой структуры организованной группы по транзакционной сети.

🌐 Онлайн-демо: https://moneygraph-hackalem.vercel.app (без пароля, конкурсный набор уже рассчитан) 🎬 Видео работы: https://youtu.be/76Vf1yPgT2w

Обзор: 2 248 участников, роли и кластеры

Какую проблему решаем

У аналитика финмониторинга есть 81 подозрительный клиент (seed) и выгрузка их переводов на 4 колена: 2 248 клиентов, 3 119 связей, 4 840 транзакций. Вручную понять, кто в этой сети собирает деньги, кто раздаёт, кто транзит, а кто конечный получатель, — это дни работы.

«Граф денег» за один запуск (≤ 5 минут, на практике ≈ 2 минуты):

  1. Назначает роль каждому узлу: consolidator, distributor, transit, terminal, coordinator, peripheral, с баллом 0–1 и текстовым обоснованием.
  2. Находит группы (кластеры) методом Louvain и формулирует гипотезу о назначении каждой группы.
  3. Ранжирует узлы по приоритету проверки (топ-50) и объясняет, почему узел в топе.
  4. Показывает интерактивный граф: поиск по gid, направления переводов, раскраска по ролям и кластерам, карточка узла с потоками и сработавшими правилами.
  5. Отвечает на вопросы через AI-помощника (OpenAI, вызов инструментов по данным графа). Без ключа помощник работает офлайн по правилам.

Результаты — гипотезы для проверки аналитиком, а не доказательство вины. Все правила прозрачны и настраиваются в config.yaml.

Граф и карточка узлаКластеры и гипотезы
Граф: окружение узла №1 из топа и его карточкаКластеры: размер, seed, оборот, гипотеза

Технологии

СлойСтек
АнализPython 3.12, pandas, PyArrow, NumPy, SciPy, NetworkX (PageRank, betweenness, Louvain)
Веб-версияFastAPI + vis-network, деплой на Vercel (api/index.py)
Локальный интерфейсStreamlit, pyvis, Altair
AI-помощникOpenAI API (gpt-4.1-mini, function calling, JSON Schema), офлайн-фолбэк
Качествоpytest: tests/ (расчёт, API) и tests_c/ (UI, помощник)

Быстрый запуск

Вариант 1. Открыть онлайн

https://moneygraph-hackalem.vercel.app — ничего устанавливать не нужно.

Вариант 2. Windows, в один клик

Нужен Python 3.12. Положите nodes.parquet, edges.parquet, transactions.parquet в папку data/ (необязательно: без них откроется форма загрузки).

ДействиеЧто произойдёт
Двойной клик START.cmdСоздаст .venv, поставит зависимости, выполнит расчёт по data/ и откроет Streamlit на http://localhost:8501
Двойной клик START_WEB.cmdЗапустит веб-версию (как на Vercel) на http://127.0.0.1:8600
START.cmd -CheckЗапустит все тесты
START.cmd -DemoДемо на вымышленных данных, без расчёта

Вариант 3. Вручную (любая ОС)

python3.12 -m venv .venv
# Windows: .venv\Scripts\activate   |   Linux/macOS: source .venv/bin/activate
pip install -r requirements-lock.txt

# 1) Расчёт: Parquet → CSV (≤ 5 минут)
python -X utf8 run.py --data data --out output/current --config config.yaml

# 2) Интерфейс
streamlit run app.py                                   # локальный UI
python -m uvicorn api.index:app --port 8600            # веб-версия

AI-помощник (необязательно): скопируйте .env.example в .env и укажите OPENAI_API_KEY. Расчёт ролей, кластеров и приоритетов от ключа не зависит. Подробности: docs/OPENAI_VERCEL.md.

Как проверить решение (для жюри)

  1. Расчёт. Выполните run.py (см. выше) и откройте output/current/run_report.json: там должны быть "status": "ok" и elapsed_seconds < 300.
  2. Обязательные выгрузки в output/current/:
    • nodes_roles.csv: gid, role, role_score, cluster_id, priority_score, evidence. Все 2 248 узлов с ролью и обоснованием.
    • clusters.csv: cluster_id, n_nodes, n_seed, sum_kzt_internal, top_gids, hypothesis.
    • top_nodes.csv: rank, gid, role, priority_score, why. Топ-50.
  3. Интерфейс. Обзор → Приоритеты → Граф: найдите gid из топа и откройте карточку. В ней роль, балл, сработавшие правила и входящие и исходящие потоки.
  4. Свои данные. Блок «Загрузить файлы и выполнить анализ» принимает Parquet или CSV по схеме ниже. Некорректные файлы отклоняются с объяснением.
  5. Помощник. Вкладка чата, например вопрос: «Кто главный консолидатор и откуда к нему идут деньги?»
  6. Тесты. python -X utf8 -m pytest -q.

Подробный сценарий и контрольные узлы: docs/CHECK_PROJECT.md.

Формат входных данных

ФайлОбязательные колонки
nodes.parquet / .csvgid (int64), depth (0 = seed), is_seed (bool / 0-1)
edges.parquet / .csvsrc, dst, sum_kzt, n_tx, depth
transactions.parquet / .csvsrc, dst, date (ISO), sum_kzt

CSV: UTF-8, разделитель — запятая. Концы рёбер должны быть в nodes, суммы в edges должны сходиться с transactions. Описание конкурсного датасета: docs/DATASET.md.

Как принимаются решения

РольОсновное условие
consolidator≥ 5 плательщиков; балл учитывает число источников и равномерность входов
distributorне граница выборки, ≥ 10 получателей
transitне граница, степени ≤ 3, есть исходящие; для не-seed out/in от 0,8 до 1,2
terminalне граница, вход ≥ медианы; нет исходящих (или out/in ≤ 0,2 для не-seed)
coordinatorне граница; ≥ 2 сигнала: сходимость seed, ролевые соседи, мостовая позиция
peripheralни одно правило не сработало

Приоритет = 0,35 × перцентиль seed-оборота + 0,20 × перцентиль seed-источников + 0,15 × max(перцентиль PageRank, betweenness) + 0,30 × вес роли × role_score (для самих seed × 0,85). Формулы: docs/roles.md, методы: docs/METHODS.md.

Дополнительные сигналы: транзит в окне 2 дней, повторяющиеся цепочки A→B→C, дробление платежей (≥ 3 близкие суммы в день), циклы длиной до 5, устойчивость сети при удалении топ-узлов, список следующих запросов данных. На конкурсном наборе найдено 120 повторяющихся цепочек и 7 групп близких платежей.

Дополнительные выгрузки: node_features.csv, graph.json, data_quality.md, next_requests.csv, cluster_metrics.csv, cycles.csv, resilience.csv, repeated_routes.csv, splitting.csv.

Архитектура

Схема решения: данные → метрики → роли → интерфейс

flowchart LR
    A[Parquet / CSV] --> B[Валидация<br/>moneygraph/io.py]
    B --> C[Граф и метрики<br/>graph, features, flow]
    C --> D[Роли и кластеры<br/>roles, clusters]
    D --> E[Приоритет и CSV<br/>priority, export]
    E --> F[Streamlit UI<br/>app.py, ui/]
    E --> G[FastAPI + Vercel<br/>api/index.py]
    F & G --> H[AI-помощник<br/>assistant/]
moneygraph/   расчётный конвейер (граф, метрики, роли, кластеры, приоритет, экспорт)
assistant/    LLM-агент с инструментами по графу + офлайн-фолбэк
api/          FastAPI для веб-версии (Vercel)
ui/, app.py   Streamlit-интерфейс
run.py        CLI: Parquet → CSV
config.yaml   все пороги и веса
tests/, tests_c/  автотесты
docs/         методы, роли, проверка, демо

Ограничения

  • Пороги ролей — наши эвристики. Разметки (ground truth) нет, поэтому role_score — это не вероятность, а accuracy не измерена.
  • Граница выборки (4-е колено) защищена от ложной роли terminal: у крайних узлов исходящие просто не выгружены.
  • Haircut-атрибуция моделирует пропорциональное смешение денег и не доказывает движение конкретной операции.
  • Решение рассчитано на конкурсный объём. Для миллиона узлов понадобятся чтение по частям, CSR/igraph и приближённые центральности; на таком объёме проект не проверялся.
  • Данные организаторов обезличены и включены в showcase/ только для демонстрации; репозиторий приватный. Решение не использует ФИО, ИИН и иные персональные данные. .env и окружения в Git не входят.

Команда

  • Artyom — граф, метрики, атрибуция потоков
  • Kostya — роли, скоринг, конвейер
  • Maksim — интерфейс и AI-помощник
Звёзды
⭐ 0
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
13
Авторы
3
Файлы
115
Ветки
4

Авторы коммитов

atomi7e 8legez 3KostyaKostolom 2

История коммитов

  • 2026-09-23 17:46docs: update demo video link and drop backup videolegez
  • 2026-09-23 17:41docs: replace README screenshots with current web designlegez
  • 2026-09-23 17:39docs: rewrite README for jury reviewlegez
  • 2026-09-23 17:22Complete Money Graph analysis, OpenAI assistant and Vercel dashboardatomi7e
  • 2026-09-23 16:05Rewrite jury README with reproducible setup and verificationatomi7e
  • 2026-09-23 15:54Prepare NVIDIA adapter and verify delivery in clean environmentatomi7e
  • 2026-09-23 15:26Integrate real data, precise graph IDs and UI verification across A B Catomi7e
  • 2026-09-23 15:21Merge Maksim UI and assistant into Artyom with verified backendatomi7e
Все коммиты (13)
  • 2026-09-23 15:21Validate real organizer data and preserve backend fixes before UI integrationatomi7e
  • 2026-09-23 15:14Integrate Streamlit dashboard, offline assistant and team handoffKostyaKostolom
  • 2026-09-23 14:50Verify integrated A/B pipeline with default CLI configurationatomi7e
  • 2026-09-23 14:45Implement role scoring, priority and integrated pipelineKostyaKostolom
  • 2026-09-23 14:02Implement graph metrics, source attribution and clusteringatomi7e
Структура репозитория (115 файлов)
.env.example
.gitignore
.streamlit/config.toml
.vercelignore
README.md
START.cmd
START_WEB.cmd
api/__init__.py
api/index.py
app.py
assistant/__init__.py
assistant/agent.py
assistant/fallback.py
assistant/schemas.py
assistant/tools.py
config.yaml
docs/ABC_INTEGRATION.md
docs/ARCHITECTURE.md
docs/AUDIT.md
docs/A_handoff.md
docs/B_handoff.md
docs/CHECK_PROJECT.md
docs/C_CHECKLIST.md
docs/C_README.md
docs/DATASET.md
docs/DELIVERY_CHECK.md
docs/DEMO.md
docs/DEMO_CURRENT.md
docs/INTEGRATION.md
docs/METHODS.md
docs/NVIDIA_SETUP.md
docs/OPENAI_VERCEL.md
docs/PROJECT_AUDIT_2026-09-23.md
docs/RUN_WEB.md
docs/TZ_compliance.md
docs/VERIFICATION.md
docs/VERIFICATION_CURRENT.md
docs/architecture.png
docs/backend_verification.md
docs/demo/01-overview.png
docs/demo/02-network.png
docs/demo/03-activity.png
docs/demo/frames.txt
docs/real_data_review.md
docs/roles.md
docs/screens/clusters.png
docs/screens/graph.png
docs/screens/overview.png
moneygraph/__init__.py
moneygraph/clusters.py
moneygraph/export.py
moneygraph/features.py
moneygraph/flow.py
moneygraph/gaps.py
moneygraph/graph.py
moneygraph/hypotheses.py
moneygraph/io.py
moneygraph/patterns.py
moneygraph/prepare.py
moneygraph/priority.py
moneygraph/resilience.py
moneygraph/roles.py
moneygraph/uploads.py
pyproject.toml
requirements-a.txt
requirements-b.txt
requirements-demo.txt
requirements-lock.txt
requirements.txt
run.py
scripts/build_backup_video.py
scripts/demo_pipeline.py
scripts/package_release.py
scripts/prepare_showcase.py
showcase/analysis.json.gz
showcase/source/edges.parquet
showcase/source/nodes.parquet
showcase/source/transactions.parquet
start.ps1
starter/starter/README.md
starter/starter/requirements.txt
starter/starter/starter.py
tests/conftest.py
tests/test_audit.py
tests/test_flow.py
tests/test_graph_metrics.py
tests/test_invariance.py
tests/test_outputs.py
tests/test_priority.py
tests/test_roles.py
tests/test_uploads_patterns.py
tests/test_validation_edges.py
tests/test_vercel_api.py
tests/test_web_integration.py
tests_c/conftest.py
tests_c/test_agent.py
tests_c/test_app.py
tests_c/test_dashboard.py
tests_c/test_data.py
tests_c/test_large_ids.py
tests_c/test_tools.py
ui/__init__.py
ui/constants.py
ui/dashboard.py
ui/data.py
ui/demo.py
ui/graph_view.py
ui/node_card.py
ui/pages.py
ui/style.py
ui/uploads.py
vercel.json
web/app.js
web/index.html
web/style.css
Ветки (4)

Обсуждение 0 комментариев

Войдите, чтобы комментировать

Пока нет комментариев — будьте первым.