金融数据采集:数据源分类与合规要点

做金融RAG系统,第一步就是搞数据。这活儿看着简单,其实坑特别多。

我刚开始做这个方向时,以为数据采集就是写几个爬虫的事。结果呢?数据源五花八门,接口文档写得像天书,合规问题更是让人头大。今天咱们就把这块掰开揉碎了讲清楚。

数据源分类:四大金刚

金融数据源,说白了就四类:公告、研报、新闻、行情。每一类的特点都不一样,采集策略也完全不同。

数据源类型 更新频率 数据量级 结构化程度 典型来源
公告 日更(盘后集中发布) 中等(每家公司每年几十份) 半结构化(PDF/HTML) 上交所、深交所、巨潮资讯
研报 日更(券商发布) 大(每天几百份) 非结构化(PDF为主) 东方财富、同花顺、券商官网
新闻 实时/分钟级 极大(每天上万条) 半结构化(HTML/JSON) 财联社、华尔街见闻、新浪财经
行情 实时/秒级 极大(Tick级数据) 结构化(JSON/CSV) 交易所、万得、聚宽

你看这个表,其实就能看出门道了。公告和研报是「深度数据」,适合做知识库的底层。新闻是「时效数据」,适合做事件驱动。行情是「量化数据」,适合做因子计算。

我的经验:别想着一个爬虫搞定所有数据源。我早期犯过这个错,结果代码改得面目全非。后来我学乖了——每个数据源单独写一个采集模块,统一接口但内部实现各自独立。这样改一个不影响其他。

API对接:别自己造轮子

能走API就别爬网页。这是铁律。

为什么?API稳定、规范、有文档。网页爬虫呢?改个CSS类名就崩了。我遇到过最离谱的一次,某财经网站改版,把整个HTML结构重写了,我那爬虫直接废了三天。

常见的金融数据API有这些:

  • 万得(Wind):机构标配,数据全但贵。接口是COM组件,Python调用有点麻烦。
  • 聚宽(JoinQuant):量化友好,有Python SDK。行情数据不错,但公告类数据不全。
  • Tushare:开源免费,适合个人和小团队。数据质量还行,但接口有调用限制。
  • 东方财富Choice:数据量大,接口文档写得...嗯,你懂的。需要耐心。

我个人习惯是:先用Tushare做原型验证,确认数据需求后,再切到万得或聚宽做生产环境。这样成本可控,风险也小。

# 一个典型的API调用示例(Tushare)
import tushare as ts

# 设置token
pro = ts.pro_api('your_token_here')

# 获取某只股票的日线行情
df = pro.daily(ts_code='000001.SZ', start_date='20240101', end_date='20240301')
print(df.head())

# 获取公告数据
announcements = pro.anns(ts_code='000001.SZ', start_date='20240101', end_date='20240301')

避坑指南:API调用一定要加重试机制和限流。我曾经在Tushare上一次性拉了十年数据,结果被限流了三天。后来我加了个指数退避重试,问题就解决了。

网页爬虫合规要点

这块是红线,碰不得。

你想想看,金融数据涉及真金白银,监管盯得特别紧。我见过有人因为爬取交易所数据被发律师函的,也见过因为爬虫频率太高被反爬机制封IP的。

合规要点,我总结成三条:

  1. robots.txt 必须看。这是最基本的礼貌。很多金融网站明确禁止爬虫,你硬爬就是违法。
  2. 频率控制。别每秒发几百个请求。我一般控制在每秒1-2个请求,加上随机延时。这样既不影响对方服务器,也能拿到数据。
  3. 数据用途声明。如果是用于学术研究或个人学习,问题不大。但如果是商业用途,必须获得授权。我建议在代码里加个注释,注明数据来源和用途。

警告:千万不要爬取需要登录才能访问的数据。这涉及「突破技术保护措施」,在法律上属于严重违规。我有个朋友就是爬了某券商的付费研报,结果被起诉了。

另外,爬虫的User-Agent也要注意。别用默认的Python-urllib,容易被识别。我一般伪装成Chrome浏览器,再加个Referer头,这样看起来更像正常访问。

# 一个合规的爬虫示例
import requests
import time
import random

headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36',
    'Referer': 'https://finance.sina.com.cn/'
}

def safe_request(url, max_retries=3):
    for i in range(max_retries):
        try:
            resp = requests.get(url, headers=headers, timeout=10)
            if resp.status_code == 200:
                return resp
        except Exception as e:
            print(f"请求失败,重试第{i+1}次: {e}")
            time.sleep(random.uniform(1, 3))
    return None

# 使用示例
url = 'https://vip.stock.finance.sina.com.cn/corp/go.php/vCB_AllBulletin/stockid/600519.phtml'
data = safe_request(url)

知识体系总览

说了这么多,咱们用一张图把整个数据采集的逻辑串起来。这张图是我做项目时自己画的,后来成了团队的标准模板。

金融数据采集知识体系 数据源层 公告 研报 新闻 行情 采集方式层 API对接(推荐) 网页爬虫(需合规) 数据购买 数据处理层 数据清洗 格式转换 去重合并 质量校验 存储层(向量数据库 + 关系型数据库) 合规 红线

这张图把整个流程串起来了。从数据源到采集方式,再到处理和存储,每一步都有讲究。尤其是合规这块,我特意用红色标出来了——这是整个流程里最不能马虎的环节。

我的建议:刚开始做数据采集时,先选一个数据源练手。比如先从Tushare的行情数据开始,把API对接、数据清洗、存储这一整套流程跑通。然后再扩展到公告和研报。别一上来就想搞全,容易翻车。

嗯,数据采集这块就聊到这儿。记住一句话:数据是RAG系统的命根子,采集阶段多花点心思,后面做问答、做检索都会轻松很多。


公众号:蓝海资料掘金营,微信deep3321