2. 金融文本数据获取

在金融NLP项目中,数据获取是决定模型上限的第一道关口。与通用语料不同,金融文本具有强时效性、高噪声、多源异构和严格合规约束四大特征。本节将围绕数据来源、爬虫技术、API接口以及合规伦理四条主线,构建一套可落地的金融文本采集方案。

一、核心原理:金融文本的四大来源与采集逻辑

金融文本按获取方式可分为四类:公开结构化数据(如交易所公告、财报XBRL)、公开非结构化文本(新闻、研报、论坛帖子)、商业API数据(Wind、同花顺、Bloomberg)以及内部私有数据(客服对话、交易日志、尽调报告)。采集逻辑遵循“先API后爬虫、先公开后授权、先增量后全量”的原则,优先选择稳定、合规、可追溯的通道。

金融文本数据获取四通道架构 公开结构化 交易所公告 财报XBRL 宏观统计数据 公开非结构化 财经新闻 券商研报 股吧/论坛 商业API Wind/同花顺 Bloomberg Tushare/AkShare 内部私有 客服对话 交易日志 尽调报告 采集策略:先API后爬虫 · 先公开后授权 · 先增量后全量 统一元数据:来源、时间戳、URL、许可证、版本号 合规红线:robots.txt · 版权 · 个人信息保护 · 数据授权范围 禁止绕过反爬、禁止超授权使用、禁止未脱敏存储

二、方法流程:从目标定义到数据落库

一个规范的金融文本采集流程包含六个步骤:目标定义 → 来源评估 → 通道选择 → 采集实现 → 清洗校验 → 合规审查。其中来源评估需重点考察数据覆盖度、更新频率、历史深度和授权成本。

  1. 目标定义:明确任务需要的是公告、新闻还是研报,确定时间窗口和标的范围。
  2. 来源评估:对候选源打分,优先选择有官方API或开放数据协议的来源。
  3. 通道选择:API优先,爬虫兜底;内部数据走数据仓库脱敏通道。
  4. 采集实现:编写采集脚本,设置限速、重试、断点续传和去重逻辑。
  5. 清洗校验:去除HTML标签、乱码、重复内容,校验字段完整性。
  6. 合规审查:核对robots.txt、版权声明、个人信息脱敏和授权范围。

三、爬虫技术与API接口实战

对于公开非结构化文本,爬虫是主要手段。以下是一个带限速和重试的财经新闻采集示例:

import requests, time, hashlib
from bs4 import BeautifulSoup

HEADERS = {"User-Agent": "Mozilla/5.0 (compatible; FinNLP/1.0)"}
BASE = "https://example-finance-news.com/list?page={}"

def fetch_page(page, retry=3):
    for i in range(retry):
        try:
            r = requests.get(BASE.format(page), headers=HEADERS, timeout=10)
            r.raise_for_status()
            return r.text
        except Exception as e:
            print(f"retry {i+1} page {page}: {e}")
            time.sleep(2 ** i)
    return None

def parse(html):
    soup = BeautifulSoup(html, "html.parser")
    items = []
    for node in soup.select(".news-item"):
        title = node.select_one("h3").get_text(strip=True)
        url = node.select_one("a")["href"]
        ts = node.select_one(".time").get_text(strip=True)
        uid = hashlib.md5(url.encode()).hexdigest()
        items.append({"uid": uid, "title": title, "url": url, "ts": ts})
    return items

for p in range(1, 6):
    html = fetch_page(p)
    if html:
        for item in parse(html):
            print(item)
    time.sleep(1.5)  # 限速,尊重目标站点

对于商业API,以Tushare为例,需先注册获取,再按接口文档调用:

import tushare as ts
ts.set_("YOUR_")
pro = ts.pro_api()
df = pro.news(src="sina", start_date="20240101", end_date="20240131")
print(df[["datetime", "title", "content"]].head())
API接口通常有频率限制和字段权限,建议在配置文件中管理,并对返回结果做本地缓存,避免重复调用消耗配额。

四、数据合规与伦理注意事项

金融数据合规是项目生命线。以下清单可作为采集前的自查表:

合规维度 关键要求 常见风险
robots.txt 遵守目标站点爬取协议 绕过反爬、高频请求被封
版权与授权 确认文本可复制、可商用范围 研报、新闻转载侵权
个人信息保护 脱敏姓名、账号、联系方式 客服对话泄露用户隐私
数据授权范围 仅用于授权约定用途 超范围训练、二次分发
数据安全 加密存储、访问审计 明文存储、权限失控
严禁使用破解接口、伪造身份或绕过付费墙获取数据。金融领域监管严格,违规采集可能触发法律责任,项目应保留数据来源和授权凭证以备审计。

五、误区与复盘

误区一:只重数量不重质量。大量低质论坛文本会引入噪声,反而拉低模型效果。应优先保证来源权威性和文本干净度。

误区二:忽视时间戳和版本。金融文本时效性极强,缺少时间戳会导致训练集与预测集时间穿越,造成评估虚高。

误区三:先爬后补合规。合规应在采集前完成评估,事后补救成本极高,甚至需要删除全部数据重新采集。

复盘建议:建立数据采集日志,记录每次采集的来源、时间、数量、合规状态和负责人;对关键来源设置监控告警,一旦接口变更或反爬升级可快速响应。只有把数据获取做扎实,后续的清洗、标注和建模才有可靠基础。