Methodology
A transparent, config-driven scoring framework that turns 12 public macro indicators into a single composite read of US dollar liquidity conditions. Updated every 6 hours from the FRED, US Treasury, and NY Fed APIs.
Indicator Universe
12 indicators across 4 scoring tiers plus a context tier. Each indicator's direction is normalized so a positive z-score always means "tighter" liquidity.
Tier A · Policy / Reserves 30%
- Fed Balance Sheet (WALCL)
- Treasury General Account (TGA)
- Overnight Reverse Repo (ON RRP)
Tier B · Funding / Plumbing 30%
- SOFR–IORB spread
- Standing Repo Facility usage
Tier C · Credit / Intermediation 20%
- Bank Cash Buffer (cash assets / total assets)
- High Yield OAS spread
Tier D · Risk / Price 20%
- VIX
- Broad Dollar Index (DXY)
- 10-Year Real Yield (TIPS)
Context (not scored)
- Net Liquidity = Fed BS − TGA − ON RRP
- M2 Money Supply
Scoring
1. Robust z-score
For each indicator, we compute a robust z-score using the median and median absolute deviation (MAD) over a rolling 10-year window:
z = (value − median) / (MAD × 1.4826)
The 1.4826 constant makes MAD comparable to standard deviation for normally distributed data. Z-scores are winsorized to [−4, +4] to prevent extreme observations from dominating the composite. We use median/MAD rather than mean/std for resilience to structural breaks (regime changes, COVID, etc.).
2. Direction normalization
Some indicators rise when liquidity tightens (TGA, ON RRP, VIX, HY Spread, …); others fall (Fed BS, Bank Cash Buffer). For "falling-is-tightening" indicators we negate the raw z-score so a positive z always means "tighter" across every indicator.
3. Composite
composite = Σ (z_i × weight_i)
Tier A (Policy/Reserves): 3 × 0.10 = 0.30
Tier B (Funding/Plumbing): 2 × 0.15 = 0.30
Tier C (Credit/Intermediation): 2 × 0.10 = 0.20
Tier D (Risk/Price): 3 × (1/15) ≈ 0.20
─────
1.00
When indicators are missing on a given day, the remaining weights are renormalized so a partial-data day still produces a comparable composite.
4. Regime classification
We rank today's composite within the rolling 5-year history of composites and assign a regime:
- ● Loose — ≤ P20
- ● Mildly Loose — P20–P50
- ● Mildly Tight — P50–P80
- ● Tight — ≥ P80
5. Momentum & concentration
- Momentum: composite_today − composite_7d_ago.
>+0.15= deteriorating,<−0.15= improving, else stable. - Concentration: top-3 |contributions| / total |contributions|. High concentration = signal driven by a few drivers.
Asset Impact Lens
For SPX, QQQ, and BTC we precompute three relationship windows on every cron cycle (gold temporarily dropped — FRED retired the LBMA daily series; replacement TBD):
- Rolling correlations (30D / 90D / 180D) between the daily DLI composite and daily log returns.
- Lead–lag correlations (DLI leads asset returns by 10D / 20D / 60D).
- Conditional state outcomes: average forward 20-day cumulative log return + win-rate when DLI was in the loose (≤P20) or tight (≥P80) state.
Data Sources
- FRED — Federal Reserve Bank of St. Louis, public economic time series
- US Treasury Fiscal Data — Daily Treasury Statement (TGA balance)
- NY Fed Markets — Standing Repo Facility usage
Implementation Notes
- Refresh cadence: every 6 hours (00:00, 06:00, 12:00, 18:00 UTC) via Cloudflare Cron Triggers.
- Storage: Cloudflare D1 (SQLite) for time series + scores; Cloudflare KV for hot API caching.
- Backfill: 10 years of history populated on first run via
scripts/seed.js. - Robustness: each external API is fetched independently with
Promise.allSettled; one failed source degrades to a "partial" run rather than blocking the rest. - Inspired by dollarliquidity.com; this implementation is independent and uses different specific weightings.
This is not investment advice. Public Fed and Treasury data; computed every 6 hours. Past relationships do not predict future outcomes. Use at your own risk.