Docs / Opportunity Finder — Method

Opportunity Finder — Method Statement

How the Opportunity Finder decides — every step from the universe to the names in your approval email, with every threshold and formula stated exactly.

The principle: buy weakness only inside strength — never buy weakness inside breakdown. A stock must first prove it is a strong, quality business. Only after it qualifies may the system consider buying it, and only on a controlled dip — never because it fell. Rules decide; AI only explains and classifies news. Missing data is never guessed: a symbol with an unknown input is excluded and flagged.

The funnel at a glance

The universe — Nasdaq-100Qualified — watchlist of at most 15Waiting for a controlled dipBuy signal — sized 5 / 7 / 10% by depthShortlist — top 3, score ≥ 70Your verdictonly the strong qualify — score ≥ 80/100, all four bucketsthen it waitsdip ≥ 2% and every veto clearwhy did it drop?nothing executes without youtrend · business quality · beats SPY · momentumbeing good is never, by itself, a reason to buytrend intact · earnings blackout · regime · cooldown · budgetthe quality of the drop, not its depthmanual approval only
Each arrow is a gate; every threshold on it is detailed in the tables below. After a buy, the Control Tower owns the exit — its ladder plus the 20-trading-day time-stop.

Step 1 — the universe: which stocks are considered

ParameterValue
Screening universeNasdaq-100 (fetched fresh; no hand-picked names)
BenchmarkSPY (market proxy for relative strength and context)
Minimum market capUSD 20 billion
Positive earnings (trailing 12m)required
Revenue growth (year over year)required
Excluded symbolsSTX, DASH — safety blacklist: their bare tickers resolve to crypto assets on the broker, not the intended equities
Qualified output cap15 names maximum on the watchlist
How “positive earnings (trailing 12m)” is measured

The value is netIncomeToCommon — Yahoo Finance's trailing-twelve-month net income attributable to common shareholders: the sum of the company's last four reported quarters, after minority interests and preferred dividends, as aggregated by Yahoo from company filings. It is consumed as reported, not recomputed in-house; the gate tests only its sign (> 0). If the value is unavailable, the stock is excluded as DATA_INCOMPLETE — never defaulted to pass or fail.

How “revenue growth (year over year)” is measured

