Results Scan · Strength Score Reference

0–100 composite score. Max raw ≈ 113 pts → capped at 100 after miss penalty. Cache key: v21

1 · Sales Growth

15 pts max (YoY 10 + QoQ 5)
Sub-componentConditionPointsFormula
Sales YoY Sales growth > 0% YoY 0 – 10 min(salesYoy, 30) / 30 × 10
30%+ YoY → full 10 pts  |  15% → 5 pts  |  ≤ 0 → 0
Sales QoQ Sales growth > 0% QoQ 0 – 5 min(salesQoq, 20) / 20 × 5
20%+ QoQ → full 5 pts  |  Banks: Revenue used when Sales = 0

2 · Net Profit Growth

12 pts max (YoY 8 + QoQ 4)
Sub-componentConditionPointsNotes
NP YoY (normal) Prev year base > 0  &&  NP YoY > 0 0 – 8 min(npYoy, 60) / 60 × 8
NP YoY (turnaround) Prev year base ≤ 0  &&  current NP > 0 3 Fixed credit — growth % not used (avoids 2600% inflation)
NP QoQ (normal) Prev quarter base > 0  &&  NP QoQ > 0 0 – 4 min(npQoq, 30) / 30 × 4
NP QoQ (turnaround) Prev quarter base ≤ 0  &&  current NP > 0 2 Fixed credit

3 · EBITDA (Operating Profit) Growth

8 pts max (YoY 6 + QoQ 2)
Sub-componentConditionPointsFormula / Notes
EBITDA YoY Prev year OP > 0  &&  YoY growth > 0 0 – 6 min(ebitdaYoy%, 50) / 50 × 6
EBITDA YoY (turnaround) Prev year OP ≤ 0  &&  current OP > 0 2 Fixed credit
EBITDA QoQ Prev quarter OP > 0  &&  QoQ growth > 0 0 – 2 min(ebitdaQoq%, 20) / 20 × 2
EBITDA QoQ (turnaround) Prev quarter OP ≤ 0  &&  current OP > 0 1 Banks: OP = Revenue − Interest (NII proxy)

4 · Cash Flow Quality (CFOOP)

10 pts max  ·  3-year average OCF / Net Profit %
Avg CFOOP (3 yrs)PointsMeaning
≥ 120%10Excellent — cash far exceeds reported profit
≥ 100%8Strong — all profit backed by cash
≥ 80%6Good
≥ 50%4Acceptable
< 50% or missing0Poor or no data

5 · Growth-to-PE (PEG proxy)

15 pts max (−3 penalty for negative growth)
Ratio = avgGrowth / PEPointsNotes
≥ 2.515Deeply undervalued relative to growth
≥ 1.812
≥ 1.29
≥ 0.757
≥ 0.54
≥ 0.251
≥ 0.00
< 0 (negative avg growth)−3NP YoY capped at 100% before averaging

avgGrowth = (min(NP YoY, 100%) + Sales YoY) / 2

6 · Consistency Bonus

10 pts (all-or-nothing)
ConditionPointsMetrics checked
≥ 4 of 5 metrics positive 10 NP YoY, NP QoQ, Sales YoY, Sales QoQ, EBITDA YoY
< 4 positive 0

7 · Earnings Surprise Rate

20 pts max  ·  last 8 quarters
Beat ratePointsExample
8 / 820100% beat rate
6 / 81575%
5 / 81362.5%
4 / 81050%
2 / 8525%
0 / 80Beat = NP YoY > 15%; formula: beatQty / totalQ × 20

★ New Quality Signals  Edit thresholds in ConcallScan.aspx.cs lines ~431–478

A · ROCE

10 pts max  New
ROCE %PointsSignal
≥ 25%10Exceptional capital allocator / moat
≥ 20%8Strong compounder
≥ 15%5Good
≥ 10%2Acceptable
< 10%0Weak or no data

B · Debt-to-Equity

+5 to −8  New
D/E ratioPointsSignal
= 0 (debt-free)+5Zero financial risk
≤ 0.5+3Conservatively financed
≤ 1.00Neutral
≤ 2.0−3Elevated leverage
> 2.0−8High risk — debt servicing may eat profits

C · Institutional & Promoter Conviction

