Published formulas · engine v2 · every number auditable
Methodology
Every number shows its work.
This page is the contract: the bands, weights and gates below are imported from the same code that computes every score, so what you read here is what runs. Scores are 0–100 integers by linear interpolation between the band edges. When a component's data is missing, it is shown as missing and the remaining weights are re-balanced — a score is never invented. Automated analysis for information & education; not investment advice.
Value — what you pay vs what you get
| Component | Weight | Scoring band (0 ←→ 100) |
|---|---|---|
| P/E vs absolute bands (loss-making scores 0, with the reason shown) | 25 | ≥25 → 0 … ≤6 → 100 |
| P/B vs absolute bands | 20 | ≥3.0 → 0 … ≤0.8 → 100 |
| Earnings yield minus the 364-day T-bill rate | 20 | spread ≤ −5pp → 0 … ≥ +5pp → 100 |
| P/E vs the counter’s own 3-year average | 15 | ≥1.5× → 0 … ≤0.6× → 100 |
| Dividend yield vs the counter’s own 3-year average | 10 | ≤0.5× → 0 … ≥1.5× → 100 |
| Revenue/earnings growth, year on year | 10 | ≤ −10% → 0 … ≥ +20% → 100 |
The distinctive component is the T-bill spread: a share's earnings yield must be judged against Kenya's risk-free alternative, taken from our own CBK series. The two own-history comparisons switch on as owned price history accumulates; until then they read "needs history".
Quality — is the business good
| Component | Weight | Scoring band (0 ←→ 100) |
|---|---|---|
| Return on equity | 25 | 0% → 0 … ≥25% → 100 |
| Net profit margin (sector-class bands) | 20 | financial: 0 → 0 … ≥30% → 100 · other: 0 → 0 … ≥20% → 100 |
| Net-margin trend over the observed window | 15 | ≤ −5pp → 0 … ≥ +5pp → 100 |
| Return on assets | 15 | −5% → 0 … ≥20% → 100 |
| Debt/equity (financial sector judged on leverage bands of its own) | 15 | standard: ≥3.0× → 0 … 0 → 100 · financial: ≥12× → 0 … ≤4× → 100 |
| Revenue stability (worst annual decline) | 10 | decline ≥30% → 0 … never declined → 100 |
Ratios are derived from raw statement lines — net income, equity, assets, revenue — never copied from published summaries. Banks are scored on financial-sector bands where the economics differ (margins, leverage); the page for each counter says which bands applied.
Financial health — will it survive
The Piotroski F-Score: nine binary checks across two consecutive annual statements — profitability (positive earnings, positive operating cash flow, improving returns, cash backing profits), balance-sheet direction (falling leverage, improving liquidity, no share dilution) and efficiency (improving margins and asset turnover). F/9 maps to 0–100 at weight 70; interest coverage (0× → 0 … ≥10× → 100) carries weight 30. Financial-sector counters skip interest coverage — interest is their revenue — and use a capital-adequacy variant of the leverage check. Signals that cannot be observed are excluded and the score normalizes over what was observable, marked as a shorter window.
Dividend reliability — the hero factor
| Component | Weight | Scoring band (0 ←→ 100) |
|---|---|---|
| Payout consistency — FYs paid ÷ FYs observed (design window 5) | 30 | 0/5 → 0 … 5/5 → 100 |
| Current yield (capped — pairs with the Yield-Trap flag) | 20 | 0% → 0 … ≥8% → 100 |
| Coverage — EPS ÷ DPS | 20 | ≤0.8× → 0 … ≥2.5× → 100 |
| DPS stability — worst annual cut observed | 15 | cut ≥50% → 0 … never cut → 100 |
| Payout-ratio sustainability (both directions penalized) | 15 | 0% → 0 … 30–60% → 100 … ≥120% → 0 |
Nairobi is an income market, so consistency carries the top weight: a counter that has paid every observed year outranks one that paid big once. A high yield alone is not enough — the Yield-Trap flag fires at ≥8% yield with weak coverage or patchy consistency.
Liquidity — can you get out
| Component | Weight | Scoring band (0 ←→ 100) |
|---|---|---|
| Median daily turnover, 90-day window (log scale) | 40 | ≤KES 10K/day → 0 … ≥KES 100M/day → 100 |
| Share of days with zero trades | 30 | ≥50% of days → 0 … 0% → 100 |
| Median daily turnover ÷ market capitalisation | 30 | 0bp/day → 0 … ≥10bp/day → 100 |
Liquidity is also a gate: below 30, no model view is ever shown for the counter — only the fact "thinly traded". A bargain you cannot exit is not a bargain.
Momentum — switched off, honestly
Momentum activates only once we hold at least 182 days (~6 months) of our own daily price history. Until then every surface reads "Building history — since 2026-07-07" and the composite re-balances around it. We do not compute trend signals on history we do not hold.
Composite & sector weights
The composite is the weighted average of available pillars using the sector's profile below (weights re-balance around unavailable pillars). Profiles reflect what drives each sector: financial health for banks and insurers, dividends for REITs and agriculture, liquidity for ETFs.
| Sector | Value | Quality | Momentum | Fin. health | Dividend | Liquidity |
|---|---|---|---|---|---|---|
| Banking | 20 | 25 | 10 | 25 | 15 | 5 |
| Telecommunication | 20 | 20 | 25 | 15 | 10 | 10 |
| Manufacturing and Allied | 25 | 20 | 10 | 20 | 20 | 5 |
| Insurance | 20 | 20 | 10 | 30 | 15 | 5 |
| Agricultural | 25 | 15 | 10 | 20 | 25 | 5 |
| Energy and Petroleum | 20 | 20 | 20 | 20 | 15 | 5 |
| Construction and Allied | 25 | 20 | 15 | 25 | 10 | 5 |
| Commercial and Services | 20 | 25 | 20 | 15 | 10 | 10 |
| Investment | 30 | 20 | 10 | 15 | 20 | 5 |
| Investment Services | 20 | 25 | 20 | 15 | 10 | 10 |
| Real Estate Investment Trusts | 25 | 10 | 5 | 20 | 35 | 5 |
| Automobiles and Accessories | 25 | 25 | 15 | 20 | 10 | 5 |
| Exchange Traded Funds | 25 | 10 | 30 | 5 | 5 | 25 |
Data confidence & the uncertainty gate
Every counter carries a grade built from three data checks — the grade is how many of them fail. Model views ("appears undervalued / fairly valued / richly priced") appear only at grade A or B and liquidity ≥ 30. Grade C replaces the view with "low data confidence"; grade D hides scores and shows facts only. Thin data or thin trading widens what a counter must clear before anything bullish-looking is displayed.
Confidence grades the DATA, never the investment. Every threshold shown is the exact value the engine uses.
The three checks: Fundamentals age ≤ 12 months · Fundamentals history ≥ 3 years · Price freshness ≤ 2 trading days
Grade A
Fundamentals age ≤ 12 months, Fundamentals history ≥ 3 years, Price freshness ≤ 2 trading days
Every input is current and complete: recent fundamentals, enough history, fresh prices. Nothing is missing or stale.
A grade on the data, not on the investment — it says our inputs are solid, nothing about whether the counter is a good buy.
Grade B
Exactly one of the three checks below fails
One of the three data checks falls short — one input is missing or stale. Everything else is current.
A grade on the data, not on the investment — it says our inputs are solid, nothing about whether the counter is a good buy.
Grade C
Exactly two of the three checks below fail
Two of the three data checks fall short. Model views are withheld and replaced with 'low data confidence' — the data isn't strong enough to support them.
Not a negative view of the counter — a statement that our data is too thin to say much.
Grade D
All three checks below fail, or no financial statements are on file at all
Three checks fall short, or no financial statements are on file at all. Scores are hidden; only raw facts are shown.
Not a warning about the company — it means we don't have enough reliable data to score it.
Archetypes — pattern labels, published thresholds
Archetypes describe patterns in the numbers. They are never recommendations. Every threshold below is the exact value the engine uses — the same number, shown here.
A counter can carry several labels at once. These are independent patterns, not ranked judgments — each simply describes something the data shows.
Income Fortress
Dividend score ≥ 75 AND Financial health score ≥ 60
This counter scores high on dividend strength and sits on financially healthy footing — the two together are what the label points to.
Not a recommendation to buy, and not a promise the dividend continues. It describes two scores being high at once, nothing about future payments.
Stretched Yield
Current yield ≥ 8% AND (Dividend coverage < 1× OR Consistency score ≤ 60)
The yield is unusually high (8%+), and either the company paid out more than it earned (coverage below 1) or its payout history is uneven. A high yield resting on thin support.
Not a warning to sell or avoid, and not a prediction the dividend will be cut. It flags that a high yield is currently backed by weak coverage or inconsistent history — a pattern to understand, then judge for yourself.
Sleeping Compounder
Quality score ≥ 70 AND Value score ≥ 60 AND Liquidity score < 50
Scores well on quality and value, but trades thinly — a counter that looks solid on the numbers yet doesn't change hands much.
Not a claim it will grow, and not advice to buy before others do. It describes strong quality/value scores paired with low trading activity, no more.
Thinly Traded
Liquidity score < 30
This counter trades in low volume — buying or selling meaningful amounts may be hard, and prices can move sharply on small trades.
Not a judgment on the company's worth. It's purely a statement about how much the counter trades.
Radar — pattern discovery, published thresholds
We do not predict. Radar states when a counter matches a named combination of published, factual criteria — nothing about tomorrow's price. Screens 1–3 apply the same uncertainty gate as verdict badges: no counter surfaces on confidence C or D data. Threshold changes are logged decisions (PIN updates), so a card's "why" stays reproducible after the fact.
| Screen | Published criteria |
|---|---|
| PIN-R-01 Quiet Quality | composite ≥ 65 AND confidence ∈ {A, B} AND liquidity below the universe median |
| PIN-R-02 Filing Divergence | composite moved ≥ +8 after a processed filing AND price moved < ±2% over the following 5 sessions |
| PIN-R-03 Yield Trap Watch | trailing dividend yield in the top quartile AND (dividend reliability < 40 OR coverage < 1×) |
| PIN-R-04 Cross-Asset Arithmetic | published fee-vs-net-yield and tax-crossover arithmetic across asset classes — no confidence gate (not a company-level score) |
Limitations we publish
- Fundamentals currently derive from a February 2026 research snapshot, labeled as such on every surface, refreshed per company filing as filings are processed.
- Owned price history began 2026-07-07; history-dependent components state that instead of guessing.
- Market capitalisation uses a shares-outstanding approximation (net income ÷ EPS), labeled wherever used.
- A track record section will appear here once the model has one — published with dates, dividends included, costs stated, never as a headline return figure.
scoring lineage: v1 four-factor (2025) → v3 six-pillar (Feb 2026) → engine v2 (this page) · data heartbeat