The product definition
The app is not a generic stock screener. The goal is to help a user identify fundamentally strong stocks that are meaningfully below their highs and approaching attractive buy zones. That framing matters because it changes the whole build. You are no longer making a filter wall. You are making a ranked decision-support product.
Start with the user decision. In this case: which strong stocks are far enough below ATH to deserve attention now?
The ideal PM-to-builder conversation
The builder should frame the product as a deterministic composite score across discount, fundamentals, and technicals, with explainable weighting and no LLM in the hot path.
Make it local-first, cheap to run, cached, explainable, and resilient to flaky data vendors. This prevents the product from turning into an expensive real-time infrastructure project.
All-time highs can be misleading, Fibonacci is subjective unless anchored consistently, and market data providers fail. Design around those realities before writing code.
Use a lightweight Python FastAPI backend for fetching, scoring, caching, and alerts. Use a SwiftUI iPhone app for ranked views, detail pages, and the ATH grid.
Use three pillars: discount score, fundamental score, and technical score. Weight them 30%, 35%, and 35%. Then compute confidence from pillar agreement.
A stock becomes actionable only if it is not an inverse ETF, within 3% of the next Fibonacci buy level, composite score is at least 75, and confidence is at least 60.
The ATH Grid view should use tile height to reflect percent below ATH, color to reflect setup quality, and grouping to separate Ready To Buy, Core / Long, and Inverse / Short ETFs.
What the backend should return
- ticker, company, sector, group
- price, ath_price, pct_below_ath, pct_below_52w
- day_change_pct, week_change_pct, month_change_pct
- discount_score, fundamental_score, technical_score
- composite_score, composite_confidence, tier
- fib_level, next_buy_level, rsi, ready_to_buy
Why the grid matters
A ranked list is good for precision. The grid is good for scanning. In this product, the grid is not visual decoration. It changes how the user sees opportunity. Tile height makes drawdown legible. Color helps separate near-high quality names from deep-discount names. Grouping keeps actionable ideas distinct from watchlist names and inverse products.
Make the primary visual dimension the one that matters most to the decision. Here, that is % down from ATH.
What to exclude from v1
- Real-time streaming quotes
- Auth and account systems
- Options data
- Backtesting
- News sentiment pipelines
- LLM-generated scoring
The lesson
Great prompting is not clever wording. It is clear product definition. The PM did three things correctly here: defined the user decision, constrained the architecture before build, and explicitly protected v1 from complexity traps. That is why this produces an ATH screener instead of a generic stock app.