Розробка AI-системи для виявлення відмивання грошей

Проектуємо та впроваджуємо системи штучного інтелекту: від прототипу до production-ready рішення. Наша команда поєднує експертизу в машинному навчанні, дата-інжинірингу та MLOps, щоб AI працював не в лабораторії, а в реальному бізнесі.
Показано 1 з 1Усі 1564 послуг
Розробка AI-системи для виявлення відмивання грошей
Складний
~2-4 тижні
Часті запитання

Напрямки AI-розробки

Етапи розробки AI-рішення

Останні роботи

  • image_website-b2b-advance_0.webp
    Розробка сайту компанії B2B ADVANCE
    1348
  • image_web-applications_feedme_466_0.webp
    Розробка веб-додатків для компанії FEEDME
    1247
  • image_websites_belfingroup_462_0.webp
    Розробка веб-сайту для компанії БЕЛФІНГРУП
    949
  • image_ecommerce_furnoro_435_0.webp
    Розробка інтернет магазину для компанії FURNORO
    1183
  • image_logo-advance_0.webp
    Розробка логотипу компанії B2B Advance
    642
  • image_crm_enviok_479_0.webp
    Розробка веб-додатків для компанії Enviok
    921

Anti-Money Laundering (AML) — антивідмивна система, область де ціна помилки критична. Пропуск підозрілого переказу (false negative) загрожує штрафами до 5% обороту згідно з ФЗ-115. Хибне блокування добросовісного клієнта (false positive) — репутаційні втрати та позови. Традиційні правилові системи детектують лише відомі патерни, генеруючи до 95% хибних спрацьовувань. Ми розробляємо гібридні AI-системи, які знижують FPR на 20–40% без втрати повноти виявлення. Наш досвід — 10+ років у фінансовому ML для банків та фінтехів.

В основі — комбінація детермінованих правил (для типових сценаріїв) та ML-моделей (для виявлення прихованих нелінійних патернів). Нижче — архітектура, моделі та етапи впровадження.

У цій статті ми розберемо ключові компоненти системи: транзакційний моніторинг, графовий аналіз та інтеграцію з KYC. Розглянемо, як гібридний підхід знижує навантаження на комплаєнс-відділ та відповідає вимогам FATF. Правила автоматично обробляють 80% операцій, залишаючи 20% на ML-перевірку, що знижує ручну працю на 60%.

Чому ML кращий за правилові системи для AML?

Характеристика Правила ML-модель
Виявлення нових схем Ні — лише відомі патерни Так — виявляє приховані кореляції
Хибні спрацьовування (FPR) 5–10% 2–4% (зниження в 2–5 разів)
Адаптація до змін Ручне оновлення Автоматичне перенавчання
Пояснюваність Повна (якщо правило задано явно) Через SHAP/LIME
Масштабованість Лінійно від кількості правил Паралельна обробка

Типологія схем відмивання

Структурування (Smurfing): велика сума розбивається на дрібні транзакції нижче порогу контролю (600 000 руб. в РФ).

Layering: багаторівневі перекази через ланцюжок рахунків та юрисдикцій для приховування джерела.

Integration: відмиті кошти вводяться в легальний бізнес — афілійовані послуги, нерухомість.

Red flags:

  • Транзакції рівними сумами (999 000 руб.) — нижче порогу, але підозріло.
  • Спалах активності: немає операцій → раптом 50 за день.
  • Географічні невідповідності: клієнт із Саратова, перекази в Сінгапур.
  • Рахунок-одноденка: новий рахунок, великий оборот, швидке виведення, закриття.

Feature Engineering

Ключ до якості ML — ознаки, що відображають поведінку клієнта. Ми використовуємо два класи:

Транзакційні ознаки (обсяг, час, суми біля порогів, концентрація контрагентів):

