T-Bank (Тинькофф) — самый fintech-heavy собес среди РФ-компаний для аналитика. Если в Яндексе спрашивают «как чинить retention», в Тинькофф — «как ты бы строил credit scoring модель + измерял её impact на approval rate». В этом гайде разберу 25+ реальных вопросов с 5 раундов собеса аналитика Тинькофф (Банк / Инвестиции / Бизнес / Мобайл) — с сильным и слабым ответом.
Грейды аналитика в Тинькофф (2026)
| Грейд | Compensation/мес РФ | Опыт | Что спрашивают |
|---|---|---|---|
| Junior | 150-230K ₽ | 0-1 год | SQL базовый, pandas, базовые fintech-понятия |
| Middle | 230-340K ₽ | 1-3 года | Credit risk basics, A/B-тесты, Vintage |
| Senior | 340-520K ₽ | 3-6 лет | Architecture аналитики, ML risk models, regulatory |
| Lead | 520-700K+ ₽ | 6+ лет | Multi-team projects, business strategy, mentorship |
5 раундов собеса Тинькофф
| Раунд | Что | Длительность |
|---|---|---|
| 1. HR-скрининг | Мотивация, fintech опыт, expectations | 30 мин |
| 2. SQL live | 2-3 задачи + банковская специфика | 60 мин |
| 3. Python + статистика | pandas + scoring models + A/B | 60 мин |
| 4. Fintech-кейс | Credit risk / churn / fraud detection | 60 мин |
| 5. Финал | Behavioral + регуляторика + business sense | 45-60 мин |
7 SQL-вопросов с собеса Тинькофф
Найди клиентов которые сделали 3+ транзакции за месяц со счёта open после 2026-01-01.
✅ Сильный ответ:
\\\sql
WITH eligible_accounts AS (
SELECT account_id FROM accounts WHERE opened_at >= '2026-01-01'
),
monthly_tx AS (
SELECT account_id,
date_trunc('month', tx_date) AS month,
COUNT(*) AS tx_count
FROM transactions
WHERE account_id IN (SELECT account_id FROM eligible_accounts)
GROUP BY 1, 2
)
SELECT DISTINCT account_id
FROM monthly_tx
WHERE tx_count >= 3;
\\\
Senior follow-up:
- «Что если account_id нет в transactions? — INNER JOIN исключит автоматически»
- «Если N=10M аккаунтов — IN субзапрос медленный? EXISTS быстрее или JOIN на eligible_accounts»
Vintage analysis: дефолтность по месяцу выдачи кредита.
✅ Сильный ответ:
«Vintage — view на performance кредитов сгруппированный по месяцу выдачи (cohort). Главный инструмент банка чтобы понять как новые кредиты ведут себя по сравнению со старыми.
\\\sql
WITH loans_with_status AS (
SELECT loan_id,
date_trunc('month', issued_at) AS cohort_month,
CASE WHEN dpd >= 90 THEN 1 ELSE 0 END AS default_flag
FROM loans
WHERE issued_at >= '2025-01-01'
)
SELECT cohort_month,
COUNT(*) AS issued,
SUM(default_flag) AS defaults,
1.0 * SUM(default_flag) / COUNT(*) AS default_rate
FROM loans_with_status
GROUP BY cohort_month
ORDER BY cohort_month;
\\\
Senior follow-up: «Это gross default rate — а нужно по MOB (months on book). Vintage by MOB — это матрица cohort × age, классический банковский view.»
Roll Rate: процент аккаунтов которые из 30-DPD перешли в 60-DPD за месяц.
✅ Сильный ответ:
\\\sql
WITH dpd_status AS (
SELECT account_id, snapshot_date,
CASE
WHEN dpd >= 60 THEN '60+'
WHEN dpd >= 30 THEN '30-59'
WHEN dpd >= 1 THEN '1-29'
ELSE 'Current'
END AS bucket,
LAG(CASE
WHEN dpd >= 60 THEN '60+'
WHEN dpd >= 30 THEN '30-59'
WHEN dpd >= 1 THEN '1-29'
ELSE 'Current'
END) OVER (PARTITION BY account_id ORDER BY snapshot_date) AS prev_bucket
FROM loan_snapshots
WHERE snapshot_date IN ('2026-01-31', '2026-02-28')
)
SELECT
COUNT(CASE WHEN prev_bucket = '30-59' AND bucket = '60+' THEN 1 END) * 1.0
/ NULLIF(COUNT(CASE WHEN prev_bucket = '30-59' THEN 1 END), 0) AS roll_30_60_pct
FROM dpd_status
WHERE snapshot_date = '2026-02-28';
\\\
Senior: «Roll rates — главные leading indicators credit risk. Если roll 30→60 растёт — будет волна defaults через 1-2 месяца. Это используется для early warning.»
SUM с условием: total долг по статусам активный/просроченный/закрыт.
✅ Сильный ответ:
\\\sql
SELECT
SUM(CASE WHEN status = 'active' THEN balance ELSE 0 END) AS active_balance,
SUM(CASE WHEN status = 'overdue' THEN balance ELSE 0 END) AS overdue_balance,
SUM(CASE WHEN status = 'closed' THEN balance ELSE 0 END) AS closed_balance,
SUM(balance) AS total_balance
FROM loans;
\\\
Senior follow-up: «Это conditional aggregation. Альтернатива — pivot через CROSSTAB в PG или просто GROUP BY status. Conditional чище для отчёта.»
NPL ratio за последние 12 месяцев (по месяцам).
✅ Сильный ответ:
«NPL (Non-Performing Loan) Ratio = NPL balance / Total balance. NPL обычно = loans с DPD ≥ 90.
\\\sql
SELECT
date_trunc('month', snapshot_date) AS month,
SUM(CASE WHEN dpd >= 90 THEN balance ELSE 0 END) * 1.0
/ NULLIF(SUM(balance), 0) AS npl_ratio
FROM loan_snapshots
WHERE snapshot_date >= now() - INTERVAL '12 months'
GROUP BY 1
ORDER BY 1;
\\\
Senior: «Кроме standard NPL есть NPL@90+ ratio (просрочка ≥90 дней) — что банк отчитывает в ЦБ. И provision ratio = резервы / NPL — насколько банк готов к убыткам.»
Найди корреляцию между фичами (например, age и default_rate).
✅ Сильный ответ:
«В SQL прямой Pearson нет, но можно вычислить через корреляционные формулы:
\\\sql
WITH stats AS (
SELECT
AVG(age) AS avg_age,
AVG(default_flag) AS avg_def,
COUNT(*) AS n
FROM clients
)
SELECT
SUM((age - avg_age) * (default_flag - avg_def))
/ SQRT(SUM(POWER(age - avg_age, 2)) * SUM(POWER(default_flag - avg_def, 2)))
AS pearson_correlation
FROM clients, stats;
\\\
В PostgreSQL — \corr(x, y)\ aggregate function делает это в одну строку.
Senior follow-up: «Для бинарной target (default_flag) Pearson не лучший выбор — используй point-biserial correlation или Information Value (IV) который банки используют для feature selection.»
Найди клиентов с подозрительной активностью: 5+ транзакций > 100K ₽ в течение часа.
✅ Сильный ответ:
\\\sql
WITH suspicious_windows AS (
SELECT
client_id,
tx_time,
amount,
COUNT(*) OVER (
PARTITION BY client_id
ORDER BY tx_time
RANGE BETWEEN INTERVAL '1 hour' PRECEDING AND CURRENT ROW
) AS tx_in_window
FROM transactions
WHERE amount > 100000
)
SELECT DISTINCT client_id
FROM suspicious_windows
WHERE tx_in_window >= 5;
\\\
Senior follow-up: «Это базовый фрод-detect. В реальности фрод нашли бы через ML model (Isolation Forest, Autoencoder) — SQL только для rules-based first pass. ML работает на гораздо больше features.»
5 Python-вопросов с собеса Тинькофф
Реализуй WoE (Weight of Evidence) трансформацию в pandas.
✅ Сильный ответ:
\\\python
import pandas as pd
import numpy as np
def calc_woe(df, feature, target):
grouped = df.groupby(feature).agg(
total=(target, 'count'),
bad=(target, 'sum')
).reset_index()
grouped['good'] = grouped['total'] - grouped['bad']
grouped['bad_rate'] = grouped['bad'] / grouped['bad'].sum()
grouped['good_rate'] = grouped['good'] / grouped['good'].sum()
grouped['woe'] = np.log(grouped['good_rate'] / grouped['bad_rate'])
return grouped[[feature, 'woe']]
# Использование
woe_df = calc_woe(loans, 'income_band', 'default_flag')
loans = loans.merge(woe_df, on='income_band')
\\\
Senior follow-up: «WoE — стандартный preprocessing для logistic regression в credit scoring. IV (Information Value) = сумма (good_rate - bad_rate) × WoE — это feature importance. IV > 0.3 = strong predictor, < 0.02 = useless.»
Реализуй credit score из probability of default.
✅ Сильный ответ:
\\\python
import numpy as np
def pd_to_score(pd_prob, base_score=600, base_odds=50, pdo=20):
"""
pd_prob: probability of default (от model)
base_score: scaling, обычно 600 (= odds 50:1)
pdo: points to double odds = 20 (= +20 points = в 2 раза меньше defaults)
"""
factor = pdo / np.log(2)
offset = base_score - factor * np.log(base_odds)
odds = (1 - pd_prob) / pd_prob
score = offset + factor * np.log(odds)
return score.round().astype(int)
# Использование
df['score'] = pd_to_score(df['pd_predicted'])
\\\
Senior follow-up: «Это standard credit score formula. Bigger score = lower default prob. FICO в США использует похожий scaling. У Тинькофф internal scoring 300-850 range обычно.»
Population Stability Index (PSI): как считать и зачем?
✅ Сильный ответ:
«PSI — мера насколько распределение feature/score сдвинулось между двумя periods. Используется для monitoring model drift.
\\\python
def calc_psi(expected, actual, bins=10):
breakpoints = np.percentile(expected, np.linspace(0, 100, bins + 1))
expected_pct = np.histogram(expected, bins=breakpoints)[0] / len(expected)
actual_pct = np.histogram(actual, bins=breakpoints)[0] / len(actual)
# Защита от 0 (log undefined)
expected_pct = np.where(expected_pct == 0, 0.0001, expected_pct)
actual_pct = np.where(actual_pct == 0, 0.0001, actual_pct)
psi = np.sum((actual_pct - expected_pct) * np.log(actual_pct / expected_pct))
return psi
# Использование
psi = calc_psi(scores_baseline, scores_current)
print(f"PSI: {psi:.4f}")
\\\
Интерпретация:
- PSI < 0.1: distribution стабильна
- 0.1 ≤ PSI < 0.25: moderate shift, нужен мониторинг
- PSI ≥ 0.25: significant drift — модель нужно re-trainить»
Detect outliers в transactions: Z-score vs IQR — что лучше для финансов?
✅ Сильный ответ:
«Z-score = (x - μ) / σ. Threshold обычно |z| > 3. Хорош если данные нормально распределены.
IQR = Q3 - Q1. Outlier = x < Q1 - 1.5×IQR или x > Q3 + 1.5×IQR. Не зависит от distribution.
Для финансов IQR обычно лучше потому что транзакции сильно skewed (log-normal в лучшем случае). Z-score на skewed data даст false positives.
\\\python
def detect_outliers_iqr(series):
q1, q3 = series.quantile([0.25, 0.75])
iqr = q3 - q1
lower, upper = q1 - 1.5 * iqr, q3 + 1.5 * iqr
return (series < lower) | (series > upper)
\\\
Senior follow-up: «Для фрода это слишком наивно — нужен ML (Isolation Forest, One-Class SVM, или supervised если есть labels).»
Реализуй cohort retention для клиентов кредитных карт.
✅ Сильный ответ:
\\\python
import pandas as pd
# Cohort = месяц issuance
df['cohort'] = df['issued_at'].dt.to_period('M')
df['active_month'] = df['transaction_month'].dt.to_period('M')
df['mob'] = (df['active_month'] - df['cohort']).apply(lambda x: x.n)
cohort_retention = (df.groupby(['cohort', 'mob'])['client_id']
.nunique()
.unstack(fill_value=0))
# Normalize by cohort size (MOB 0)
retention_pct = cohort_retention.div(cohort_retention[0], axis=0) * 100
\\\
Senior follow-up: «Это classic cohort matrix. В Тинькофф добавляют product type (debit / credit / mortgage) — у каждого свой shape retention. Smart move — добавить confidence intervals для маленьких cohorts.»
→ Когортный анализ retention в SQL
5 fintech-кейсов с собеса (раунд 4)
Approval rate упал на 5% за неделю. Что делаешь?
✅ Сильный ответ (структура):
«Approval Rate = одобрения / заявки. Drop может быть от:
1. Изменение типа заявок (mix shift):
- Больше high-risk клиентов (новый канал маркетинга → плохая аудитория)
- Geographic shift (новый регион с худшей кредитной историей)
- Decomposition: approval rate by channel × region × cohort
2. Изменение scoring model:
- Re-training shift threshold (model более строгий)
- Feature drift (PSI > 0.25 — model уже плохо calibrated)
- Action: проверить PSI на main features, score distribution
3. Regulation / policy change:
- ЦБ изменил требования к LTI (loan-to-income)
- Internal policy: tightened income verification
4. Технический bug:
- API integration с КИ (credit bureau) сломан
- Default response = decline
Action plan:
- Day 1: identify root cause через decomposition
- Day 2-3: исправить + monitoring добавить
- Week 1: post-mortem, добавить alerting на PSI drift»
Дизайн credit risk модели для нового продукта (consumer loan).
✅ Сильный ответ:
«Target: PD (probability of default) в 12-month horizon.
Data sources:
- Internal: customer history (transactions, balances, prev loans)
- Bureau: КИ (НБКИ, ОКБ, Equifax)
- External: salary statements, employment
Features (~50-100):
- Demographic: age, region
- Income: stated, bureau-verified, salary regularity
- Credit history: # active loans, max DPD past 24mo, utilization
- Behavioral: спендинг patterns, savings, deposit history
Model choice:
- Logistic regression + WoE — interpretable, regulatory-friendly (ЦБ может попросить)
- Gradient Boosting (XGBoost / LightGBM) — точнее, но менее interpretable
- Production: оба + champion-challenger framework
Evaluation:
- Gini / AUC (classification quality)
- KS-statistic (separation between defaulters/non-defaulters)
- Lift table (top-decile capture rate)
- Profit curve (financial impact)
Monitoring:
- PSI на input features (weekly)
- Score distribution shift (monthly)
- Realized vs predicted PD (по cohorts as they mature)»
Fraud detection: rule-based vs ML-based.
✅ Сильный ответ:
«Rule-based:
- + Простой, interpretable, быстрый deploy
- + Не нужны labels (можно по domain knowledge)
- - Hard to maintain (правила устаревают)
- - Low recall (фродстеры обходят rules)
ML-based:
- + Высокий recall, adaptive
- + Catches новые patterns
- - Нужны labels (исторические fraud cases)
- - Black-box (regulatory issue)
- - False positives (legitimate transactions blocked)
Production approach (Тинькофф style):
- Rule layer для obvious patterns (transactions out of country, suspicious merchants)
- ML layer для borderline cases (anomaly score 0.3-0.7)
- Human review для high-impact decisions
Metrics:
- Precision @ K (% of flagged that are real fraud)
- Recall (% of fraud caught)
- False positive rate (% legitimate blocked) — критично для UX»
Churn в Тинькофф Pro (premium subscription). Как анализировать?
✅ Сильный ответ:
«Churn analysis structure:
1. Definition: active vs churned. Тинькофф Pro = подписка месячная.
- Hard churn: subscription cancelled, не renew
- Soft churn: payments failed, не использует сервис
2. Segmentation:
- By tenure (1мес / 1-6мес / 6-12мес / 12мес+)
- By usage cohort (heavy users / occasional / dormant)
- By acquisition channel
- By demographic
3. Survival analysis:
- Kaplan-Meier curves: probability of retention at month T
- Cox regression: какие features predict churn
4. Action:
- High-churn segments → targeted retention campaigns
- Drivers: какие features juniors более склонны churn (например low feature usage)
- Pricing experiments на segment-specific
Key metric для Тинькофф: Churn vs base rate. Если segment X = 12% monthly churn, base = 5% — это анти-target.»
Cross-sell прогноз: дать кредит активному depositor — risk и opportunity.
✅ Сильный ответ:
«Opportunity: depositor с большим balance — высокий income, низкий default. Lift vs cold acquisition.
Risk: один продукт у одного клиента — concentration risk. Если depositor берёт large loan и дефолтит — банк теряет на 2 продуктах сразу.
Подход:
- Eligibility model: PD для depositors-кандидатов на кредит
- Sensitivity: какой % depositors захотят кредит (response model)
- Profitability: expected profit = (1 - PD) × LTV - PD × LGD (Loss Given Default)
- Saturation analysis: в каком моменте cross-sell уменьшает retention (annoying offers)
A/B-тест:
- Treatment: показывают cross-sell offer
- Control: no offer
- Primary: take-up rate × NPV
- Guardrail: retention 6mo, NPS
В Тинькофф это базовая capability — личный кабинет показывает persona-based offers.»
3 behavioral / культура (раунд 5)
Как работаешь с регуляторными требованиями (ЦБ)?
✅ Сильный ответ:
«В банке регуляторика непреложна. Подход:
- Знаю basics: 590-П (резервирование), 199-И (ПОД/ФТ), 4892-У (ОФАК)
- На скоринг model — нужна interpretability + audit trail (logistic regression предпочтительнее GBM для regulated decisions)
- Все данные access — logged, retention policy
- Любой ML-driven decision должен иметь возможность объяснить клиенту почему отказ
Personal experience: в проекте X пришлось переделать GBM модель на WoE + logistic — banking ЦБ требовал explainability. Loss в AUC ~1%, но regulatory compliance >> точность.»
Опиши случай когда твоя гипотеза оказалась wrong.
✅ Сильный ответ (STAR):
«Ситуация: анализировал retention у Тинькофф Pro, hypothesis — premium feature X driver retention.
Действие: настроил A/B где group A видит фичу X, group B нет. 8 недель.
Результат: treatment effect 0% (p=0.85). Фича не drives retention.
Learning:
- Гипотеза basana на correlation (heavy users больше используют X) — не causation
- После failed test: причинно-следственный анализ. На самом деле retention driven by transactional features (карта, инвестиции), не value-add features
- Pivot strategy: вместо инвестиций в premium-only features, focus на core experience
Главный learning: A/B-test — primary truth-finder. Correlations врут.»
Как ты подходишь к ML model risk?
✅ Сильный ответ:
«В банке model risk management — отдельная дисциплина:
1. Pre-deployment:
- Out-of-time validation (тренируешь до T, тестируешь T+1 to T+6)
- Stress testing (как model ведёт себя в economic downturn)
- Bias audit (no disparate impact на protected groups)
2. Deployment:
- Champion-challenger framework (50% on old model, 50% on new, compare)
- Gradual rollout (5% → 25% → 100%)
- Killswitch (мгновенный rollback)
3. Monitoring:
- PSI weekly
- KS-statistic stability
- Realized vs predicted PD (по cohorts as they mature, 6-12 month lag)
- Business KPIs (approval rate, NPL ratio, AUC retroactively)
4. Documentation:
- Model card (use case, limitations, training data)
- Decision audit trail (что повлияло на каждое одобрение/отказ)
В Тинькофф это формализовано через model risk committee.»
Red flags на собесе Тинькофф (не делай)
- Игнорировать regulation на ML-вопросах — топ red flag в банке
- Не знать Vintage / Roll Rate / MOB — base concepts banking analyst
- Использовать сложные модели без interpretability — в банке logistic regression > GBM из-за explainability
- Игнорировать model monitoring — PSI, KS, realized vs predicted — must-know
- Не упомянуть bias / fairness на ML-вопросах — regulatory hot topic
- Слабо разбираться в фроде — даже для не-fraud роли base understanding ожидается
- Описывать только metrics без business impact — Тинькофф ценит «как это влияет на P&L»
Как готовиться к Тинькофф
Месяц 1: банковская терминология
- Vintage analysis, Roll Rates, MOB, NPL, LGD, EAD
- WoE / IV / KS / PSI — credit scoring tools
- 590-П, 199-И, 4892-У — regulation basics
Месяц 2: SQL + ML на банковских кейсах
- 50+ SQL задач с фокусом на window-функции, cohort analysis — SQL-тренажёр
- Python: scikit-learn для logistic regression, statsmodels для interpretability
- Прочесть «Credit Risk Modeling» (Bart Baesens) — bible банковской аналитики
Месяц 3: продуктовые кейсы + behavioral
- 30+ кейсов из /cases фильтр fintech
- AI мок-собес с фокусом на банковские кейсы
- Подготовить 7 STAR-историй
FAQ
Тинькофф собес сложнее Сбера?
Да, технически сложнее. Тинькофф ожидает modern stack (Python ML, dbt, ClickHouse). Сбер ближе к классическому BI/SAS банковскому опыту.
Можно ли пройти Тинькофф без банковского опыта?
Junior — да. Middle+ — сложно без хотя бы 1-2 банковских проектов. Можно компенсировать сильным ML / pandas, но base banking знание необходимо.
Какие команды в Тинькофф самые конкурентные?
Tinkoff Invest (heavy ML, alpha-generation), Tinkoff Bank (credit risk core), Tinkoff Business (B2B fintech). Менее жёсткие — Pulse, Lifestyle, Mobile.
Чем отличается Тинькофф от других банков?
Тинькофф = tech-first банк: ML-heavy decisions, A/B-driven product, no offline branches. Сбер/ВТБ — более traditional structures + regulation-driven.
Возможен ли pre-screening test?
Часто. SQL + ML кейс на 4-6 часов home work. Финальный live разбор после.
Какие книги почитать?
- «Credit Risk Modeling» (Bart Baesens) — must-read
- «Hands-On Machine Learning» (Aurélien Géron) — ML applied
- «Statistical Methods in Credit Risk Modeling» (Aparna Gupta) — academic
Что дальше
- 521 SQL-задача с авто-проверкой
- 532 Python-задачи
- 453 кейса фильтр fintech
- AI мок-собес — первый сценарий бесплатно
- 150+ вопросов общего собеса
- Вопросы Яндекс аналитика
- Вопросы Ozon аналитика
- Behavioral interview + STAR
- Мок-собес: форматы
- Подробнее о компании Тинькофф →
Сравнить Free и Pro → (1999 ₽/мес)
Источники
- Levels.fyi РФ 2026 (T-Bank grades, salary bands)
- Habr — статьи T-Bank Tech про credit scoring, A/B, ML
- ЦБ РФ — открытые положения 590-П, 199-И, 4892-У
- «Credit Risk Modeling» (Bart Baesens) — academic reference