Skip to main content

How MarketMind works

Predictions you can audit.

MarketMind aggregates 10+ sources into four signals per stock, combines them into a daily UP/DOWN call, and publishes the track record so you can see exactly how often we're right. Every score links back to its sources — no black boxes.

How we're doing

MarketMind's daily verdicts are resolved against actual market close. We publish the score for accountability — and the 95% confidence interval (the range in parentheses) so you can see how much to trust the headline number.

A note on sample size: 1000 resolved predictions and counting. The confidence interval has narrowed enough that the headline accuracy is a defensible estimate — but still bounded by the CI, not equal to the point estimate.

last 7 days

Right 71 of 149 · 48%(40–56%)

last 30 days

Right 297 of 607 · 49%(45–53%)

last 90 days

Right 483 of 1000 · 48%(45–51%)

all-time

Right 483 of 1000 · 48%(45–51%)
What does the 95% confidence interval actually mean?

It's the range that the true accuracy most likely sits in, given the limited sample we've resolved so far. A 60% headline with a (40–80%) CI means: with this much data, anything from 40% to 80% is statistically consistent with what we've seen. As more predictions resolve, the CI shrinks — that's how you know the number is becoming trustworthy. (We use the Wilson score interval, the standard for binomial proportions at small N.)

Have feedback?Tell us what's missing, confusing, or wrong — open a GitHub issue or email neelesh1206@gmail.com. Honest critique on whether the calls are helping you make sense of the market is the single most valuable input we can get right now.

What MarketMind is not

  • Not investment advice or a trading recommendation.
  • Not a real-money platform — every credit is virtual.
  • Not a black-box model that hides reasoning — every score links back to its sources.
  • Not a real-time trading tool — the pipeline runs nightly, not tick-by-tick.

Where the numbers come from

The signals you see on every stock card are not computed in your browser. A nightly Python job does the work — here's what it does and why.

The 90-second version

Every weeknight at 8 PM ET, a Python pipeline runs on GitHub's servers and acts like a research analyst: it visits ~10 data sources for each of our 50 stocks, scores everything, and writes the result to the database. In the morning, the app just reads those pre-computed rows. The signals you see were computed once overnight — not when you opened the page.

What gets pulled per stock

  • Prices & technicals — one year of daily OHLCV bars from Yahoo Finance, then RSI / MACD / moving averages computed locally.
  • News headlines— up to ~20 articles per stock from Massive (formerly Polygon.io). Each article ships with Polygon's ticker-specific relevance + sentiment metadata, which we use to drop passing mentions before they hit the pipeline.
  • Analyst ratings — buy/hold/sell consensus plus price targets from Finnhub.
  • Insider activity — Form 4 transactions plus 8-K material events straight from SEC EDGAR (free, government source).
  • Social mentions — StockTwits bullish %, r/wallstreetbets attention, Reddit mention deltas.
  • Macro context — VIX level and sector ETF performance from FRED.

Two AI models do the parts math can't

  • FinBERTreads each news article and decides if it's positive / neutral / negative. We use it instead of keyword matching because financial language depends on context — “raised guidance” is bullish, but “raised concerns”is bearish. Its continuous score is then blended with Polygon's categorical per-ticker sentiment so the final number captures both how the article reads overall and how it pertains to this specific stock.
  • Llama-3 / Mistralturns the math (the four bucket scores) into the one-sentence English explanation under the verdict chip — “Bullish — driven by strong analyst upgrades and rising technical momentum.” It also writes each article's TL;DR, seeded with Polygon's ticker-specific reasoning so the summary stays focused on this stock instead of the broader article.

FinBERT runs locally on the pipeline runner — model and tokenizer load once, inference happens in-process, no network round-trips per article. The Llama / Mistral call still goes over HuggingFace's inference API because 7B-parameter models don't fit on a free CI runner. If the LLM call fails or times out, the pipeline degrades gracefully: verdict reasoning falls back to a rule-based template. A shared circuit breaker bounds the cost of an HF outage to a handful of calls before the rest of the run short-circuits to the fallback path. The numerical signal is never blocked by an LLM hiccup.

The audit trail is public

Every signal carries its sources — which fetchers contributed, when the data was fetched, whether they agreed or disagreed. This is the moat against the “robo-advisor” framing: data is shown to you, not interpreted for you. The code that does all of this is open source — pipeline/.

The four signal buckets

Each stock gets four independent scores in [-1, +1]. Positive = bullish for the next trading day, negative = bearish, zero = neutral. No single bucket is “right” — they often disagree, and that's the point.

Technical

Pure price + volume action over the last 200 trading days. No opinion, just math.

Sources

  • · yfinance OHLCV
  • · ta-lib indicators

What goes in

  • · RSI (14-day relative strength)
  • · MACD crossover detection
  • · Price vs 20-day and 50-day moving averages
  • · Bollinger Band position
  • · Volume trend (5-day vs 20-day average)

Scoring: Each indicator contributes a sub-score; the bucket is the weighted average with a volume-trend multiplier.

