The Problem
Retail investor sentiment on Reddit (r/wallstreetbets, r/stocks, r/investing) can precede significant price movements, but manually reading hundreds of posts daily is impractical. By the time a human identifies a sentiment shift, the market has already moved. Existing sentiment tools either do not cover Reddit specifically or charge enterprise pricing for what amounts to keyword monitoring plus basic NLP.
The Scavio Solution
Build an automated scanner that queries Reddit via Scavio for stock-related discussions, extracts ticker mentions from post titles and text, classifies sentiment per ticker, and tracks mention volume trends. The pipeline runs every 6 hours, costs under $15/month, and produces daily reports ranking tickers by mention volume, sentiment direction, and unusual activity signals.
Before
Before the scanner, monitoring Reddit stock sentiment meant manually browsing r/wallstreetbets for 30-60 minutes daily, catching only the most visible posts and missing sentiment shifts in smaller subreddits.
After
After building the scanner, every mention of tracked tickers across 5 investing subreddits is captured automatically. Daily reports highlight tickers with unusual volume spikes or sentiment reversals, surfacing signals hours before they would be noticed manually.
Who It Is For
Quantitative traders and retail investors who want automated Reddit sentiment signals. Market research teams tracking retail investor behavior for institutional clients.
Key Benefits
- Automated 6-hourly scanning across multiple investing subreddits
- Ticker extraction and sentiment classification per mention
- Volume spike detection: alert when mentions exceed 3x 30-day average
- Sentiment reversal detection: flag when bullish-to-bearish ratio flips
- Under $15/month total monitoring cost via Scavio Reddit search
Python Example
import requests
import re
from collections import Counter
from datetime import datetime
API_KEY = "your_scavio_api_key"
TICKERS = {"AAPL", "TSLA", "NVDA", "AMD", "MSFT", "GOOG", "AMZN", "META"}
def scan_reddit(query: str) -> list[dict]:
res = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "reddit", "query": query},
timeout=15,
)
res.raise_for_status()
return res.json().get("organic", [])
def extract_tickers(text: str) -> list[str]:
pattern = r"\$([A-Z]{2,5})\b"
found = re.findall(pattern, text)
words = text.upper().split()
for word in words:
if word in TICKERS:
found.append(word)
return list(set(found))
def daily_scan() -> dict:
queries = [
"what are you buying this week stocks",
"stock picks daily discussion",
"DD due diligence analysis",
"earnings play options",
]
all_mentions = Counter()
all_posts = []
for q in queries:
posts = scan_reddit(q)
for post in posts:
title = post.get("title", "")
snippet = post.get("snippet", "")
tickers = extract_tickers(f"{title} {snippet}")
for t in tickers:
all_mentions[t] += 1
if tickers:
all_posts.append({"title": title[:100], "tickers": tickers, "score": post.get("score", 0)})
return {
"date": datetime.utcnow().strftime("%Y-%m-%d %H:%M"),
"top_tickers": all_mentions.most_common(10),
"total_posts_with_tickers": len(all_posts),
"queries_run": len(queries),
}
report = daily_scan()
print(f"Scan at {report['date']}: {report['total_posts_with_tickers']} posts with tickers")
for ticker, count in report["top_tickers"]:
print(f" ${ticker}: {count} mentions")JavaScript Example
const API_KEY = "your_scavio_api_key";
const TICKERS = new Set(["AAPL", "TSLA", "NVDA", "AMD", "MSFT", "GOOG", "AMZN", "META"]);
async function scanReddit(query) {
const res = await fetch("https://api.scavio.dev/api/v1/search", {
method: "POST",
headers: { "x-api-key": API_KEY, "content-type": "application/json" },
body: JSON.stringify({ platform: "reddit", query }),
});
if (!res.ok) throw new Error(`scavio ${res.status}`);
return (await res.json()).organic ?? [];
}
function extractTickers(text) {
const matches = [...text.matchAll(/\$([A-Z]{2,5})\b/g)].map((m) => m[1]);
for (const word of text.toUpperCase().split(/\s+/)) {
if (TICKERS.has(word)) matches.push(word);
}
return [...new Set(matches)];
}
const queries = ["what are you buying this week stocks", "DD due diligence analysis"];
const mentions = {};
for (const q of queries) {
const posts = await scanReddit(q);
for (const p of posts) {
const tickers = extractTickers(`${p.title ?? ""} ${p.snippet ?? ""}`);
for (const t of tickers) mentions[t] = (mentions[t] ?? 0) + 1;
}
}
const sorted = Object.entries(mentions).sort((a, b) => b[1] - a[1]);
for (const [ticker, count] of sorted.slice(0, 10)) console.log(`$${ticker}: ${count} mentions`);Platforms Used
Community, posts & threaded comments from any subreddit