← Methodology

Technical Specification

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

1. Scope and conventions

The unit of analysis is the metro-quarter: 58 U.S. multifamily metros, quarterly. Each market is scored against its own history only; no cross-market pooling enters any standardization.

All terms are expressed in points toward defense. A positive term pushes the Cycle Score toward 100 (defend); a negative term pushes it toward 0 (lean in).

Subscript t denotes the quarter; t−1 the prior quarter; t−4 the same quarter a year earlier.

2. Inputs

SeriesDefinition
VacancyVacancy rate, v
Rent Growth12-month effective rent growth, g
SupplyUnits under construction ÷ existing stock, s
Price Growth12-month growth in closed-sale price per unit
Transaction Volume(Deals this quarter − deals in the same quarter last year) ÷ last year's average quarterly deals; clipped to [−1, 2]
Price ÷ ReplacementTop-grade (4- and 5-star) price per unit ÷ national construction-cost index
HY spreadHigh-yield option-adjusted spread (national)
SLOOSNet share of banks tightening standards for CRE / multifamily loans (national)

3. Operators

Standardization

Zt(x) = (xt − μt) ÷ σt
(3.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)))
(3.2)

Percentile

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

Change and blending

Δxt = xt − xt−4   ·   Δ²xt = Δxt − Δxt−4
(3.4)
t = 0.6·Ft + 0.4·Ft−1
(3.5)

4. Fundamentals (F)

Standing and Momentum

FS = ½·Z(g) − ½·Vacancy Gap
(4.1)
Vacancy Gapt = (vt − μt(v)) ÷ σt(v)
(4.2)
FΔ = ½·Z(Δg) − ½·Z(Δv)
(4.3)

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

Strength and Position

RF = √(S² + Δ²)
(4.4)
Position = 25·(SΔ) ÷ max(RF, 1.5)
(4.5)

For RF ≥ 1.5 the term depends only on direction, and reaches its extremes of ±25√2 ≈ ±35.4 on the diagonals. Below 1.5 it scales linearly toward zero. The 1.5 is an ex-ante threshold (1.5 standard deviations), not fitted to outcomes.

Leading

FL = 8·Z±2(s) + 4·Z±2(Δ²v)
(4.6)
F = Position + FL
(4.7)

5. Market Mood (M)

Repricing and Transactions

SP = −8·Z±2(Δ Price Growth)
(5.1)
ST = −4·Z±2(Transaction Volume)
(5.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]
(5.3)

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

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

evaluated before the SR mute.

Replacement

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

p is the market’s percentile (3.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
(5.6)

6. Cycle Score (C)

C = min(100, max(0, 50 + F + M))
(6.1)
TermRange (points)Capped by
Position−35.4 to +35.4Formula (4.5)
Leading, supply−16 to +16Z±2
Leading, vacancy 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.

7. The Hour (H)

θ = atan2(Δ, S)
(7.1)
H = 6 + 6·C ÷ 100   if θ ∈ (0°, 180°]   ·   H = (6 − 6·C ÷ 100) mod 12   otherwise
(7.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)

8. 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. (4.5)
Strength threshold1.5Eq. (4.5)
Leading weights8 · 4Supply · vacancy turn
Mood weights8 · 4Repricing · Transactions
Credit step10Eq. (5.3)
HY percentile0.90National stress
SLOOS threshold+40National stress
Replacement maximum45Eq. (5.5)
Replacement ramp0.90 → 1.00Own-history percentile
Breadth trigger0.60 of ≥ 30 marketsEq. (5.5)

9. Limitations

Standardization uses only information available at each date, so historical readings contain no look-ahead in their inputs. The weights and thresholds are round, ex-ante values, but they were chosen with knowledge of the sample period; historical results are therefore in-sample. Decisions D4.24 and D4.26 are provisional until the first production run scores a quarter the model has not seen.

Readings describe a market as a whole. Individual submarkets and properties can behave differently.