def extract_transaction_features(transaction_history, lookback_days=90):
    """Ознаки на основі історії транзакцій клієнта."""
    df = transaction_history.copy()
    features = {
        # Обсяг транзакцій
        'total_amount_30d': df[df['days_ago'] <= 30]['amount'].sum(),
        'transaction_count_30d': len(df[df['days_ago'] <= 30]),
        'avg_transaction_amount': df['amount'].mean(),
        'amount_std': df['amount'].std(),
        # Часові патерни
        'transactions_per_active_day': len(df) / df['date'].nunique(),
        'max_transactions_single_day': df.groupby('date').size().max(),
        'night_transaction_ratio': (df['hour'] < 6).mean(),
        'weekend_activity_change': calculate_weekend_ratio(df),
        # Суми біля порогів
        'near_threshold_pct': (df['amount'].between(550000, 610000)).mean(),
        'round_amount_pct': (df['amount'] % 1000 == 0).mean(),
        # Контрагенти
        'unique_counterparties': df['counterparty_id'].nunique(),
        'counterparty_concentration': df.groupby('counterparty_id')['amount'].sum().max() / df['amount'].sum(),
        'new_counterparty_ratio': (df['is_new_counterparty'] == True).mean(),
        # Географічні
        'foreign_transaction_ratio': (df['country'] != 'RU').mean(),
        'high_risk_jurisdiction_pct': df['country'].isin(HIGH_RISK_COUNTRIES).mean()
    }
    return features

def compute_network_features(account_id, transaction_graph):
    """Транзакції як граф: вузли = рахунки, ребра = перекази."""
    G = transaction_graph
    pagerank = nx.pagerank(G, weight='amount')
    betweenness = nx.betweenness_centrality(G, weight='amount')
    communities = nx.community.greedy_modularity_communities(G.to_undirected())
    community_risk = assess_community_risk(account_id, communities, G)
    return {
        'pagerank_score': pagerank.get(account_id, 0),
        'betweenness_score': betweenness.get(account_id, 0),
        'community_risk': community_risk,
        'in_degree': G.in_degree(account_id),
        'out_degree': G.out_degree(account_id)
    }

Мережеві ознаки (PageRank, betweenness, кластеризація) — допомагають виявляти складні layering-схеми, де рахунок виступає транзитним вузлом.

Моделі машинного навчання

LightGBM з налаштуванням під AML

import lightgbm as lgb
from sklearn.metrics import roc_auc_score, average_precision_score

n_normal = (y_train == 0).sum()
n_sar = (y_train == 1).sum()
scale_pos_weight = n_normal / n_sar

model = lgb.LGBMClassifier(
    n_estimators=500,
    scale_pos_weight=scale_pos_weight,
    learning_rate=0.05,
    num_leaves=31,
    min_child_samples=20,
    feature_fraction=0.8
)

# Threshold підбирається так, щоб recall >= 0.85
from sklearn.metrics import precision_recall_curve
precision, recall, thresholds = precision_recall_curve(y_val, y_scores)
optimal_threshold = thresholds[np.argmax(recall >= 0.85)]

Графова нейронна мережа (GNN) для мережевого аналізу

import torch
from torch_geometric.nn import SAGEConv

class AMLGraphNN(torch.nn.Module):
    """GNN для аналізу транзакційних мереж."""
    def __init__(self, node_features, edge_features, hidden_dim=64):
        super().__init__()
        self.conv1 = SAGEConv(node_features, hidden_dim)
        self.conv2 = SAGEConv(hidden_dim, hidden_dim)
        self.edge_mlp = torch.nn.Linear(edge_features, hidden_dim)
        self.classifier = torch.nn.Linear(hidden_dim * 2, 1)

    def forward(self, node_features, edge_index, edge_features):
        x = torch.relu(self.conv1(node_features, edge_index))
        x = torch.relu(self.conv2(x, edge_index))
        edge_emb = self.edge_mlp(edge_features)
        source_emb = x[edge_index[0]]
        target_emb = x[edge_index[1]]
        edge_repr = torch.cat([source_emb, target_emb], dim=1)
        return torch.sigmoid(self.classifier(edge_repr))

Як влаштована гібридна архітектура AML?

Гібридна система об'єднує правила та ML в єдиний пайплайн. Правила швидко відсіюють очевидні легітимні операції та сигналізують про явні порушення (перевищення лімітів, заборонені юрисдикції). ML-моделі аналізують ознаки, які неможливо закодувати правилами: аномальну поведінку, приховані зв'язки, нелінійні залежності. Результат: кожен переказ отримує єдиний ризик-скор, який враховує і правила, і ML.

