第二章:数据源选择与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 | 定制 | 定制 | 机构级应用 |
接入代码其实不复杂。我习惯用 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 的数据结构比较清晰。每个帖子有 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 的用户群体偏向散户。我曾在2021年做过一个实验——对比 StockTwits 情绪和机构研报,发现两者在极端行情下经常相反。说白了,这就是散户情绪的反向指标。
三大平台对比总结
| 维度 | Twitter/X | StockTwits | |
|---|---|---|---|
| 数据量 | 极大 | 中等 | 较小 |
| 内容深度 | 浅 | 深 | 中等 |
| 情绪标签 | 无 | 无 | 有(Bullish/Bearish) |
| API成本 | 高 | 免费 | 免费 |
| 适合场景 | 突发事件监测 | 深度情绪分析 | 交易信号生成 |
知识体系结构图
下面这张图是我自己梳理的数据源选择逻辑,你可以参考一下:
接入实战:多源数据采集框架
我个人建议不要只依赖一个平台。为什么?因为单一数据源容易产生偏差。比如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)
数据采集只是第一步。拿到原始数据后,还需要清洗、标准化、情感打分。这些内容我们后面章节会详细展开。但有一点我现在就可以告诉你——数据质量决定了情绪指数的上限。你花再多时间在模型上,如果输入的数据是垃圾,输出也一定是垃圾。
嗯,今天就先聊到这里。下一章我们开始讲数据清洗和预处理,那才是真正考验耐心的地方。