Мошенничество в финтех не выглядит как в кино. Это не один большой подозрительный перевод — это паттерн: несколько небольших транзакций в нестандартное для пользователя время, в нестандартной геолокации, с нестандартными получателями. Статические правила («заблокировать транзакцию > 50 000 рублей в ночное время») дают high false positive rate и фрустрируют честных пользователей. ML-модели работают с контекстом.
Мы — команда с 10+ летним опытом в мобильной разработке и машинном обучении: выполнили более 50 проектов по фрод-детекции для финтех-компаний. Предлагаем реализацию под ключ: от анализа данных до мониторинга модели. Оценим ваш проект бесплатно — напишите нам. Гарантируем снижение False Positive Rate на 40% при соблюдении рекомендаций — это подтверждено результатами наших внедрений.
Почему это труднее скоринга
Дисбаланс классов. Мошеннических транзакций — 0.1–1% от общего числа. Модель, которая всегда отвечает «нормальная транзакция», имеет 99% accuracy и бесполезна. Нужны специальные техники: SMOTE oversampling, cost-sensitive learning, оптимизация threshold по F1/AUC-PR, а не accuracy.
Реальное время. Скоринг заёмщика — офлайн-задача, можно считать минуты. Детекция фрода — онлайн, решение нужно за 200–500 мс до того, как транзакция подтвердится. Это накладывает ограничения на сложность модели.
Concept drift. Схемы мошенничества меняются быстрее экономических паттернов. Модель деградирует быстро — нужен более частый мониторинг и переобучение. Стоимость внедрения окупается за 3–6 месяцев за счёт снижения операционных затрат на фрод-мониторинг.
Какие признаки действительно важны для fraud detection?
def extract_transaction_features( transaction: Transaction, user_history: UserHistory, real_time_context: RealTimeContext ) -> dict: return { # Отклонение суммы от исторической нормы пользователя "amount_zscore": (transaction.amount - user_history.avg_amount) / user_history.std_amount, # Время суток (0-23) — мошенничество пиково ночью "hour_of_day": transaction.timestamp.hour, "is_unusual_hour": transaction.timestamp.hour not in user_history.active_hours, # Скорость: время с предыдущей транзакцией "minutes_since_last_tx": (transaction.timestamp - user_history.last_tx_time).seconds / 60, # Геолокация "is_new_country": transaction.country not in user_history.known_countries, "distance_from_last_tx_km": geo_distance(transaction.location, user_history.last_location), "impossible_travel": is_impossible_travel(transaction, user_history.last_tx_location, user_history.last_tx_time), # Получатель "is_new_recipient": transaction.recipient_id not in user_history.known_recipients, "recipient_fraud_score": real_time_context.recipient_risk_score, # Из внешнего источника # Устройство и сессия "is_new_device": transaction.device_id not in user_history.known_devices, "session_age_minutes": real_time_context.current_session_age_minutes, "transactions_in_session": real_time_context.session_tx_count, } Impossible travel — один из сильнейших признаков: транзакция в Москве в 14:00 и транзакция в Лондоне в 14:30 физически невозможна. Реализуется через Haversine distance между геолокациями и временным дельта.
Модель и inference
CatBoost и LightGBM — практичный выбор: быстрый inference (< 5 мс), хорошая работа с категориальными признаками, встроенный SHAP.
import catboost as cb model = cb.CatBoostClassifier( iterations=500, learning_rate=0.05, depth=6, loss_function="Logloss", eval_metric="AUC", class_weights={0: 1, 1: 50}, # Компенсация дисбаланса классов random_seed=42 ) def predict_fraud_score(features: dict) -> dict: feature_vector = prepare_features(features) proba = model.predict_proba(feature_vector)[0][1] # Многоуровневые пороги вместо бинарного решения if proba > 0.85: action = "block" elif proba > 0.60: action = "challenge" # Запросить подтверждение (биометрия, OTP) else: action = "allow" return { "fraud_probability": float(proba), "action": action, "risk_factors": get_shap_explanations(feature_vector) } Три уровня действий вместо бинарного «разрешить/заблокировать» снижают false positive rate: большинство подозрительных транзакций получают дополнительную аутентификацию, а не блокировку.
| Подход | Точность | Скорость инференса | Сложность внедрения | Пример |
|---|---|---|---|---|
| Статические правила | Низкая (FP > 5%) | Мгновенно | Минимальная | Блокировка по сумме и времени |
| Градиентный бустинг | Высокая (AUC > 0.95) | < 5 мс | Средняя | CatBoost с 15 признаками |
| Глубокое обучение | Сравнимая с бустингом | 10–50 мс | Высокая | Feed-forward сеть |
Интеграция в мобильное приложение
Fraud scoring — синхронный вызов в момент инициации транзакции пользователем:
// iOS — Swift func initiateTransfer(_ transfer: TransferRequest) async throws -> TransferResult { // 1. Получаем fraud score (цель < 300ms) let fraudScore = try await fraudDetectionService.evaluate( amount: transfer.amount, recipientId: transfer.recipientId, userLocation: locationManager.currentLocation ) switch fraudScore.action { case "block": throw TransferError.blockedByFraudProtection( reason: localizeRiskFactors(fraudScore.riskFactors) ) case "challenge": // Запрашиваем биометрию или OTP перед продолжением try await authenticateAdditionally() return try await processTransfer(transfer) case "allow": return try await processTransfer(transfer) default: return try await processTransfer(transfer) } } Как мониторить модель в продакшене?
Fraud detection без мониторинга — деградирующая система. Ключевые метрики:
| Метрика | Что измеряет | Целевой диапазон |
|---|---|---|
| False Positive Rate | Доля заблокированных честных транзакций | < 0.5% |
| Detection Rate | Доля пойманного мошенничества | > 85% |
| AUC-PR | Общее качество модели | > 0.85 |
| PSI признаков | Дрейф входных данных | < 0.2 |
False Positive Rate важнее Detection Rate для пользовательского опыта: заблокированная честная транзакция — прямые потери лояльности. Баланс настраивается через threshold.
Архитектура микросервиса фрод-детекции
Микросервис получает признаки транзакции, вызывает модель (inference HTTP), возвращает action. Для низкой задержки — предзагрузка модели в память, кэширование user_history в Redis. Асинхронный лог всех результатов для ретренинга.
Процесс работы
- Сбор и разметка исторических транзакций (вместе с командой по рискам)
- Feature engineering и построение baseline (логистическая регрессия)
- Обучение градиентного бустинга с тюнингом threshold
- A/B тестирование на реальных транзакциях (минимум 2 недели)
- Деплой в продакшен и настройка мониторинга PSI, FPR
- Ежемесячное переобучение с автоматическим пайплайном
Что входит в работу
- Анализ данных и разметка (если нет готовой)
- Построение baseline и финальной модели (CatBoost/LightGBM)
- Оптимизация threshold и трёхуровневое решение
- Интеграция fraud scoring в iOS (Swift) и Android (Kotlin)
- Мониторинг метрик и дашборды (Grafana)
- Документация и обучение команды
- Онбординг и поддержка 1 месяц после запуска
Ориентиры по срокам
MVP с правилами + простой ML-моделью — 4–6 недель. Полная система с realtime inference, мониторингом и автоматическим переобучением — 2–3 месяца. При наличии готовой размеченной выборки — ускоряется на 3–4 недели.
Свяжитесь с нами для оценки вашего проекта — мы подберём оптимальное решение под ваш стек и бюджет. Получите консультацию по интеграции AI-фрод-детекции за 1 день.







