Before the tables: how to actually read this stuff
The pipeline, and the three habits that separate signal from noise.
Every series flows the same way: FRED / US Treasury API → the fetch notebook → a TradeStation-format CSV → an overlay on your monthly S&P chart. The CSV columns are Date, Time, Open, High, Low, Close, Vol, OI; for most series only Close carries the value, but a few pack several numbers into O/H/L (see §02).
Habit 1 — Level vs. rate-of-change
This is the one that trips people up. Index levels — CPI, Core CPI, Core PCE, PPI, the home-price index, M2 — only ever rise. Plotting the raw level tells you almost nothing; the signal is the slope (the year-over-year % change). Rates, spreads and ratios — yields, the curve, HY spread, VIX, the gas ratio — are mean-reverting, so the level itself is the signal.
Your CPI.csv, Core CPI.csv, Core PCE.csv and PPI.csv plot the index level (a smooth up-and-to-the-right line). To read inflation you want the YoY %: (value / value 12 months ago − 1) × 100. If you'd rather chart that directly, the notebook can output a YoY version — it's one extra row in the config.
Habit 2 — Lead, coincident, or lag?
Group the dashboard by when each series moves relative to the market and the economy:
- Leading (move first): yield-curve inversion, HY/credit spreads, NFCI, initial claims, breakevens, consumer sentiment, net liquidity.
- Coincident (move with): VIX, unemployment, GDP/GDI, Fed Funds, the 10Y.
- Lagging / confirming (move after): CPI/PCE/PPI levels, the Buffett valuation, household-credit data.
Habit 3 — Mind the release lag
Monthly inflation prints (CPI, Core CPI, Core PCE, PPI) are plotted shifted +1 month so the data point lands near when the market actually traded on it, not the reference month. Daily series (yields, spreads, VIX) are real-time; quarterly series (GDP/GDI, household credit, Buffett) carry a 1–3 month reporting lag baked in.
What's packed into each file's O/H/L/C
Most series put the value in Close and zero the rest. Four derived files cleverly pack multiple inputs into the OHLC slots so you can plot all of them from one symbol — read them like this:
| File | Open | High | Low | Close (the headline) |
|---|---|---|---|---|
| Net Liqduity.csv | Balance Sheet ($B) | Reverse Repo ($B) | TGA ($B) | Net Liquidity ($B) |
| GDP GDI.csv | 0 | GDP ($B) | GDI ($B) | GDP − GDI |
| Gas Prices.csv | 0 | Premium ($/gal) | Regular ($/gal) | Premium ÷ Regular ratio |
| HH-M2Stock.csv | 0 | HH Credit ($M) | Real M2 ($B) | YoY HH − YoY M2 (pp) |
| All other series | 0 | 0 | 0 | the value (yield, %, index, spread…) |
Tip: in TradeStation, plot the packed files as bars/candles to see all four numbers at once, or reference High/Low in an indicator to pull a component out.
Inflation & price expectations
Sets the Fed's reaction function. For a multiple-driven index like the S&P, the rate of change — and whether it's accelerating — matters more than the level.
| Series | What it is & how it's calculated | Typical range — & why | Updates | Watch for · use vs SPX |
|---|---|---|---|---|
| CPI & Core CPI CPIAUCSL · CPILFESL plots index level |
Consumer Price Index, urban consumers — avg price of a fixed basket. Core strips out food & energy (the volatile bits). Inflation rate = (CPI/CPI₋₁₂ − 1)×100. |
Level only rises (≈335, base 1982-84=100). Watch YoY: ~2% = comfort, 3–4% = hot, >5% = problem (2022 hit ~9%), <0 = deflation (rare). Unbounded because it's cumulative. | Monthly · BLS · ~2nd week, prior month | Accelerating YoY → higher-for-longer Fed → P/E headwind. Cooling surprise → risk-on. Core is the trend, headline is the noise. |
| Core PCE PCEPILFE plots index level |
Personal Consumption Expenditures price index, ex food/energy — the Fed's official 2% target gauge. Broader basket than CPI, reweights as people substitute. | YoY ~2% target; >3% = restrictive bias. Structurally runs ~0.3–0.5pp below Core CPI. | Monthly · BEA · ~end of month (later than CPI) | What the Fed actually targets → cleanest read on cut/hike odds. SPX reacts to PCE surprises for the policy path. |
| PPI PPIACO plots index level |
Producer Price Index, all commodities — prices producers receive. Pipeline inflation that often precedes CPI. | Level rises; YoY far more volatile than CPI (−5% to +20%), swinging with commodities. | Monthly · BLS · ~same week as CPI | Leading tell for CPI & margins. PPI rising faster than CPI = margin squeeze → earnings risk. |
| 10Y Breakeven T10YIE |
Market-implied avg inflation over 10y = 10Y nominal − 10Y TIPS yield. Plots % directly. |
1.5–2.5% normal; <1.5% = deflation/growth scare (2008, 2020); >2.5% = inflation fear (2022). Bounded by expectations + Fed credibility. | Daily (business days) | Forward-looking & daily — moves before CPI. Falling sharply = growth scare (usually with SPX selloffs). |
| 5y5y Fwd Inflation T5YIFR |
Expected avg inflation over the 5-year window starting 5 years out — strips near-term noise; the cleanest expectations anchor. | 2.0–2.5% = "anchored." De-anchoring (>2.75 or <1.5) is what the Fed fears most. | Daily | Long-run credibility gauge. Un-anchoring forces the Fed's hand regardless of growth → bad for multiples. |
Rates & the yield curve
The risk-free curve is the denominator under every valuation — and the market's best recession barometer.
| Series | What it is & how it's calculated | Typical range — & why | Updates | Watch for · use vs SPX |
|---|---|---|---|---|
| Fed Funds FEDFUNDS |
Effective federal funds rate — the overnight rate banks lend reserves; the Fed's policy lever. Plots % (monthly avg). | 0% (ZIRP) to ~5.25–5.5% (2023-24); historically ~20% (1981). Bounded by policy. | Monthly avg · target changes only at the 8 FOMC meetings/yr | The policy anchor. Hikes compress multiples & raise the cash hurdle vs stocks; cuts are risk-on — unless cutting into recession. |
| 10-Year Treasury DGS10 |
10-year constant-maturity Treasury yield — the global discount rate. Plots %. | 0.5% (2020) to ~5% (2023); historically ~15% (1981). | Daily | Rising 10Y = higher discount rate → pressure on long-duration / growth names. The speed matters more than the level — fast spikes break things. |
| 10Y−3M & 10Y−2Y spreads T10Y3M · T10Y2Y |
Yield-curve slope = long − short. 3M version = Fed's preferred recession model; 2Y version = the classic. FRED computes the spread. | ~−1% to +3%. Negative = inversion. Inversions preceded every recession since 1970 (long, variable lags). | Daily | Inversion = warning (6–18mo lead). The re-steepening after inversion often coincides with the recession actually starting and SPX topping. |
Credit & financial conditions
Credit markets sniff trouble before equities. Spreads widening = the bond market repricing default risk.
| Series | What it is & how it's calculated | Typical range — & why | Updates | Watch for · use vs SPX |
|---|---|---|---|---|
| Baa Corporate Yield DBAA |
Moody's Baa (lowest investment-grade) corporate bond yield. Plots %. The credit spread = Baa − 10Y (use your 10Y file). |
~3–7% recent. The spread over Treasuries (~1.5–3%) is the stress signal; widens in recessions. | Daily | Rising Baa spread = credit stress, usually before/with SPX drawdowns. Level alone conflates with the rate cycle — watch the spread. |
| High-Yield (Junk) Spread BAMLH0A0HYM2 |
ICE BofA US High-Yield Option-Adjusted Spread — extra yield junk bonds pay over Treasuries. Plots the spread itself (%). | <3% = complacency; 3–5% = normal; >6–8% = stress; >10% = crisis (2020 ~11%, 2008 ~20%). | Daily | The single best market-based risk gauge here. Blowouts confirm risk-off. Divergence (HY widening while SPX rises) = warning. |
| NFCI NFCI |
Chicago Fed National Financial Conditions Index — 105 indicators (money, debt, equity, leverage) distilled to one z-score. | 0 = average conditions (since 1971). Negative = looser than average; positive = tighter. Crisis spikes >+1 (2008 ~+3). | Weekly (Wed, prior week) | One number for "tailwind or headwind." Crossing above 0 = tightening regime caution; deeply negative = liquidity-fuelled melt-ups. |
Liquidity & money
Liquidity is the tide. Net Liquidity in particular has tracked the S&P's big swings since 2020.
| Series | What it is & how it's calculated | Typical range — & why | Updates | Watch for · use vs SPX |
|---|---|---|---|---|
| Net Liquidity WALCL − RRP − TGA derived, $B |
Fed balance sheet − Reverse Repo − Treasury cash (TGA) — the cash actually sloshing in markets. O=Bal Sheet, H=RRP, L=TGA, C=Net Liq. |
No fixed range — trends with QE/QT (~$5–6T era). Direction is the signal, not the level. | Effectively daily (RRP & TGA daily; WALCL weekly Thu) | Rising = tailwind for SPX (the post-2020 correlation is striking); draining (QT, TGA rebuild, RRP rising) = headwind. One of the highest-value overlays here. |
| M2 YoY M2SL |
Nominal M2 money supply, year-over-year: (M2/M2₋₁₂ − 1)×100. Plots %. |
Normally +3 to +7%. Spiked ~+27% (2021 stimulus); went negative (~−4%, 2023) — first contraction since the 1930s. | Monthly (~4-wk lag) | Money-growth impulse. Surges precede inflation & asset melt-ups (12–18mo lag); contraction is disinflationary and historically risky. |
| HH Credit − M2 HCCSDODNS − M2REAL derived, pp |
YoY household credit − YoY real M2. H=HH Credit, L=real M2, C=the YoY spread. |
Oscillates around 0. Positive = credit expanding faster than money (late-cycle leverage); negative = deleveraging. | Quarterly (HH credit = Z.1, ~10-wk lag) | Slow late-cycle leverage gauge — context, not timing. Rising = credit-fuelled expansion. |
Growth & activity
Hard data — slower-moving, mostly coincident-to-lagging, but the substance under earnings.
| Series | What it is & how it's calculated | Typical range — & why | Updates | Watch for · use vs SPX |
|---|---|---|---|---|
| GDP − GDI gap GDP · GDI derived, $B |
Two independent measures of the same economy — output (GDP) vs income (GDI). Close = GDP − GDI. H=GDP, L=GDI. |
Should be ~0; the gap widens near turning points and gets revised. GDI is often weaker before recessions. | Quarterly · BEA · heavily revised | A persistent GDP>GDI gap has flagged late-cycle weakness the headline hid. Context for the earnings backdrop. |
| NY Home Price NYXRSA plots index level |
S&P CoreLogic Case-Shiller NY-metro home-price index (Jan 2000=100), 3-mo moving average. | Level (~280 in 2026); watch YoY & turns. Housing is rate-sensitive & wealth-effect linked. | Monthly · ~2-month lag · last Tuesday | Regional proxy for the rate-sensitive housing / wealth channel; turns lead consumer stress. Slow-moving. |
| Gas Premium/Regular APU000074716 ÷ 074714 derived ratio |
Retail gasoline: Premium ÷ Regular price. H=Premium, L=Regular, C=ratio. |
~1.05–1.15. Fairly stable; widens with refining/margin dynamics. | Monthly · BLS average prices | Niche. The Low (regular price) is the consumer-squeeze / headline-inflation read; the ratio is a refining-margin curiosity. |
Labor & recession triggers
Labor is what turns a slowdown into a recession — and this group holds the cleanest real-time trigger there is.
| Series | What it is & how it's calculated | Typical range — & why | Updates | Watch for · use vs SPX |
|---|---|---|---|---|
| Unemployment Rate UNRATE |
% of the labor force unemployed (U-3). Plots %. | ~3.4% (2023 cycle low) to 10% (2009) / ~15% (2020). Full employment ≈ 3.5–4.5%. | Monthly · 1st Friday (jobs report) | Low & stable = fine; the rise off the lows is the tell — it never drifts, it lurches. Coincident, but the trigger for Fed cuts. |
| Sahm Rule SAHMREALTIME |
3-month avg unemployment minus its lowest value in the prior 12 months. Plots that gap (pp). | <0.5 = expansion; ≥0.50 = recession signal (fired in every recession since 1970, near real-time). | Monthly · after the jobs report | The cleanest single recession tripwire. Crossing 0.50 has aligned with SPX entering/confirming bear territory. |
| Initial Jobless Claims ICSA |
New unemployment-insurance filings, seasonally adjusted. Plots the count. | 200–260k = healthy; >300k = softening; >350–400k = recessionary; spiked ~6M (2020). | Weekly · Thursdays — most timely labor data | Earliest labor crack. A sustained climb through ~300k is an early risk-off flag, before the monthly jobs data confirms. |
| Consumer Sentiment UMCSENT plots index level |
U. Michigan Index of Consumer Sentiment (survey, 1966Q1=100). | ~50 (2022 record low) to ~100+ (booms). <70 = stressed; >90 = confident. | Monthly (prelim mid-month, final end-month) | Soft data; leads spending turns. Extreme lows have (counter-intuitively) marked SPX bottoms — peak pessimism. |
Risk & valuation
Where the market prices fear — and how expensive it is to begin with.
| Series | What it is & how it's calculated | Typical range — & why | Updates | Watch for · use vs SPX |
|---|---|---|---|---|
| VIX VIXCLS |
CBOE Volatility Index — 30-day implied volatility from S&P 500 options (the "fear gauge"). Plots index (annualized %). | 9–12 = complacent; 13–20 = normal; 20–30 = elevated; >30 = fear; >40 = panic; ~80 peaks (2008, 2020). Mean-reverting. | Daily (FRED = daily close) | Inversely tracks SPX. Spikes = capitulation (often near-term bottoms). VIX rising while SPX rises = hedging into strength = warning. |
| Buffett Indicator NCBEILQ027S ÷ GDP derived, % |
Corporate equities (Z.1) ÷ nominal GDP × 100 — total market value vs the economy. Replaces the discontinued Wilshire/GDP version. |
~70% = cheap; ~100% = fair (historical avg); >150% = expensive; ~190–220% now (record). | Quarterly (Z.1 + GDP) | A valuation altitude gauge: high = low long-run forward returns, not a sell signal (can stay rich for years). Context for sizing, not timing. |
The regime playbook
No single series times the market. They work as a confluence: liquidity and credit lead, the curve warns, labor confirms, valuation sizes the bet. Here's the at-a-glance tilt:
- Net Liquidity rising
- HY spread tight & stable (<4%), NFCI negative
- Inflation YoY cooling; breakevens anchored
- Curve positive; Fed on hold or cutting (not into recession)
- Claims low, Sahm <0.5; VIX low-but-not-complacent
- Net Liquidity draining (QT, TGA rebuild)
- HY spread widening (>6%), NFCI crossing above 0
- Inflation re-accelerating or breakevens un-anchoring
- Curve re-steepening after inversion
- Claims climbing >300k, Sahm ≥0.50; VIX spiking
Daily tripwires (HY spread, VIX, breakevens) react first. Weekly (claims, NFCI) confirm the turn. Monthly (Sahm, unemployment, inflation) make it official. Quarterly (GDP/GDI, Buffett) set the slow backdrop. Read fast-to-slow: a daily flag that the weekly/monthly data then confirm is a real regime change; a lone daily wiggle is noise.
Plot rates of change, not levels, for anything that only goes up (CPI, PCE, PPI, M2, home prices). Watch spreads, not absolute yields, for credit. And keep three tripwires always in view — the HY spread (daily), initial claims (weekly), and the Sahm Rule (monthly). Liquidity is the tide that lifts or drops everything else.
The two numbers behind every claim: IC and perm-p
You don't need statistics training to use this. Two ideas carry it all — one measures strength, the other measures whether the strength is real.
Information Coefficient (IC) — "how well does this indicator rank what comes next?"
The IC is a single number from −1 to +1 that answers: when this indicator was high in the past, did the market tend to go up or down afterwards — and how reliably?
How it's built: take every historical month, line up (a) the indicator's reading that month against (b) the market's return over the following N months, and measure how well they rank together. We use the rank correlation (Spearman) rather than ordinary correlation, so a single crazy outlier can't dominate and we capture "higher reading → higher return" even when the relationship isn't a perfectly straight line.
Markets are close to random, so the bar is low. |IC| ≈ 0 = no information; 0.03–0.05 = weak; 0.10 = genuinely useful for the S&P; 0.15+ = strong (for equities). The sign tells direction — with our charts, signals are oriented so a positive IC means "higher signal → higher future return." In the bar charts, the bar height IS the IC. ⚠️ Caveat: for *trending* data like home prices, a big IC is cheap and misleading — which is exactly what perm-p is for.
Permutation p-value (perm-p) — "could this have happened by luck?"
A big IC isn't enough. Two problems can fake it: (1) two series that both drift upward over decades will correlate even if unrelated (the "spurious correlation" trap), and (2) we ran 3,374 tests — some will look great by pure chance. The perm-p is the probability that an IC this big could have appeared by luck alone.
How it's built (the "circular shift" test): take the real future-returns series and slide it forward in time by a random amount, wrapping the end back to the front — thousands of times. Each random slide destroys any genuine link between indicator and returns, but keeps the data's natural trend and persistence intact. Re-measure the IC after each slide. That gives a whole distribution of "ICs you'd get from noise that trends like this." The perm-p is the fraction of those random ICs that are as large as the real one.
A plain shuffle would scramble the trend and make almost everything look "significant." The circular slide preserves the trend, so the test honestly asks: "given how trendy this data already is, is the relationship bigger than trend-coincidence?" This is the single most important tool in the whole study.
perm-p < 0.05 → keep it (under a 1-in-20 chance it's luck). perm-p > 0.05 → discard it, no matter how big the IC. This is why the S&P signals (IC ~0.16, perm-p 0.01) are trustworthy while the housing signals (IC ~0.7, perm-p 0.1–0.65) were thrown out — the housing correlations were just two trending lines drifting together.
The other guards, briefly
| Method | What it does | Why it's here |
|---|---|---|
| Lead-lag | Slides the indicator against returns to find how many months ahead it peaks | Tells you how early a signal fires |
| FDR (multiple-testing) | With 3,374 tests, ~168 pass p<0.05 by chance; FDR keeps only those beating that bar | Stops us "discovering" pure noise |
| Train/test + walk-forward | Re-checks the signal on data it wasn't found on, and in every rolling 10-yr window | Confirms it isn't a one-era fluke |
| Point-in-time (vintage) data | Re-runs using only the first-published values, not later revisions | So the backtest can't "cheat" with data you couldn't have known |
| Backtest metrics | CAGR = annual growth · Sharpe = return per unit of risk · Max drawdown = worst peak-to-trough loss | Turns a signal into tradeable terms |
Bar charts: bar height = IC; green = survives perm-p (real), gray/red = doesn't (ignore); the p= label is the perm-p. Equity curve: growth of $1 on a log scale (equal % moves look equal). Rolling-IC line: the signal's IC measured over each 10-year window — above the zero line = working in that decade. Overlay chart: two lines on two axes — watch whether one consistently turns before the other.
IC tells you how strong a signal is. Perm-p tells you whether to believe it. A signal needs both a usable IC (≥0.10 for stocks) and a perm-p under 0.05. Big IC + big perm-p = a mirage.
What actually has predictive power for SPX
3,374 tests were run. ~168 will look "significant" by pure luck. Here's what survives an honest test.
Every candidate below was scored by Information Coefficient (IC), then re-checked with an autocorrelation-preserving permutation test and independently reproduced by separate verification agents. Only what survives is reported as real.
Across all timeframes I ran 3,374 indicator-signal-horizon tests. At p<0.05, ~168 will look "significant" by chance alone. On the SPX monthly grid alone, 140 tests showed raw p<0.05 — but only 17 survive a false-discovery-rate correction. This is why raw p-values are worthless here and every headline was permutation-tested.
The signals that survive permutation testing
Only three monthly signals clear the bar — and they're all rates / inflation momentum or level:
| Signal | Reading | IC (3mo) | perm-p | Verdict |
|---|---|---|---|---|
| 10Y Treasury momentum | rising vs its own 6-mo average = bearish | +0.161 | 0.010 | ✅ robust |
| PPI level (z-score) | high producer inflation = bearish | +0.156 | 0.016 | ✅ robust |
| Core CPI level (z-score) | low/falling inflation = bullish | +0.130 | 0.018 | ✅ robust |
| VIX level | high VIX = bullish (contrarian) | +0.132 | 0.094 | ⚠️ borderline |
| Credit spread / Net Liquidity | — | ~0 / +0.14 | 0.82 / 0.28 | ❌ fail (noise / too short) |
How early does each lead?
Most SPX macro signals are near-coincident to ~2 months — markets price macro fast. Only a few slow labor signals (initial claims ~12mo, M1 growth ~8mo) lead by much.
Momentum transforms (distance-from-MA, MA-crossovers) work best for the near-term (1–3 month) turn — 10Y madist6 peaks at the 3-month horizon. Level / regime transforms (z-scores) build power at longer horizons — Core CPI's IC rises from 1→6 months. Use momentum for the immediate tilt, the raw level for the multi-month regime.
Combining signals: drawdown control, not forecasting
A fitted regression of the 3–4 robust signals has an out-of-sample R² of ≈ 0 — you cannot forecast the SPX return number. But an equal-weight composite used as an on/off risk filter roughly halves drawdowns (OOS max-drawdown −20% vs −53% buy-and-hold) for a similar return — out-of-sample Sharpe 0.84 vs 0.58.
Combining doesn't raise the correlation — the composite's IC (+0.14) is no higher than the best single (+0.16). Its value is robustness and drawdown avoidance: diversified across drivers, it sidesteps the worst regimes. Don't expect to predict the number; expect to tilt risk and dodge the deep bears.
The most stable signal, and where edges live
10Y momentum is the workhorse: its rolling 10-year IC is positive in 83% of decades and is the same across every regime (high/low inflation, pre/post-2010 ≈ +0.15). Core CPI, by contrast, is regime-dependent — it works in low-inflation periods and dies in high-inflation ones:
| Signal | pre-2010 | post-2010 | high-inflation | low-inflation | Read |
|---|---|---|---|---|---|
| 10Y momentum | +0.15 | +0.15 | +0.16 | +0.16 | regime-stable |
| Core CPI | +0.13 | +0.20 | +0.02 | +0.20 | low-inflation only |
| Credit spread | −0.01 | −0.04 | −0.03 | −0.05 | no edge alone |
How to actually apply each SPX predictor
For each: the concrete rule to compute, what a given reading is telling you, and how to use it.
| Predictor | The concrete rule | What a reading means | How to use it |
|---|---|---|---|
| 10Y momentum the workhorse | Take the 10-yr yield minus its own 6-month moving average. Above 0 = rising; below 0 = falling. | Rising 10Y above its 6mo avg → expect lower SPX returns over the next 1–3 months (the discount rate is climbing). Works in every regime. | Standalone risk tilt. When it flips positive (yields breaking higher), trim risk / raise cash. When it rolls back below its average, lean back in. |
| PPI & Core CPI regime detectors | Z-score the inflation rate vs its own ~5-yr range (how high/low vs normal). High z = hot inflation. | Low / falling inflation → tailwind. Hot / rising → headwind, especially when the Fed is tightening. Core CPI's edge concentrates in low-inflation regimes. | Regime filter. Hold full equity risk while inflation is low/cooling; de-risk when it's high/accelerating. Don't use it as a fast trigger — it's a multi-month backdrop. |
| VIX contrarian confirm | Watch absolute level: <15 calm, 20–30 elevated, >30 fear, >40 panic. | A VIX spike (>30–40) marks capitulation → forward returns tend to be higher, not lower. | Contrarian confirmation. Use spikes to add risk into fear, not to flee. Borderline on its own — pair with the others. |
| Composite the recommended tool | Average the oriented z-scores of 10Y-momentum, PPI, Core CPI (and credit/VIX). Composite > 0 = risk-on. | >0 → the macro backdrop favors equities; <0 → defensive. It won't predict the return size, but it flags the bad regimes. | Drawdown filter. Be fully invested when >0, reduce when <0. Historically cuts max drawdown roughly in half for similar return. |
| Net Liquidity | Fed balance sheet − reverse repo − Treasury cash; watch its 12-month change. | Rising = tailwind; draining = headwind. | Context only — too short a history (2005+) to trust as a standalone trigger. |
| Buffett Indicator | Total market value ÷ GDP. | High (>150%) = expensive = low long-run (10-yr) expected returns. It says nothing about the next month. | Do not time with it. Use it to size long-run expectations and position scale, never as a buy/sell trigger. |
"Buffett crossing its 6-month average leads SPX" does not hold: IC ≈ 0.01–0.06 (noise), and the rule trails buy-and-hold risk-adjusted (Sharpe 0.46 vs 0.50). It's robust to point-in-time data too (vintage IC +0.009). The catch: Buffett is quarterly, so a "6-month average" is only ~2 real points. Buffett is a long-horizon valuation gauge, not a monthly timing cross — independently confirmed by two verification agents.
SPX is modestly predictable: a handful of rates/inflation signals (led by 10Y momentum) carry the real edge, best used to tilt risk and avoid drawdowns, not to forecast returns. Everything else was multiple-testing noise.
NY real estate: a masterclass in spurious correlation
The raw numbers screamed "0.7 predictability." The honest test says otherwise — and the truth underneath is more useful.
First, the angles — what each one uniquely measures
You added many real-estate series. Here's the map so they don't become noise — grouped by what they actually do:
| Role | Series | What it uniquely measures · scope of lead |
|---|---|---|
| Target — price | NYXRSA (metro, '87), NYSTHPI (state, '75), Zillow NY, NY high-tier | The thing to forecast. Zillow captures co-ops Case-Shiller misses; FHFA state goes back to 1975 for long cycles |
| Driver — money | Real M2 YoY, M2 YoY | Liquidity fueling future demand — leads turns ~7–13 months |
| Driver — cost | Fed Funds, 30Y mortgage, CPI | Affordability / borrowing cost — lead ~7–12 months, negatively |
| Driver — supply | Permits, starts, months-supply, vacancy | Inventory pressure — track the persistent trend, not turning points |
| Context | US / 20-city HPI | National backdrop — but 0.86 correlated with NY = mostly NY predicting itself |
The trap: huge correlations that mean nothing
Predicting the home-price level's forward return, every indicator shows a massive IC (0.3–0.7). But home prices are a near-unit-root series, and so are the macro drivers. When you run an autocorrelation-preserving permutation test, the significance collapses: only supply (permits, vacancy) survives, and even those are largely trend-persistence. M2, CPI, Fed Funds, mortgage — all fail (perm-p 0.10–0.65).
Two series that both drift upward over 40 years will correlate ~0.7 even if neither causes the other — the textbook "spurious regression." The effective number of independent observations isn't 440 monthly points; with 12-month overlapping windows and 0.99 autocorrelation it's about 36. A 0.55 correlation on 36 effective points is p≈0.09, not 0.001. Lesson: on trending data, a big R² is the default, not the discovery.
The real signal: predicting the *change* in growth (turning points)
Switch the target to home-price acceleration (the change in the growth rate — i.e. turning points, a stationary target) and the picture clears. Now your hunch validates: Real M2 growth (perm-p 0.025) and CPI, inverted (perm-p 0.013) genuinely lead NY home-price turns. Permits and vacancy — which "predicted" the level — have no power over turning points (they ride the trend, they don't call the turn).
Your hunch, visualized: M2 leads the turns
Real M2 growth (orange) repeatedly turns before NY home-price growth (blue) — the 2003–05 liquidity surge before the mid-2000s boom, the 2020–21 spike before the 2021–22 melt-up, the 2022–23 money contraction before the cooling. This is the one relationship in the whole study that is genuinely stable:
| Predictor → NY home-price acceleration | IC | perm-p | Vintage (real-time) perm-p | Walk-forward stability |
|---|---|---|---|---|
| Real M2 YoY (~7mo lead) | +0.35 | 0.025 | 0.044 | median IC +0.58, 100% of decades same-sign |
| CPI YoY, inverted (~12mo lead) | +0.41 | 0.013 | 0.071 | median IC +0.53, 96% of decades |
| M2 YoY (nominal) | +0.24 | 0.105 | — | borderline |
| Fed Funds / 30Y mortgage | +0.10–0.14 | 0.33–0.45 | — | directionally right, not significant |
Real M2 and CPI genuinely lead NY home-price turning points by ~7–12 months — and Real M2 survives both the permutation test and point-in-time (vintage) data, the single most robust relationship found. Fed Funds and the mortgage rate point the right way but don't clear significance once you correct for trending data. So: watch money growth and inflation for the turn; they're real leads, not the level co-movement that looked so dramatic.
How to apply the real-estate signals
Real estate is slow and illiquid, so these are forecasting / planning tools (months ahead), not trade triggers.
| Predictor | The concrete rule | What a reading means | Lead & use |
|---|---|---|---|
| Real M2 YoY the validated leader | Inflation-adjusted M2 money supply, year-over-year %. Watch its turns (when growth peaks or troughs), not its level. | When Real M2 growth rolls over, NY home-price growth tends to slow ~7 months later; when it bottoms and turns up, housing reaccelerates. | ~7-month lead. The earliest reliable warning of a NY housing turn. The single most stable relationship found (positive in 100% of rolling decades). |
| CPI YoY (inverted) | Headline CPI year-over-year %. High/rising inflation is the negative signal. | Accelerating inflation → home-price growth decelerates ~12 months later (the Fed hikes → mortgage rates rise → demand cools). | ~12-month lead. A slower, confirming companion to Real M2. |
| Permits / Vacancy | Building permits (high = supply coming) and vacancy (low = tight market). | They describe the current trend's strength, not its turning point. | Trend confirmation only — they ride the trend, they don't call the turn. Don't use them to time tops/bottoms. |
| Fed Funds / Mortgage rate | Policy rate / 30-yr mortgage rate. | Higher → housing headwind. | Directionally right but not statistically reliable after correction — use as context, not a signal. |
Commercial real estate — the honest gap
NY-specific commercial price indices (Green Street, MSCI-RCA, NCREIF) are all proprietary. Free national proxies exist — BIS US CRE price (quarterly), CRE-loan delinquency (1991→), and the daily REIT total-return index — and these reprice 6–18 months ahead of private indices. For NY-specific commercial there is currently no free clean series, so it's flagged as a gap rather than faked.
Real-estate "predictability" of 0.5–0.7 is mostly two trending lines moving together — not forecasting skill. The genuine, vintage-robust signal is narrower and more useful: Real M2 growth and inflation lead NY home-price turning points by ~7–12 months.