1 · 60-second primer: what is economics/time-series data?1 · Вводная за 60 сек: что такое данные экономики и временны́е ряды?
A macro series is a labelled stream of observations over time, plus a heavy metadata stack. The data engineering twist that makes econ data different from your event/log work at Meta: the same period gets multiple values over time (revisions), and users need to ask "what did we know then?" not just "what's true now?"
Макроэкономический ряд — это помеченный поток наблюдений во времени плюс тяжёлый стек метаданных. Инженерный поворот, который отличает эконом-данные от работы с событиями/логами в Meta: один и тот же период получает несколько значений во времени (ревизии), и пользователям нужно спросить «что мы знали тогда?», а не только «что верно сейчас?»
If you remember one thing: the natural grain of an observation is NOT (series_id, period) — it is (series_id, period, release_date/vintage). That single fact signals you "get" the domain.
Если запомнить одно: естественная гранулярность наблюдения — это НЕ (series_id, period), а (series_id, period, release_date/vintage). Этот единственный факт даёт понять, что ты «въехал» в домен.
2 · The indicators you must be able to name2 · Индикаторы, которые ты должен знать
| Indicator | Measures | Freq / lag | Revision & notes |
|---|---|---|---|
| CPI (inflation) | Consumer price changes / cost of living. Core = ex food & energy. | Monthly, ~2wk lag | Lightly revised. PCE = Fed's preferred US gauge; PPI = producer prices. |
| GDP | Total economic output → the business-cycle headline. | Quarterly, advance ~1mo | Heavily revised: advance→2nd→3rd→benchmark. Classic vintage example. |
| Unemployment / NFP | Labour slack / monthly job creation (non-farm payrolls). | Monthly, timely | NFP = one of the biggest market-movers. |
| PMI | Survey diffusion index. >50 expansion, <50 contraction. | Monthly, very timely | Leading indicator; survey data structurally. |
| Policy rates | Fed funds / ECB / BoE base rate — the price of money. | Event-driven (meetings) | Step-function / effective-dated, not periodic. |
| Also | Retail sales, industrial production, consumer confidence/sentiment, trade balance, housing starts, yields/curve. | ||
| Индикатор | Что измеряет | Частота / лаг | Ревизии и заметки |
|---|---|---|---|
| CPI (инфляция) | Изменения потребительских цен / стоимость жизни. Core = без еды и энергии. | Месячный, ~2 недели лаг | Слабо ревизируется. PCE = приоритетная метрика для Fed; PPI = цены производителей. |
| GDP | Общий объём экономики → главный заголовок бизнес-цикла. | Квартальный, advance ~1мес | Сильно ревизируется: advance→2nd→3rd→benchmark. Классический пример версий. |
| Unemployment / NFP | Безработица / месячное создание рабочих мест (non-farm payrolls). | Месячный, своевременно | NFP = один из самых сильных двигателей рынка. |
| PMI | Индекс диффузии из опросов. >50 расширение, <50 сжатие. | Месячный, очень своевременно | Опережающий индикатор; структурно данные из опросов. |
| Policy rates | Fed funds / ECB / BoE ставка — цена денег. | Event-driven (заседания) | Ступенчатая функция / эффективная дата, не периодический. |
| Также | Розничные продажи, промышленное производство, уверенность/настроения потребителей, торговый баланс, начало строительства жилья, доходности/кривая. | ||
3 · Vintages, revisions & point-in-time core3 · Версии, ревизии и точка-во-времени ядро
Definitions
Определения
- Vintage: the snapshot of a series as it existed at a point in time.
- Revision: a later release changes a value for a past period.
- Point-in-time (PIT) / as-of: "what did we know on date X?"
- Latest: "what is our best current estimate?"
- Vintage (Версия): снэпшот серии, каким он существовал в точке времени.
- Revision (Ревизия): поздний релиз меняет значение прошлого периода.
- Point-in-time (PIT) / as-of: «что мы знали на дату X?»
- Latest: «каково наше лучшее текущее оценочное значение?»
GDP for Q1 might read 2.1% (advance) → 2.4% (2nd) → 2.3% (3rd) → restated years later at benchmark revision. Each is a vintage.
GDP за Q1 может быть 2.1% (advance) → 2.4% (2nd) → 2.3% (3rd) → переоценён годами позже при benchmark-ревизии. Каждый — версия.
Why it matters
Почему важно
- Overwriting destroys reproducibility & audit.
- A model trained "as of 2024" must see the 2024 vintage — else look-ahead bias.
- Quant backtests, nowcasting, regulators all need PIT.
- Перезапись уничтожает воспроизводимость и аудит.
- Модель, обученная «as of 2024», должна видеть версию 2024 — иначе look-ahead bias.
- Квантовый бэктест, nowcasting, регуляторы — всем нужен PIT.
Storage patterns
Паттерны хранения
| Pattern | How | "Latest" = | Trade-off |
|---|---|---|---|
| Append-only + vintage key | Never UPDATE; insert keyed by (series, period, release_date) | window: max(release_date) per period | Clean, auditable; larger volume |
| Bitemporal (SCD2) | valid_from/to + system_from/to | filter both time axes | Full correction-of-correction audit; complex queries |
| Vintage / real-time DB | Store each vintage explicitly (ALFRED-style triangle) | pick vintage column | Reconstruct any snapshot; storage explodes |
| Паттерн | Как | «Latest» = | Компромисс |
|---|---|---|---|
| Append-only + vintage key | Никогда не UPDATE; insert с ключом (series, period, release_date) | window: max(release_date) на период | Чисто, аудируемо; больше объём |
| Bitemporal (SCD2) | valid_from/to + system_from/to | фильтруй обе оси времени | Полный аудит исправлений; сложные запросы |
| Vintage / real-time DB | Хранить каждую версию явно (ALFRED-style треугольник) | выбрать столбец версии | Восстанавливает любой снэпшот; хранилище взрывается |
Pragmatic shops keep full vintages for revision-prone series (GDP, payrolls), latest-only or compressed for stable ones.
Прагматичные команды хранят полные версии для склонных к ревизиям серий (GDP, payrolls), latest-only или сжатые для стабильных.
4 · Bitemporal modelling, precisely senior4 · Битемпоральное моделирование, точно senior
Two independent time axes:
Две независимые оси времени:
- Valid time (effective/application): when the fact is true in the real world — the observation period.
- Transaction / system time: when your system recorded the row.
- Valid time (effective/application): когда факт верен в реальном мире — период наблюдения.
- Transaction / system time: когда твоя система записала строку.
Revisions create multiple system-time versions of one valid-time fact. Corrections create versions of versions. Bitemporal answers both "true now" and "what we thought then."
Ревизии создают несколько system-time версий одного valid-time факта. Исправления создают версии версий. Битемпоральное отвечает и на «верно сейчас», и на «что мы думали тогда».
Many teams approximate full SQL:2011 bitemporal with append-only + a single explicit release_date axis. Know the trade-off: simpler/queryable vs full correction auditing.
Многие команды приближают полный SQL:2011 битемпоральный с append-only + единственной явной осью release_date. Знай компромисс: проще/запросимо vs полный аудит исправлений.
5 · Seasonality & seasonal adjustment5 · Сезонность и сезонная корректировка
Many series have predictable intra-year patterns (Dec retail spike, summer hiring). Seasonal adjustment removes that recurring component to expose the trend/cycle. Methods: X-13ARIMA-SEATS, TRAMO/SEATS.
Многие серии имеют предсказуемые внутригодовые паттерны (всплеск розницы в декабре, летний наём). Сезонная корректировка убирает этот повторяющийся компонент, чтобы обнажить тренд/цикл. Методы: X-13ARIMA-SEATS, TRAMO/SEATS.
| SA (seasonally adjusted) | NSA (not adjusted) | |
|---|---|---|
| Read for | Trend, MoM moves | YoY, raw print, contracts |
| Keep because | Store both: users need each, some series publish only one way. | |
| SA (seasonally adjusted) | NSA (not adjusted) | |
|---|---|---|
| Читать для | Тренд, MoM-движения | YoY, сырое значение, контракты |
| Хранить потому что | Хранить оба: пользователям нужны оба, некоторые серии публикуют только один способ. | |
6 · Observation vs release date · fiscal vs calendar · frequency6 · Дата наблюдения vs дата релиза · фискальный vs календарный · частота
Observation vs release date
Дата наблюдения vs дата релиза
- Observation/reference period: what the number describes (CPI for May 2026).
- Release/publication date: when published (12 Jun 2026).
- Differ by the publication lag. PIT logic keys off release_date.
- Observation/reference period: что описывает число (CPI за май 2026).
- Release/publication date: когда опубликовано (12 июн 2026).
- Различаются на publication lag. PIT-логика ключуется по release_date.
Fiscal vs calendar
Фискальный vs календарный
- US federal FY = Oct 1–Sep 30; UK = Apr 6; companies vary.
- Store actual calendar start/end dates + a period_type + fiscal convention as metadata.
- Never compute period math off the label string.
- US федеральный FY = 1 окт–30 сен; UK = 6 апр; компании варьируются.
- Хранить фактические календарные даты start/end + period_type + фискальную конвенцию как метаданные.
- Никогда не вычислять период-математику из строки метки.
Mixed frequency (daily / weekly / monthly / quarterly)
Смешанная частота (дневная / недельная / месячная / квартальная)
- Store frequency as explicit metadata — don't infer from row spacing.
- Mixed-frequency alignment: up/down-sample (aggregate vs interpolate) is a transform decision — keep native frequency, resample at serving.
- Period semantics differ: end-of-period vs period-average vs flow vs stock — store the semantic.
- Calendar edges: week-numbering, partial periods, holidays, business-day counts.
- Хранить частоту как явные метаданные — не выводить из интервала между строками.
- Выравнивание смешанной частоты: up/down-sample (агрегация vs интерполяция) — это решение преобразования — хранить родную частоту, передискретизировать при сервинге.
- Семантика периода различается: end-of-period vs period-average vs flow vs stock — хранить семантику.
- Края календаря: нумерация недель, частичные периоды, праздники, счёт бизнес-дней.
7 · Survey vs forecast/consensus data7 · Опросные данные vs прогнозы/консенсус
Survey dataОпросные данные
Responses from many respondents (PMI, consumer confidence, business sentiment).
Ответы от множества респондентов (PMI, потребительская уверенность, настроение бизнеса).
- Grain: respondent/panel × question × response, with weighting.
- Diffusion-index construction (% reporting improvement).
- Methodology + sample metadata matter; often anonymized/aggregated.
- Гранулярность: респондент/панель × вопрос × ответ, с весами.
- Построение diffusion-индекса (% сообщающих об улучшении).
- Методология + метаданные выборки важны; часто анонимизированные/агрегированные.
Forecast / consensusПрогноз / консенсус
Predictions of a future value of a known indicator, from many forecasters.
Предсказания будущего значения известного индикатора от многих прогнозистов.
- Grain: (indicator, target_period, forecaster_id, value, forecast_date).
- Aggregate → consensus (mean/median) + dispersion (high/low/std).
- Forecasts are vintaged too — a forecaster updates over time.
- Гранулярность: (indicator, target_period, forecaster_id, value, forecast_date).
- Агрегировать → консенсус (mean/median) + дисперсия (high/low/std).
- Прогнозы тоже версионированы — прогнозист обновляет во времени.
8 · Vendor-supplied data quirks & defenses8 · Причуды вендорных данных и защита
| Quirk | Defense |
|---|---|
| Identifiers / mappings — vendor codes, drift, breakage | Canonical crosswalk layer (vendor_code → series_id/geo/ccy) with coverage validation |
| Units & scale — thousands vs millions, index vs level vs % | Units as enforced metadata; validate transforms against unit |
| Currencies — local/USD/EUR, nominal vs real | FX + base metadata; explicit conversion rules |
| Geographies — ISO2/ISO3/vendor, EU aggregate vs members | Geo dimension + mapping; handle changing boundaries |
| Calendar conventions — EOP vs avg, business vs calendar, holidays | Store semantic; holiday calendars per geo |
| Silent revisions — vendor re-sends "full file", history quietly changed | Full-file diff vs last load; ingest as new vintage; never overwrite |
| Format instability — schema/encoding/late files | Schema-change detection; contract/SLA monitoring; reconcile vs 2nd source |
| Причуда | Защита |
|---|---|
| Идентификаторы / маппинги — вендорные коды, дрифт, поломка | Канонический crosswalk слой (vendor_code → series_id/geo/ccy) с валидацией покрытия |
| Единицы и масштаб — тысячи vs миллионы, index vs level vs % | Единицы как принудительные метаданные; валидировать преобразования против unit |
| Валюты — local/USD/EUR, nominal vs real | FX + базовые метаданные; явные правила конверсии |
| Географии — ISO2/ISO3/вендор, агрегат EU vs члены | Geo измерение + маппинг; обрабатывать меняющиеся границы |
| Календарные конвенции — EOP vs avg, бизнес vs календарь, праздники | Хранить семантику; календари праздников на гео |
| Тихие ревизии — вендор переотправляет «полный файл», история тихо изменена | Полный diff файла vs последняя загрузка; заливать как новую версию; никогда не перезаписывать |
| Нестабильность формата — схема/кодировка/поздние файлы | Обнаружение изменения схемы; мониторинг контракта/SLA; сверка vs 2-го источника |
9 · Why timeliness matters & how to design for it9 · Почему своевременность важна и как проектировать под неё
Releases (CPI, NFP, FOMC, GDP) move markets in seconds. Users, algos and analysts need the number the instant it's public. Late or wrong = competitive + reputational failure. That's a core value prop for financial data providers.
Релизы (CPI, NFP, FOMC, GDP) двигают рынки за секунды. Пользователи, алгоритмы и аналитики нуждаются в числе в момент, когда оно публично. Поздно или неправильно = конкурентный и репутационный провал. Это ключевое предложение ценности для провайдеров финансовых данных.
- Releases are scheduled but format-variable → event-driven, pre-staged pipelines.
- Release calendar = first-class data asset; freshness/SLA monitoring ("did CPI land at 08:30 ET?").
- Speed vs accuracy tension → resolve by embedding fast inline controls on the critical path, human escalation only on exceptions.
- Corrections happen → clean, versioned re-publish (no silent overwrite).
- Релизы запланированы, но формат переменный → event-driven, предварительно настроенные пайплайны.
- Календарь релизов = первоклассный data asset; мониторинг свежести/SLA («CPI приземлился в 08:30 ET?»).
- Напряжение скорость vs точность → решается встраиванием быстрых inline-контролей на критическом пути, человеческая эскалация только на исключениях.
- Исправления случаются → чистая, версионированная переиздание (не тихая перезапись).
10 · Automated quality controls (layered) core10 · Автоматизированные контроли качества (слоистые) ядро
| Layer | Checks |
|---|---|
| Schema/structure | Type/nullability; schema-change detection (vendor add/rename/remove). Fail-closed on breaking, alert on additive. |
| Domain rules | Unit/currency consistency, sign sanity (unemployment ≥ 0), frequency continuity (no missing months), period alignment, mapping completeness. |
| Statistical / anomaly | Value vs historical range, MoM/YoY delta vs distribution, vs-consensus deviation, seasonality-aware outliers. Light ML flags for human review. |
| Cross-series / referential | Components sum to headline; related-series consistency; vintage monotonicity where expected. |
| Completeness / timeliness | Expected release landed on schedule? freshness; missing-release alerts. |
| Слой | Проверки |
|---|---|
| Схема/структура | Тип/nullable; обнаружение изменений схемы (вендор добавил/переименовал/удалил). Fail-closed на ломающих, алерт на добавляющих. |
| Доменные правила | Консистентность unit/currency, санитарность знака (unemployment ≥ 0), непрерывность частоты (нет пропущенных месяцев), выравнивание периода, полнота маппинга. |
| Статистические / аномалия | Значение vs исторический диапазон, MoM/YoY-дельта vs распределение, отклонение vs консенсус, выбросы с учётом сезонности. Лёгкие ML-флаги для человеческого ревью. |
| Кросс-серии / референтные | Компоненты суммируются к заголовку; консистентность связанных серий; монотонность версии где ожидается. |
| Полнота / своевременность | Ожидаемый релиз приземлился по расписанию? свежесть; алерты пропущенных релизов. |
Operational: inline where cheap, async where heavy; exceptions → queue + runbook; every correction versioned; observability dashboards + alerting; idempotent re-runs.
Операционно: inline где дёшево, async где тяжело; исключения → очередь + runbook; каждое исправление версионировано; дашборды наблюдаемости + алертинг; идемпотентные перезапуски.
11 · Reference schema (enterprise-scale)11 · Референсная схема (корпоративный масштаб)
-- GRAIN: observation = (series_id, observation_period, release_date/vintage) ← bitemporal heart CREATE TABLE dim_series ( -- SCD2: definition revises when base year/units change series_id STRING, indicator STRING, -- 'CPI' geography STRING, -- ISO + canonical unit STRING, -- index(1982-84=100) / pct / count frequency STRING, -- M/Q/W/D sa_flag BOOLEAN, -- SA vs NSA currency STRING, base_year STRING, period_semantic STRING, -- EOP / avg / flow / stock source STRING, valid_from DATE, valid_to DATE ); CREATE TABLE fct_observation ( -- APPEND-ONLY, never UPDATE series_id STRING, obs_start DATE, obs_end DATE, -- the period described value DOUBLE, release_date TIMESTAMP, -- when published vintage_id STRING, status STRING, -- prelim / final source_file STRING ); -- lineage -- LATEST view: pick newest vintage per period SELECT series_id, obs_start, value FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY series_id, obs_start ORDER BY release_date DESC) AS rn FROM fct_observation ) WHERE rn = 1; -- AS-OF view: what we knew on :asof_date SELECT series_id, obs_start, value FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY series_id, obs_start ORDER BY release_date DESC) AS rn FROM fct_observation WHERE release_date <= :asof_date ) -- ← no look-ahead WHERE rn = 1;
-- ГРАНУЛЯРНОСТЬ: observation = (series_id, observation_period, release_date/vintage) ← битемпоральное сердце CREATE TABLE dim_series ( -- SCD2: определение ревизируется при изменении base year/units series_id STRING, indicator STRING, -- 'CPI' geography STRING, -- ISO + канонический unit STRING, -- index(1982-84=100) / pct / count frequency STRING, -- M/Q/W/D sa_flag BOOLEAN, -- SA vs NSA currency STRING, base_year STRING, period_semantic STRING, -- EOP / avg / flow / stock source STRING, valid_from DATE, valid_to DATE ); CREATE TABLE fct_observation ( -- APPEND-ONLY, никогда UPDATE series_id STRING, obs_start DATE, obs_end DATE, -- период, который описывается value DOUBLE, release_date TIMESTAMP, -- когда опубликовано vintage_id STRING, status STRING, -- prelim / final source_file STRING ); -- lineage -- LATEST вьюха: выбрать новейшую версию на период SELECT series_id, obs_start, value FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY series_id, obs_start ORDER BY release_date DESC) AS rn FROM fct_observation ) WHERE rn = 1; -- AS-OF вьюха: что мы знали на :asof_date SELECT series_id, obs_start, value FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY series_id, obs_start ORDER BY release_date DESC) AS rn FROM fct_observation WHERE release_date <= :asof_date ) -- ← нет look-ahead WHERE rn = 1;
Scale: partition by source/frequency/date; columnar; as-of prunes on release_date; compress unchanged vintages; full vintages only for revision-prone series. Also: dim_release (calendar, embargo) and vendor crosswalk tables.
Масштаб: партиция по source/frequency/date; колоночное; as-of прунит по release_date; сжимать неизменённые версии; полные версии только для склонных к ревизии серий. Также: dim_release (календарь, эмбарго) и вендорные crosswalk-таблицы.
12 · The gap-bridge script (rehearse cold) do this12 · Скрипт пробела-моста (отрепетировать наизусть) сделай это
They've read your CV; they will raise the missing macro/time-series experience. Pre-empt it. Calm, specific, zero defensiveness.
Они читали твоё CV; они поднимут отсутствие опыта макро/временны́х рядов. Опереди это. Спокойно, конкретно, без защиты.
- Name it plainly: "I haven't worked with macro, survey or forecast datasets; my closest time-series-adjacent work is the bank default model, not true series modelling. I want to be upfront."
- PIT instinct from credit: the top-10 bank factoring default model lived on point-in-time correctness — you cannot train on info unavailable at decision time. Same look-ahead/vintage discipline econ demands.
- Modelling at scale: 10 logging systems / 3.6B events/day into one model; entity-resolution fix across 6.2B records. "Nail the grain, fix identity, restore downstream trust" — here on a new temporal axis.
- Legacy modernization (direct match): McMakler triple migration (Snowflake, Airflow, dbt), EUR 1M+ saved, no BI downtime — parallel-run + reconcile + incremental cutover.
- Messy multi-source: Salesforce sync layer, 8-brand customer-spine convergence = the vendor crosswalk problem.
- Proof of fast ramp: EMEA DE Hackathon win (Untangler multi-agent, picked for internal tooling); Kafka + GPT-4 production at IU in months; Azure OpenAI case study.
- Show you started: "I've already studied vintages/PIT, seasonal adjustment, release calendars, and the BLS/BEA/Eurostat/central-bank model — happy to go deep."
- Назови прямо: «Я не работал с макро-, опросными или прогнозными датасетами; моя ближайшая time-series-смежная работа — банковская модель дефолта, не настоящее моделирование серий. Хочу быть честным.»
- PIT-инстинкт из кредита: модель дефолта факторинга топ-10 банка жила на point-in-time корректности — нельзя тренировать на информации, недоступной в момент решения. Та же look-ahead/vintage дисциплина, которую требует экономика.
- Моделирование на масштабе: 10 систем логирования / 3.6B событий/день в одну модель; entity-resolution фикс на 6.2B записях. «Пробей гранулярность, почини идентичность, восстанови доверие downstream» — здесь на новой временно́й оси.
- Модернизация легаси (прямое попадание): McMakler тройная миграция (Snowflake, Airflow, dbt), EUR 1M+ сэкономлено, никакого простоя BI — параллельный запуск + сверка + инкрементальная переключка.
- Грязный мульти-источник: Salesforce-синк-слой, 8-брендовая customer-spine конвергенция = проблема вендорного crosswalk.
- Доказательство быстрого вката: победа в EMEA DE Hackathon (Untangler мультиагент, выбран для внутренних инструментов); Kafka + GPT-4 в продакшн в IU за месяцы; Azure OpenAI кейс.
- Покажи, что начал: «Я уже изучил vintages/PIT, сезонную корректировку, календари релизов и модели BLS/BEA/Eurostat/центробанков — готов углубиться.»
13 · Self-quiz — flip to reveal13 · Самопроверка — переверни, чтобы открыть
Tap a card to flip. Define each in one sentence, fast.
Нажми на карточку, чтобы перевернуть. Определи каждое в одном предложении, быстро.