Bill Street Research

Methodology & backtests

The whole firm is built on one principle: every call is reproducible from public data and published maths. Below is exactly how the models work — and how they actually performed on half a million real, look-ahead-free predictions.

Verified, not promised

Backtest 1 — short-horizon direction (1-day)

Walk-forward on 491,867real predictions (S&P 500 daily, 2013-2018). To predict day i+1 the model saw only the trailing 252 sessions up to day i— no look-ahead. We measured how often "predict up" was right vs the unconditional base rate.

Predict up when P(up) ≥callshit-rateedge vs base
0.50300,87651.22%−0.80pp
0.55280,00151.17%−0.85pp
0.60268,08851.18%−0.85pp

Base rate (always-up) was 52.0%. The naïve momentum signal does not beat a coin flip. Calibration was in fact inverted— the model's least-bullish days rose more often (a short-term reversal effect), and fading the model scored ~53.8% (+1.7pp in-sample).

Verified, not promised

Backtest 2 — monthly direction

Same discipline, longer horizon: predict each non-overlapping calendar month from data up to the prior month-end, using the app's price-based factors. 23,477 ticker-months.

Overall directional accuracy ≈ 51.8% vs 55.8% always-up base rate (−3.9pp)

The momentum/technical factors alone don't forecast monthly direction either, and the reversal pattern repeats. The value & qualityfactors — the part most likely to add medium-term edge — can't be backtested without point-in-time fundamentals, so we deliberately don't claim a number we can't verify.

Why show this? Because a firm that only publishes winners is selling a story. We're building on evidence. The honest finding (markets mean-revert short-term, momentum is over-rated at these horizons) is exactly what shapes the next iteration.

The maths

Composite opportunity score (0-100)

Five orthogonal factor buckets, each scored 0-100, combined by weight:

Score = 0.30·Value + 0.25·Momentum + 0.20·Quality + 0.15·Technicals + 0.10·Sentiment
  • Value — upside to blended fair value, plus cheap/rich P/E & PEG nudges.
  • Momentum — price vs SMA50/200 trend stack, 3-month return, RSI regime.
  • Quality — ROE, net margin, Debt/EBITDA leverage.
  • Technicals — MACD histogram, Bollinger position, distance from 52-week high.
  • Sentiment — sell-side consensus blended with Reddit retail buzz (smallest weight).
The maths

Price targets — model blend

FairValue = 0.35·DCF + 0.25·EarningsPower + 0.25·Analyst + 0.15·Graham

Two-stage discounted cash flow

FV = Σₜ₌₁ᴺ FCFₜ/(1+r)ᵗ + [FCF_N·(1+g₂)/(r−g₂)]/(1+r)ᴺ

FCF grows at g₁ (≤20%) for 5 years, then a 2.5% terminal value. Discount rate is a CAPM build-up r = 4% + β·5%; per-share = (PV − net debt) / shares.

Graham number

FV = √(22.5 × EPS × BookValuePerShare)

Forward earnings power (PEG-anchored)

FV = ForwardEPS × justifiedP/E, justifiedP/E = growth% (PEG = 1)
The maths

ODTE — short-horizon expected move

σ₁d = AnnualVol / √252 , ExpectedMove% = σ₁d × 100 , σ₂d = σ₁d·√2P(up) = 1 / (1 + e^(−z)), z = Σ wᵢ·factorᵢ

The desk excludes names that have already run past their target: if the move since the previous close ≥ 0.8σ, the asymmetric entry is spent and it's filtered out.

Honesty

Limitations we won't hide

  • Data is Yahoo Finance (unofficial, delayed) + Reddit; sample data is used and clearly labelled when feeds are down.
  • Backtests are US large-caps, one bull-market regime, gross of trading costs and spreads.
  • No model reliably predicts short-term prices. These are probabilistic estimates, not advice.
  • Bill Street is not a licensed adviser. You can lose money. Size positions accordingly.

Run the backtests yourself: npx tsx scripts/backtest.ts and scripts/backtest-monthly.ts.

← Back to the terminal