Sentiment

What financial journalists are saying about this stock right now.

Sources

  • · Massive (news API) — including Polygon's per-ticker insights
  • · Finnhub (company news)
  • · MarketWatch (best-effort, when reachable)
  • · FinBERT (sentiment classification)
  • · Llama-3 (per-article summaries on stock detail page)

What goes in

  • · Up to ~20 recent articles per stock
  • · Polygon's per-ticker relevance gate drops articles that don't specifically discuss this stock (sector pieces, comparables, M&A coverage)
  • · FinBERT classifies each surviving article as positive / neutral / negative
  • · FinBERT's continuous score is averaged with Polygon's categorical per-ticker sentiment
  • · Recency-weighted: today's news matters more than week-old news
  • · Cross-source agreement is reported (e.g. "4 of 5 sources agree")

Scoring: Weighted average of per-article (FinBERT-blended-with-Polygon) sentiment scores, scaled by source agreement to avoid noisy single-source spikes.

Professional

What people who do this for a living think — analysts and insiders.

Sources

  • · Finnhub analyst recommendations
  • · SEC EDGAR Form 4 (insider transactions)
  • · SEC EDGAR 8-K (material events)

What goes in

  • · Buy / Hold / Sell consensus among covering analysts
  • · Consensus price target vs current price
  • · Recent insider transaction count (last 14 days)
  • · Recent 8-K filings (last 24 hours)
  • · Days until next earnings call

Scoring: Analyst buy-share net of sells, plus insider activity bonus, amplified within 3 days of earnings.

Social

What retail traders are saying — weighted against the herd effect. The academic literature is clear that retail attention spikes precede underperformance for non-meme tickers (Barber & Odean 2008; Da, Engelberg & Gao 2011), so we fade the crowd rather than follow it.

Sources

  • · StockTwits (bullish/bearish ratio from tagged messages)
  • · ApeWisdom (r/wallstreetbets mention aggregation)
  • · Reddit API (when configured)

What goes in

  • · Reddit mention delta vs 7-day average → fade signal at spikes
  • · ApeWisdom rank in top-mentioned tickers → fade signal at top-10
  • · StockTwits bullish percentage → directional signal, but damped when message volume is high
  • · Herding intensity (0..1) computed from the above, damps the directional read further when the crowd is loud

Scoring: Herding contribution is negative (fade the crowd); StockTwits bullish ratio contributes positively, scaled down when message count is high or when herding intensity is at peak. See ADR 0013 for the academic basis and exact magnitudes.

How MarketMind's daily call works

Each day the four bucket scores get combined into a single weighted score:

# Per-bucket weights
w = { technical: 0.30, sentiment: 0.25,
      professional: 0.30, social: 0.15 }

# Only buckets with actual data contribute.
# Missing buckets are EXCLUDED and weights renormalize over the rest —
# absence of evidence is not evidence of zero.
present   = { k: v for k, v in buckets if v is not None }
combined  = Σ(present[k] * w[k]) / Σ(w[k] for k in present)

direction = "UP"      if combined >  0.15
          | "DOWN"    if combined < -0.15
          | "NEUTRAL" otherwise

confidence = min(|combined|, 1.0)

NEUTRAL is a legitimate verdict — when buckets disagree we say so, not force a call. The weights are an initial heuristic; as track-record data accumulates, we tune them based on what combinations correlate with WIN outcomes (versioned so accuracy maps to specific weight cohorts).

The renormalization step matters for less-covered tickers. If we have a strong technical read but no analyst coverage, the technical bucket carries the call on its own instead of getting diluted toward zero by the missing professional input. ADR 0011 covers the math.

The 0.15 threshold is also scaled per-stock by realized volatility: a low-vol name like PG (daily σ ≈ 0.9%) needs only |combined| > 0.075 to flip directional, while a high-vol name like NVDA (σ ≈ 3.5%) needs |combined| > 0.26. Same signal magnitude is less informative on noisy stocks, so we require more of it before making a call. ADR 0014 documents the design.

Alongside the per-stock verdict, every prediction also carries a rank within the day's universe: rank 1 is the strongest bullish call across all 50 stocks, rank N is the strongest bearish. The absolute combined score is sensitive to formula choices and bucket scaling; the rank is the more honest unit of conviction — “today's top 5 long calls” is what a long-short factor model would care about. ADR 0015 explains why ranks beat absolute scores.

Read ADR 0007 — the full design

When does the verdict show DOWN?

The most common question we get: “Why is everything UP?” The answer is in the math — and in the kinds of stocks people pick. Here's exactly what it takes.

The DOWN threshold

combined = 0.30·Tech + 0.25·Sent + 0.30·Prof + 0.15·Soc

if combined > +0.15   →  UP
if combined < -0.15   →  DOWN
otherwise             →  NEUTRAL

You need the weighted sum below -0.15 for a DOWN call. Practically that means at least two buckets meaningfully bearish, or one bucket very deeply bearish.

What different signal mixes produce

