ScavioScavio
产品定价文档
登录开始使用
  1. 首页
  2. 教程
  3. 如何构建 Reddit 股票情绪扫描仪
教程

如何构建 Reddit 股票情绪扫描仪

使用 Scavio Reddit API 扫描 r/wallstreetbets 和金融 subreddits 以获取股票提及和情绪信号。 Python 管道,每次查询 0.005 美元。

获取免费API密钥API文档

r/wallstreetbets、r/stocks 和 r/investing 等 Reddit 金融社区在零售情绪出现在价格走势前几个小时就已浮现出来。该扫描仪使用 Scavio Reddit 搜索端点来提取最近提到股票行情的讨论,根据情绪和参与度对它们进行评分,并输出排名后的观察列表。每次 Reddit 子版块扫描费用为 0.005 美元。

前置条件

  • Python 3.8+
  • 请求库
  • 来自 scavio.dev 的 Scavio API 密钥
  • 目标股票代码或股票相关关键字

操作指南

步骤 1: 设置 Reddit 股票扫描仪

使用目标 subreddits 和股票提取配置扫描仪。

Python
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 金融社区并提取带有上下文的股票提及。

Python
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: 按情绪和交易量对股票进行评分

根据上下文关键字分配情绪分数并按提及量排名。

Python
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: 生成每日观察列表

过滤高信号股票并输出排名观察列表。

Python
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 示例

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 示例

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);

预期输出

JSON
  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)

相关教程

  • 如何构建 Reddit 市场研究扫描仪
  • 如何根据购买意图对 Reddit 主题进行评分
  • 如何构建个人 Reddit 监视器

常见问题

大多数开发者在15到30分钟内完成本教程。您需要一个Scavio API密钥(免费套餐即可)和可用的Python或JavaScript环境。

Python 3.8+. 请求库. 来自 scavio.dev 的 Scavio API 密钥. 目标股票代码或股票相关关键字. Scavio API密钥注册即送50个免费积分。

可以。免费套餐注册即送50个积分,完全足够完成本教程并构建一个可运行的原型解决方案。

Scavio提供原生LangChain包(langchain-scavio)、MCP服务器以及适用于任何HTTP客户端的REST API。本教程使用 the raw REST API, 但您可以根据需要适配您选择的框架。

相关资源

Best Of

2026 年股票情绪数据的最佳 Reddit API

Read more
Best Of

2026 年最佳 Reddit API

Read more
Glossary

搜索 API 供应商格局(2026)

Read more
Solution

Reddit

Read more
Solution

Reddit Reddit API

Read more
Comparison

Reddit API / Search API vs Social Listening Tools (Brandwatch, Mention, Sprout Social)

Read more

开始构建

使用 Scavio Reddit API 扫描 r/wallstreetbets 和金融 subreddits 以获取股票提及和情绪信号。 Python 管道,每次查询 0.005 美元。

获取免费API密钥阅读文档
ScavioScavio

面向AI智能体的实时搜索API。搜索所有平台,不仅仅是Google。

产品

  • 功能
  • 定价
  • 控制台
  • 联盟计划

开发者

  • 文档
  • API参考
  • 快速开始
  • MCP集成
  • Python SDK

替代方案

  • Tavily替代方案
  • SerpAPI替代方案
  • Firecrawl替代方案
  • Exa替代方案

工具

  • JSON格式化
  • cURL转代码
  • Token计数器
  • 全部工具

© 2026 Scavio. 保留所有权利。

Featured on TAAFT
服务条款隐私政策