Build a WallStreetBets Sentiment Dashboard in 50 Lines of Python
The do-it-yourself version of this is a weekend of pain: scrape Reddit with PRAW, fight the rate limits, then build and tune your own finance sentiment model. This tutorial skips all of it. One API call returns the most-mentioned tickers already scored, and about 50 lines of Streamlit turn them into a live dashboard.
What you'll build
- A live WSB leaderboard: buzz score, mentions, bullish/bearish and a 7-day sparkline per ticker
- A per-ticker drill-down: 30 days of buzz and mention history on click
- What you skip: Reddit scraping, rate-limit juggling and training your own NLP model
- The whole leaderboard in one call: the trending endpoint returns every ticker already scored
The do-it-yourself trap
Counting ticker mentions on r/wallstreetbets sounds like an afternoon project, and the first version usually is. Then reality arrives. You authenticate PRAW, pull the hot posts, and within a day you are managing Reddit's rate limits and pagination. You write a regex for tickers and discover that "ALL", "CEO", "YOLO" and "DD" are also valid symbols. You reach for a sentiment score and learn that off-the-shelf VADER reads "puts on $WEN, we're so back" as bearish and "this stock is going to zero, loading calls" as a coin flip.
None of that is hard, exactly. It is just a lot of small things that have to keep running, on a schedule, forever, before you see a single number you trust. The shortcut is to treat the scored data as a service and spend your time on the part you actually care about, the dashboard. That is what the rest of this does.
What you need
Three things, about two minutes of setup:
- A free Adanos API key. Register at adanos.org/register, no card required.
- Python 3.9 or newer.
- The libraries: pip install streamlit requests pandas
One call for the whole leaderboard
The trending endpoint returns the most-mentioned Reddit tickers for a window, each already scored. One request, no pagination:
Each row in the response carries everything the dashboard needs:
{
"ticker": "AAPL",
"company_name": "Apple Inc",
"buzz_score": 79.3, // 0-100 attention score
"mentions": 257, // posts and comments in the window
"sentiment_score": -0.012, // -1 bearish .. +1 bullish
"bullish_pct": 20,
"bearish_pct": 21,
"trend": "rising",
"trend_history": [77.6, 77.4, 80.5, 77.4, 80.3, 78.9, 79.3] // 7-day buzz
}
The trend_history array is already a ready-made sparkline, and bullish_pct with bearish_pct is the real classification, not a mention count. That is the difference that makes the dashboard worth looking at.
The dashboard, in full
Save this as app.py. It fetches the leaderboard, renders it with inline buzz bars and sparklines, and adds a drill-down chart that pulls 30 days of history for whichever ticker you pick.
# app.py -- a live r/wallstreetbets sentiment dashboard
# pip install streamlit requests pandas then: streamlit run app.py
import requests
import pandas as pd
import streamlit as st
API_KEY = "YOUR_FREE_KEY" # get one at adanos.org/register
BASE = "https://api.adanos.org/reddit/stocks/v1"
HEADERS = {"X-API-Key": API_KEY}
st.set_page_config(page_title="WSB Sentiment", layout="wide")
st.title("r/wallstreetbets sentiment dashboard")
@st.cache_data(ttl=900) # data refreshes hourly upstream, so cache 15 min
def trending():
r = requests.get(f"{BASE}/trending", params={"days": 1}, headers=HEADERS, timeout=20)
r.raise_for_status()
return pd.DataFrame(r.json())
@st.cache_data(ttl=900)
def history(ticker):
r = requests.get(f"{BASE}/stock/{ticker}", params={"days": 30}, headers=HEADERS, timeout=20)
r.raise_for_status()
return pd.DataFrame(r.json()["daily_trend"])[::-1] # API returns newest-first
df = trending()
st.caption(f"{len(df)} most-mentioned tickers on Reddit, refreshed hourly")
if df.empty:
st.warning("No trending tickers right now, try again shortly.")
st.stop()
top = df.iloc[0]
a, b, c = st.columns(3)
a.metric("Top ticker", top.ticker, f"{top.mentions} mentions")
b.metric("Buzz score", f"{top.buzz_score:.0f}/100", top.trend)
c.metric("Bull vs bear", f"{top.bullish_pct}% / {top.bearish_pct}%")
st.subheader("Trending leaderboard")
st.dataframe(
df[["ticker", "mentions", "buzz_score", "sentiment_score",
"bullish_pct", "bearish_pct", "trend_history"]],
hide_index=True, use_container_width=True,
column_config={
"buzz_score": st.column_config.ProgressColumn("Buzz", min_value=0, max_value=100, format="%.0f"),
"sentiment_score": st.column_config.NumberColumn("Sentiment", format="%.2f"),
"trend_history": st.column_config.LineChartColumn("7-day buzz"),
},
)
st.subheader("Drill into a ticker")
pick = st.selectbox("Ticker", df.ticker)
h = history(pick)
st.line_chart(h.set_index("date")[["buzz_score", "mentions"]])
The two @st.cache_data decorators matter more than they look. They hold each response for fifteen minutes, so flipping between tickers does not spend a request every click. On the free tier that keeps a personal dashboard comfortably inside the monthly quota.
Run it
One command, and the dashboard opens in your browser:
You get a three-number summary for the top ticker, a sortable leaderboard with a buzz bar and a seven-day sparkline on every row, and a drill-down that charts 30 days of buzz and mentions for whatever you select. The numbers move on their own, because the upstream data refreshes hourly and the cache lets go after fifteen minutes.
Going further
The same shape extends in a few directions:
- Alerts. Drop Streamlit and run the trending() call on a cron, then post to Slack or email when a ticker crosses a buzz or bullish threshold.
- More sources. The same key works on the X, news and Polymarket endpoints. Swap the base path and the response shape is identical, so the code barely changes.
- No code at all. If you just want the numbers in a terminal, the Finance Sentiment CLI wraps the same API.
If you are weighing this build against a free mention tracker, the ApeWisdom alternatives rundown covers when a scored API is worth it and when a free dashboard is plenty.
FAQ
Do I need to scrape Reddit or train an NLP model for this?
No. The trending endpoint returns the most-mentioned tickers already scored, with a buzz score, mention count, bullish and bearish percentages and a seven-day history. You skip the scraping, the rate-limit juggling and the work of building and tuning a finance sentiment model. The dashboard is one HTTP call plus Streamlit for the UI.
Is there a free tier I can build this on?
Yes. The free Adanos tier gives 250 requests per month with no card, plenty for a personal dashboard that caches results. The trending call covers the whole leaderboard in one request, and the per-ticker history is one more.
Can I add X, news or Polymarket to the same dashboard?
Yes. The same key works across the Reddit, X, news and Polymarket endpoints. Swap the base path, for example x/stocks/v1 instead of reddit/stocks/v1, and the response shape is the same.
Can I use this dashboard commercially?
A personal or internal dashboard is fine on any tier. Redistributing the data or shipping it in a commercial product needs the Professional tier, which grants commercial-use rights.