Шахрайство в фінтех не виглядає як у кіно. Це не один великий підозрілий переказ — це патерн: кілька невеликих транзакцій у нестандартний для користувача час, у нестандартній геолокації, з нестандартними отримувачами. Статичні правила («заблокувати транзакцію > 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 день.







