Прогнозирование дохода
Прогнозирование дохода
Доход — итог взаимодействия многих факторов: предложения контента/продукта, поведения пользователей, цен и промо, внешних условий (праздники, спорт-ивенты, курс валют, регуляторные изменения). Надежный прогноз — это не одна «модель», а управляемый контур: определения → данные → модель → сценарии → эксплуатация → сверки → улучшение.
1) Постановка задачи
Что прогнозируем: валовую выручку (GGR), чистую (Net), выручку после бонусов/комиссий, по базовой валюте и в локальных валютах.
Горизонт/шаг: ежедневный/недельный/месячный; для планирования кассовых разрывов — дневной, для бюджета — месячный/квартальный.
Единица прогноза: бренд × страна × платформа × канал (минимум) с последующим согласованием по иерархии.
Назначение: бюджетирование, закупка трафика/контента, лимиты инфраструктуры, финансовые ковенанты.
Цена ошибки: недопрогноз (упущенный спрос/недозакуп) vs перепрогноз (излишние закупки/переобещания).
2) Определения и согласование с финансовым контуром
Формулы: GGR, Net, вычеты (налоги, бонусы, афилиатские комисcии) — версионированы в семантическом слое.
Календарь: UTC-хранение + локальные представления; праздники/зарплатные дни; спорт-расписания (если релевантно).
FX-политика: источник курсов, дата конверсии (на дату операции/средний курс периода), единая базовая валюта.
Сверки: обязательная процедура reconciliation c бухгалтерией (расхождение в допустимых пределах).
3) Декомпозиция дохода на драйверы
Базовая формула:[
\text{Доход} = \text{Трафик}\times \text{Конверсия}\times \text{Частота}\times \text{Средний чек}
]
Трафик/активные: пользователи/сессии/входы.
Конверсия: доля платящих, CR в целевые события.
Частота: число транзакций на платящего/период.
Средний чек: средняя сумма транзакции (учитывайте бонусы/скидки).
Рекомендуется прогнозировать драйверы отдельно, затем собирать композит, чтобы видеть вклад факторов (мост «план-факт»).
4) Данные и регрессоры
Временные ряды: дневные/недельные агрегаты по единице прогноза.
Регрессоры X:- промо/бонусы (интенсивность, тип, охват);
- маркетинговые расходы/импрессии/клики;
- контент-ивенты (релизы, турниры, крупные матчи);
- изменения цен/лимитов/каталога;
- FX/инфляция, погода/календарь (если влияет);
- регуляторные события (ограничения/разморозки).
- Аномалии/one-off: помечайте, не «сглаживайте» молча.
- Отсутствие ликов: используйте только информацию, доступную на момент прогноза.
5) Моделирование
5.1 Бейзлайны
Naive/Seasonal Naive/Drift — обязательны для честной оценки.
5.2 Классические ряды
ETS/ARIMA/SARIMA, TBATS (множественные сезонности), Prophet (быстрый старт с праздниками).
5.3 Регрессоры
ARIMAX/ETS+X, динамические регрессии с календарем и промо/FX.
5.4 Мульти-сирийные/табличные
LightGBM/XGBoost/линейные с лагами/окнами/календарем;
Темпоральные NN (TFT, N-Beats) для портфелей и длинных X.
5.5 Вероятностные
Квантильная регрессия (pinball), Student-t/Gaussian предсказания, ансамбли квантилей для интервалов (q10/q50/q90).
5.6 Иерархии и согласование
Bottom-Up/Top-Down/MinT (оптимальное согласование ошибок) для структуры страна→бренд→канал→платформа.
6) Специфика метрик дохода
Доли/отношения (маржа, комиссия): моделируйте числитель/знаменатель отдельно, затем композируйте.
Интермиттирующие компоненты (chargeback, high-roller): Croston/TSB, zero-inflated, отдельные компоненты с квантилями.
Каннибализация: при запуске новой акции/продукта моделируйте перетоки между сегментами (мультивыходные модели или ограниченные регрессоры).
Эластичность по цене/бонусам: лог-лог модели/каузальные оценки (DiD/SC) для оценки коэффициентов, затем — what-if.
7) Оценка качества и backtesting
Сплиты: rolling/expanding origin с кратностью сезонности (недели/месяцы).
Метрики уровней: WAPE/sMAPE (устойчивы к нулям), MAE/RMSE.
Вероятностные: pinball loss, coverage 80/95%-интервалов.
Стабильность: ошибки по сегментам/праздникам/каналам; out-of-time.
Правило бейзлайна: модель должна обгонять Seasonal Naive на ключевых горизонтах.
8) Сценарии и неопределенность
Квантили: q10/q50/q90 → «пессимист/база/оптимист».
Сценарии X: «без промо/с промо», «FX ±10%», «крупный ивент», «регуляторные ограничения».
Риск метапараметров: стресс-тесты на изменения эластичностей и сезонности.
Стоимость риска: планируйте по условному shortfall (наказание за недопрогноз/перепрогноз асимметричны).
9) План-факт и вклад факторов (доходный bridge)
Покажите мост: тренд + сезонность + промо + цена/лимиты + FX + шоки/инциденты → итоговое отклонение. Это повышает доверие и помогает принимать действия (добавить бюджет, сдвинуть промо, поменять прайсинг).
10) MLOps и эксплуатация
Расписание: дневные прогнозы — T+1 до 06:00 лок.; недельные — N раз в неделю; месячные — T+1/T+3.
Артефакты: фичестор (онлайн/офлайн паритет), реестр моделей, версии формул дохода.
Мониторинг: WAPE/coverage по окну, PSI дрейфа признаков, задержка фидов, SLA генерации.
Алерты: рост ошибки > порога, некалиброванные интервалы, разлад иерархий.
Fail-safe: откат к ETS/Seasonal Naive; freeze-режим в пиковые праздники.
Гистерезис: разные пороги включения/выключения промо-регрессоров, чтобы не «мигать».
Сверки: ежедневные/недельные reconciliation с финансовыми отчетами.
11) Шаблоны артефактов
A. Паспорт прогноза дохода
KPI: `NET_REVENUE_EUR_v3`
Горизонт/шаг: 8 недель / день
Единицы: бренд×страна×платформа×канал; reconciliation: MinT
Регрессоры: `promo_spend`, `content_event_flag`, `price_index`, `fx_rate`, `holiday`
Модели: `ARIMAX_v2` + `LightGBM_Quantiles_v4` (ансамбль, q10/50/90)
Цели: WAPE ≤ 8% (дневной), coverage 90%-интервала ≥ 85%
SLO: генерация ≤ 10 мин после 06:00; лаг данных ≤ 1 ч
Владельцы: Finance & Growth Analytics; дата ревизии, версия
B. Decision-ready отчет (скелет)
Заголовок: «Доход, прогноз 8 недель: q10/q50/q90»
Риски: недопрогноз в неделе 3 — 21% (ожидаемый shortfall €X-€Y)
Вклад факторов: +праздники, +контент-ивент, −FX, −снятие промо
Рекомендации: увеличить промо в странах A/B, сдвинуть акцию, хедж FX
C. Псевдо-код пайплайна
python
1) load y = load_revenue_series(grain=['brand','country','platform','channel'], step='D')
X = load_regressors(['promo_spend','content_event','price_idx','fx_rate','holiday'])
2) features ds = make_lags(y, lags=[1,7,14,28])
ds = add_rolling_stats(ds, windows=[7,14,28])
ds = join_regressors(ds, X)
3) cv cv = rolling_backtest(ds, folds=6, horizon=28, step=7)
4) models m_baseline = ETS(). fit(ds. train)
m_gbm = LGBMQuantiles(q=[0. 1,0. 5,0. 9]). fit(ds. train)
m_arimax = ARIMAX(). fit(ds. train)
5) evaluate & ensemble scores = evaluate([m_baseline,m_gbm,m_arimax], cv, metrics=['WAPE','pinball'])
best = ensemble_quantiles([m_gbm,m_arimax])
6) reconcile & publish f = reconcile_minT(forecast(best), hierarchy=['country','brand','platform','channel'])
publish(f, sla='06:10', owners=['Finance','Growth'])
12) Частые ошибки и анти-паттерны
MAPE при нулях/низких значениях: используйте WAPE/sMAPE.
Среднее средних: агрегируйте числитель/знаменатель, а не усредняйте проценты по сегментам.
Игнор календаря/контента/FX: без регрессоров прогноз «слепнет».
Лики: фичи из будущего или пост-фактум корректировки в train.
Несогласованность иерархий: итоговые суммы не сходятся → применяйте reconciliation.
Нет fail-safe: модель «плывет» на праздниках.
Отсутствие сверок: прогноз не стыкуется с управленческим/бухучетом.
13) Чек-лист перед релизом
- Определения дохода и вычетов согласованы и версионированы
- Календарь/FX/регрессоры подключены и протестированы
- Бейзлайны побеждены на backtesting; цели по WAPE/coverage достигнуты
- Интервалы калиброваны; сценарии «пессимист/база/оптимист» собраны
- Иерархический прогноз согласован (MinT/Top-Down)
- MLOps: расписание, мониторинг, алерты, fail-safe, рунибук
- Настроены ежедневные/недельные сверки с финнадзором/бухгалтерией
- Отчет «decision-ready» с мостом факторов и рекомендациями
Итог
Прогнозирование дохода — это согласованные определения + драйверная декомпозиция + регрессоры + вероятностные и иерархические модели + сценарии и интервалы + дисциплинированный MLOps и сверки. Такой контур превращает «гадание по графику» в инструмент планирования бюджета, маркетинга и операций с понятной стоимостью риска и прозрачными действиями.