class HybridAMLSystem:
    def __init__(self, rule_engine, ml_model, threshold=0.5):
        self.rules = rule_engine
        self.model = ml_model
        self.threshold = threshold

    def evaluate_transaction(self, transaction, customer_history):
        rule_alerts = self.rules.evaluate(transaction)
        features = extract_transaction_features(customer_history)
        ml_score = self.model.predict_proba([features])[0][1]
        final_risk = max(rule_alerts.max_risk_score if rule_alerts else 0, ml_score)
        if final_risk > self.threshold:
            return SARCandidate(
                transaction=transaction,
                risk_score=final_risk,
                triggered_rules=rule_alerts,
                ml_explanation=shap_explain(self.model, features)
            )

Що входить у роботу

  • Документація: архітектурна схема, model card, керівництво адміністратора.
  • ML-пайплайн: вилучення ознак, навчання, валідація, A/B-тестування.
  • Інтеграція: з KYC-системою, core banking, CRM.
  • Real-time API: HTTP/gRPC ендпоінт для оцінки ризику кожної транзакції.
  • Дашборди: моніторинг метрик, звітність SAR, SHAP-пояснення.
  • Розгортання: в контурі замовника (on-prem) або в хмарі.
  • Підтримка: 1 місяць пост-продакшн, навчання команди.

Процес розробки

  1. Аналітика — збір вимог, аудит поточних логів, нормативних актів (ФЗ-115, FATF).
  2. Проектування — вибір архітектури, визначення ознак, конфігурація пілоту.
  3. Розробка — написання коду, навчання моделей, налаштування пайплайну.
  4. Тестування — крос-валідація на історичних даних, сценарне тестування.
  5. Деплой — розгортання, інтеграція, навантажувальне тестування.

Строки: від 6–8 тижнів на базову версію (правила + LightGBM + SAR) до 4–5 місяців на повну (з GNN, real-time, графічним аналізом).

Порівняння моделей: LightGBM vs GNN

Характеристика LightGBM GNN (SAGEConv)
Тип даних Табличні ознаки (транзакції) Графові дані (мережа рахунків)
Виявляє Аномалії в поведінці клієнта Складні ланцюжки переказів (layering)
Навчання Швидке навчання, мало даних Потребує багато даних та GPU
Інтерпретація SHAP, важливість ознак Візуалізація графа, attention

Регуляторна відповідність

ФЗ-115 (Росія): обов'язковий контроль операцій >600 000 руб., передача SAR в Росфінмоніторинг протягом 3 робочих днів.

FATF/EU AMLD: KYC на онбордингу, continuous monitoring, посилена перевірка (EDD) для high-risk клієнтів. Регуляторні вимоги описані в Рекомендаціях FATF.

Як ми забезпечуємо пояснюваність?

Кожне підозріле рішення супроводжується SHAP-поясненням. Розглянемо приклад: переказ 950 000 руб. з Саратова в Сінгапур. SHAP-значення показують, що foreign_transaction_ratio підвищив ризик на 0.34, near_threshold_pct — на 0.28, new_counterparty_ratio — на 0.21, transaction_count_30d — на 0.15, avg_transaction_amount — на 0.10. Підсумковий ризик 0.87 перевищує поріг 0.5, що генерує SAR-звіт.

import shap

def explain_sar_decision(model, features, feature_names):
    """Регулятор вимагає обґрунтування кожного SAR."""
    explainer = shap.TreeExplainer(model)
    shap_values = explainer.shap_values(features)
    top_factors = sorted(
        zip(feature_names, shap_values[0]),
        key=lambda x: abs(x[1]), reverse=True
    )[:5]
    explanation = "\n".join([
        f"- {name}: {'підвищив' if val > 0 else 'знизив'} ризик на {abs(val):.2f}"
        for name, val in top_factors
    ])
    return explanation

Такий підхід дозволяє не лише пройти аудит, а й дати операторам зрозумілі причини блокувань.

Готові оцінити ваш проєкт? Замовте розробку AML-системи під ваші дані — отримайте консультацію з архітектури та строків. Зв'яжіться з нами для обговорення.