ScenarioTechSentProfSoc= NetVerdict
Mega-cap normal day-0.10+0.30+0.70+0.50+0.32UP
Mixed signals-0.30-0.20+0.30-0.20-0.08NEUTRAL
Earnings miss-0.40-0.50-0.30-0.40-0.40DOWN
Big downgrade wave+0.10-0.20-0.70-0.30-0.25DOWN
RSI overbought only-0.70+0.20+0.50+0.40+0.05NEUTRAL

Why your feed probably leans UP

If you picked mega-caps (AAPL, NVDA, MSFT, GOOGL, META…), the bullish bias is structural — not a bug. Mega-caps have a different signal distribution than the broader market:

  • Professional (30% weight): Analysts rate mega-caps Buy/Hold roughly 85% of the time. Sell ratings are vanishingly rare.
  • Sentiment (25% weight): Coverage is mostly favorable — earnings beats, AI hype, expansion stories. Major negative coverage requires a real catalyst.
  • Social (15% weight): High retail attention typically comes with bullish framing.
  • Technical (30% weight): The only bucket that swings both ways equally — but one bearish technical contribution alone caps at -0.30, not enough to push past the threshold.

That's why COIN with Technical -0.50 still shows NEUTRAL when Professional +0.58 + Social +0.42 neutralize the bearish technical. The math is doing exactly what it should.

Real-world triggers for DOWN verdicts

  • Day after a bad earnings miss — Sentiment crashes, Technical follows, often Professional downgrades pile on within 24-48 hours
  • Analyst downgrade wave — Professional is the biggest single weight; a 30% drop here moves the needle hard
  • Regulatory bombshell — FTC suit, FDA rejection, DOJ probe — flips Sentiment + Professional in one news cycle
  • Insider sell cluster — multiple Form 4 filings within a few days flips Professional to negative even before analysts react
  • Broad macro selloff — Technical breaks down across the board, VIX spikes; mega-caps less affected than small-caps

Want to see DOWN verdicts in your feed?

  1. Add some volatile or struggling tickers to your watchlist alongside the mega-caps — names like RIVN, LCID, GME, AFRM often skew bearish on technical setups.
  2. Watch your watchlist during earnings season — post-miss days are when the system genuinely calls DOWN.
  3. Don't expect daily DOWN calls on diversified mega-cap watchlists. When DOWN does show up there, it's a stronger signal precisely becauseit's rare.

Update cadence

  • 8:00 PM ET — pipeline kicks off the night before. Crunching ~50 stocks (news, social, technicals, FinBERT, Llama summaries) typically takes 15–25 minutes.
  • ~8:25 PM ET — pipeline completes. Fresh insights + verdict for the next trading day are live; bet window opens.
  • 9:30 AM ET — market opens. Bet window stays open — you can place bets while watching live price action.
  • 1:00 PM ET— bet window locks (= 10 AM PT). Late bettors trade prediction time for confirmation. The verdict was made the night before — only the user's call is informed by intraday moves.
  • 4:00 PM ET — market closes.
  • 4:15 PM ET— resolution job runs. Three scoring windows depending on what's being resolved and when the user bet:
    • MarketMind's daily verdict is scored sign(close − prev_close) — the window matches when the call was made (8 PM the night before), so the overnight gap is part of the prediction.
    • Pre-market user bets (placed any time from 8 PM the night before up to 9:30 AM ET) are scored sign(close − open) — neither the user nor the verdict had a real intraday price to anchor on, so the open is the only equitable bar.
    • In-market user bets (placed between 9:30 AM and 1 PM ET) are scored sign(close − entry) — where entry is the live price (Finnhub real-time quote) at the moment the bet landed. This was a fairness change in May 2026: with a single open-based bar, a user betting UP at 12:30 PM with the stock already up 2% only needed the close to stayabove the open — a much easier call than the 8 PM bettor who had to predict the whole day. Anchoring in-market bets to the user's actual entry price puts both bettors on equal footing.

Stock quotes are real-time for the live price on cards and detail pages (Finnhub free tier, ~5 min Upstash cache). News articles surface within 1-2 hours of publication. See ADR 0008 for why the bet window extends past market open, ADR 0017 for the two-mode resolution model that fixed the inequity, and ADR 0011 for why MarketMind's own verdict uses a different window than user bets.

Honest limitations

  • No backtest yet.The signal formulas are based on conventional technical analysis and standard financial NLP, but we haven't published historical accuracy. That ships when we have it.
  • 50-stock pool. Curated mega-caps and popular tickers — not the full market.
  • Daily, not real-time. Designed for overnight prediction, not intraday trading.
  • English-language sources only. Non-US news gets less coverage.
  • FinBERT is good, not perfect.It can misclassify finance-specific irony or jargon. Blending with Polygon's per-ticker sentiment + cross-source agreement helps but doesn't eliminate the problem.

About the project

MarketMind is a personal showcase project built by Neelesh Kakaraparthi. The full architecture, design decisions (ADRs), and pipeline code are open source on GitHub.