The scoring methodology transforms raw financial data into a single comparable number for each stock. This article explains the mathematics behind Z-score normalization, composite scoring, and the statistical techniques that make cross-stock comparison meaningful.
The Normalization Problem
Raw financial metrics exist on incompatible scales. P/E ratios range from 5 to 500. ROE ranges from -50% to +80%. Revenue growth might be -20% to +200%. You cannot add or average these directly — a P/E of 15 and an ROE of 15% are not comparable quantities.
Normalization converts every metric to a common scale so they can be combined mathematically.
Z-Score Normalization
The resulting Z-score tells you how many standard deviations a stock is from the average. A Z-score of +2.0 means the stock is two standard deviations above the mean — better than approximately 97.7% of the universe on that metric.
Properties of Z-Scores
- Mean = 0 — An average stock scores 0 on every metric
- Standard Deviation = 1 — Most stocks fall between -2 and +2
- Direction — Higher is always better (after inversion for metrics where lower is better)
- Sensitivity to outliers — A single extreme value can pull the mean and compress other scores
For metrics where lower is better (P/E, P/B, Debt/Equity), the Z-score is negated: Z = -(X - μ) / σ. This ensures that a cheap stock (low P/E) gets a high positive score, consistent with all other metrics.
Winsorization: Handling Outliers
Financial data regularly contains extreme values. A biotech with no earnings produces an undefined P/E. A company that just completed a massive acquisition might have a temporary debt/equity ratio of 50. These outliers distort Z-scores for every other stock.
Winsorization caps extreme values at the 1st and 99th percentile boundaries. The outlier stock still scores at the extreme end, but it does not pull the distribution and distort scores for normal stocks.
Percentile Rank Alternative
Percentile ranks are inherently outlier-resistant because they only care about ordering, not magnitude. A stock with P/E of 5 and one with P/E of 8 might both be in the 95th percentile if most stocks have P/E above 15. The downside is loss of information — you cannot tell how much better the 95th percentile stock is compared to the 90th.
Two-Level Weighting System
Level 1: Metric Weights (Within Factor)
Each metric within a factor gets an importance weight:
- Off (0) — Metric excluded from the factor score entirely
- Low (0.5) — Half weight. Use for metrics you find less reliable or less relevant
- Medium (1.0) — Standard weight. The default for all metrics
- High (2.0) — Double weight. Use for metrics you consider most important
The factor score is the weighted average of its constituent metric Z-scores.
Level 2: Factor Weights (Between Factors)
The four factor scores are combined into a composite using percentage weights that sum to 100%:
Final Score Normalization
The raw composite score is rescaled to a 0-100 range for readability:
This means the top-ranked stock always scores 100 and the bottom-ranked stock always scores 0. All other stocks are distributed proportionally between them.
A score of 80 means "better than most stocks in this specific universe at this specific time." It does not mean the stock is objectively good. If the entire market is overvalued, even the top-ranked stock may not be a good investment in absolute terms. Always combine quantitative screening with macro context.
Statistical Considerations
- Data Cleaning — Stocks with insufficient data are excluded before scoring. Missing individual metrics are handled per-metric (stock excluded from that metric only)
- Universe Sensitivity — Scores are relative to the chosen index. A stock scoring 90 in the S&P 500 might score differently in the NASDAQ 100 because the peer group changes
- Temporal Stability — Factor scores change as new financial data is reported (quarterly). Momentum scores change more frequently (price-based)
- Multi-collinearity — Some metrics within a factor are correlated (e.g., ROE and ROA). The weighting system lets you turn off redundant metrics if desired