Reference

Parameters

Every filter, threshold, and gate the screener runs on, broken out by category. This mirrors config/thresholds.yaml and the screener code directly — not marketing copy.

Universe FiltersSelects stocks4 params

Applied before a single gate runs — narrows ~1,000+ US tech stocks down to a screenable pool.

ParameterValue
SectorTechnology
Min market cap$1B
Min avg daily $ volume$20M/day
Analyst consensus floorBuy or better
Enforced at the Finviz fetch level via the fa_recom_buy URL filter — not a post-fetch check.
The 8 Screening GatesSelects stocks8 params

A stock must pass every gate to be eligible for ranking. Gates 4 and 6 are structural placeholders — Finviz has no cash-flow or options-flow data, so they always pass as N/A. Gates 7-8 (added 2026-07-10) were derived from the real percentile distribution of the production universe, not textbook defaults — deliberately loose, excluding only extreme-tail risk.

ParameterValue
1Gate 1 · MomentumPrice > SMA50 AND SMA200; 1M perf > 0; 3M perf > 0
2Gate 2 · ProfitP/E > 0; EPS growth > 0
EPS-growth field is Finviz "eps growth this year" — a forward analyst estimate, not realized trailing YoY.
3Gate 3 · Revenue5-year sales CAGR ≥ 20%
QoQ non-deceleration sub-check is N/A in production — Finviz doesn’t expose prior-quarter growth.
4Gate 4 · Cash FlowFCF or OCF positive
5Gate 5 · SentimentBuy+ analyst consensus
Enforced at fetch — this gate always passes at screen time.
6Gate 6 · OptionsCall/put ratio ≥ 1.0
7Gate 7 · OwnershipShort float < 20%
Excludes only extreme short-interest tail risk (crowded-short/squeeze volatility) — production universe p75 was 11.5%.
8Gate 8 · Financial HealthCurrent ratio ≥ 1.0 AND gross margin ≥ 0% AND debt/equity ≤ 2.0
Bundled 3-check gate. Missing data on any sub-check passes through as N/A rather than failing.

Note: Missing data on gates 1–3, 7, and 8 passes through as N/A rather than failing — a stock isn’t penalized for a data gap it can’t control.

Valuation Hard ExclusionsSelects stocks1 param

Applied after all 8 gates pass. An excluded stock is dropped from ranking entirely — it never appears in the top 10, no matter how well it scored.

ParameterValue
PEG ceilingPEG > 2.0 excluded
Soft FlagsWarning only2 params

Attached to a ranked stock as a caution note — never blocks a pick or affects its rank.

ParameterValue
EXTENDEDPrice > 125% of 50-day SMA
Adds a pullback-zone suggestion to the email.
OverboughtRSI(14) > 70
Ranking & Composite ScoreSelects stocks2 params

Determines which eligible stocks become the day’s top 10, and in what order.

ParameterValue
Top N10
Scored dimensionsMomentum, Profit, Revenue, Cash Flow, Sentiment, Options — equal weight (1.0 each)
Gates 7–8 (Ownership, Financial Health) are pass/fail only and don’t contribute a subscore — the composite score summarizes 6 dimensions, not all 8 gates.
Risk & Position SizingSizing / exit — not selection4 params

Governs how much capital a hypothetical position uses and where its stop-loss sits. Does not affect which stocks get picked.

ParameterValue
Capital base$5,000
Risk per trade2% (~$100)
Flat trailing stop12% below reference high
Reference high = 52-week high, or current price if unavailable. Not 12% off current/entry price.
ATR stop multiplier2.5× ATR
Sell-Signal EngineSizing / exit — not selection4 params

Runs each morning against positions in the Alpaca paper account (config/holdings.yaml is a fallback for local testing only) — flags exit conditions on current positions. Does not affect which stocks get picked.

ParameterValue
Deteriorating fundamentalsEPS growth negative AND (QoQ decel OR 5Y CAGR negative)
QoQ decel is always N/A in production, so this reduces to EPS negative AND 5Y CAGR negative.
Sentiment breakdownConsensus → Sell / Strong Sell / Underperform / Underweight
Sentiment softenedConsensus → Hold / Neutral / Market Perform / Peer Perform
Monitor-only, lower severity than a breakdown.
Stop-lossPrice < entry price × 0.90
Static, flat 10% off entry — decided 2026-07-11. Never trails, same rule for every position, no per-position override. Unrelated to the Risk & Position Sizing category’s trailing-stop values, which only apply to brand-new picks.
Alpaca Paper TradingBuilt, disabled2 params

Places real orders against an Alpaca paper (fake-money) account. Off by default — requires explicit sign-off to enable.

ParameterValue
Enabledfalse
Kill-switch. Never flipped without explicit sign-off — see CLAUDE.md.
Notional per pick$500 (fractional shares)
$500 × 10 picks = $5,000/day if enabled.
Operational & DeliveryNot a filter3 params

How and when the result actually reaches an inbox — doesn’t affect stock selection.

ParameterValue
Send emailsend_direct: true
RecipientsSage, Ashwad
Schedule9:00am ET summer / 8:00am ET winter
Authoritative cron lives in .github/workflows/screener.yml, not config/thresholds.yaml.

Not currently gated, by design: Dividend Yield (66.6% of the universe pays none — this is a momentum screener, not a value screener), ROE / ROA / ROIC / Operating Margin / Profit Margin (redundant with the gates above — stacking correlated profitability checks risks over-filtering), Insider/Institutional Ownership + Transactions (no discriminating power in this cap range), Short Ratio, Quick Ratio. These were evaluated against real production data and deliberately excluded, not overlooked.

↑ Back to top