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.
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) ≥ | calls | hit-rate | edge vs base |
|---|---|---|---|
| 0.50 | 300,876 | 51.22% | −0.80pp |
| 0.55 | 280,001 | 51.17% | −0.85pp |
| 0.60 | 268,088 | 51.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).
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.
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).
Price targets — model blend
FairValue = 0.35·DCF + 0.25·EarningsPower + 0.25·Analyst + 0.15·GrahamTwo-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)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.
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.