Виявлення аномалій: автоенкодери, Isolation Forest, PyOD

Ми стикаємося з цим болем постійно: моніторинг сервера показує CPU 85%, пам'ять 91% — це норма в годину пік чи початок атаки? Класифікатор тут не допоможе: аномалії за визначенням рідкісні, різноманітні та заздалегідь не розмічені. Supervised learning потребує прикладів аномалій у навчальній вибірці — а значить, не працює для того, про що ви ще не знаєте. Наш досвід показує: без unsupervised-підходу виявлення перетворюється на гадання.

Чому виявлення аномалій потребує unsupervised підходу?

Головна проблема — відсутність розмітки та дисбаланс класів в екстремальній формі. Фрод-транзакції становлять 0.01–0.1% від загального об'єму. Виробничий дефект — 0.5–3%. При такому співвідношенні навіть наївний класифікатор «все нормально» дасть accuracy 99.9% і precision/recall для аномального класу, близькі до нуля. Supervised-моделі тут безсилі.

Друга проблема — «нормальність» завжди контекстна. Чи нормально, що користувач логіниться о 3 годині ночі? Залежить від його історії та часової зони. Чи нормальна вібрація підшипника 2.3 мм/с? Залежить від режиму роботи верстата та його віку. Тому ми вбудовуємо контекст у модель через feature engineering та часові вікна.

Третя — оцінка якості. Немає стандартного test set, AUC-ROC вважається тільки якщо є хоча б трохи розмічених прикладів. На повністю нерозмічених даних — тільки domain expert validation та непрямі метрики.

Як відрізнити аномалію від шуму в реальному часі?

Відповідь — адаптивні пороги та моніторинг статистик моделі. У розділі кейсу покажемо, як це працює.

Методи та інструменти

Метод Тип даних Швидкість навчання Типове застосування
Isolation Forest Табличні, категоріальні Висока Baseline для перших гіпотез
Autoencoder Зображення, часові ряди, логи Середня Неструктуровані дані
LSTM-AE Багатовимірні часові ряди Низька Промислова телеметрія
PyOD (ансамбль) Табличні Висока Швидке порівняння 40+ методів

Isolation Forest — стандартний baseline для табличних даних. Ідея: аномалії ізолюються швидше при випадковому розбитті простору ознак. Працює добре при contamination 0.01–0.1, стійкий до масштабу ознак, не потребує нормалізації. Реалізація в sklearn.ensemble.IsolationForest.

Типова помилка: ставити contamination='auto' без розуміння даних. Auto-режим передбачає поріг -0.5, що не завжди відповідає реальній частці аномалій. Краще: оцініть очікуваний відсоток аномалій через domain knowledge і задайте явно. Ми гарантуємо підбір contamination під ваш кейс.

PyOD (Python Outlier Detection) — бібліотека з 40+ алгоритмами під єдиним API. Включає: OCSVM, LOF, COPOD, ECOD, DeepSVDD, AutoEncoder. Зручно для швидкого порівняння методів на одних даних.

Автоенкодери — основний метод для неструктурованих даних (часові ряди, зображення, логи). Ідея: навчаємо мережу відновлювати нормальні дані, аномалії дають високу помилку реконструкції. Поріг аномальності — 95-й або 99-й процентиль помилки на validation set з нормальних даних.

Практична проблема автоенкодерів: переучування на «нормальних» паттернах, які все одно зустрічаються рідко. Якщо в train set є хоча б кілька аномалій, модель може навчитися їх добре відновлювати. Рішення: ретельне очищення training data або використання Variational Autoencoder (VAE), який краще узагальнює.

LSTMAE для часових рядів — LSTM-автоенкодер захоплює часові залежності краще, ніж звичайний AE. Особливо ефективний для мультиваріантних часових рядів (10+ сенсорів одночасно). Реалізація через PyTorch, навчання з MSELoss на ковзних вікнах.

Детально: виявлення аномалій у промислових часових рядах

Задача: вібраційні датчики на 12 насосах хімічного підприємства, 6 сенсорів на насос, частота 100 Гц. Потрібно попередити про наближену поломку за 4–24 години.

