Сбер — самый enterprise собес среди РФ-банков. Если в Тинькофф спрашивают «как ты бы построил ML model», в Сбере — «как ты интегрируешь модель в banking flow с учётом регуляторики и SAS legacy». В этом гайде разберу 25+ реальных вопросов с 4 раундов собеса аналитика Сбер (СберТех / Бизнес-блок / Розница / Investtech) — с сильным и слабым ответом.
Грейды аналитика в Сбер (2026)
| Грейд | Compensation/мес РФ | Опыт | Что спрашивают |
|---|---|---|---|
| Junior | 130-200K ₽ | 0-1 год | SQL базовый, Excel/Power BI, базовая статистика |
| Middle | 200-310K ₽ | 1-3 года | Advanced SQL, Python pandas, банковские метрики |
| Senior | 310-470K ₽ | 3-6 лет | ML credit scoring, A/B-тесты, system integration |
| Lead/Manager | 470-650K+ ₽ | 6+ лет | Team management, vendor management (SAS/SAP), регуляторика |
4 раунда собеса Сбер
| Раунд | Что | Длительность |
|---|---|---|
| 1. HR + technical screen | Мотивация, banking experience, мини-SQL | 45 мин |
| 2. Hard skills | SQL + Python + статистика | 90 мин |
| 3. Бизнес-кейс | Banking кейс, метрики, ETL | 60 мин |
| 4. Финал с лидом | Behavioral + культура + regulation | 60 мин |
8 SQL-вопросов с собеса Сбер (часто PostgreSQL/Greenplum/Oracle)
Найди топ-10 клиентов по обороту за квартал с условием активности на счёте.
✅ Сильный ответ:
\\\sql
WITH active_clients AS (
SELECT DISTINCT client_id
FROM accounts
WHERE status = 'active' AND last_activity >= '2026-01-01'
),
quarterly_turnover AS (
SELECT t.client_id, SUM(t.amount) AS total_turnover
FROM transactions t
WHERE t.client_id IN (SELECT client_id FROM active_clients)
AND t.tx_date >= '2026-01-01' AND t.tx_date < '2026-04-01'
GROUP BY t.client_id
)
SELECT client_id, total_turnover
FROM quarterly_turnover
ORDER BY total_turnover DESC
LIMIT 10;
\\\
Senior follow-up:
- «Что если client_id есть в transactions но нет в accounts? — INNER JOIN исключит (это intentional)»
- «На 100M+ строк IN субзапрос медленный → перепиши через EXISTS или INNER JOIN»
- «Какие индексы нужны? — (client_id, tx_date) composite на transactions»
Найди клиентов которые не делали транзакций последние 90 дней (dormant).
✅ Сильный ответ:
\\\sql
SELECT c.client_id, c.last_name, c.opened_at
FROM clients c
LEFT JOIN transactions t
ON c.client_id = t.client_id AND t.tx_date >= CURRENT_DATE - INTERVAL '90 days'
WHERE t.client_id IS NULL
AND c.status = 'active';
\\\
Senior follow-up:
- «LEFT JOIN + WHERE IS NULL = anti-join pattern. Альтернатива — NOT EXISTS»
- «NOT IN с NULL → отдаст 0 строк. NOT EXISTS — безопаснее»
- «На больших таблицах NOT EXISTS обычно быстрее LEFT JOIN + IS NULL (PostgreSQL planner)»
ETL: ежедневный snapshot балансов, найти клиентов где баланс упал на 50%+ за неделю.
✅ Сильный ответ:
\\\sql
WITH balances_compared AS (
SELECT
today.client_id,
today.balance AS today_balance,
week_ago.balance AS week_ago_balance,
(today.balance - week_ago.balance) * 100.0 / NULLIF(week_ago.balance, 0) AS pct_change
FROM balance_snapshots today
JOIN balance_snapshots week_ago
ON today.client_id = week_ago.client_id
AND week_ago.snapshot_date = CURRENT_DATE - 7
WHERE today.snapshot_date = CURRENT_DATE
AND week_ago.balance > 0
)
SELECT client_id, today_balance, week_ago_balance, pct_change
FROM balances_compared
WHERE pct_change <= -50
ORDER BY pct_change;
\\\
Senior follow-up: «Это change detection pattern. Для real-time можно использовать LAG over window вместо self-JOIN — проще, быстрее на partitioned table.»
Pivot: остатки по типам продукта × месяцам.
✅ Сильный ответ:
\\\sql
SELECT
date_trunc('month', snapshot_date) AS month,
SUM(CASE WHEN product_type = 'debit' THEN balance END) AS debit_balance,
SUM(CASE WHEN product_type = 'credit' THEN balance END) AS credit_balance,
SUM(CASE WHEN product_type = 'savings' THEN balance END) AS savings_balance,
SUM(CASE WHEN product_type = 'mortgage' THEN balance END) AS mortgage_balance
FROM balance_snapshots
WHERE snapshot_date >= '2025-01-01'
GROUP BY 1
ORDER BY 1;
\\\
Senior follow-up: «PostgreSQL имеет \crosstab\ функцию (extension tablefunc) — но для отчёта conditional aggregation чище. Если dynamic columns — обычно делается на client side (pandas, BI tool).»
Calculate Net Profit Margin по бизнес-сегментам.
✅ Сильный ответ:
\\\sql
SELECT
business_segment,
SUM(revenue) AS total_revenue,
SUM(costs) AS total_costs,
SUM(revenue - costs) AS net_profit,
SUM(revenue - costs) * 100.0 / NULLIF(SUM(revenue), 0) AS net_margin_pct
FROM business_pnl
WHERE period_month = '2026-03-01'
GROUP BY business_segment
ORDER BY net_margin_pct DESC;
\\\
Senior follow-up: «Net Margin = Net Profit / Revenue × 100. В банке это measured per business unit: розница, корпорат, инвест, страхование. Сравнение с прошлым кварталом — operating leverage analysis.»
Анти-фрод: найди клиентов с подозрительными переводами на новые счёта.
✅ Сильный ответ:
\\\sql
WITH first_time_recipients AS (
SELECT DISTINCT t.sender_id, t.recipient_id, MIN(t.tx_date) AS first_tx_date
FROM transfers t
GROUP BY 1, 2
)
SELECT
t.sender_id,
COUNT(DISTINCT t.recipient_id) AS new_recipients_count,
SUM(t.amount) AS total_amount
FROM transfers t
JOIN first_time_recipients ft
ON t.sender_id = ft.sender_id
AND t.recipient_id = ft.recipient_id
WHERE t.tx_date >= CURRENT_DATE - INTERVAL '7 days'
AND ft.first_tx_date >= CURRENT_DATE - INTERVAL '7 days'
GROUP BY 1
HAVING COUNT(DISTINCT t.recipient_id) >= 5
AND SUM(t.amount) >= 500000;
\\\
Senior: «Это rules-based first-pass. В реальности дополняется ML — Isolation Forest на 100+ features (location, time, amount distribution, network topology).»
Window function: накопительная сумма transactions за последние 30 дней (rolling).
✅ Сильный ответ:
\\\sql
SELECT
client_id,
tx_date,
amount,
SUM(amount) OVER (
PARTITION BY client_id
ORDER BY tx_date
RANGE BETWEEN INTERVAL '30 days' PRECEDING AND CURRENT ROW
) AS rolling_30d_sum
FROM transactions
WHERE client_id = 12345;
\\\
Senior follow-up:
- «RANGE — окно по дате, ROWS — по строкам. Для time-based используй RANGE»
- «На больших таблицах добавь INDEX (client_id, tx_date) — иначе window function медленная»
→ Window-функции SQL полный гайд
Recursive CTE: иерархия менеджеров банка.
✅ Сильный ответ:
\\\sql
WITH RECURSIVE manager_hierarchy AS (
SELECT employee_id, manager_id, full_name, 1 AS level, full_name::text AS path
FROM employees
WHERE manager_id IS NULL -- CEO
UNION ALL
SELECT e.employee_id, e.manager_id, e.full_name,
mh.level + 1,
mh.path || ' > ' || e.full_name
FROM employees e
JOIN manager_hierarchy mh ON e.manager_id = mh.employee_id
)
SELECT * FROM manager_hierarchy ORDER BY level, path;
\\\
Senior: «Recursive CTE — banking standard для org chart, account hierarchy (parent-child accounts), категорий продуктов. Limit recursion обязательно: \OPTION (MAXRECURSION 100)\ в SQL Server или WHERE level < 20 в PG.»
5 Python-вопросов с собеса Сбер
Прочитай Excel (10 листов), agg каждый по client_id, объедини.
✅ Сильный ответ:
\\\python
import pandas as pd
excel = pd.ExcelFile('clients.xlsx')
all_dfs = []
for sheet in excel.sheet_names:
df = pd.read_excel(excel, sheet_name=sheet)
df_agg = df.groupby('client_id').agg(
total_amount=('amount', 'sum'),
tx_count=('amount', 'count'),
sheet_source=('amount', lambda x: sheet) # tracking source
).reset_index()
all_dfs.append(df_agg)
merged = pd.concat(all_dfs, ignore_index=True)
# Final: union by client_id, summing amounts
final = merged.groupby('client_id').agg(
total_amount=('total_amount', 'sum'),
tx_count=('tx_count', 'sum')
).reset_index()
\\\
Senior follow-up: «Это classic banking workflow. На 100K+ rows pd.read_excel медленный — используй \openpyxl\ напрямую или \pd.read_excel(engine='calamine')\ для скорости.»
Имплементируй decile binning для credit scores.
✅ Сильный ответ:
\\\python
import pandas as pd
# Decile binning
df['score_decile'] = pd.qcut(df['credit_score'], q=10, labels=range(1, 11))
# Decile analysis
decile_stats = df.groupby('score_decile').agg(
n_clients=('client_id', 'count'),
default_rate=('default_flag', 'mean'),
avg_score=('credit_score', 'mean'),
avg_balance=('balance', 'mean')
).round(3)
\\\
Senior follow-up: «\pd.qcut\ делит на equal-population бины. Альтернатива — \pd.cut\ для equal-width. Decile analysis — основа credit scoring evaluation (lift table, gain chart).»
Реализуй A/B sample size calculator на Python.
✅ Сильный ответ:
\\\python
from scipy import stats
import math
def sample_size(p_baseline, mde, alpha=0.05, power=0.80):
"""
p_baseline: baseline conversion rate (e.g., 0.10 for 10%)
mde: minimum detectable effect (e.g., 0.01 for absolute +1pp)
alpha: Type I error (default 5%)
power: 1 - beta (default 80%)
"""
p_treatment = p_baseline + mde
pooled_p = (p_baseline + p_treatment) / 2
pooled_var = 2 * pooled_p * (1 - pooled_p)
z_alpha = stats.norm.ppf(1 - alpha/2)
z_beta = stats.norm.ppf(power)
n = ((z_alpha + z_beta)**2 * pooled_var) / (mde**2)
return math.ceil(n)
# Use: detect +1pp lift from 5% baseline
n_per_group = sample_size(0.05, 0.01)
print(f"Sample size per group: {n_per_group}")
# ~7,663 per group
\\\
Используй scipy для t-test: контроль vs treatment по выручке.
✅ Сильный ответ:
\\\python
from scipy import stats
control = df[df['group'] == 'control']['revenue']
treatment = df[df['group'] == 'treatment']['revenue']
# Two-sample t-test (Welch's)
t_stat, p_value = stats.ttest_ind(control, treatment, equal_var=False)
print(f"Mean control: {control.mean():.2f}")
print(f"Mean treatment: {treatment.mean():.2f}")
print(f"Lift: {(treatment.mean() - control.mean()) / control.mean() * 100:.2f}%")
print(f"p-value: {p_value:.4f}")
print(f"Significant: {p_value < 0.05}")
\\\
Senior follow-up: «Welch's vs Student's — Welch не требует equal variance (default в scipy). Для revenue которая highly skewed (lognormal) — рассмотри log-transform или bootstrap для CI.»
Detect missing values и обработай в credit data.
✅ Сильный ответ:
\\\python
# 1. Visualize missingness
missing_pct = df.isna().mean() * 100
print(missing_pct.sort_values(ascending=False))
# 2. Strategies depend on feature type:
# - <5% missing: drop rows
df_clean = df.dropna(subset=['age', 'income']) if missing_pct['age'] < 5 else df
# - 5-30% missing in numeric: impute by median (robust to outliers)
df['income'] = df['income'].fillna(df['income'].median())
# - >30% missing: feature itself может быть informative (missing = no data → high risk?)
df['has_credit_history'] = df['credit_history'].notna().astype(int)
# - Categorical: impute by mode или 'Unknown' category
df['employment'] = df['employment'].fillna('Unknown')
\\\
Senior follow-up: «В банке missing нельзя просто impute — нужен missing-as-feature. Если client не дал income — это сам по себе signal. WoE encoding обрабатывает missing как separate bin.»
5 кейсов / банковских вопросов (раунд 3)
Зарплатный клиент vs неклиент: как сравнишь PD?
✅ Сильный ответ:
«Salary client (зарплатный) — банк видит доход напрямую через counterparty payroll. Реальный income, не stated.
Non-salary client — банк polагается на client-stated income + bureau data.
Hypothesis: salary clients имеют lower PD (default rate) потому что:
- Доход проверен (нет fake income)
- Связь работодателя с банком — экзит дороже
- Auto-deduct платежей возможен
Analysis:
- Сравнить PD по cohorts (salary vs non-salary) с одинаковым demographic
- DiD: те же клиенты до/после становления зарплатными
- Confounder: salary clients выбирают свой банк → selection bias. Нужно matching по income + age + product mix
Expected result: salary cohort PD ~ 30-50% ниже non-salary. Это bedrock business model Сбера.»
Анализ скоринг-модели: AUC 0.78. Это достаточно?
✅ Сильный ответ:
«AUC 0.78 — average для credit scoring. Сравнение:
- 0.65-0.75 = weak
- 0.75-0.85 = decent (industry standard)
- 0.85+ = strong (rare in unsecured loans)
Достаточно — зависит от:
1. Business cost of mistakes:
- High loan amount → false positives дороги (упускаем хороший client) → нужно lift в top deciles, не average AUC
- Low ticket size → focus on TPR (catch rate)
2. Comparison с baseline:
- Старая model = 0.74 → 0.78 = improvement
- Старая = 0.80 → 0.78 = regression
3. Stability:
- AUC 0.78 stable across cohorts ОК
- AUC 0.78 average + variance 0.65-0.85 — unreliable
4. Calibration:
- Predicted PD 5% → actual 5%? Калибрация важнее чем AUC для pricing decisions
Practical answer: AUC 0.78 + good calibration + stable = deploy. AUC 0.85 + poor calibration = don't deploy.»
Сегментация клиентов: RFM или behavioral?
✅ Сильный ответ:
«RFM (Recency, Frequency, Monetary) — классика. Простой, interpretable, работает для transactional behavior.
Behavioral segmentation — clustering на 50+ features (transactions categories, channels, products owned, time patterns). Глубже инсайт, но сложнее.
Когда RFM:
- Запуск с нуля, нет history
- Нужна interpretability для бизнеса
- Малые объёмы данных (RFM = 3 features)
Когда behavioral:
- Зрелая data infrastructure
- ML team есть
- Нужна persona-level аналитика (не «high-value», а «mortgage candidate», «savings hoarder»)
В Сбере используется оба:
- RFM для базовой сегментации в розничной аналитике
- Behavioral (k-means / DBSCAN на 30+ features) для targeted offers
My take: начинай с RFM, эволюционируй в behavioral по мере зрелости команды.»
Дизайн A/B-теста: новый дизайн мобильного приложения.
✅ Сильный ответ:
«Hypothesis: новый дизайн увеличит engagement (session frequency).
Design:
- Unit of randomization: user_id (не device — иначе same user разные группы)
- Split: 50/50
- Primary metric: session frequency per active user per month
- Secondary: time per session, features used, transactions performed
- Guardrails: crash rate, NPS, transaction success rate
Sample size:
- Baseline session freq = 8/мес, std = 4
- MDE = +0.5 session (6% lift)
- Sample = ~10K per group (на основе t-test power analysis)
Duration:
- Minimum 4 weeks (cover monthly cycle)
- Не более 6 weeks (avoid novelty effect, model drift)
Analysis:
- Welch's t-test for primary
- CUPED для variance reduction (использовать pre-period sessions как covariate)
- Segmentation: heavy vs light users — кто реагирует сильнее?
Decision:
- Primary metric: +1.2 sessions, p=0.003 ✓
- Guardrails: crash +0.2pp, NPS -0.5 → flags
- Recommendation: не катить full → investigate crash issue first, потом rollout»
Cross-sell campaign к existing clients: как измеришь uplift?
✅ Сильный ответ:
«Uplift modeling — измерение incremental effect от campaign vs natural conversion.
Метод 1: Holdout A/B
- Random 10% target audience — не получает offer (holdout)
- 90% — получают
- Difference в conversion = incremental conversion (uplift)
Метод 2: Propensity Score Matching (если A/B не возможен)
- Match treated и control clients по propensity score
- Сравни conversion rate матчей
Метод 3: Uplift ML modeling
- Two-model approach: P(convert | treatment) - P(convert | no treatment)
- Use for targeting (показывать offer только high-uplift segments)
Метрики:
- Incremental conversion — primary
- Cost per incremental conversion (CPIC)
- ROI = incremental revenue / cost
- Saturation analysis: после сколько touchpoints uplift уменьшается
Гайдрейл: annoyance metric — % клиентов кто отписался от offers после campaign.»
4 behavioral / cultural вопроса (раунд 4)
Как ты работаешь с менторами из бизнеса (без data background)?
✅ Сильный ответ:
«Слушаю сначала, преподаю потом. Бизнес знает domain лучше меня; я знаю analytics. Цель — brige.
Подход:
- Изучаю их terminology (RWA, EAR, NIM — банковский язык)
- Объясняю свои findings через их metrics (не «AUC 0.78», а «model отделяет defaults лучше на 15%»)
- Когда отказываю — даю alternative path («это не сделаем в Q1, но Q2 можно через approach Y»)
- Регулярные 1-on-1 для context exchange, не только task delivery
Опыт: работа с risk officer 5 лет старше меня по seniority. Сначала я хотел сразу advanced ML, она настаивала на logistic + WoE из-за regulation. Она была права — XGBoost для credit decision не пропустил бы model risk committee.»
Этичность данных и privacy: реальный кейс из опыта.
✅ Сильный ответ:
«Кейс: маркетинг хотел использовать demographic data (age, gender) для targeted credit offer.
Issue: demographic targeting может быть disparate impact — даже если model не использует gender напрямую, через proxy features (профессия, частота транзакций) gender может коррелировать с outcomes.
Action:
- Запустил bias audit: differential outcomes по gender / age в historical campaign
- Нашёл: women получали credit offers на 30% реже equivalent men с similar profile
- Eskal в compliance + data ethics committee
- Result: убрали features которые работали как gender proxies. Improved compliance, минимальный business impact (~0.5% conversion loss).
Learning: в банке data ethics не optional — regulation + reputation. Lучше сразу dive deep чем feature deploy и потом откатывать.»
Если бизнес просит anti-pattern (например p-hacking)?
✅ Сильный ответ:
«Прямой отказ + предложение alternative.
Кейс: PM хотел запустить 5 разных вариантов баннера на маленькой выборке и выбрать лучший без correction for multiple testing.
Issue: classic p-hacking. Если каждый test с α=5%, вероятность false positive хотя бы в одном = 1 - (0.95)^5 = 23%.
Response:
- Объяснил проблему на цифрах (вероятность 23% false positive)
- Предложил Bonferroni correction (α=1% per test) или Holm-Bonferroni
- Или: одно primary metric, один primary test
- Не «нет», а «вот как сделать правильно»
Result: запустили с correction, тест дал значимый результат на одном варианте, выбрали честно.
Главный learning: говорить «нет» с alternative path — конструктивный отказ, а не блокер.»
Опиши свою команду мечты.
✅ Сильный ответ:
«Команда мечты:
- Domain expert (senior banking) — знает что важно для бизнеса
- ML engineer — production-grade models с monitoring
- DE / Data engineer — reliable data pipelines
- Я (product analyst) — мост между бизнес и tech
- PM / Product — приоритизация
- Compliance / Risk officer — для regulation-heavy решений
Culture:
- Data-driven decisions (но recognize что не всё measurable)
- Constructive disagreement (challenge ideas, not people)
- Continuous learning (book club, conference attendance)
- Customer focus (banking impacts real lives)
Что важно: diversity в опыте (academic ML + банковский background + tech-стартап опыт). Hard skills можно научить, culture fit — нет.»
Red flags на собесе Сбер (не делай)
- Игнорировать регуляторику — в Сбере это базовое требование, не nice-to-have
- Сравнивать только с Тинькофф в негативном свете — Сбер — partner / competitor, не «они хуже»
- Слишком ML-heavy ответы — Сбер ценит interpretability, не «black box GBM»
- Игнорировать banking метрики (NIM, RWA, NPL) — base knowledge expected
- Не упоминать stakeholder management — в большой организации это критично
- Перетягивать одеяло на behavioral — Сбер ценит team players
- Описывать решение без financial impact — Сбер бизнес-driven, привязка к P&L важна
Как готовиться к Сбер
Месяц 1: банковская терминология + SQL
- Vintage, Roll Rates, NPL, NIM, RWA, EAR (read «Risk-Adjusted Return»)
- 50+ SQL задач — SQL-тренажёр с focus на window functions, recursive CTE
- Регуляторика: 590-П, 199-И, 4892-У
Месяц 2: Python + классическая статистика
- pandas advanced (groupby, merge, pivot, transform)
- statsmodels для interpretable модels (logistic regression, OLS)
- scipy.stats для hypothesis testing
- WoE / IV / KS / PSI для credit scoring
Месяц 3: кейсы + behavioral
- 30+ кейсов banking-focused из /cases
- AI мок-собес с regulatory focus
- 7 STAR-историй (1 обязательно про регуляторику / compliance)
FAQ
Сбер собес сложнее или проще Тинькофф?
По SQL примерно одинаково. По ML — проще Сбера (logistic regression > GBM, less modern ML). По banking domain — Сбер требует больше base knowledge (regulation, NIM, RWA).
Можно ли попасть в Сбер без банковского опыта?
Junior — да. Middle — сложно, но возможно если сильный SQL + понимание banking domain. Senior — нужны 2+ года банковского опыта (внешнего или Тинькофф).
Какие команды самые конкурентные?
СберТех Лаборатория (R&D), Кредитный риск (core analytics), СберИнвестиции (alpha-generation). Менее конкурентные — Маркетинг розницы, HR Analytics.
Где остальные банки (ВТБ, Газпромбанк, Альфа)?
ВТБ — похож на Сбер culture-wise, чуть менее tech-savvy. Газпромбанк — corporate-focused, меньше retail аналитики. Альфа — более tech-progressive, ближе к Тинькофф по подходу.
Important certifications?
SAS Certified Statistical Business Analyst — legacy но банковский стандарт. CFA — для инвестблока. ML/data — Yandex Practicum / Карпов курсы — recognized.
Что дальше
- 521 SQL-задача с авто-проверкой
- 532 Python-задачи
- 453 кейса фильтр fintech
- AI мок-собес — первый сценарий бесплатно
- 150+ вопросов общего собеса
- Вопросы Тинькофф аналитика (fintech-focus)
- Вопросы Яндекс аналитика (tech-focus)
- Вопросы Ozon аналитика (marketplace-focus)
- Behavioral interview + STAR
- Мок-собес: форматы
- Подробнее о компании Сбер →
Сравнить Free и Pro → (1999 ₽/мес)
Источники
- Levels.fyi РФ 2026 (Сбер grades, salary bands)
- Habr — статьи СберТех про analytics, ML, data infrastructure
- ЦБ РФ — положения 590-П, 199-И, 4892-У
- «Credit Risk Modeling» (Bart Baesens) — academic reference
- SAS Institute — official SAS Statistical Business Analyst curriculum