Middle-аналитик в команде рисков B2B: валидация скоринговых моделей, портфельная аналитика и кредитные стратегии в финтех-банке
Фишка: Фокус на влиянии аналитики на финансовый результат: не просто «строить отчёты», а валидировать модели, оптимизировать лимитные стратегии и балансировать рост портфеля с контролем дефолтности. Стек Vertica + ClickHouse + Airflow + Superset — типичный для high-load финтеха.
| Этап | Длительность | Что проверяют |
|---|---|---|
| HR / рекрутер | 30–45 мин | Мотивация, опыт 2+ года, софт-скиллы, формат работы (офис/удалёнка), зарплатные ожидания, готовность к домену кредитного риска B2B |
| Технический скрининг | 60–90 мин | SQL на сложных запросах (джойны, оконные функции, агрегации), базовая статистика, метрики классификации, лайв-код или разбор готового кода |
| Глубокое техинтервью / кейс | 90–120 мин | Валидация скоринговых моделей (Gini, ROC-AUC, PSI, калибровка), портфельный анализ (когорты, винтажи), дизайн A/B-теста, разбор бизнес-кейса по кредитной стратегии |
| Финал с тимлидом / hiring manager | 45–60 мин | Коммуникация с бизнесом, приоритизация задач, влияние на финансовый результат, культурный fit в продуктовую финтех-культуру Ozon Банка |
Обязательный минимум
Плюсом будет
Опыт написания SQL-запросов
Опиши типовые задачи: агрегации, джойны, оконные функции, оптимизация. Упомяни Vertica/ClickHouse и работу с большими таблицами.
В чём разница между WHERE и HAVING и зачем использовать HAVING после GROUP BY?
WHERE фильтрует строки до агрегации; HAVING — после GROUP BY по агрегатам. Пример: WHERE status='active' vs HAVING COUNT(*) > 10.
Как устроены таблицы и джойны в SQL?
INNER — пересечение, LEFT — все из левой + совпадения, RIGHT, FULL. Декартово произведение при отсутствии условия ON.
Как работает FULL JOIN?
Возвращает все строки из обеих таблиц; NULL где нет пары. Максимальное число строк среди join-типов при дубликатах.
Какие оконные функции в SQL вы знаете?
ROW_NUMBER, RANK, DENSE_RANK, LAG/LEAD, SUM/COUNT OVER (PARTITION BY ... ORDER BY ...). PARTITION BY не обязателен — без него окно = весь результат.
Является ли PARTITION BY обязательным аргументом в оконных функциях?
Нет. Без PARTITION BY функция применяется ко всему набору строк; с PARTITION BY — внутри групп.
Как реализовать запрос с максимальной датой курса для каждой транзакции с учётом выходных и праздников?
ASOF JOIN или подзапрос с MAX(date) WHERE date <= transaction_date; календарь праздников через LEFT JOIN + фильтр рабочих дней.
Как рассчитать медиану в SQL без функций percentile/median?
ROW_NUMBER + COUNT, взять среднее двух центральных значений при чётном N; или PERCENTILE_CONT если доступен.
Какие конструкции в SQL вы избегаете или используете чаще?
Избегай: SELECT *, NOT IN с NULL, коррелированные подзапросы на больших данных. Предпочитай: CTE, явные JOIN, LIMIT/OFFSET с индексами.
Что такое колоночные базы данных и почему они лучше для аналитики?
ClickHouse/Vertica хранят данные по столбцам — быстрые агрегации и сканы по нескольким полям, сжатие, но медленные точечные UPDATE.
Совет: На техэтапе часто дают лайв SQL: когорты, ранжирование, поиск дубликатов. Практикуй на LeetCode SQL / StrataScratch.
Ловушка: В Vertica/ClickHouse синтаксис оконных функций и дат может отличаться от PostgreSQL — уточняй при решении.
Фишка: Вакансия явно требует сложные запросы к Vertica и ClickHouse — готовь примеры оптимизации (фильтр по partition, избегание SELECT *).
Как упорядочить математическое ожидание, медиану и моду в распределении зарплат?
Для правоскошенных распределений (зарплаты): мода < медиана < среднее. Редкие высокие значения «тянут» среднее вверх.
Знаком ли с экспоненциальным распределением?
Моделирует время между событиями в потоке; связано с Пуассоном. PDF: λe^(-λx), памятьless. Применение: время до дефолта, интервалы транзакций.
Что такое стандартная ошибка среднего?
SEM = σ/√n — насколько точно среднее оценивает популяцию. Уменьшается с ростом n; используется в t-тестах и CI.
Какую метрику выбрать для регрессии с выбросами: MSE или MAE?
MAE — робастна к выбросам (линейный штраф). MSE — квадратичный штраф, чувствительна к выбросам, дифференцируема.
Совет: В риск-аналитике часто работают с тяжёлыми правыми хвостами — медиана и квантили важнее среднего.
Ловушка: Не путай стандартную ошибку (SEM) со стандартным отклонением (SD).
Какие метрики качества классификации существуют?
Precision, Recall, F1, Accuracy (осторожно при дисбалансе), ROC-AUC, PR-AUC, LogLoss. Выбор зависит от cost of error.
Как считается коэффициент Джини и как он связан с ROC-AUC?
Gini = 2×AUC − 1. Измеряет неравномерность распределения скоров между классами. Gini=1 — идеальная модель, 0 — случайная.
Есть ли третий вариант усреднения метрик при дисбалансе классов?
Micro (глобальный), Macro (среднее по классам), Weighted (по размеру класса). Плюс F1, PR-AUC — альтернативы accuracy.
Какие метрики использовать для оценки новой модели при выкатывании на пилотную группу?
Офлайн: Gini/AUC, KS, PSI. Онлайн: approval rate, take rate, дефолт, NPL, резервы. Сравнение champion vs challenger.
Как считаются метрики MAP и MRR в задачах ранжирования?
MRR = среднее 1/rank первого релевантного. MAP = среднее AP по запросам; AP = среднее precision на позициях с релевантным результатом.
Фишка: Ключевая задача вакансии — валидация скоринговых моделей: ранжирующая способность, калибровка, стабильность во времени.
Совет: Знай PSI (Population Stability Index) для мониторинга дрейфа распределения скоров: PSI < 0.1 — стабильно, > 0.25 — значимый дрейф.
Ловушка: Высокий AUC не гарантирует хорошую калибровку — для лимитных стратегий важны predicted PD и calibration curve.
Как проводить когортный анализ кредитного портфеля?
Группировка по месяцу выдачи (когорта) + винтаж (месяц жизни). Метрики: cumulative default rate, roll rates, early warning.
Как оценить влияние изменения лимитной стратегии на портфель?
Сравни approval rate, take rate, utilization, NPL/PD по сегментам до/после. Когортный анализ + контрольная группа.
Что такое approval rate, take rate и как они связаны с риском?
Approval = одобренные/заявки. Take = взятые/одобренные. Рост approval без контроля риска → рост дефолта; баланс через скоринг.
Как мониторить эффективность стратегий в разрезе сегментов?
Дашборды по сегментам (размер бизнеса, отрасль, регион), винтажные кривые, концентрация риска, stress-сценарии.
Фишка: Роль в команде рисков B2B — баланс роста портфеля и контроля дефолтности через данные.
Совет: Готовь пример, как ты переводил аналитику в конкретную рекомендацию продукту (изменение лимита, стоп-правило, сегментация).
Что такое A/B-тест и почему он полезен?
Рандомизированное сравнение контроля и теста. Позволяет оценить эффект изменения (модель, лимит) с контролем confounders.
Проводил ли A/B-тесты?
Опиши: гипотеза, дизайн (размер выборки, длительность), метрики, статистический тест, интерпретация. Для рисков — guardrail metrics (дефолт).
Как определить, что метрика конверсии выросла именно на 10%, а не на 9% или 3%?
Статистический тест (z-test/chi-square), p-value < α, confidence interval. Учитывай размер выборки и множественные сравнения.
Совет: В кредитном A/B важны guardrail metrics: даже если approval растёт, дефолт не должен ухудшиться.
Ловушка: Peeking — преждевременная остановка теста при первом значимом результате увеличивает false positive rate.
Как посчитать количество уникальных значений в колонке DataFrame?
df['col'].nunique() или df['col'].value_counts(). Для больших данных — approximate (HyperLogLog) или groupby.
Как создать признаки для модели на основе тренда и кульминации в метриках?
Feature engineering: rolling mean/slope, peak detection, lag features, seasonality decomposition.
Совет: На интервью могут попросить написать расчёт Gini/AUC или когортного анализа в pandas — практикуй sklearn.metrics и groupby.
Когортный анализ дефолтов в SQL
Дана таблица loans (loan_id, client_id, issue_date, default_flag — 1 если дефолт в первые 12 месяцев). Напишите SQL-запрос: для каждой когорты (месяц выдачи) посчитать cumulative default rate по винтажам (1–12 месяцев жизни кредита).
WITH base AS (
SELECT loan_id,
DATE_TRUNC('month', issue_date) AS cohort,
DATEDIFF('month', issue_date, default_date) AS vintage_months,
default_flag
FROM loans
),
cohort_sizes AS (
SELECT cohort, COUNT(*) AS cohort_size
FROM base GROUP BY cohort
),
defaults_by_vintage AS (
SELECT cohort, vintage_months,
SUM(default_flag) AS defaults
FROM base
WHERE vintage_months BETWEEN 1 AND 12
GROUP BY cohort, vintage_months
)
SELECT d.cohort, d.vintage_months,
SUM(d.defaults) / c.cohort_size AS cumulative_default_rate
FROM defaults_by_vintage d
JOIN cohort_sizes c ON d.cohort = c.cohort
GROUP BY d.cohort, d.vintage_months, c.cohort_size
ORDER BY d.cohort, d.vintage_months;Сложность: O(n) с индексами на issue_date
Ранжирование транзакций по дате курса
Таблицы: transactions (txn_id, txn_date, currency) и exchange_rates (date, currency, rate). Для каждой транзакции найти актуальный курс — последний доступный курс на дату транзакции или ранее (учитывая, что в выходные курсы не обновляются).
SELECT t.txn_id, t.txn_date, t.currency, er.rate
FROM transactions t
LEFT JOIN LATERAL (
SELECT rate
FROM exchange_rates er
WHERE er.currency = t.currency
AND er.date <= t.txn_date
ORDER BY er.date DESC
LIMIT 1
) er ON true;
-- Альтернатива с оконной функцией после ASOF-подобного joinСложность: O(n log n) при сортировке
Расчёт Gini и ROC-AUC в Python
Дан массив предсказанных вероятностей default (scores) и бинарных фактов (y_true). Реализуйте функцию, возвращающую Gini и ROC-AUC без использования sklearn.
import numpy as np
def gini_and_auc(y_true, scores):
# Сортируем по убыванию скоров
order = np.argsort(-scores)
y_sorted = y_true[order]
n_pos = y_sorted.sum()
n_neg = len(y_sorted) - n_pos
if n_pos == 0 or n_neg == 0:
return 0.0, 0.5
cum_pos = np.cumsum(y_sorted)
auc = (cum_pos.sum() - n_pos * (n_pos + 1) / 2) / (n_pos * n_neg)
gini = 2 * auc - 1
return gini, aucСложность: O(n log n)
3 дня
7 дней
14 дней
| Блок | Готов, если... |
|---|---|
| SQL | можешь написать когортный анализ, ASOF-подобный join и медиану через оконные функции без подсказок |
| Метрики моделей | можешь объяснить Gini, ROC-AUC, PSI и когда accuracy вводит в заблуждение |
| Портфельная аналитика | можешь описать когортный/винтажный анализ и связь approval rate с риском |
| A/B-тесты | можешь спроектировать тест новой модели с guardrail metrics по дефолту |
| Python | можешь посчитать Gini/AUC и сделать когортный groupby в pandas |
| Behavioral | есть 3 STAR-кейса: сложная задача, конфликт с бизнесом, влияние на решение |
В день собеседования