1. Three different number systems
Metro Analytics shows three related but separate calculation systems on the same pages. They are easy to confuse because a market card can show a Market Score, a ranking position, and a forecast percentage all at once, in the same sentence of UI copy.
| System | What it is | Primary inputs | Refresh cadence |
|---|---|---|---|
| Market Score | A hand-tuned, rules-based composite from 0 to 100 | Census ACS, FRED, BEA | Computed live on each page load |
| Rankings | A sort order built from the same Market Score engine | Same as Market Score | Weekly, via a Monday cron run |
| Forecast | A machine-learning projection of a series over time | Home value indexes, state GDP, macro features | On demand, or a stored snapshot |
None of these three numbers should be added together, averaged, or converted into one another. A Market Score of 80 and a forecast of "+9%" are answers to two different questions asked with two different tools.
If you only remember one thing from this page: the Market Score and Rankings are a rules engine you can fully audit from the weights below. The Forecast is a statistical model with its own separate uncertainty. Treat them as two independent opinions, not one number expressed two ways.
2. How the Market Score is calculated
Each city or place score blends five sub-scores into a single 0 to 100 composite. Every sub-score is normalized onto the same 0 to 100 scale before it is weighted, so no single input can dominate the result just because its raw units happen to be larger.
The weighted breakdown is shown visually below. Each sub-score uses a piecewise function of its raw input rather than a straight linear formula. For example, the affordability sub-score compares the home-value-to-income ratio against a fixed set of thresholds (a ratio at or below 2.5 scores 95, a ratio above 7.0 scores 20), and the macro sub-score starts from the 30-year mortgage rate before layering adjustments for unemployment and inflation on top.
What happens when data is incomplete
ACS demographic data is required for a score to compute at all. FRED and BEA inputs are treated differently: if either is missing, the engine substitutes a documented, conservative default so the page can still render a useful score, and the market is labeled Partial instead of Live.
| Input | Default used when missing |
|---|---|
| 30-year mortgage rate (FRED) | 7.0% |
| Unemployment rate (FRED) | 4.0% |
| CPI year over year (FRED) | 3.0% |
| State per-capita income growth (BEA) | 3.0% |
Because these defaults sit near the middle of their historical ranges, a Partial score is a reasonable estimate rather than a placeholder, but it is still worth checking the data quality badge before relying on the exact number.
ACS median home value relative to median household income. Source: Census ACS.
Rental vacancy rate, used as a proxy for inventory pressure. Source: Census ACS.
30-year mortgage rate, national unemployment, and CPI year over year. Source: FRED.
Local median income against a national reference, adjusted by state income growth. Source: Census ACS + BEA.
Share of adults 25 and older holding a bachelor's degree or higher. Source: Census ACS.
3. What score ranges mean
The composite score is rounded to the nearest whole number and clamped to the 0 to 100 range. That single number is then classified into one of three tiers, shown visually below.
A score of 80 for Flower Mound, Texas, and a score of 62 for Boise, Idaho, means the weighted inputs currently favor Flower Mound across affordability, supply, macro conditions, income, and education. It does not mean prices in Flower Mound will rise 80%, and it does not mean Flower Mound will outperform Boise by 18 percentage points. The score is an ordinal ranking signal, not a rate of return.
Some compact UI surfaces, such as small tag chips on dense tables, use slightly different color cutoffs (75 and 60) purely so the colors read clearly at a glance. The official Hot, Watch, and Cool classification used everywhere else in the product always uses the 72 and 56 thresholds shown above.
Stronger composite conditions across the five weighted inputs.
Mixed signal: neither clearly strong nor clearly cooling.
Weaker composite conditions relative to other tracked markets.
4. Narrative percentage bands on market cards
Market detail pages and ranking cards often show a narrative band such as "+7 to 12%" next to the score. That band comes from a fixed lookup table keyed directly to the composite score. It exists purely to give quick, readable context on a card, and it is not a statistical projection.
| Composite score | Narrative band shown |
|---|---|
| 82 and above | +12 to 18% |
| 72 to 81 | +7 to 12% |
| 62 to 71 | +3 to 7% |
| 52 to 61 | +0 to 3% |
| 42 to 51 | -1 to 2% |
| Below 42 | -3 to 6% |
Because this table is derived from the score, two markets with the same composite score will always show the same narrative band. Compare this to the Forecast Center, where two markets with identical Market Scores can show completely different forecast percentages, because the forecast model is reasoning about a different set of inputs entirely.
5. How forecast percentage changes are generated
Forecast Center reads from the metro-forecast service whenever FORECAST_API_BASE_URL is configured. When it is not configured, the page states plainly that the Forecast API is not configured, rather than silently substituting Market Score data.
- Feature collection. Housing forecasts are built from Zillow-style home value indexes and related features for covered cities and ZIP codes. Economic forecasts instead use state GDP and macro time series.
- Model projection. The model predicts a future level of the series at the selected horizon of 6, 12, or 24 months.
- Percentage conversion. The percentage change you see on screen is calculated as:
(forecast level / current origin - 1) x 100
- Scenario construction. Base, Upside, and Downside are not three separately trained models sharing a name. They are three views of the same underlying point forecast. Base uses an 80% uncertainty band around the point forecast. Upside and Downside widen that band toward the 95% residual range to sketch an optimistic path and a stressed path around the same central prediction.
- Snapshot versus live. Where a stored snapshot already exists, the page may show "Stored snapshot" instead of triggering a fresh model run. Both are equally model-derived; snapshot only means the last persisted result is being served rather than recomputed on this page load.
6. Ranges, confidence, and extreme values
The low to high range shown around a forecast is an uncertainty band derived from historical model residuals on the log-transformed series. It is a statistical envelope, not a guaranteed outcome corridor.
| Confidence label | What it means |
|---|---|
| High | The model fit recent history tightly (low mean absolute error on the log scale); expect a narrower band. |
| Moderate | A reasonable fit with some historical error; the band is wider than a high-confidence case. |
| Low | Larger historical errors, often from thin data coverage; expect a noticeably wider band and treat the point estimate cautiously. |
Large moves, such as a -37% twelve-month estimate, tend to appear when the model's projected level sits far from today's origin. This is more common with thin ZIP-level coverage, stressed scenarios, or low-confidence fits. That combination is still a model output, and it can still be wrong.
Treat an extreme projection as a prompt to check coverage, confidence, and scenario before acting on it, not as a settled prediction. When in doubt, prefer a high-confidence Base case over a low-confidence Downside extreme.
Not every ZIP or city has forecast coverage. If Forecast reports coverage as unavailable for a geography, that place is simply missing from the forecast catalog, even if it already has a live Market Score elsewhere on the site.
7. National indicators and rankings
National indicators, such as mortgage rates, inflation, unemployment, and the national ACS or BEA series, are plain time series with period-over-period change. They describe the U.S. backdrop as a whole. They do not describe any single city's score, and they should not be read as a city-level signal.
Weekly rankings score every place with a population of 50,000 or more using the exact same Market Score engine described above, then sort the results by a clamped, derived sort key. If the rankings table is empty, it means no completed ranking run is available yet, which can happen independently of the national indicators, which can remain fully live at the same time.
10. Data sources
Every number on Metro Analytics traces back to one of four sources. Here's what each one feeds and how often it's refreshed.
5-year estimates for ACS median home value, household income, rental vacancy rate, and educational attainment. The ACS home value is owner-estimated, not a live sale or listing price. Powers Affordability, Supply & Demand, Income Quality, and Education.
30-year fixed mortgage rate, national unemployment rate, and CPI year over year. Powers the Macro Environment sub-score and the national Indicator Signal Center.
State-level per-capita personal income and its growth rate. Adjusts the Income Quality sub-score up or down relative to the national baseline.
A dedicated forecasting service that projects home-value and economic series forward. Entirely separate from the Market Score engine, and only available when configured.
11. Frequently asked questions
No. The Market Score is a rules-based composite over public ACS, FRED, and BEA data, updated live. The Forecast is a separate machine-learning service that projects a series forward in time. They can move independently and should not be compared directly.
ACS demographic data is required to compute a score at all. If FRED or BEA data is temporarily missing or incomplete for that market, the engine falls back to documented default values so the page still renders, and it labels itself Partial so you know real macro data was not fully available.
Rankings are recomputed weekly, on Mondays, against the latest available ACS, FRED, and BEA inputs. Small movements in underlying series, or a market crossing a scoring threshold, can shift its position even when nothing looks obviously wrong.
The forecast model has its own coverage catalog, separate from the Market Score engine. A place can have a live Market Score while still being outside metro-forecast's covered geographies.
No. Large moves are still model outputs with uncertainty bands attached. Check the confidence label first: low confidence paired with an extreme scenario is a cue to dig into coverage and assumptions, not a settled prediction.