第二章:金融文本数据采集
数据采集,说白了就是给模型找吃的。你模型再厉害,没有高质量的数据,那也是巧妇难为无米之炊。我个人习惯把金融文本数据分成三大类:新闻、财报、社交媒体。这三类数据各有各的脾气,采集方式也完全不同。
2.1 数据源全景:新闻、财报、社交媒体
先聊聊这三类数据的特点。我刚开始做金融NLP时,踩过不少坑,比如把财报公告当新闻处理,结果模型完全跑偏。
| 数据源 | 特点 | 更新频率 | 典型用途 |
|---|---|---|---|
| 新闻 | 时效性强,噪音大 | 分钟级 | 事件驱动、舆情监控 |
| 财报 | 结构化,信息密度高 | 季度/年度 | 基本面分析、财务预警 |
| 社交媒体 | 碎片化,情绪强烈 | 秒级 | 情绪指标、散户行为 |
嗯,这里要注意一点:新闻和社交媒体虽然都是文本,但处理逻辑完全不同。新闻相对客观,社交媒体则充满了情绪化表达。我在项目中遇到过把微博评论当新闻分析的情况,结果情绪得分高得离谱,后来才发现是用户吐槽。
2.2 API调用实战:Tushare与东方财富
API调用是数据采集最优雅的方式。我个人偏爱Tushare,它的数据质量在国内金融数据源里算是一流的。不过要注意,Tushare的积分制度有点坑,免费用户能拿到的数据有限。
先看一个Tushare获取新闻数据的例子:
import tushare as ts
# 设置token,建议用环境变量管理
ts.set_token('your_token_here')
pro = ts.pro_api()
# 获取个股新闻
df = pro.news(src='sina',
start_date='2024-01-01',
end_date='2024-01-31',
limit=100)
print(df.head())
东方财富的接口更开放一些,但文档写得比较随意。我一般用它来抓取财报数据:
import akshare as ak
# 获取东方财富财报数据
financial_df = ak.stock_financial_report_sina(stock="600519",
symbol="资产负债表")
print(financial_df.columns)
为什么会选择东方财富?说白了,它的数据更新速度比Tushare快,但数据清洗的工作量也更大。我建议新手先从Tushare入手,等熟悉了数据格式再切换到东方财富。
2.3 爬虫基础与合规性
API拿不到的数据怎么办?那就得上爬虫了。但这里我要强调一句:爬虫不是万能的,合规性永远是第一位的。
先看一个简单的新闻爬虫示例:
import requests
from bs4 import BeautifulSoup
url = "https://finance.sina.com.cn/stock/"
headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36"
}
response = requests.get(url, headers=headers)
soup = BeautifulSoup(response.text, 'html.parser')
# 提取新闻标题
titles = soup.find_all('a', class_='title')
for title in titles[:5]:
print(title.text.strip())
合规性方面,我总结了三条铁律:
- 遵守robots.txt: 爬虫前先检查网站的爬虫协议
- 控制请求频率: 建议每秒不超过1次请求
- 不爬取个人隐私数据: 金融数据可以爬,但用户个人信息别碰
你想想看,如果因为爬虫问题被起诉,那整个项目就白干了。我见过有人因为爬取内部数据被判刑的,所以合规性怎么强调都不过分。
2.4 本章知识体系
为了让你更直观地理解数据采集的整体流程,我画了一张图:
这张图展示了数据采集的完整链路:从三大数据源出发,通过API或爬虫获取原始数据,经过清洗和合规检查,最终形成可用的结构化数据集。
- API优先,爬虫为辅
- 合规性高于一切
- 数据质量决定模型上限
好了,这一章的内容就到这里。数据采集是基础中的基础,但也是最容易出问题的环节。我建议你动手实践一下,用Tushare拉点数据试试,感受一下真实金融数据的味道。