← Methodology

Technical Specification

Engine v2.10, data as of 2026 Q2. Every formula, constant and rule behind the published readings, as implemented.

1. Inputs

Every input is quarterly, from 2000 Q1. A market needs 16 quarters of history before its readings begin, and 2020 Q2 – 2021 Q4 is left out of what counts as normal. The last two inputs are national; the rest are measured market by market.

InputWhat it measuresHow the model uses it
Occupancy rate, oShare of all multifamily units in the market that are occupied at quarter end; units still leasing up count as unoccupied.Standing: the rate standardized against its own history, so occupancy above the market’s own norm adds to Standing. Momentum: its change over the past four quarters. Leading: the change in that four-quarter change versus a year earlier, entered negatively.
Effective rent growth, gPercentage change in average effective rent per unit (asking rent net of concessions) over the trailing 12 months, all units.Standing: the 12-month growth rate itself. Momentum: that rate versus four quarters earlier.
Supply, sUnits under construction at quarter end, as a share of the market’s existing inventory.Leading: the level, against the market’s own history.
Price growth12-month percentage change in a market-wide sale price index covering all multifamily properties.Repricing: that 12-month growth versus four quarters earlier, so whether price growth is speeding up or slowing down.
Transaction volumeNumber of multifamily sales closed in the quarter, less the same quarter a year earlier, divided by the prior year’s average quarterly count; capped between −100% and +200%.Transactions: the year-over-year change, against the market’s own history.
Price ÷ replacementPrice per unit of 4- and 5-star properties divided by a national construction-cost index.Replacement: this market’s percentile of the ratio against its own history, plus the share of all markets past their own 90th percentile.
HY spreadOption-adjusted spread of U.S. high-yield corporate bonds over Treasuries (national).Credit: its percentile against its own history, and whether it is higher than a year earlier.
SLOOSNet share of banks reporting tighter standards on multifamily real estate loans in the Federal Reserve’s quarterly senior loan officer survey (national).Credit: the net share tightening in the latest quarter.

2. Operators

Standardization

Zt(x) = (xt − μt) ÷ σt
(2.1)

μt and σt are the mean and (population) standard deviation of the market’s own observations strictly before t, excluding 2020 Q2 – 2021 Q4. Z is undefined until at least 16 such observations exist. No observation at or after t enters its own standardization.

Z±2(x) = min(2, max(−2, Z(x)))
(2.2)

Percentile

pt(x) = share of prior observations (same exclusions, n ≥ 16) strictly below xt
(2.3)

Change and blending

Δxt = xt − xt−4   ·   Δ²xt = Δxt − Δxt−4
(2.4)
F̃t = 0.6·Ft + 0.4·Ft−1
(2.5)

3. Fundamentals (F)

Standing and Momentum

FS = ½·Z(g) + ½·Z(o)
(3.1)

Occupancy is 1 − vacancy, the form the data arrives in; standardizing either gives the same number with the sign flipped. Occupancy above the market’s own norm adds to Standing.

FΔ = ½·Z(Δg) + ½·Z(Δo)
(3.2)

Standing and Momentum are not capped. Both are blended by (2.5) to give F̃S and F̃Δ.

Strength and Position

RF = √(F̃S² + F̃Δ²)
(3.3)
Position = 25·(F̃S − F̃Δ) ÷ max(RF, 1.5)
(3.4)

Signal strength is used to normalize the Position term while distinguishing stronger directional signals from markets that remain close to normal. It combines a market’s current standing and momentum into a single measure of how far fundamentals have moved from normal conditions.

The Position term divides the directional spread, (F̃S − F̃Δ), by overall Signal Strength, √(F̃S² + F̃Δ²). This was designed to measure the directional signal relative to its overall magnitude, rather than allowing unusually large raw readings to dominate the score. Because of the way the two components are combined, the formula naturally limits the Position contribution to approximately ±35.

Signal Strength also dampens readings at the other end of the spectrum. When Signal Strength falls below 1.5, the Position term is scaled linearly toward zero rather than receiving its full weight. Because Signal Strength combines the squared standing and momentum terms, a reading below 1.5 generally means both components remain relatively close to zero — or normal conditions. For perspective, if standing and momentum contributed equally, each would be only about 1.06 at a Signal Strength of 1.5. The threshold is therefore set “ex ante” as a reasonable neutral zone around normal conditions, rather than selected afterward to improve historical results.