Архітектура рішення:

Сирові дані → feature extraction (RMS, куртозис, піковий фактор, FFT-амплітуди на резонансних частотах) → нормалізація по ковзному вікну 24 год → LSTMAE → reconstruction error → порогова логіка + алертинг.

Розмір вікна LSTM: 60 секунд (6000 точок на 100 Гц). Занадто мале вікно — не захоплює повільні паттерни. Занадто велике — втрачає чутливість до швидких змін.

Поріг аномальності: не фіксований, а адаптивний. threshold = mean(errors_last_7d) + 3 * std(errors_last_7d). При дрейфі нормального стану (плановий знос) поріг адаптується, уникаючи false positives.

Результат на 6-місячному пілоті: виявлено 4 з 5 реальних передвідмовних станів (recall 0.8), 2 хибні тривоги за 6 місяців (precision 0.67). До впровадження: 3 незаплановані зупинки зі значними збитками. Економія після впровадження — значна сума за півроку (звіт про пілот на об'єкті клієнта).

Фрод-детекція: специфіка фінансових даних

Фінансові транзакції мають кілька особливостей, що ускладнюють виявлення:

  • Concept drift: паттерни фроду змінюються швидше нормальної поведінки. Модель, навчена півроку тому, застаріває.
  • Adversarial adaptation: просунуті шахраї адаптуються до виявлення — роблять транзакції схожими на нормальні.
  • Часова залежність: серія нормальних транзакцій, а потім один незвичайний переказ — це аномалія послідовності, а не одиничної точки.

Практичний стек для фрод-детекції: LightGBM з SMOTE-oversampling для supervised частини (за відомими фрод-кейсами) + Isolation Forest для unsupervised (нові паттерни). Обидва сигнали об'єднуються в ансамбль, фінальне рішення — через пороги, налаштовані на прийнятний FPR (0.1–1% від транзакцій на ручну перевірку).

Як оцінити якість без розмітки?

Коли ground truth немає, для оцінки використовуємо:

  • Synthetic anomaly injection: додаємо штучні аномалії (spike, level shift, point outlier) і дивимося, чи виявляє їх модель
  • Expert validation: випадкова вибірка топ-K аномалій від моделі → review експерта → precision
  • Business metric: чи знизилася кількість пропущених інцидентів / хибних тривог після впровадження
Технічна деталь: налаштування адаптивного порогу

Поріг обчислюється як mean(errors) + k * std(errors) на ковзному вікні 7 днів. Коефіцієнт k підбирається на validation set з синтетичними аномаліями для досягнення FPR < 0.1%. При дрейфі ознак вікно автоматично зсувається.

Процес роботи

  1. Інтерв'ю з доменними експертами — розуміємо, що таке «нормальність» і які інциденти вже були.
  2. EDA та підготовка даних — очищення, створення ознак, часові вікна.
  3. Baseline (Isolation Forest) — швидка валідація на відомих інцидентах.
  4. Вибір та кастомізація моделі — Autoencoder / LSTM-AE / ансамбль.
  5. Навчання, валідація з синтетичними аномаліями.
  6. Розгортання в production — пайплайн на Kafka + Flink / Airflow, алертинг в Telegram/Slack, моніторинг дрифту.
  7. Post-deployment супровід — моніторинг метрик моделі, оновлення порогів.

Що входить у роботу

  • Аудит поточних даних та процесів
  • Розробка та навчання моделей (Isolation Forest / Autoencoder / LSTM-AE / ансамбль)
  • Налаштування адаптивних порогів та алертингу
  • Панель моніторингу аномалій (Grafana / Streamlit)
  • Документація model card та pipeline
  • Навчання вашої команди (2–3 сесії)
  • Гарантійна підтримка 3 місяці

Терміни: baseline-система з одним методом — 2–4 тижні. Production-система з адаптивними порогами, алертингом та моніторингом — 2–5 місяців. Вартість розраховується індивідуально під ваш кейс.

Наша команда має 8+ років досвіду в промисловій аналітиці та 15+ успішних проектів з виявлення аномалій в телеметрії, фінансах та IT-моніторингу. Отримайте консультацію — розкажемо, як вирішити вашу задачу.