Data lineage

Every number, traced.

Field-by-field lineage from upstream source to the JSON we serve — so your diligence reviewer can verify provenance without an NDA cycle. Pair with the data catalog for schemas and the status page for current freshness.

forecast_12m

/api/v1/markets — field `forecast_12m`
API reference
SourceFHFA + FRED· HPI (All-Transactions, SA) + macro covariates (FEDFUNDS, MORTGAGE30US, CPIHOSSL, HOUST)
  1. Ingest

    Quarterly FHFA zip → raw.fhfa_hpi; FRED series via API → raw.fred_observations.

  2. Clean

    Drop metros with < 20 quarters of history; forward-fill FRED weekly → monthly.

  3. Transform

    Log-diff HPI to stationarity; align macros to the quarter; join on cbsa + period_start.

  4. Score

    XGBoost regression with 4-quarter horizon; 500-round training + 80% prediction band from quantile regression.

  5. Publish

    Ratio back to index space; materialize into `markets.forecast_12m` on every nightly run.

Model version + run timestamp exposed via /api/v1/forecast-runs.

yoy_price

/api/v1/markets — field `yoy_price`
API reference
SourceFHFA· House Price Index, All-Transactions, seasonally adjusted
fhfa.gov/DataTools/Downloads/Pages/House-Price-Index.aspx
  1. Ingest

    Quarterly CSV → raw.fhfa_hpi (cbsa, period_start, value).

  2. Clean

    Deduplicate on (cbsa, period_start); coerce value to numeric.

  3. Transform

    YoY = (value_t / value_{t-4}) - 1, expressed in percentage points.

  4. Publish

    Written to `markets.yoy_price` for the latest quarter only.

signal

/api/v1/markets — field `signal`
API reference
SourceDerived· forecast_12m + yoy_price + risk_score
  1. Transform

    Default rule: forecast_12m >= 3pp → expand, <= -1pp → contract, else hold. Risk D/F override to contract.

  2. Score

    Enterprise customers can swap the rule via /app/signal-rules; evaluation happens at publish time.

  3. Publish

    Stored as markets.signal; a change emits `signal.changed` onto the event bus.

Signal changes stream via /app/stream and fan out to configured destinations.

risk_score

/api/v1/markets — field `risk_score`
API reference
SourceDerived· FHFA HPI drawdown + FRED macro volatility
  1. Transform

    Compute max drawdown across the metro's HPI history + weighted volatility of YoY series.

  2. Score

    Quantile-bucket the combined score into A/B/C/D/F (20/20/20/20/20 split across the universe).

  3. Publish

    Materialized into markets.risk_score on the same nightly run.

HPI observations

/api/v1/markets/{cbsa}/history
API reference
SourceFHFA· House Price Index, All-Transactions, seasonally adjusted
  1. Ingest

    Quarterly ZIP from fhfa.gov → raw.fhfa_hpi.

  2. Clean

    Remove rows where cbsa is null or non-CBSA (state / division aggregates).

  3. Publish

    Served as-is through the /history endpoint; no model transformation.

Macro observations

/api/v1/observations?series_id=…
API reference
SourceFRED· FEDFUNDS, MORTGAGE30US, DGS10, CPIHOSSL, HOUST, …
  1. Ingest

    Daily FRED API pull → raw.fred_observations (series_id, period_start, value).

  2. Clean

    Coerce numeric; drop the small set of rows FRED returns as `.` (missing).

  3. Publish

    Exposed through /observations; compare view joins these to the HPI axis.

Missing a field? Every published field in the data catalog has a lineage entry; if one is missing, let us know and we'll add it.

Data lineage — re-invest · RE-Invest