Leading

FL = 8·Z±2(s) − 4·Z±2(Δ²o)
(3.5)
F = Position + FL
(3.6)

4. Market Mood (M)

Repricing and Transactions

SP = −8·Z±2(Δ Price Growth)
(4.1)
ST = −4·Z±2(Transaction Volume)
(4.2)

While SR > 0, lean-in readings are muted: SP = max(SP, 0) and ST = max(ST, 0).

Credit

SC = 10 · 1[national stress] · 1[local transmission]
(4.3)

National stress holds when the HY spread is at or above its 90th expanding percentile (2.3) and higher than four quarters earlier, or when SLOOS net tightening is +40 or more. Local transmission holds when

8·Z±2(Δ Price Growth) + 4·Z±2(Transaction Volume) < 0
(4.4)

evaluated before the SR mute.

Replacement

SR = 45 · min(1, max(0, (p − 0.90) ÷ 0.10)) · 1[B ≥ 0.60]
(4.5)

p is the market’s percentile (2.3) of Price ÷ Replacement. B is the share of markets with p ≥ 0.90 in the same quarter, computed only when at least 30 markets report.

M = SP + ST + SC + SR
(4.6)

5. Cycle Score (C)

C = min(100, max(0, 50 + F + M))
(5.1)

Every term is in points toward defense: a positive term pushes C toward 100 (defend), a negative term toward 0 (lean in).

TermRange (points)Capped by
Position−35.4 to +35.4Formula (3.4)
Leading, supply−16 to +16Z±2
Leading, occupancy turn−8 to +8Z±2
Repricing SP−16 to +16Z±2
Transactions ST−8 to +8Z±2
Credit SC0 or +10Indicator
Replacement SR0 to +45Ramp

A missing Leading or Market Mood input contributes zero. Position requires both Standing and Momentum for the current and prior quarter.

6. The Hour (H)

θ = atan2(F̃Δ, F̃S)
(6.1)
H = 6 + 6·C ÷ 100   if θ ∈ (0°, 180°]   ·   H = (6 − 6·C ÷ 100) mod 12   otherwise
(6.2)

The rising side is the one where blended Momentum is positive. C = 0 maps to 6 o’clock and C = 100 to 12 o’clock on either side.

Readings

All three readings are functions of H alone.

ReadingHour bands
Fundamental PhaseRecovery [6, 9) · Expansion [9, 12) · Hypersupply [12, 3) · Recession [3, 6)
Market MoodDisbelief [7, 8) · Optimism [8, 11) · Euphoria [11, 12:30) · Anxiety [12:30, 2) · Fear [2, 5) · Despair [5, 7)
Investment PostureAggressive [5, 8) · Active [8, 10) · Cautious [10, 11) · Defensive [11, 3:15) · Cautious [3:15, 5)

7. Constants

ConstantValueRole
History minimum16 quartersBefore any Z or percentile is defined
Excluded window2020 Q2 – 2021 Q4Omitted from every mean, deviation and percentile reference set
Cap±2All Leading and Market Mood Z-terms
Blend0.6 / 0.4Current / prior quarter, Standing and Momentum
Position scale25Eq. (3.4)
Strength threshold1.5Eq. (3.4)
Leading weights8 · 4Supply · occupancy turn
Mood weights8 · 4Repricing · Transactions
Credit step10Eq. (4.3)
HY percentile0.90National stress
SLOOS threshold+40National stress
Replacement maximum45Eq. (4.5)
Replacement ramp0.90 → 1.00Own-history percentile
Breadth trigger0.60 of ≥ 30 marketsEq. (4.5)

8. Limitations

Every historical reading uses only the data that existed at the time, so none of them was built with hindsight.

The weights and thresholds are round numbers, not values tuned to fit past outcomes. They were still chosen while looking at this history, so the results here are not a live track record.

A reading describes a market as a whole. Submarkets and individual properties can behave differently.