Overview
This pipeline scans Reddit trading communities daily, extracts ticker mentions from post titles and comments, and cross-references with Google News to validate signals. The workflow produces a morning briefing with tickers showing unusual Reddit activity alongside any confirming news headlines. Designed for traders who want Reddit-sourced alpha without manually scrolling trading subreddits.
Trigger
Cron schedule (daily at 7:00 AM EST)
Schedule
Runs daily at 7:00 AM EST
Workflow Steps
Scan Reddit trading subreddits
Query Scavio Reddit for recent posts from WSB, r/stocks, r/options, and r/investing.
Extract and count ticker mentions
Parse ticker symbols from post titles and snippets, filtering noise words.
Cross-reference with Google News
For top-mentioned tickers, query Scavio Google for confirming or contradicting news.
Generate morning briefing
Compile a ranked ticker list with Reddit mention counts and news confirmation status.
Python Implementation
import requests
import json
import re
from collections import Counter
from datetime import datetime
from pathlib import Path
API_KEY = "your_scavio_api_key"
TICKER_RE = re.compile(r"\b[A-Z]{2,5}\b")
SKIP = {"THE","AND","FOR","ARE","BUT","NOT","YOU","ALL","CAN","HAS","WSB","IMO","YOLO","FOMO","HODL","TBH"}
def scan_reddit(queries: list[str]) -> list[dict]:
posts = []
for q in queries:
res = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "reddit", "query": q},
timeout=15,
)
res.raise_for_status()
posts.extend(res.json().get("organic", []))
return posts
def cross_reference_news(ticker: str) -> dict:
res = requests.post(
"https://api.scavio.dev/api/v1/search",
headers={"x-api-key": API_KEY},
json={"platform": "google", "query": f"{ticker} stock news today"},
timeout=15,
)
res.raise_for_status()
headlines = [r.get("title", "") for r in res.json().get("organic", [])[:3]]
return {"ticker": ticker, "news_headlines": headlines, "has_news": len(headlines) > 0}
def run():
date = datetime.utcnow().strftime("%Y-%m-%d")
posts = scan_reddit(["wallstreetbets today", "stocks picks today", "options plays this week"])
counts = Counter()
for p in posts:
text = f"{p.get('title', '')} {p.get('snippet', '')}"
for t in TICKER_RE.findall(text):
if t not in SKIP:
counts[t] += 1
top = counts.most_common(10)
briefing = {"date": date, "posts_scanned": len(posts), "signals": []}
for ticker, mentions in top:
news = cross_reference_news(ticker)
briefing["signals"].append({"ticker": ticker, "reddit_mentions": mentions, **news})
Path(f"trading_scan_{date}.json").write_text(json.dumps(briefing, indent=2))
for s in briefing["signals"][:5]:
news_str = s["news_headlines"][0][:60] if s["news_headlines"] else "no confirming news"
print(f" ${s['ticker']}: {s['reddit_mentions']} mentions | {news_str}")
if __name__ == "__main__":
run()JavaScript Implementation
const API_KEY = "your_scavio_api_key";
const SKIP = new Set(["THE","AND","FOR","ARE","BUT","NOT","YOU","ALL","WSB","YOLO","FOMO"]);
async function scanReddit(queries) {
const posts = [];
for (const q of queries) {
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: q }),
});
posts.push(...((await res.json()).organic ?? []));
}
return posts;
}
const posts = await scanReddit(["wallstreetbets today", "stocks picks today"]);
const counts = {};
for (const p of posts) {
for (const m of `${p.title ?? ""} ${p.snippet ?? ""}`.matchAll(/\b[A-Z]{2,5}\b/g)) {
if (!SKIP.has(m[0])) counts[m[0]] = (counts[m[0]] ?? 0) + 1;
}
}
Object.entries(counts).sort((a, b) => b[1] - a[1]).slice(0, 5).forEach(([t, c]) => console.log(`$${t}: ${c} mentions`));Platforms Used
Community, posts & threaded comments from any subreddit
Web search with knowledge graph, PAA, and AI overviews