Methodology

Rule-based screening publishes one pick per day — a data-and-score candidate, not a guaranteed forecast.

Goal

Screen for stocks with high potential for a 10x price move within five years. Score v2 blends Peter Lynch GARP heuristics with Yartseva (2025) multibagger factor research: size, cash yield, sustainable growth, and contrarian entry timing.

Market rotation

Odd days · Korea

KOSPI · KOSDAQ ≈ 2,800

Even days · US

NYSE · NASDAQ ≈ 6,300

The universe is refreshed daily from full exchange listings. Only symbols recommended in the last 30 days are excluded before screening.

Score weights v2

Live
Valuation25%P/E, PEG, FCF yield, P/B
Growth20%Blended revenue & earnings growth, 20–50% sweet spot (penalty above 50%)
Quality20%ROE, debt/equity, operating margin, FCF/net income, ROA
Size15%Smaller market cap scores higher (ideal ≤KRW 2T / ≤$2B)
Entry10%12-month price range and distance from 52-week high
Momentum10%6-month return only (52-week high position moved to Entry; reduced vs v1)

Pre-filter

KR minimum cap500억 원 / KRW 50B (kept when cap data is missing)
US minimum capUSD 300M (kept when cap data is missing)
Red flagNegative book equity, or both FCF and operating cash flow negative
Recency excludeSymbols recommended in the last 30 days

Low analyst coverage receives a small size bonus.

Pick vs none

≥ 70.0

Pick

Highest scoring candidate only

< 70.0

None

Days whose top score is below 70 show no pick

So far, 0 of 112 market days had no pick. The lowest published score is 76.2. The cutoff has not filtered anything yet: in practice the top-scoring candidate is published every day.

Simple baselines

The Does the pick beat simple baselines? table on the performance page is not the benchmark excess percent. Each number is the published pick's H20 return minus the baseline's H20 return on the same date. Both sides subtract that date's benchmark, so the benchmark cancels.

The baselines are a random 10 names in the same market, random names whose market cap sits between half and double the pick, and same-day score ranks 2 through 5. H20 means 20 trading days. The table recalculates once a week, on the Friday as-of date.

The day count is small. Consecutive 20-trading-day windows overlap. On a day with a snapshot the random sample is that day's listing. Names delisted before 2026-10-09, and days without a snapshot, still use today's listing, so survivorship bias remains.

Excess-return gate

The performance page publishes the headline Excess figure only when a separate gate passes. Cumulative portfolio and benchmark curves may still render, but the Excess % stays hidden until all of the following hold (today:not published). This gate applies only to that Excess percent. The simple-baseline table is a same-date difference with the benchmark cancelled, so the gate does not cover it.

  • Sample — ≥ 20 pick-complete rows on the cumulative horizon
  • Benchmark — every pick-complete row on that horizon also has a complete benchmark return
  • Horizon tier — presentation horizons only (1M / 3M / 6M / 1Y); engineering H20 / H60 excluded
  • Price basis — #119 price-basis validation complete (adjusted_preferred or adjusted_auto)

Data & schedule

Schedule

Starts 06:00 KST (Mon-Fri), usually published in the morning · GitHub Actions

Storage

No database · JSON committed to Git

Listings

FinanceDataReader

Prices & fundamentals

Yahoo Finance (yfinance) · prices are vendor-adjusted (splits and dividends, auto_adjust=True). 002780.KS price-basis validation note

Score v3 candidate factors join the public methodology only after measurement gates pass. Score v2 remains live today.

Top-N observational tags

Optional observational labels on Top-5 candidate rows only — separate from scores and the published pick. Classification runs via TypeSafe JEVsystem_one Choice only when a business summary and API key exist; it never changes selection, rank, or Score v2.

  • Risk (#147) — one salient business-risk category
  • Moat (#149) — none, narrow, orwide
  • Megatrend (#149) — none,ai_infrastructure, power_grid, orrobotics

On missing API key, missing summary, errors, or timeouts, entries keep concisefallback provenance in JSON but hide UI labels. Older daily JSON without these fields remains valid.