5 pts max  New
ConditionPointsSource field
FII increasing (quarter-on-quarter)+2Instrument.FiiIncreasing
Promotor ≥ 50% AND Promotor increasing+2Instrument.PromotorHolding / PromotorIncreasing
Neither FII nor DII decreasing+1No smart-money exits this quarter

D · Promoter Pledge Penalty

Penalty  New
Pledged %PenaltyMeaning
≤ 10%0Acceptable
> 10%−2Minor concern
> 30%−5Significant stress
> 50%−10Major red flag — lender sell-off risk

E · Free Cash Flow Quality

3 pts max  New
FCF > 0 in last 3 fiscal yearsPointsSignal
3 of 3 years positive3Consistently self-funding
2 of 3 years positive2Usually positive
1 or 0 of 3 years positive0Capital-hungry or FCF negative

Penalties

ConditionEffectNotes
Miss streak ≥ 2 consecutive quarters −20 pts Applied to strengthRaw before cap; floor = 0
Negative avgGrowth (G2PE) −3 pts avgGrowth < 0
D/E > 2.0 −8 pts Via debtScore
Pledge > 50% −10 pts Via pledgePenalty

Score Weight Summary

1. Sales Growth15 pts
2. NP Growth12 pts
3. EBITDA Growth8 pts
4. CF Quality (CFOOP)10 pts
5. Growth-to-PE15 pts
6. Consistency Bonus10 pts
7. Earnings Surprise20 pts
A. ROCE ★10 pts
B. Debt-to-Equity ★+5 / −8
C. Institutional ★5 pts
D. Pledge Penalty ★0 / −10
E. Free Cash Flow ★3 pts
Miss Streak ≥ 2−20
Final cap0 – 100
Max raw score (no penalties) ≈ 113 pts → capped at 100
Strong filter criteria: recentResultCount > 0  ·  beatQty ≥ 5/8  ·  NP YoY > 15%  ·  NP base > 0  ·  NP QoQ > 0  ·  prev NP > 0  ·  Sales YoY > 5%

Stock Screener · Composite Score  ScreenerRow.cs · max 20 pts

Screener Score Breakdown

Max 20 pts · filters: Min Score dropdown
LayerSignalPointsSource
InstitutionalMF Accumulating (positive avg change ≥ 2 of last 3 periods)+2MFHoldingHistory · last 4 months
FII Increasing (quarter-on-quarter)+1ShareholdingPattern.FiiIncreasing
DII Increasing+1ShareholdingPattern.DiiIncreasing
Promoter not decreasing+1!PromotorDecreasing
EarningsStrength ≥ 70+3StrengthScore.Compute() — see above
Strength 50–69+2
Strength 25–49+1
Growth ★Avg YoY sales growth ≥ 20% across recent quarters+2salesGrowthAvg in ScreenerRow
Avg YoY sales growth 12–19%+1avg of YOYSalesGrowthPercentage across resultList
Accelerating — latest 2 qtrs avg > prior 2 qtrs avg by +2 pp+1needs ≥ 4 quarterly results
GuidanceBullish concall sentiment+2ConcallProjection.Sentiment
Strong guidance metrics ≥ 2+2Improving + Strong direction/strength
Avg concall confidence ≥ 0.8+1AvgConf across Metrics
TechnicalPrice above SMA 61+1Instrument.SMA61
Price above SMA 200+1Instrument.SMA200
RSI 50–75 (healthy momentum)+1Instrument.RSI12

Fast Mover — Trend Column & Filter

GrowthMomentum field · computed from up to 8 quarterly Result records

The Trend column in the screener table and the Fast Mover only layer filter both derive from GrowthMomentum — a string computed in ScreenerRow.cs using the same resultList already fetched for earnings quality. No extra DB query.

BadgeConditionScore contribution
⚡ FastsalesGrowthAvg ≥ 15% OR (salesGrowthAvg ≥ 10% AND accelerating)Qualifies for "Fast Mover only" layer filter
▲ GrowingsalesGrowthAvg ≥ 8%
→ StablesalesGrowthAvg ≥ 0%
▼ SlowingsalesGrowthAvg < 0%
No quarterly results with sales > 0No data