The value is revenueGrowth — Yahoo Finance's pre-computed quarterly year-over-year figure: the most recent reported quarter's revenue versus the same quarter one year earlier, from company filings. Example (CSX, verified against Yahoo's own quarterly statements): Q2 2026 revenue $3,935M vs Q2 2025 $3,574M → (3,935 − 3,574) ÷ 3,574 = 0.101 = +10.1%. Judex performs no calculation of its own — the field is consumed as reported and the gate tests only its sign, so it is robust to the nuance that "YoY" here means latest-quarter-vs-year-ago-quarter, not full year vs full year. If unavailable → DATA_INCOMPLETE.

Data: daily/weekly prices and fundamentals from market data feeds; tradability overlay from the broker (a name must actually be buyable).

Step 2 — qualification: proving strength (score ≥ 80/100, all four buckets must pass)

A stock enters the watchlist only if it reaches at least 80 of 100 points and passes every required test in all four buckets. Failing any single required test rejects the stock regardless of score.

2a · Trend — 35 points, all required

Revised 2026-08-12. Previously three price-vs-average tests — close above the 50-week, 200-day and 50-day averages. The first two measured nearly the same thing, and the daily 50-day test disqualified a stock on exactly the dip the strategy wants to buy. The revision tests the structure of the trend instead of today's snapshot.

TestConditionPointsOn fail
Averages stacked20-day MA > 50-day MA > 200-day MA > 50-week MA20reject
Not brokendaily close > 200-day moving average15reject
Entry on strengthdaily close > 50-day moving average — checked only when a stock first qualifies (or re-qualifies after leaving the watchlist)reject

The stacked-averages test says the uptrend has been in place long enough to reorder the averages themselves — a two-week bounce cannot fake it, and an ordinary pullback cannot break it, because a dip moves the price, not the averages. A stock must be trading above its 50-day average on the day it enters the watchlist (qualify on strength); after that, dipping through the 50-day is tolerated — often that is the buyable dip — and only a close below the 200-day average, or the ladder un-stacking, removes it.

How the moving averages are computed

Unlike the fundamentals (vendor-reported), all moving averages are computed by Judex from its own price table of daily closes. All are simple, unweighted averages. 20-day / 50-day / 200-day: the mean of the last 20 / 50 / 200 daily closing prices. 50-week: daily closes are resampled to ISO weeks (Monday-start); each week is represented by its last close (normally Friday's; the current in-progress week by its latest close so far); the MA is the mean of the most recent 50 weekly closes.

No partial averages: until a full 50/200-observation window exists the MA is NULL, and a NULL blocks qualification rather than being estimated. Reproducibility: recorded values re-derive exactly from the stored price series (e.g. CSX 2026-08-05: recomputed 50-week MA 40.3593 vs recorded 40.3593). Note for screener users: Judex records each MA as a price level (e.g. 200-day MA $41.36); screeners such as Finviz display instead the % distance of the current price above the MA (e.g. "SMA200 +24%"). Same indicator, different clothes — close > MA is exactly distance > 0%.

2b · Business quality — 25 points, all three required

TestConditionOn fail
Sizemarket cap ≥ USD 20 billionreject
Profitabilitytrailing-12-month earnings > 0reject
Growthrevenue growth (YoY) > 0reject

If any fundamental is unavailable, the stock is neither passed nor failed — it is marked DATA_INCOMPLETE and excluded until the data exists.

2c · Relative strength — 20 points, required

TestConditionPointsOn fail
Beat the marketstock's 63-trading-day return > SPY's 63-day return (margin ≥ 0 pp)20reject
How the 63-day return and relative strength are computed

Both are computed by Judex from its own stored daily closes. 63-day return: (today's close − the close 63 trading rows earlier in the price series) ÷ that older close × 100 — trading sessions, not calendar days (~3 months), so holidays never distort the window. Relative strength: the stock's 63-day return minus SPY's over the identical date window from the same price table (if SPY lacks a row on a date, its latest known value is carried forward rather than misaligning the windows).

Worked example (CSX, 2026-08-05): CSX (51.02 − 44.8924) ÷ 44.8924 = +13.6496%; SPY over the same 2026-05-05 → 2026-08-05 window (775.68 − 721.9102) ÷ 721.9102 = +7.4483%; relative strength = +6.2013 pp — reproducible to four decimals against the recorded values. The gate is all-or-nothing: any positive margin passes and takes the full 20 points — this bucket qualifies, it does not rank. Insufficient history → NULL → DATA_INCOMPLETE, excluded.

2d · Momentum — 20 points, at least one must fire (minimum 6 points)

TestConditionPoints
Recent highmade its 52-week high within the last 60 days7
Near highclose ≥ 90% of its 52-week high7
RSI14-day RSI > 506

Step 3 — the lifecycle: the system remembers each stock, day over day

Each symbol carries a persistent state, day over day: candidate → qualified → waiting_for_pullback → buy_opportunity → manual_approval_required, with rejected, disqualified and no_buy as the downward paths. A stock that qualifies but hasn't dipped simply waits — being good is never, by itself, a reason to buy.

Ongoing disqualification (a qualified stock is demoted the day it breaks): the average ladder un-stacks (20-day, 50-day, 200-day, 50-week no longer in order) → disqualified; close ≤ 200-day MA → disqualified; 63-day return falls behind SPY → back to review. A dip through the 50-day average alone no longer disqualifies (revised 2026-08-12) — that is often precisely the dip worth buying.

Step 4 — buy gates: when a dip becomes a signal

Every one of these must hold on the evaluation day:

GateExact rule
Minimum dip≥ 2.0% below its highest close of the last 20 trading days (calibrated up from 0.5% on 2026-06-27 — see the calibration note below)
Trend intactthe average ladder still stacked and close still above the 200-day moving average — weak today, not broken (a dip through the 50-day is allowed)
Earnings blackoutno buy within 3 trading days of the next earnings date; if the date is unknown: warn but allow
Market regimeno buy signals at all while the market regime is BROKEN; caution flag when UNKNOWN
Market contextdips confirmed by a down market are preferred; in an up market the dip must be clearly stock-specific
Re-entry cooldowna name the system exited is not re-bought for 5 trading days

Position sizing — scales with the dip and with the account (computed against the execution book's live available cash, read fresh each run — never a hardcoded amount):

TierDip from 20-day highBuy size
dip 2–4%2% ≤ dip < 4%5% of available cash
dip 4–6%4% ≤ dip < 6%7% of available cash
dip ≥ 6%dip ≥ 6%10% of available cash

Hard caps (smaller number always wins): max 10% of available cash per single purchase and per total position in one stock; absolute ceilings USD 2,000 per purchase and USD 3,000 total per stock. Insufficient cash → no buy.

Per-day deployment budget: at most 3 new buys per daily brief, and their sum may not exceed 30% of available cash. Signals are ranked by dip depth; those over budget are deferred (they re-signal on the next dip). This operationalizes "use cash gradually."

Step 5 — the shortlist: drop quality, not drop depth

"Do not select a stock only because it dropped" is written into the strategy file. Every buy signal that survives the gates is graded on why it dropped, using the day's price context, up to 12 news headlines from the last 3 days, and a small language model (gpt-5-mini) that classifies the drop reason and red flags — classification only; all scoring is deterministic.

Where the AI sits — and where it does not

One small language model has one narrow job: read the day's headlines the way a human analyst would, and sort what it finds into fixed baskets. It writes no scores, applies no penalties, and selects nothing — its baskets are inputs to the fixed rules on this page, nothing more.

BasketWhat it meansWhat the rules do with it
Drop-reason categoryexactly one of: market-wide · sector-wide · company-specific · unknown — plus one plain sentence explaining the weaknesssets the classification; "unknown" costs the unclear-news penalty (−10) and most of the drop-quality points
Temporary?company-specific drops only: does the cause look temporary?a temporary cause keeps partial drop-quality credit; a lasting one scores zero there
Fraud / accountingfraud, restatement, auditor resignation, regulator probehard reject — score set to zero
Bankruptcy / liquiditydefault risk, going concern, emergency financinghard reject — score set to zero
Guidance cutmanagement materially cut revenue or earnings guidancepenalty −15
Dilution riskannounced or likely share issuanceblocks the full drop-quality score
Margin pressureheadlines indicate sharply declining marginspenalty −10
Other red flagsanything else the headlines raise (often macro or sector worry)surfaced as "main risks" and gates the "strong" label — but never zeroes the score
The AI's exact contract — and its three guardrails

Per candidate, the model receives only the company name, the price context, and the headlines, and must answer in a fixed JSON form — the baskets above, nothing free-form except the one explanatory sentence and the "other red flags" list. Its instructions include three guardrails: "Never invent facts not in the headlines"; if the headlines are unrelated noise, the price context decides the category; if nothing explains the drop, the category is unknown. And if the model call fails entirely, the system falls back to pure price-arithmetic classification — the pipeline never depends on the AI being available. Every basket the model returns is recorded with the evaluation.

Drop classification (daily-change thresholds): market-wide if the market fell ≥ 1.5%; sector-wide if the sector fell ≥ 2.0%; company-specific if the stock fell ≥ 1.5 percentage points below both. These price thresholds stand on their own — they are how the system classifies even with zero headlines.

Hard rejects and heavy penalties:

CheckThresholdEffect
Existing position concentration≥ 10% of book already in the namedo not add more
Debt/equity> 200%very high — reject-level flag
Negative free cash flow + debt/equity> 150%heavy penalty (−15)
Earnings misses≥ 2 of last 4 quartersheavy penalty (−15)

Quality scoring thresholds: revenue growth good ≥ 5% · EPS growth good ≥ 5% · debt/equity low ≤ 80% · cash strong ≥ 4% of market cap · moat proxy: gross margin ≥ 40% or operating margin ≥ 20% · PEG reasonable ≤ 2.0 · margin-of-safety pullback ≥ 8% · RSI 25–45 = healthy oversold (below 25 = panic collapse) · volume ≥ 3.0× the 20-day average = panic selling, ≤ 1.5× = orderly.

Penalties: missing data −5 · unclear news −10 · guidance cut −15 · high debt + weak cash flow −15 · margin decline −10 · overvaluation −10 · concentration −10.

Selection: final score ≥ 80 = strong review candidate · ≥ 70 = moderate review candidate · ≥ 60 = watch only. The brief presents the top 3 names with score ≥ 70. Selection is a quality bar, not a "best of a bad day" ranking — on a day with no quality dips, fewer than 3 (or zero) are selected.

Step 6 — selection to verdict, and what happens after

The selected names appear in the daily opportunity brief and on Decisions with their full reasoning: qualification score, dip depth and tier, drop classification, shortlist score, and suggested amount. Nothing executes without your explicit approval. Approved buys execute only on the dedicated agent-managed book.

After a buy, the position hands off to the Control Tower, which owns the exit: its risk ladder plus a 20-trading-day maximum hold per lot (the time-stop; backtest optimum), after which an exit is proposed — again for approval, never automatic.

Governance and honesty notes (the part most method statements omit)

  1. One disabled rule, disclosed. An overextension guard (no buys > 60% above the 200-day MA, or > 100% 63-day return, or RSI > 80) exists in the configuration but is disabled since 2026-06-27: a two-year backtest showed it was the single largest edge-killer (cutting the 20-day edge from +3.14pp to +0.75pp) and performed worst in down markets. Its thresholds are retained so it can be re-enabled if a true-bear backtest ever justifies it. Crash protection lives instead at the portfolio regime gate and the defensive engine's ladder.
  2. Calibration is evidenced, dated, and versioned. The 2% minimum dip and the %-of-cash sizing tiers were set by backtest on 2026-06-27 (edge rises monotonically with dip depth in both market regimes; ~5–10% per name, diversified, is the stable sizing zone). The tested window contains no sustained bear market — stated, not hidden.
  3. Every evaluation is logged — every symbol, every day, with inputs, score, state transition, decision, and rejection reason — supporting audit and historical replay with no look-ahead bias.
  4. No guessing, ever. Any required input that is missing produces DATA_INCOMPLETE and exclusion — never a default pass or fail.
  5. Change control. Parameters change only by deliberate deployment of the configuration file; each run's rules_version hash proves which rules were in force.
Buy weakness only inside strength. Never buy weakness inside breakdown.

Version history — earlier rules stay readable

When the rules change, the old version is not overwritten — it is frozen, so every recorded decision keeps the exact rules that judged it.

  • Current — Trend tests revised 12 August 2026: the stacked-averages ladder replaced the three price-vs-average tests (the note in step 2a states why).
  • As of 5 August 2026 — the version that judged the CSX case file.

Read on

See the method applied to one real day: the CSX case file → The same exact treatment for the Control Tower's trims and sells is coming next.