Track The Themes Driving The Market
| Basket | Members | 1D | 1W | 1M | 3M | 6M | 1Y | YTD | Trend |
|---|
Formerly Polygon.io. Needed to fetch live prices. Stored only in this browser's localStorage.
A local, dark-themed dashboard that tracks equal-weight performance of predefined investment "themes" (baskets of tickers) using the Massive (formerly Polygon.io) API.
The 1D / 1W / 1M / 3M / 6M / 1Y / YTD buttons rank every theme by its return over that window. Click any column header in the table to sort by it instead — click again to flip ascending/descending.
Flags themes whose return this week is clearly outpacing last week's, with at least 60% of priced members up today — so one big mover can't trigger it alone.
"8/8 · 75% up" means 8 of 8 tickers in the theme have price data, and 75% of those priced tickers are up today — a quick check on how broad a move is, since one big mover can skew the average return.
A small bar-style sparkline of the theme's last 25 trading days, built from the same daily price data as the return columns — no separate chart or API call. Each bar's color shows whether that day closed up or down from the day before it.
Turn on "Show Relative Strength vs SPY" in Settings to see a small α number under each return — how much better or worse that theme did than the S&P 500 (SPY) over the same period.
Click a theme row to expand/collapse its ticker list. Inside, use + Ticker to add a ticker, × to remove one, and ✎ on a theme's name to rename it. Use + Add at the top to create a new theme from a name and a comma-separated ticker list.
Each priced ticker shows a technical state — Strong Bullish, Bullish, Neutral, Bearish, or Strong Bearish — next to its RSI. This describes the stock's current trend and momentum structure only. It is not a price forecast, an expected return, or a buy/sell recommendation — Strong Bullish does not mean a stock is expected to rise, and Strong Bearish does not mean it's expected to fall.
Trend structure (moving averages) carries the most weight, momentum (RSI, MACD) adds context on top of it, and trend strength (ADX) and volume only adjust how strongly that combination is expressed — they never set the direction by themselves. The underlying numerical score is intentionally not shown in the UI; only the state and the context behind it are.
The 20-day, 50-day and 200-day simple moving averages (SMA) give a short-, intermediate- and long-term trend reference. Whether price sits above or below each one, and how the three sit relative to each other, is what mainly drives the state: Price > 20D > 50D > 200D reads as full bullish alignment, and the reverse ordering reads as full bearish alignment. A partial mix — say, a short-term dip inside a longer uptrend — reads as weaker/mixed rather than snapping straight to Bullish or Bearish.
RSI(14) measures recent price momentum on a 0–100 scale — higher means stronger recent momentum, lower means weaker. Theme Tracker does not automatically treat RSI above 70 as bearish ("overbought") or below 30 as bullish ("oversold") — strong momentum can stay strong, and weak momentum can stay weak. RSI is momentum context, not a reversal trigger.
MACD is read two ways at once: above or below its own signal line, and above or below zero. Above signal and above zero reads as the strongest positive momentum; above signal but still below zero reads as improving momentum that hasn't cleared the longer baseline yet; below signal and below zero reads as the strongest negative momentum; below signal but still above zero reads as momentum weakening inside an otherwise positive regime.
ADX measures how strong the current trend is — not which direction it's pointing. Below 20 is weak/non-trending, 20–25 is a developing trend, 25–40 is an established trend, and above 40 is a strong trend. A high ADX can show up in a bullish or a bearish trend; it only ever makes an already-bullish or already-bearish read more (or less) strongly expressed — it can't turn a mixed structure into a Bullish or Bearish one by itself.
ATR(14), shown as e.g. "ATR 3.1% of price", measures how much a stock's price typically moves day to day relative to its own price. It's contextual only — it never pushes the state toward Bullish or Bearish either way.
"X% below 52-week high" shows how far the latest price sits below the highest price over the last year of cached data. If a ticker doesn't yet have close to a full year of history, this is shown against however many trading days are actually available instead, rather than claiming a full 52-week high it can't see. Being close to a high is context, not a signal that gains will continue.
Recent trading volume (the last few sessions vs. their own 20-day average) can add a small confirmation nudge in whichever direction the trend/momentum read already points — a clear pickup in volume makes that read a little more strongly expressed; unusually light volume tempers it slightly. Volume never sets the direction on its own.
Confidence — High, Limited, or Low — is separate from direction. It reflects how much of the underlying data (moving averages, RSI, MACD) was actually available to compute the state, not how likely any outcome is. "Strong Bearish · Confidence: High" means the available indicators clearly agree the current structure is bearish — it is not a probability that the price will fall. A newer listing without a full price history, for example, shows Limited or Low confidence rather than being scored as if that history existed.
In the Technical Analysis modal, Supporting and Against list the strongest individual moving-average and MACD signals for and against the displayed state, so the classification is never a black box. They're technical evidence for the current read, not investment pros and cons.
The app opens instantly from cached prices, then refreshes anything stale in the background automatically. ↻ Refresh always force-refetches everything. Requests / minute in Settings should match your Massive plan's rate limit. Clearing the cache (⚙ Settings → Clear cache) also triggers an automatic refresh right away.
Your API key's rate limit is enforced by Massive/Polygon on the whole account, not per browser tab or window — testing the same key in several tabs at once can trip the limit sooner than you'd expect from either one alone.
Self-hosting this project? You can pre-fill the key in
js/config.js instead.
Theme Tracker is provided for informational and educational purposes only and does not constitute financial, investment, or trading advice. Performance figures, the SURGING indicator, and all other data are derived from third-party sources (Massive.com, formerly Polygon.io) and may be delayed, incomplete, or inaccurate. Always do your own research and consult a qualified professional before making investment decisions.
Questions or feedback? contact@themetracker.app
Reflects current trend/momentum structure only — not a return forecast or a buy/sell recommendation.