Methodology
Model v9.2.70 · Last updated 12 May 2026
1. Universe
The model scores a canonical 33-ticker NGX universe defined in code asSECTOR_MAP. Membership is intentionally narrow: each ticker must have ≥ 60 days of liquid price history, a verifiable sector classification, and an active listing on the Nigerian Exchange as of the most recent ingestion run. Tickers that delist, get acquired, or fall outside the liquidity floor are removed from SECTOR_MAPand their per-ticker rows are atomically purged across nine downstream tables to prevent stale rows surfacing in any read path.
The 33-ticker boundary reflects deliberate selectivity, not technical constraint. Frontier markets carry meaningful idiosyncratic risk per name; concentration on the well-covered, deeply-traded subset of NGX produces more defensible signals than blanket coverage.
2. Factor stack
The composite alpha score is a weighted blend of nine factors. Weights were rescaled uniformly by 0.9× in v9.0.0 to make room for two alternative-data signals; the residual 10pp of weight is allocated to MD&A NLP scoring and an earnings-surprise factor. The full set sums to 1.000.
| Factor | Weight | Source |
|---|---|---|
| Momentum | 22.5% | 12-month price trajectory with skip-month |
| Relative strength | 18.0% | Cross-sectional rank vs NGX universe |
| Value | 13.5% | Sector-aware P/E, P/B, dividend yield vs NTB hurdle, two-stage DDM for banks |
| Liquidity | 13.5% | 20-day median NGN volume |
| Volatility | 10.8% | 20-day Garman-Klass realised volatility |
| Quality | 9.0% | Six-component sector-aware composite + EPS-trajectory gate |
| MD&A NLP | 8.0% | 120-phrase Nigeria-tuned lexicon, section-weighted |
| Mean reversion | 2.7% | Short-horizon excess-return reversal |
| Earnings surprise | 2.0% | Post-earnings drift from BEAT/MISS events |
Sector-aware components mean a bank's P/B is scored against the banks median, not the consumer-staples median. The two-stage dividend discount model is applied only to the Banking sector, where the Gordon-growth denominator goes pathological at the ROE × retention levels Nigerian banks routinely produce. Damodaran two-stage DDM is the standard remedy.
3. Overlay pipeline
After the factor composite is computed, alpha is adjusted by six overlay layers exposed at /api/factors.overlays:carry, fx_direction, mie,pai, regime, and seasonal. Each layer captures information the underlying factor inputs cannot. The pipeline is strictly sequenced and the cumulative absolute adjustment across all six layers is capped at 20 percentage points.
- Carry penalty (0 to −8pp) — applied uniformly when NTB 364D exceeds the model's dynamic hurdle threshold. Reflects the bar that risk assets must clear to justify substitution away from a risk-free yield. Live values exposed at
/api/factors.overlays.carry.{ntb_364d, threshold_pct, penalty_pp}. - FX direction overlay (±10pp) — applied uniformly to the universe from a seven-signal NGN composite (NAFEM trajectory, reserves drift, NTB / NAFEM divergence, oil-led FX pressure, remittance shocks, IMF / fiscal posture, regime carry). Asymmetric: depreciation penalty is steeper than appreciation premium because NGN weakness historically hurts equity multiples more than strength helps them. Exposed at
/api/factors.overlays.fx_direction. - Macro Intelligence Engine (MIE) — five sub-signals (FAAC allocations, NIBSS payment activity, MPC outcome surprise, INSIDER director-dealings disclosures, BPP procurement activity) blended into a per-ticker composite. Confidence-gated: when completeness is low across sub-signals, MIE's contribution decays toward zero rather than fabricating a signal. Exposed at
/api/factors.overlays.miewithactive_signalsandconfidence_gatedfields. - Port Activity Index (PAI) — AIS vessel tracking (aisstream.io), freight cost (FRED Brent), NPA throughput, CBN FX utilisation, and news sentiment (RSS feeds). Dynamic confidence ceiling based on per-source freshness; PAI cannot exceed its ceiling regardless of raw signal strength. Exposed at
/api/factors.overlays.pai. - Regime gating — final signal labels (HIGH CONVICTION / OVERWEIGHT / NEUTRAL / UNDERWEIGHT) are reassigned per the current HMM regime after all alpha adjustments complete. Three regimes (BULL / TRANSITION / BEAR) carry distinct conviction thresholds (table below). Exposed at
/api/factors.overlays.regime.{active, thresholds}. - Seasonal — per-month return distribution from the available NGX history applied as a uniform tilt. Disclosed with
data_yearsandmethodologyfields so consumers can see how many history years feed the current month's tilt. Exposed at/api/factors.overlays.seasonal.
4. Regime gating
Final signal labels (HIGH CONVICTION / OVERWEIGHT / NEUTRAL / UNDERWEIGHT) are reassigned per current HMM regime after all overlay adjustments complete. The regime is computed monthly from a three-state hidden Markov model trained on NGX market breadth + ASI return observations.
| Regime | HIGH CONVICTION | OVERWEIGHT | NEUTRAL |
|---|---|---|---|
| BULL | ≥ 72 | ≥ 57 | ≥ 38 |
| TRANSITION | ≥ 75 | ≥ 60 | ≥ 40 |
| BEAR | ≥ 82 | ≥ 65 | ≥ 45 |
The bear-regime bar is the highest. Asymmetric thresholds reflect that conviction in a contracting tape requires more evidence than the same conviction in an expanding tape. When the HMM's breadth coverage falls below 50%, a confidence haircut is applied and the regime uncertainty flag fires; clients should treat regime-conditional labels with appropriately reduced weight when this flag is visible.
5. Source authority — CFA V(A) / V(B) compliance
Every factual datapoint displayed on the platform carries a machine-classified source authority tier. The classification is shared across the codebase (see scrapers/source_authority.py) and surfaced as a coloured badge on every research-grade panel.
- PRIMARY — direct exchange filing (NGX X-Filings, issuer IR page, regulator publication). Satisfies CFA Standard V(A) reasonable basis without further corroboration.
- SECONDARY — verified news outlet (Nairametrics, Punch, Vanguard, BusinessDay, Reuters, Bloomberg, others on a maintained trusted-outlet registry). Satisfies V(A) when the value corroborates a primary source.
- PROMOTED — hand-curated override from offline verification. Reviewed by the operator and accepted into the override registry; subject to periodic re-verification.
- TERTIARY — single intel-feed mention without corroboration. Routed to the corroboration staging table and quarantined from the display surface until a SECONDARY-or-higher source agrees within 5% tolerance.
- SEEDED — bootstrap hardcoded value pending primary capture. Flagged in the UI; will be replaced when the auto-capture pipeline ingests the underlying release.
Ratio metrics (P/E, ROE, P/B, net margin) inherit the weakest authority of their constituent inputs. A ROE computed from FY2025 P&L tagged TERTIARY against FY2024 balance sheet tagged PROMOTED renders as TERTIARY, with the mixed-period amber pill explaining the cross-period mismatch.
6. Audit trail — CFA III(D)
Every supersession of a factual value is preserved in the earnings_actuals_history table via a database trigger. When a captured value is corrected, restated, or superseded by a higher-authority source, the prior row is copied into history with the superseding source, timestamp, and reason recorded. The trigger fires on every UPDATE and DELETE; no application-level code path can bypass the audit trail.
This satisfies CFA Standard III(D) Performance Presentation by guaranteeing that any prior value displayed on the platform on a given date can be reconstructed from the audit trail on request.
7. Rebalancing cadence
The rebalancing engine runs on a three-tier policy:
- Tier 1 — Full rebalance: quarterly (March / June / September / December). 30% per-name turnover cap, cost gate requiring alpha > 1.5× round-trip transaction cost.
- Tier 2 — Tactical: monthly (second Tuesday). 10% turnover cap, momentum-delta threshold of 15 points. A 10-day quarterly blackout around the Tier 1 window prevents whipsaw.
- Tier 3 — Event-triggered: 24-to-48-hour response window for CBN MPC moves ≥ 50bps, HMM regime flips, Global Macro Flag (GMF) red flags, Brent ± 15%, sovereign rating actions, and circuit-breaker clusters.
Continuous monitors flag positions for the next eligible window when absolute score drift exceeds 20 points or position weight drifts more than 5pp from target. Drift signalling does not auto-rebalance; it surfaces flags for operator review.
8. Data integrity guards
Several architectural guards constrain the data the model can ingest:
- Circuit breaker on factor-engine availability with a last-known-good cache and three-tier degradation (CLOSED → OPEN → EMERGENCY → CATASTROPHIC). API responses include a
_circuit_breakerfield whenever stale or degraded data is served, so the UI can render the appropriate banner. - Data anomaly detector pre-validates every price and macro write against historical bounds (price range, daily-return cap, volume-spike threshold, macro-series sanity range). Anomalous values are rejected at the boundary, not flagged after persistence.
- Corroboration gate at the earnings-capture entry point routes TERTIARY-tier captures into a staging table that never feeds the display surface. Promotion requires either a SECONDARY+ source agreement within 5% or explicit operator action.
- Anti-broadcast guard on the intel-feed parser rejects single-value-to-multiple-ticker attribution and validates per-ticker proximity in the source text before any write.
9. Backtest disclosure
Walk-forward backtest results published on the Track Record page report full error history including exception periods. Returns are computed net of frictional cost assumptions and benchmarked against the All-Share Index (ASI). Backtest construction uses point-in-time universe data drawn from the sector_map_history audit table to avoid survivorship bias. Backtest annualised metrics carry a ±300% sanity bound; cumulative metrics are uncapped on the grounds that legitimate multi-year frontier-market alpha can and does exceed 100%.
10. Disclaimers
Model labels follow strict regulatory conventions: NairAlpha uses HIGH CONVICTION / OVERWEIGHT / NEUTRAL / UNDERWEIGHT. The platform does not publish BUY / SELL / HOLD recommendations, price targets, or any language that constitutes investment advice. All quantitative outputs are model-derived; they are not personalised, do not consider an individual's circumstances, and are not a substitute for a licensed adviser. See the Terms of Service for the full disclosure framework.
Versioning
Methodology version tags this document follows the same version sequence as the production model. See the changelog for the full release history of material methodology changes.