第二章:数据源选择与API接入

主流社交媒体平台API对比

做情绪指数,第一步就是找数据源。说白了,你选的平台决定了你能捕捉到什么样的市场情绪。

我个人习惯把主流平台分成三类:Twitter/X 适合捕捉突发事件,Reddit 适合挖掘深度讨论,StockTwits 则是纯交易情绪的聚集地。这三个我都用过,各有各的脾气。

Twitter/X API:老牌劲旅,门槛不低

Twitter 的 API 我接触得最早。2018年那会儿做项目,我还在用免费的标准API,每天能拉50万条推文,爽得很。后来 Elon 接手后,API 政策大变样——现在想拿完整数据,得掏钱。

目前 Twitter API 分几个层级:

层级 月推文上限 费用 适用场景
Free 1,500条 免费 测试、小规模研究
Basic 10,000条 $100/月 个人项目、小团队
Pro 100万条 $5,000/月 专业量化研究
Enterprise 定制 定制 机构级应用
注意: 我曾经踩过一个坑——用 Free 层级的 API 做回测,结果发现数据量根本不够。你想想看,一天才50条推文,能代表什么市场情绪?所以做严肃研究,至少得上 Basic。

接入代码其实不复杂。我习惯用 Tweepy 这个库,封装得比较干净:

import tweepy

# 配置认证信息
bearer_token = "你的Bearer Token"

client = tweepy.Client(bearer_token=bearer_token)

# 搜索最近7天的推文
query = "$AAPL lang:en -is:retweet"
response = client.search_recent_tweets(
    query=query,
    max_results=100,
    tweet_fields=["created_at", "public_metrics"]
)

for tweet in response.data:
    print(f"{tweet.created_at}: {tweet.text[:50]}...")

嗯,这里要注意一点——Twitter 的搜索语法很讲究。比如 $AAPL 是搜股票代码,lang:en 过滤英文,-is:retweet 排除转发。我刚开始做的时候没加这些过滤,结果拉回来一堆垃圾数据,清洗起来想哭。

Reddit API:宝藏社区,数据量大

Reddit 是我个人最喜欢的情绪数据源。为什么?因为 Reddit 用户喜欢长篇大论,讨论质量比 Twitter 高不少。尤其是 r/wallstreetbets 这个版块,2021年 GameStop 事件就是从这里引爆的。

Reddit 的 API 相对友好,不需要付费。但有限制——每分钟60次请求。我建议用 PRAW 这个库:

import praw

reddit = praw.Reddit(
    client_id="你的client_id",
    client_secret="你的client_secret",
    user_agent="情绪分析项目 v1.0"
)

# 获取 r/wallstreetbets 的热门帖子
subreddit = reddit.subreddit("wallstreetbets")
for post in subreddit.hot(limit=50):
    print(f"标题: {post.title}")
    print(f"分数: {post.score}")
    print(f"评论数: {post.num_comments}")
    print("---")
小技巧: 我建议同时抓取帖子的评论。因为 Reddit 的评论区才是情绪最真实的地方——标题可能只是标题党,但评论区的讨论往往能反映真实的市场看法。

Reddit 的数据结构比较清晰。每个帖子有 title、selftext、score、num_comments 等字段。我一般会重点关注 score(点赞数)和评论的情感倾向。

StockTwits API:交易员的专属社交网络

StockTwits 这个平台,说白了就是交易员的 Twitter。用户发帖必须带上股票代码,而且每条消息都有明确的看涨/看跌标签。这对做情绪指数来说,简直是量身定做。

StockTwits 的 API 也是免费的,但需要注册应用获取 token。接入方式很简单:

import requests

# 获取某只股票的消息
symbol = "AAPL"
url = f"https://api.stocktwits.com/api/2/streams/symbol/{symbol}.json"

response = requests.get(url)
data = response.json()

for message in data["messages"][:10]:
    print(f"用户: {message['user']['username']}")
    print(f"内容: {message['body'][:100]}")
    print(f"情绪: {message['entities']['sentiment']['basic']}")
    print("---")
核心优势: StockTwits 每条消息都自带情绪标签(Bullish/Bearish)。我做过对比,这个标签的准确率大概在70%左右。虽然不完美,但作为初始信号已经很有价值了。

不过要注意,StockTwits 的用户群体偏向散户。我曾在2021年做过一个实验——对比 StockTwits 情绪和机构研报,发现两者在极端行情下经常相反。说白了,这就是散户情绪的反向指标。

三大平台对比总结

维度 Twitter/X Reddit StockTwits
数据量 极大 中等 较小
内容深度 中等
情绪标签 有(Bullish/Bearish)
API成本 免费 免费
适合场景 突发事件监测 深度情绪分析 交易信号生成

知识体系结构图

下面这张图是我自己梳理的数据源选择逻辑,你可以参考一下:

社交媒体情绪数据源选择框架 情绪指数构建 Twitter/X Reddit StockTwits 特点 • 数据量大,实时性强 • 适合突发事件监测 • API成本高 特点 • 内容深度高 • 社区讨论质量好 • API免费但有限制 特点 • 自带情绪标签 • 交易员专属 • 散户情绪集中 建议:多源融合效果最佳 Twitter抓广度 + Reddit抓深度 + StockTwits抓交易信号

接入实战:多源数据采集框架

我个人建议不要只依赖一个平台。为什么?因为单一数据源容易产生偏差。比如2020年3月疫情暴跌时,Twitter上全是恐慌情绪,但 Reddit 上反而有人在讨论抄底机会。两个数据源结合起来,才能看到全貌。

下面是我常用的多源采集框架:

import pandas as pd
from datetime import datetime, timedelta

class MultiSourceCollector:
    def __init__(self):
        self.sources = {}
        
    def add_source(self, name, collector_func):
        self.sources[name] = collector_func
        
    def collect_all(self, symbol, days_back=7):
        results = {}
        for name, func in self.sources.items():
            try:
                data = func(symbol, days_back)
                results[name] = data
                print(f"{name}: 成功采集 {len(data)} 条数据")
            except Exception as e:
                print(f"{name}: 采集失败 - {e}")
        return results

# 使用示例
collector = MultiSourceCollector()
collector.add_source("twitter", collect_twitter_data)
collector.add_source("reddit", collect_reddit_data)
collector.add_source("stocktwits", collect_stocktwits_data)

data = collector.collect_all("AAPL", days_back=3)
避坑指南: 我曾经同时跑三个API,结果被 Twitter 限流了整整24小时。后来学乖了——每个API请求之间加个随机延迟,比如0.5到1.5秒。另外,一定要做好错误重试机制,网络波动是家常便饭。

数据采集只是第一步。拿到原始数据后,还需要清洗、标准化、情感打分。这些内容我们后面章节会详细展开。但有一点我现在就可以告诉你——数据质量决定了情绪指数的上限。你花再多时间在模型上,如果输入的数据是垃圾,输出也一定是垃圾。

嗯,今天就先聊到这里。下一章我们开始讲数据清洗和预处理,那才是真正考验耐心的地方。


专注资料整理