Тюнинг антифрода и правил
TL;DR
Антифрод — это не «ловля злоумышленников», а оптимизация прибыли: минимизируем Expected Loss (EL) от фрода и чарджбеков при ограничении Cost of Friction (CoF) и AR_net. Базовая схема: скоринг (ML) → порог/лесенка step-up → правила (policy & velocity) → ручная верификация. Успех дают: чистые лейблы, стабильные фичи, экономически калиброванный порог, канареечные релизы, строгая идемпотентность и управляемость правил.
1) Экономическая постановка
Expected Loss:- `EL = P_fraud(tx) × Exposure(tx)`; обычно `Exposure = captured_amount`.
- `CoF = (Abandon_on_Friction × LTV_new/ret) + Opex_review + Fees_stepup`.
- `Profit = GGR − Cost_payments − EL − CoF`.
Оптимальный порог `τ`: выбираем score-cutoff так, чтобы `d(Profit)/dτ = 0`, или по сетке min(`EL+CoF`). На практике — cost-sensitive ROC/PR с весами: `w_fraud = Exposure`, `w_fp = LTV_loss + opex`.
2) Лесенка аутентификации (step-up ladder)
1. Auto-approve (низкий риск): мгновенный проход, 3DS frictionless где можно.
2. Step-up A: 3DS challenge / SCA / device-challenge / reCAPTCHA.
3. Step-up B: легкий KYC (doc selfie/face-match, liveness).
4. Manual review: кейс у аналитика (SLA, reason-codes).
5. Auto-decline: высокий риск/санкции/мулы/ваучерные аномалии.
Порог/ветка зависят от скорингового балла, суммы (`ticket_size`), страны, BIN/issuer, поведенческих фич и контекста (бонус-кампании, ночные окна, velocity).
3) Сигналы и фичи (минимальный базис)
Платежные: BIN/IIN, issuer_country, ECI/3DS flow, AVS/CVV match, soft-decline коды, возвраты/disputes в истории.
Поведенческие: скорость событий (velocity: `cards/device/ip/email`), время суток, first-seen/last-seen, «топология» аккаунтов (граф-связи: общие устройства/карты/кошельки).
Устройство/сеть: device fingerprint, эмуляторы/джейл/рут, прокси/VPN/TOR, ASN/хостинги.
Анти-бонус: рефералы-синдикаты, «прокачка» бонусов, аномальные паттерны депозит→вывод без игры.
Выплаты/кошельки/ваучеры: повторы PIN, гео-мисматч, «скоростные» редимы, мулинговые каскады.
KYC/KYB: уровень, валидации, SoF/SoW флаги.
Санкции/PEP/блок-листы: совпадения по спискам, фуззи-матч ФИО/адресов.
4) Стек: ML + правила
5) Метрики качества (с четкими базами)
AR_clean = `Auth_Approved / (Auth_Attempted − Fraud_preblocked − Abandon_3DS)`
Fraud Rate (по захватам) = `Fraud_captured_amount / Captured_amount`
Chargeback Rate = `Chargeback_count / Captured_Tx` (или по сумме)
False Positive Rate (FP) = `Legit_declined / Legit_attempted`
Step-up Rate = `StepUp_tx / Auth_Attempted`, Abandon_on_StepUp
Auto-approve %, Manual review %, Review SLA/TtA
Net Profit uplift после тюнинга (AB-разница EL+CoF vs контроль).
Ориентиры: FP у новых пользователей ≤ 1–2% (по объему), Fraud (по сумме) — в целевом коридоре лицензии/схем.
6) Пороги и политика правил
6.1 Калибровка порога
Строим cost-curve: для каждого `τ` считаем `EL(τ)+CoF(τ)`.
Выбираем `τ` с минимумом. Для high-ticket — отдельный `τ_hi`.
6.2 Типовые правила (псевдокод)
yaml
- name: SANCTIONS_HIT when: sanctions_match==true action: DECLINE reason: "Sanctions/PEP match"
- name: BIN_RISKY_3DS when: bin in RISKY_BINS and score in [τ_low, τ_mid)
action: STEPUP_3DS
- name: DEVICE_VELOCITY_LOCK when: device_id in last_10min.deposits > 3 action: DECLINE_TEMPORARY ttl: 2h
- name: BONUS_ABUSE_GUARD when: (bonus_received and gameplay_turnover < Xdeposit_amount) and payout_request action: HOLD_REVIEW reason: "Turnover not met"
6.3 Динамические лимиты
Лимит суммы и количества транзакций по уровню риска (risk-tier): `R1/R2/R3`.
Адаптивные лимиты для новых аккаунтов, прогрев при хорошей истории.
7) Жизненный цикл правил (governance)
DSL/реестр правил с версиями, владельцем и описанием эффекта.
Shadow mode → canary (5–10%) → full rollout.
RACI: Owner (Payments Risk), Approver (Compliance/Legal), Consulted (Support/Treasury), Informed (Ops).
Аудит-лог: кто/когда изменил, какие метрики/AB, откат.
Срок годности правила и переоценка (например, 30/60 дней).
8) Данные и обучение моделей
Сплиты по времени, без утечки (features только из прошлого окна).
Целевой лейбл: confirmed fraud/chargeback; отдельные лейблы bonus abuse.
Reweighing классов по сумме (amount-weighted loss).
Drift-мониторинг: PSI для ключевых фич, KS для скоров, baseline stability.
Retrain-триггеры: PSI>0.25, падение KS, смена трафика/юрисдикций.
9) Объяснимость и саппорт
Для каждого решения генерируем reason_codes (до 5 причин) с человекочитаемыми подсказками.
Саппорт-макросы по step-up/отказам (3DS, KYC, turnover).
Споры/диспуты: обратная связь попадает в labeling pipeline (закрываем цикл).
10) Комплаенс и приватность
GDPR/DSAR: право объяснения решения; минимизация PII; хэширование (salted) идентификаторов (email/phone/PAN-токен).
PCI-DSS: PAN-safe потоки, токенизация.
Санкции/AML: отдельный контур скрининга + эскалации MLRO.
Retention: политики хранения сигналов и обоснований решений.
11) Мониторинг и алерты (ежечасно/ежедневно)
AR_clean, Fraud (amt%), FP (retention-weighted), Step-up/Abandon, Review SLA, Chargeback Rate (lagged).
Спайки velocity, рост TOR/Proxy/ASN-хостингов, BIN-деградации, ваучер-редимы.
Алерты при: FP>коридора, Fraud>таргета, Abandon>базы +X п.п., дрейф PSI/KS.
12) SQL-срезы (пример)
12.1 Базовые метрики
sql
WITH base AS (
SELECT
DATE_TRUNC('day', attempt_ts) d, country, provider, method_code,
COUNT() FILTER (WHERE auth_status='ATTEMPTED') AS attempted,
COUNT() FILTER (WHERE auth_status='APPROVED') AS approved,
COUNT() FILTER (WHERE decision='DECLINE' AND label='LEGIT') AS fp_cnt,
SUM(captured_amount) AS cap_amt,
SUM(CASE WHEN label='FRAUD' THEN captured_amount ELSE 0 END) AS fraud_amt
FROM payments_flat
GROUP BY 1,2,3,4
)
SELECT d, country, provider, method_code,
approved::decimal/NULLIF(attempted,0) AS ar_clean,
fraud_amt::decimal/NULLIF(cap_amt,0) AS fraud_rate_amt,
fp_cnt::decimal/NULLIF(attempted,0) AS fp_rate
FROM base;
12.2 Доля step-up и отказов по скору
sql
SELECT
DATE_TRUNC('day', attempt_ts) d,
WIDTH_BUCKET(score, 0, 1, 10) AS bucket,
AVG(CASE WHEN decision='STEPUP' THEN 1 ELSE 0 END) AS stepup_share,
AVG(CASE WHEN decision='DECLINE' THEN 1 ELSE 0 END) AS decline_share,
AVG(CASE WHEN stepup_abandon THEN 1 ELSE 0 END) AS abandon_after_stepup
FROM risk_events
GROUP BY 1,2
ORDER BY d, bucket;
13) Плейбуки тюнинга
Рост Fraud (amt%) при стабильном FP → поднять `τ`, усилить velocity по устройствам/ASN, включить 3DS-challenge на уязвимых BIN.
Высокий FP у новых → смягчить `τ` для low-ticket, перевести часть в Step-up A вместо отклонения.
Abandon на 3DS↑ → договориться с PSP о 3DS2-параметрах, улучшить UX, сузить step-up на мобильных для low-risk.
Синдивидуальные бонус-сети → графовые фичи, лимитировать «параллельные» выплаты, turnover-правила.
Ваучерные аномалии → velocity по PIN/ретейлеру/гео, device-binding, hold до верификации.
14) Внедрение: чек-лист
- Экономическая калибровка порога (`EL+CoF`), отдельные `τ` по сегментам.
- Реестр правил (DSL), shadow→canary→rollout, аудит и откат.
- Reason-codes и шаблоны коммуникаций.
- Мониторинг PSI/KS, дрейф фич/скоров, регулярный retrain.
- Канал обратной связи (диспуты→лейблы).
- Политики KYC/step-up, SLA review и TtA/TtR.
- Приватность: хэширование идентификаторов, минимизация PII.
15) Резюме
Тюнинг антифрода — это системная оптимизация прибыли с управляемой фрикцией: ML-скоринг + продуманная лесенка step-up, жесткие легальные правила и аккуратные velocity-лимиты. Экономическая калибровка порога, чистые лейблы, канареечные выкладки и строгая управляемость дают низкий Fraud по сумме, низкий FP у новых, высокий AR_net — без сюрпризов для комплаенса и UX.