Methodology — how every signal is computed

Full transparency. Every number on the dashboard is computed from public data using the formulas documented below — RSI calibration, composite scores, the recession model, and the macro indicators are all spelled out so you can check the math against the raw Yahoo Finance / FRED data yourself.

Live track record

Forward-capture of every signal the universe screener has fired since deploy. Captured 3 signals total · 3 currently open · capture started 2026-05-28 · scoring schema v3. We never delete, never backfill, never cherry-pick — losers, expired, and stop-outs all shown.

Small sample — not yet meaningful. Need ≥ 20 resolved signals before these numbers should drive decisions.

BUY signals (closed)
Count: 0
Hit rate: (target_hit / (target_hit + stopped_out))
Mean days to resolve:
Mean return:
Median return:
SELL signals (closed)
Count: 0
Hit rate:
Mean days to resolve:
Mean return:
Median return:

Data sources

  • Stock prices & fundamentals: Yahoo Finance v8 chart endpoint (free, unofficial). Pre/post-market trading captured via includePrePost=true.
  • Macro data: FRED (Federal Reserve Economic Data) — official series for CPI, PCE, M2, Treasury yields, unemployment trend, and recession indicators.
  • Update cadence: Strategy passes run on Cloudflare Cron Triggers — every 5 minutes for prices/RSI during US market hours, every 15 minutes for the heavier composite scoring, hourly for macro panels. Off-hours and weekends the cadence throttles down (price data doesn't change).

RSI (Relative Strength Index)

Standard Wilder RSI(14) on daily closes. The novel part is the thresholds — instead of the textbook 30/70, we calibrate them per stock:

  • Pull the stock's last 1 year of daily closes
  • Compute the full RSI series
  • Buy threshold = the 10th percentile of that series (clamped between 20 and 45)
  • Sell threshold = the 90th percentile (clamped between 55 and 85)

This handles the reality that high-volatility stocks (AMD, NVDA) rarely hit 30/70 cleanly, while low-volatility stocks (KO, JNJ) hit them too often. Calibrated thresholds = relevant alerts.

Composite buy score (0–100)

Sum of weighted contributions from independent signals. Components and max points:

  • RSI oversold: +20 max — scaled by how far below the calibrated buy threshold
  • Near 52-week low: +15 max — current price within 15% of the 52w low
  • Pullback in uptrend: +15 — price below 50-day MA but above rising 200-day MA
  • Healthy ERP: +15 — earnings yield (1/PE) at least 3% above 10y Treasury yield
  • P/E in bottom quartile of 5y range: +10
  • Strong long-term momentum: +10 — 5y CAGR > 12%
  • Golden cross: +5 — 50-day MA above rising 200-day MA
  • Macro tailwind: +5 — zero regime flags tripped
  • Market-cap headroom: +5 to +8 — mid-cap and large-cap (under $1.5T) get a bonus for having room to grow; ultra-mega-caps (over $3T) get nothing

Labels: 0–30 Skip · 30–50 Watch · 50–70 Buy candidate · 70+ Strong buy.

Composite sell score (0–100)

  • RSI overbought: +15 max
  • Manual price ceiling hit: +20 (only if you set a target_above on your watchlist)
  • Take-profit hit: +20 (if you set cost_basis + take_profit_pct)
  • ERP weak or negative: +10–15 — bonds outyielding earnings = rotation risk
  • P/E in top decile of 5y range: +10 — historically expensive
  • Follow-through risk: up to +20 — price below 50dma AND 200dma AND in death-cross regime
  • Insider net selling: +10
  • Volume anomaly today: +15 — down ≥3% on 2× average volume (institutional dump signature)
  • Distribution days on SPY: +10 — 4+ in last 20 sessions
  • Macro flags ≥2: +10
  • Death cross active: +10

Suggested buy entry

The greater of (52-week low) or (current price × 0.90). The clamp prevents asking you to wait for a crash on a stock in a strong uptrend.

Suggested sell target

Two regimes:

  • Stock near its 52-week high (within 5%): project forward using the stock's own 5-year CAGR, compounded over 3 years.
  • Stock well below its 52-week high: use the greater of (52-week high) or (current × 1.15).

The projection is then capped if it implies an implausible market cap — specifically, if the implied market cap would exceed $10 trillion, or be more than 5× the current cap. This prevents nonsensical targets like "NVDA to $10,000" (which would imply a $245T market cap, larger than US GDP).

Risk rating

Composite of three measures over 5 years:

  • Annualized volatility (standard deviation of log returns × √252)
  • Beta vs S&P 500 (covariance / SPY variance)
  • Maximum drawdown (worst peak-to-trough decline)

Each metric contributes 0–3 points based on standard thresholds. Total score maps to: Low / Low-Moderate / Moderate / Moderate-High / High / Very High.

Recession risk (0–100)

Combines market-price signals with fundamental data from FRED:

  • Sahm Rule (FRED SAHMREALTIME): unemployment-trend signal. ≥0.5 historically means recession has already begun. We add 25 pts if ≥0.5, 15 pts if ≥0.3.
  • Yield-curve model (Estrella-Mishkin formula): P(recession in 12mo) = Φ(−0.5333 − 0.6330 × spread). This is the math behind the NY Fed's published yield-curve recession indicator. Contributes up to 25 pts scaled by the probability.
  • Recent inversion memory: if 10Y-3M Treasury spread (FRED T10Y3M) was negative anywhere in the last 18 months, add 15 pts. Recessions historically begin 6–18 months after the curve un-inverts, not during inversion.
  • SPY below 200-day MA: +20
  • VIX 30-day avg > 25: +15
  • Credit spreads widening (HYG/LQD ratio down ≥5% in 6mo): +20
  • Defensive sector leadership (XLP+XLU vs XLY+XLK by 10%+): +10
  • Small-cap weakness (IWM/SPY down ≥15% in 6mo): +10

Inflation & stagflation

Pulls CPI YoY (FRED CPIAUCSL), Core PCE YoY (FRED PCEPILFE — the Fed's preferred metric), and WTI crude (Yahoo CL=F). Stagflation risk score combines high inflation (CPI > 3.5% adds points) with energy-cost shock (oil YoY > +30%) and sticky-inflation signals (Core PCE > 3%).

Monetary conditions (–4 to +4)

Composite tailwind/headwind score from FRED:

  • M2 money supply YoY — is the Fed printing or destroying money?
  • Fed balance sheet YoY — QE vs QT?
  • Real 10y yield (DFII10) — cost of money after inflation
  • Trade-weighted USD (DTWEXBGS) — strong dollar tightens global liquidity
  • 5y breakeven inflation (T5YIE) — context only

What this methodology won't tell you

Earnings reports. Acquisitions. Regulatory risk. Geopolitical events. Management changes. Anything that requires reading the news. Our signals are statistical proxies that historically correlate with future returns — they are not crystal balls and they will be wrong sometimes. Use them as one input among many.

Backtest snapshot — what the score actually does

We ran a strict point-in-time replay of the composite buy score over the trailing 2 years of daily bars for the current universe. The honest numbers, at a threshold of 30/100:

  • 117 signals fired across 32 symbols over ~2 years
  • 49% win rate — basically a coin flip on direction
  • Mean return: +14.3% — winners outsize losers because the exit-target is asymmetric vs. the 10% stop
  • Median return: −1.1% — most individual signals are slight losers; a small number of large winners pull the mean up
  • 23% target hits / 45% stops / 32% time-stops — almost half of signals get stopped out before hitting target

What this tells you: the score has asymmetric edge (winners run bigger than losers lose), but it is NOT a high-accuracy predictor. Treat any single signal as low-conviction; treat a portfolio of them with discipline on position sizing and stops. Also note that this backtest does not include the FRED macro inputs the live system uses (Yahoo doesn't expose them historically) — so the live score has more information than what we tested. Whether that makes it better or worse than these numbers is open.

Caveats called out in BACKTEST.md: no slippage / fees / taxes / sizing modeled, no survivorship-bias correction, and the universe is whatever's in the screener today — a stock delisted 18 months ago wouldn't appear. Numbers are illustrative of the math, not of a strategy you should run capital against.

← back to the live dashboard