Reference
Methodology
Every score, grade and statistic on capXalpha, with the formula behind it. Where the implementation takes a shortcut, that is stated rather than smoothed over.
Quant score & ratings
The headline rating is a weighted mean of five factor scores, each on a 0–5 scale.
- Factor score
- percentile rank of the metric within the universe → mapped to 0–5
- Sector-relative where a sector is known, otherwise market-relative. A percentile needs a real peer set; fewer than 2 comparables returns the neutral 0.5.
- Overall quant score
- weighted mean of Value, Growth, Profitability, Momentum, EPS Revisions (0–5)
- Weights are part of the engine (services/src/quant.rs); the five factors are the Seeking-Alpha-equivalent set.
- Letter grade
- A+ ≥ 4.5 · A ≥ 4.0 · A− ≥ 3.7 · B+ ≥ 3.3 · B ≥ 3.0 · B− ≥ 2.7 · C+ ≥ 2.3 · C ≥ 2.0 · C− ≥ 1.7 · D+ ≥ 1.3 · D ≥ 1.0 · F < 1.0
- Applied to the 0–5 factor scores, so an ETF grade means what a stock grade means.
- Rating band
- Strong Buy ≥ 4.0 · Buy ≥ 3.0 · Hold ≥ 2.0 · Sell ≥ 1.0 · Strong Sell < 1.0
- The same bands are used by the live engine and by the historical score series.
- Value
- inverted percentiles of P/E, P/B, P/S, EV/Revenue, PEG
- Inverted because a lower multiple is cheaper. Negative earnings make P/E undefined — the metric is skipped, not coerced to zero.
- Growth
- revenue growth and EPS growth (period over period)
- Uses reported fiscal periods; no forward guidance is invented.
- Profitability
- gross / operating / net margin, ROE, ROA, ROIC
- ROIC = NOPAT ÷ invested capital. Rankings are within the peer set.
- Momentum
- 12-month total return, skipping the most recent month (12-1)
- Skipping the last month avoids short-term reversal noise; it is the standard academic momentum definition.
- EPS revisions
- net analyst EPS estimate revisions over the trailing 30 days
- Requires forward estimates (Yahoo consensus). Absent coverage means the factor is neutral, not zero.
- Price-based score history
- 0.40 × momentum(-30%…+30%) + 0.30 × trend(-20%…+20%) + 0.15 × volatility(50%…15%, inverted) + 0.15 × drawdown(-50%…0%)
- Each input maps to 1–5 over the range shown, then the weighted mean is the score. This series is price-only by necessity — see Data limits.
Risk & return
Computed from the daily close series. Metrics are suppressed (null) below 30 observations rather than annualised from a handful of days.
- Annualized return
- mean daily return × 252
- Arithmetic annualisation. A two-day sample annualises to nonsense, hence the 30-observation floor.
- Volatility
- stdev(daily returns) × √252
- Sample standard deviation (n−1).
- Sharpe ratio
- (Rₚ − R_f) ÷ σₚ
- R_f annualised then divided by periods-per-year before use, so both terms are on the same basis.
- Sortino ratio
- (Rₚ − R_f) ÷ σ_downside
- Downside deviation counts only returns below the target, so upside volatility is not penalised.
- Beta
- cov(rₐ, r_b) ÷ var(r_b)
- Only meaningful with a benchmark and overlapping dates; otherwise null — never 1.0 by default.
- Alpha (Jensen)
- Rₚ − [R_f + β × (R_m − R_f)]
- Requires beta, so it inherits the same benchmark requirement.
- Max drawdown
- max over t of (peak − priceₜ) ÷ peak
- Reported as a positive magnitude of the worst peak-to-trough decline.
- VaR (95%)
- 5th percentile of the daily return distribution
- Historical simulation, not a normal assumption.
- CVaR (95%)
- mean of returns at or below the VaR threshold
- Expected shortfall: what the bad tail averages.
- Correlation
- Pearson r of daily returns
- Tail-aligned on common dates; the correlation matrix uses the same rule.
Fundamentals
Sourced from SEC EDGAR XBRL, so values are what the company reported — not a vendor's restatement.
- PEG
- P/E ÷ earnings growth rate
- Undefined for negative or zero growth; shown as null.
- ROIC
- NOPAT ÷ invested capital
- NOPAT = operating income × (1 − tax rate). Invested capital = total debt + equity − cash.
- DuPont (3-factor)
- ROE = net margin × asset turnover × equity multiplier
- Decomposes ROE into profitability, efficiency and leverage.
- Piotroski F-score
- sum of 9 binary signals (profitability, leverage/liquidity, operating efficiency)
- Score is 0–9; each signal is reported so the total is auditable.
- Margins
- gross = (revenue − COGS) ÷ revenue · operating = operating income ÷ revenue · net = net income ÷ revenue
- Shown as null when the filer does not tag the input (e.g. many companies never tag GrossProfit).
- Free cash flow
- operating cash flow − capital expenditure
- From the cash-flow statement.
Technical indicators
50+ indicators. Price-only indicators use closes; OHLC indicators require stored open/high/low and return null without them.
- RSI (n)
- 100 − 100 ÷ (1 + average gain ÷ average loss)
- Wilder smoothing. Needs n+1 bars; a short series returns null, not 0.
- MACD
- EMA(12) − EMA(26); signal = EMA(9) of MACD; histogram = MACD − signal
- MACDEXT allows any moving-average family for each leg (TA-Lib codes 0–8).
- Bollinger Bands
- SMA(n) ± k × stdev(n)
- The middle band is exactly the SMA, so the band and the overlay share a basis.
- ATR (n)
- Wilder-smoothed true range, TR = max(high−low, |high−prev close|, |low−prev close|)
- OHLC-based.
- ADX / +DI / −DI
- smoothed directional movement, DX = 100 × |+DI − −DI| ÷ (+DI + −DI), ADX = smoothed DX
- ADX measures trend strength, not direction.
- Stochastic
- %K = 100 × (close − lowₙ) ÷ (highₙ − lowₙ); %D = SMA(%K)
- Fast and slow variants; slow is the smoothed contract.
- Aroon
- Aroon Up = 100 × (n − bars since n-period high) ÷ n; Down is the mirror
- Oscillator is Up − Down.
- Hilbert family
- HT_TRENDLINE, HT_DCPERIOD, HT_DCPHASE, HT_PHASOR, HT_SINE, HT_TRENDMODE, MAMA
- Transcribed from TA-Lib and validated against TA-Lib 0.8.1 reference vectors to <1e-6.
- KAMA / T3 / TRIMA
- Kaufman adaptive MA · Tillson T3 · triangular MA
- TRIMA is SMA(p/2) of SMA(p/2+1) — not SMA of SMA, which is a common and wrong shortcut.
Portfolio, backtest & forecast
Premium analytics; all long-only by default so weights are investable.
- Minimum variance
- min wᵀΣw subject to Σw = 1, w ≥ 0
- Long-only clamps negative weights to zero and renormalises.
- Tangency (max Sharpe)
- max (wᵀμ − R_f) ÷ √(wᵀΣw)
- Unconstrained tangency can short and lever; the UI runs it long-only.
- Risk parity
- weights such that each asset contributes equal risk
- Iterative solution, not a closed form.
- Efficient frontier
- the set of (σ, μ) points from minimum variance to maximum return
- Backtest
- SMA-crossover entries/exits on adjusted closes
- Reports total/annualised return, Sharpe, max drawdown, win rate, equity curve and alpha/beta vs a benchmark.
- Forecast
- OLS trend, lag-1 autocorrelation, mean-reversion z-score, rolling volatility, day-of-week seasonality
- Descriptive statistics, not a price prediction — the UI says so.
Dividends & ETF grades
- Dividend yield
- trailing 12-month dividends ÷ price
- Trailing, from actual ex-dates — not a forward estimate.
- Dividend grades
- yield, consistency, growth and safety, each graded A–F
- Safety uses payout ratio and cash-flow coverage.
- ETF factor grades
- Σ (constituent weight × constituent factor score) ÷ Σ scored weight
- Weights come from the newest N-PORT snapshot only. A bond CUSIP has no ticker and contributes nothing — it is not scored zero.
- ETF coverage
- scored weight ÷ total weight
- Shipped alongside every ETF grade. A bond fund can score a tiny slice of its portfolio, and the UI warns below 20%.
Data limits — what is deliberately not shown
Honest gaps matter more than a full-looking page. A null here means unknown, never zero.
- Fundamentals start ~2009
- SEC XBRL mandate
- Pre-2009 statements exist only as filing documents, not structured data. Any all-time fundamental series would be incomplete before then.
- Historical score is price-only
- price history exists since listing; point-in-time fundamentals do not
- Using today's latest statement to score 1995 would be look-ahead bias, so the history series excludes fundamental factors and says so.
- ETFs have no fundamentals
- —
- A fund files N-PORT/N-CSR, not 10-K/10-Q, and SEC companyfacts returns 404 for a fund CIK. ETFs get a Fund Overview (fee, AUM, issuer, holdings) instead.
- No paid feeds
- —
- Every figure comes from SEC EDGAR, Yahoo's delayed chart endpoint, FRED, FINRA, BLS, ECB or DefiLlama. Real-time intraday is out of scope by design.
- Nothing here is investment advice
- —
- Scores are mechanical summaries of reported data. They can be wrong and they do not know your circumstances.