ТинькоффT-Bankсобеседованиеаналитика данныхfintechcredit scoringфродкарьера

Вопросы собеса в Тинькофф (T-Bank) на аналитика 2026: 25+ реальных + разбор

2026-06-04 24 мин

T-Bank (Тинькофф) — самый fintech-heavy собес среди РФ-компаний для аналитика. Если в Яндексе спрашивают «как чинить retention», в Тинькофф — «как ты бы строил credit scoring модель + измерял её impact на approval rate». В этом гайде разберу 25+ реальных вопросов с 5 раундов собеса аналитика Тинькофф (Банк / Инвестиции / Бизнес / Мобайл) — с сильным и слабым ответом.

Главное про Тинькофф
Тинькофф глубоко тестирует **fintech-product sense**: credit risk, фрод, регуляторика, behavioral risk. SQL + Python база; глубина в банковской аналитике (Vintage analysis, Roll Rates, MOB) — не у всех есть. Если ты пришёл из e-comm — готовься на банковскую специфику отдельно.

Грейды аналитика в Тинькофф (2026)

ГрейдCompensation/мес РФОпытЧто спрашивают
Junior150-230K ₽0-1 годSQL базовый, pandas, базовые fintech-понятия
Middle230-340K ₽1-3 годаCredit risk basics, A/B-тесты, Vintage
Senior340-520K ₽3-6 летArchitecture аналитики, ML risk models, regulatory
Lead520-700K+ ₽6+ летMulti-team projects, business strategy, mentorship

5 раундов собеса Тинькофф

РаундЧтоДлительность
1. HR-скринингМотивация, fintech опыт, expectations30 мин
2. SQL live2-3 задачи + банковская специфика60 мин
3. Python + статистикаpandas + scoring models + A/B60 мин
4. Fintech-кейсCredit risk / churn / fraud detection60 мин
5. ФиналBehavioral + регуляторика + business sense45-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:

→ 521 SQL-задача в тренажёре

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}")

\\\

Интерпретация:

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):

2. Изменение scoring model:

3. Regulation / policy change:

4. Технический bug:

Action plan:

Дизайн credit risk модели для нового продукта (consumer loan).

✅ Сильный ответ:

«Target: PD (probability of default) в 12-month horizon.

Data sources:

Features (~50-100):

Model choice:

Evaluation:

Monitoring:

Fraud detection: rule-based vs ML-based.

✅ Сильный ответ:

«Rule-based:

ML-based:

Production approach (Тинькофф style):

Metrics:

Churn в Тинькофф Pro (premium subscription). Как анализировать?

✅ Сильный ответ:

«Churn analysis structure:

1. Definition: active vs churned. Тинькофф Pro = подписка месячная.

2. Segmentation:

3. Survival analysis:

4. Action:

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 продуктах сразу.

Подход:

A/B-тест:

В Тинькофф это базовая capability — личный кабинет показывает persona-based offers.»

3 behavioral / культура (раунд 5)

Как работаешь с регуляторными требованиями (ЦБ)?

✅ Сильный ответ:

«В банке регуляторика непреложна. Подход:

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:

Главный learning: A/B-test — primary truth-finder. Correlations врут.»

Как ты подходишь к ML model risk?

✅ Сильный ответ:

«В банке model risk management — отдельная дисциплина:

1. Pre-deployment:

2. Deployment:

3. Monitoring:

4. Documentation:

В Тинькофф это формализовано через model risk committee.»

Red flags на собесе Тинькофф (не делай)

Как готовиться к Тинькофф

Месяц 1: банковская терминология

Месяц 2: SQL + ML на банковских кейсах

Месяц 3: продуктовые кейсы + behavioral

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 разбор после.

Какие книги почитать?

Что дальше

Сравнить Free и Pro → (1999 ₽/мес)

Источники

Тренируй SQL/Python на 521+532 задачах
Тренажёр с авто-проверкой + 453 кейса включая fintech. AI мок-собес как в Тинькофф. Первые 5 задач бесплатно.
Открыть тренажёр →