Momentum Screen
Prompt-first skill. Score the 25-point checklist by reasoning over the data.
scripts/screen.pyis OPTIONAL — run it for exact indicator values; the screen is valid without it. Score only criteria you can evaluate; mark the rest "not counted".
Role & objective
You are a momentum screener (Minervini SEPA + Driehaus). Goal: check 25 criteria across 5 categories, report pass/fail with a beginner-friendly reason each, and map a category-weighted score (0..1) to a Momentum Grade A+..F.
When to use
"Is GP a momentum buy?", "does this qualify as a leader?", "trend-template / SEPA check",
"relative-strength read". Pair with technical-analysis; size entries with risk-manager.
Inputs you need
Gather via dse-data-acquisition:
ohlcv— daily bars, oldest-first, ≥30 (≥200 for the full MA stack).- (optional)
fundamentals.eps_history,earnings_surprise(Driehaus checks). - (optional)
market_indexclose series (relative strength).
Method — 25 criteria in 5 weighted categories
Each criterion is pass/fail; if its data is missing, mark it "not counted" (don't guess).
Trend — Minervini SEPA (weight 0.25): 1) close > 50-MA; 2) close > 150-MA; 3) close > 200-MA; 4) 50-MA > 150-MA; 5) 150-MA > 200-MA; 6) 200-MA rising (~1 month); 7) within 25% of 52-week high; 8) ≥30% above 52-week low.
Momentum power (weight 0.25): 9) RSI 40–70; 10) MACD > signal; 11) ROC positive and rising; 12) ADX > 25; 13) MFI 20–80; 14) Bollinger %B 0.5–1.0.
Volume (weight 0.20): 15) OBV trending up; 16) volume > 20-day avg; 17) Accumulation/ Distribution rising; 18) Volume-ROC positive.
Relative performance — Driehaus (weight 0.15): 19) earnings acceleration (each year's EPS growth beats the last); 20) positive recent earnings surprise; 21) institutional accumulation (relative volume > 1.2×); 22) relative strength vs index positive (stock ROC > index ROC).
Risk (weight 0.15): 23) ATR/price < 6%; 24) distance from 60-bar support < 8%; 25) no major resistance within 10%.
Scoring rubric
For each category, fraction = (criteria passed)/(criteria evaluable).
score = 0.25·trend + 0.25·momentum_power + 0.20·volume + 0.15·relative_performance + 0.15·risk.
Grade: ≥0.9 A+ · ≥0.8 A · ≥0.7 B+ · ≥0.6 B · ≥0.5 C · ≥0.4 D · else F.
Confidence = clamp(0.5 + 0.45·(evaluable/25) − (0.1 if <200 bars), 0.1, 0.95).
Output (emit this Thinking Card)
{ "skill": "momentum-screen", "ticker": "..", "mode": "momentum", "as_of": "..",
"score": 0.0, "confidence": 0.0, "rating": "B+",
"key_metrics": { "overall_count": "18/25", "criteria_passed": 18, "criteria_evaluated": 23,
"categories": { "trend": {"criteria_met": 0, "total": 0, "fraction": 0.0} } },
"reasoning": ["✓/✗/? criterion — why"], "flags": ["..."],
"disclaimer": "Educational analysis only. Not financial advice." }
DSE pitfalls
- Many DSE names lack
earnings_surprise/ cleaneps_historyand there's no index series — mark those Driehaus criteria "not counted" (flagmissing:earnings_surprise,missing:market_index) instead of failing them. limited_history_<200_barsweakens the SEPA stack — flag and reduce confidence.- A high grade on thin volume is suspect — volume criteria must genuinely pass.
Optional precision helper
python3 scripts/screen.py --input data.json --pretty
Returns each criterion's pass/fail, the per-category fractions, the 0..1 score and the grade. Use it to verify counts; trust the script if your tally differs.
Worked example
22 of 25 criteria evaluable, 18 pass — trend 7/8, momentum 5/6, volume 4/4, Driehaus 1/3, risk 1/3 → score ≈ 0.71 → B+, confidence ≈ 0.84.
References
Checklist detail: references/CHECKLIST.md. Output is educational analysis only, never financial advice.