salesGrowthAvg: average of YOYSalesGrowthPercentage across all Result records where Sales > 0 and growth ≠ 0 (up to 8 quarters).
Accelerating: true when (avg of 2 most-recent quarters' YoY growth) > (avg of next 2 prior quarters) + 2 pp. Requires ≥ 4 data points.
npGrowthAvg: also computed (avg of NetProfitChangePctYOY) and returned in JSON but not shown as a separate column — used by the PEG/Valuation columns below.
Summary pill: "⚡ fast mover" pill in the results bar shows the count of Fast-tier stocks in the current result set.

Sector Filter

Screener.aspx & WealthShortlist.aspx

The Sector field on both pages is a server-rendered <select> (BindSectorDropdown() in each code-behind, populated from Sector.GetAll(SectorIndustryType.Sector)) — not free text. The selected option's value is the sector's numeric ID, sent to data.aspx as sectorId and matched exactly against Instrument.SectorIndustryLink (no substring matching, no name lookup needed).

PE / PEG / Valuation Columns

ScreenerRow.cs · Pe, PeEstimated, Peg, Valuation
FieldSourceNotes
PeInstrument.PE (broker/fundamentals feed)When the feed value is 0, falls back to LTP / trailing-4Q EPS — EPS summed from quarterly Result.EPSInRs, filtered to ResultPeriod.Quarter and re-sorted to the newest 4
PeEstimatedboolTrue when the fallback above was used instead of the feed value — the table shows a * next to PE with an explanatory tooltip
PegPe / NpGrowthAvg0 (shown as —) when Pe ≤ 0 or NpGrowthAvg ≤ 0
Valuationderived from PegCheap ≤ 1 · Fair ≤ 1.5 · Expensive > 1.5 · N/A when Peg ≤ 0

Wealth Shortlist · Verdict Tiers  WealthShortlist.aspx · ScreenerRow.Verdict()

Verdict Logic

Same ScreenerRow engine as the Screener, stricter defaults
VerdictConditionNotes
★ StrongScore ≥ 12 AND NpGrowthAvg > 0 AND De ≤ 1.5 AND Valuation ≠ ExpensiveAll four conditions must hold
WatchScore ≥ 8Doesn't clear the Strong bar
weak (filtered out)Score < 8Excluded entirely under the page's default Min Score filter (8+)

Differences from the Stock Screener defaults: Min Score starts at 8+ (vs. Screener's "Any"), and the Universe toggle defaults to All equities (fnoOnly=false) rather than F&O-only, since F&O eligibility is a liquidity/derivatives signal, not a quality one.

Column Reference  how each display column is computed

OPM% Column

Operating / NII Margin

OPM% has a different meaning depending on the company type. The column always shows the closest structural equivalent to "how much of each revenue rupee survives after the core cost of doing business."

Company type Formula shown Why
Non-financial
FMCG, IT, Pharma, Auto…
OPMPercentage from DB
(stored by the result scraper)
Traditional operating margin: Sales − Raw Material − Employee − Other Expenses = OP; OPM% = OP / Sales × 100
Bank / NBFC
ICICIBANK, HDFCBANK…
(Revenue − Interest) / Revenue × 100
NII Margin, computed on-the-fly
Banks have no "Sales". Their product is money; cost of product = interest paid on deposits. Net Interest Income (NII) is structurally identical to Gross Profit for a manufacturer.
Insurance
ICICIPRULI, SBILIFE…
OPMPercentage from DB
(may be negative in high-claims quarters)
Insurance OPM is volatile — large claims in one quarter can flip the margin negative. Negative values are shown in red; zero is shown as —.

Why not use stored FinancingMarginPercentage for banks?
The scraper stores FinancingProfit = Revenue − Interest − Operating Expenses (and sometimes provisions). For banks with high provisions or opex, this figure can turn negative even when the bank is highly profitable (e.g. ICICIBANK FY26 Q4: stored FinancingMarginPercentage = −29%, actual NP = ₹15,681 Cr). The on-the-fly NII% is always positive for a solvent bank and is directly comparable across all banks.

Code reference: ConcallScan.aspx.cs → CalcOpm(Result r) — priority: OPMPercentage (if non-zero) → FinancingMarginPercentage (if > 0) → (Revenue − Interest) / Revenue × 100 (if Sales = 0 and Revenue > 0).