Trading Deskquantitative screening

Scoring model

Every weight, every metric, and the assumptions behind the ranking

How a score is built

  1. Each instrument is measured on 29 raw metrics computed from its own price history and filings.
  2. Every continuous metric is converted to a percentile rank within its own market — not scored against an absolute threshold. A P/E of 30 means different things on the S&P 500 and the KLCI, and any fixed cut-off that suits one market empties or floods the other.
  3. Boolean signals score 0 or 100. RSI is banded rather than ranked, so an overbought 95 scores below a healthy 60 instead of winning.
  4. Metrics roll up into six dimensions, then into one weighted total. A metric with no data drops out and its weight is redistributed, rather than counting as zero.

What this does not tell you

Dimensions and weights

Fundamental quality

20% of total

Growth, profitability, leverage and valuation from the most recent trailing-twelve-month figures the market had seen as of the run date.

MetricDirectionWeight in dimension
Revenue growth YoYHigher is better10%
Earnings growth YoYHigher is better10%
EPS growth YoYHigher is better10%
Return on equityHigher is better15%
Net marginHigher is better10%
Free cash flow marginHigher is better10%
Debt to equityLower is better15%
P/ELower is better10%
P/BLower is better10%

Technical trend

25% of total

Where price sits against its own moving averages, and whether the shorter-term structure confirms the longer-term one.

MetricDirectionWeight in dimension
Price above 50-day MAYes / no15%
Price above 200-day MAYes / no20%
50-day above 200-dayYes / no20%
MACD above signalYes / no15%
RSI (14)Best between 45 and 7015%
Position in 20-day rangeHigher is better15%

Momentum & structure

25% of total

Trailing performance across three horizons, weighted toward the medium term, plus how steadily that performance was delivered.

MetricDirectionWeight in dimension
20-day returnHigher is better15%
60-day returnHigher is better25%
120-day returnHigher is better25%
Trend consistencyHigher is better20%
Near 52-week highHigher is better15%

Relative strength

15% of total

Performance against the market benchmark. The one dimension that still discriminates when every absolute return is negative.

MetricDirectionWeight in dimension
Excess return vs index, 60dHigher is better40%
Excess return vs index, 120dHigher is better35%
RS line slope, 60dHigher is better25%

Volume confirmation

10% of total

Whether the move is backed by participation, and whether the name is liquid enough to actually trade.

MetricDirectionWeight in dimension
Volume expansion (20d vs 60d)Higher is better50%
Avg daily turnoverHigher is better50%

Risk profile

5% of total

Volatility, historic drawdown and gap exposure. Every metric here is inverted: a calmer instrument scores higher.

MetricDirectionWeight in dimension
Annualised volatilityLower is better30%
Max drawdown, 1yLower is better30%
Largest overnight gapLower is better20%
ATR as % of priceLower is better20%

Gates applied before scoring

GateRuleWhy
Minimum history200 daily barsThe 200-day moving average is the longest window the model reads.
Liquidity, US5,000,000 USD/dayAverage daily traded value over 20 sessions. A name that cannot be entered and exited at size is not an opportunity, and leaving it in distorts every percentile around it. The floors differ because Bursa is an order of magnitude thinner — one shared floor would empty it.
Liquidity, Bursa500,000 MYR/day

Weights are stored in trading.weight_profiles and read at run time, so changing how the model ranks needs no deploy and every past run stays reproducible against the weights it actually used.