r/wallstreetbets、r/stocks 和 r/investing 等 Reddit 金融社区在零售情绪出现在价格走势前几个小时就已浮现出来。该扫描仪使用 Scavio Reddit 搜索端点来提取最近提到股票行情的讨论,根据情绪和参与度对它们进行评分,并输出排名后的观察列表。每次 Reddit 子版块扫描费用为 0.005 美元。
前置条件
- Python 3.8+
- 请求库
- 来自 scavio.dev 的 Scavio API 密钥
- 目标股票代码或股票相关关键字
操作指南
步骤 1: 设置 Reddit 股票扫描仪
使用目标 subreddits 和股票提取配置扫描仪。
import os, requests, re
from collections import defaultdict
API_KEY = os.environ['SCAVIO_API_KEY']
SH = {'x-api-key': API_KEY, 'Content-Type': 'application/json'}
SUBREDDITS_QUERIES = ['wallstreetbets stock', 'stocks investing', 'investing portfolio']
TICKER_PATTERN = re.compile(r'\b[A-Z]{2,5}\b')
COMMON_WORDS = {'THE', 'AND', 'FOR', 'ARE', 'BUT', 'NOT', 'YOU', 'ALL', 'CAN', 'HER',
'WAS', 'ONE', 'OUR', 'OUT', 'HAS', 'ITS', 'HIS', 'HOW', 'MAY', 'NEW'}
def extract_tickers(text):
found = TICKER_PATTERN.findall(text)
return [t for t in found if t not in COMMON_WORDS and len(t) >= 2]
print('Reddit stock scanner configured.')步骤 2: 扫描 Reddit 查看股票讨论
搜索 Reddit 金融社区并提取带有上下文的股票提及。
def scan_reddit(query):
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=SH, json={'query': query, 'platform': 'reddit', 'country_code': 'us'}).json()
results = data.get('organic_results', [])[:15]
mentions = defaultdict(list)
for r in results:
text = f"{r.get('title', '')} {r.get('snippet', '')}"
tickers = extract_tickers(text)
for t in tickers:
mentions[t].append({'title': r.get('title', '')[:80],
'snippet': r.get('snippet', '')[:120], 'link': r.get('link', '')})
return mentions
all_mentions = defaultdict(list)
for q in SUBREDDITS_QUERIES:
mentions = scan_reddit(q)
for ticker, posts in mentions.items():
all_mentions[ticker].extend(posts)
print(f' {q}: {len(mentions)} tickers found')
print(f'Total unique tickers: {len(all_mentions)}')步骤 3: 按情绪和交易量对股票进行评分
根据上下文关键字分配情绪分数并按提及量排名。
BULLISH = ['buy', 'moon', 'calls', 'bullish', 'undervalued', 'squeeze', 'breakout', 'long']
BEARISH = ['sell', 'puts', 'bearish', 'overvalued', 'crash', 'short', 'dump', 'avoid']
def score_ticker(ticker, posts):
bull = bear = 0
for p in posts:
text = f"{p['title']} {p['snippet']}".lower()
bull += sum(1 for w in BULLISH if w in text)
bear += sum(1 for w in BEARISH if w in text)
total = bull + bear or 1
sentiment = (bull - bear) / total
return {'ticker': ticker, 'mentions': len(posts), 'bullish': bull,
'bearish': bear, 'sentiment': round(sentiment, 2)}
scored = [score_ticker(t, p) for t, p in all_mentions.items()]
scored.sort(key=lambda x: x['mentions'], reverse=True)
print(f'\nTop tickers by mention volume:')
for s in scored[:10]:
signal = 'BULL' if s['sentiment'] > 0.3 else 'BEAR' if s['sentiment'] < -0.3 else 'NEUTRAL'
print(f' ${s["ticker"]:5} | {s["mentions"]:3} mentions | sentiment: {s["sentiment"]:+.2f} | {signal}')步骤 4: 生成每日观察列表
过滤高信号股票并输出排名观察列表。
def generate_watchlist(scored, min_mentions=2):
watchlist = [s for s in scored if s['mentions'] >= min_mentions]
watchlist.sort(key=lambda x: abs(x['sentiment']) * x['mentions'], reverse=True)
cost = len(SUBREDDITS_QUERIES) * 0.005
print(f'\n=== Reddit Stock Watchlist ({len(watchlist)} tickers) ===')
print(f'Cost: ${cost:.3f} ({len(SUBREDDITS_QUERIES)} queries)')
for i, s in enumerate(watchlist[:15], 1):
signal = 'BULL' if s['sentiment'] > 0.3 else 'BEAR' if s['sentiment'] < -0.3 else 'MIXED'
print(f' {i:2}. ${s["ticker"]:5} | {s["mentions"]:3}x | {signal:7} | score: {s["sentiment"]:+.2f}')
return watchlist
watchlist = generate_watchlist(scored)Python 示例
import os, requests, re
from collections import defaultdict
SH = {'x-api-key': os.environ['SCAVIO_API_KEY'], 'Content-Type': 'application/json'}
TICKER_RE = re.compile(r'\b[A-Z]{2,5}\b')
SKIP = {'THE','AND','FOR','ARE','NOT','YOU','ALL','CAN','HAS','NEW'}
def scan(query):
data = requests.post('https://api.scavio.dev/api/v1/search',
headers=SH, json={'query': query, 'platform': 'reddit', 'country_code': 'us'}).json()
tickers = defaultdict(int)
for r in data.get('organic_results', [])[:10]:
for t in TICKER_RE.findall(f"{r.get('title','')} {r.get('snippet','')}"):
if t not in SKIP: tickers[t] += 1
for t, c in sorted(tickers.items(), key=lambda x: -x[1])[:5]:
print(f' ${t}: {c} mentions')
scan('wallstreetbets stock picks')JavaScript 示例
const SH = { 'x-api-key': process.env.SCAVIO_API_KEY, 'Content-Type': 'application/json' };
async function scan(query) {
const data = await fetch('https://api.scavio.dev/api/v1/search', {
method: 'POST', headers: SH,
body: JSON.stringify({ query, platform: 'reddit', country_code: 'us' })
}).then(r => r.json());
const tickers = {};
const skip = new Set(['THE','AND','FOR','ARE','NOT','YOU','ALL','CAN','HAS','NEW']);
for (const r of (data.organic_results || []).slice(0, 10)) {
const text = `${r.title || ''} ${r.snippet || ''}`;
for (const m of text.matchAll(/\b[A-Z]{2,5}\b/g)) {
if (!skip.has(m[0])) tickers[m[0]] = (tickers[m[0]] || 0) + 1;
}
}
Object.entries(tickers).sort((a,b) => b[1]-a[1]).slice(0,5)
.forEach(([t,c]) => console.log(` $${t}: ${c} mentions`));
}
scan('wallstreetbets stock picks').catch(console.error);预期输出
wallstreetbets stock: 8 tickers found
stocks investing: 6 tickers found
investing portfolio: 5 tickers found
Total unique tickers: 14
Top tickers by mention volume:
$NVDA | 7 mentions | sentiment: +0.65 | BULL
$TSLA | 5 mentions | sentiment: -0.40 | BEAR
$AAPL | 4 mentions | sentiment: +0.33 | BULL
$AMD | 3 mentions | sentiment: +0.50 | BULL
$SPY | 3 mentions | sentiment: +0.20 | NEUTRAL
=== Reddit Stock Watchlist (8 tickers) ===
Cost: $0.015 (3 queries)