数据源接入:财报数据API、PDF解析与网页爬虫

做量化投研,第一步就是搞定数据。没有数据,模型再牛也是空中楼阁。

我个人习惯把数据源分成三类:结构化API非结构化文档公开网页。今天咱们就把这三条路都走一遍。

3.1 东方财富API:最接地气的实时数据

东方财富的接口,说白了就是散户的福音。它不需要注册,不需要token,直接HTTP请求就能拿到数据。我在做日内策略回测时,经常用它来补实时行情。

核心思路:模拟浏览器请求,解析JSON返回。

import requests
import json

def get_eastmoney_financial(stock_code):
    """
    获取东方财富财报数据
    stock_code: '600519' 格式
    """
    url = f"https://datacenter.eastmoney.com/securities/api/data/v1/get"
    params = {
        'reportName': 'RPT_LICO_FN_CPD',
        'columns': 'SECUCODE,SECURITY_NAME_ABBR,REPORT_DATE,BASIC_EPS,WEIGHTAVG_ROE',
        'filter': f'(SECUCODE="{stock_code}.SH")',
        'pageNumber': 1,
        'pageSize': 5,
        'sortTypes': -1,
        'sortColumns': 'REPORT_DATE'
    }
    
    resp = requests.get(url, params=params, timeout=10)
    data = resp.json()
    
    if data['code'] == 0:
        return data['result']['data']
    else:
        raise Exception(f"API错误: {data['message']}")

# 试试茅台
result = get_eastmoney_financial('600519')
print(json.dumps(result, indent=2, ensure_ascii=False))

避坑指南:我曾经因为没加headers被反爬了整整一下午。建议加上User-Agent模拟浏览器,比如'Mozilla/5.0...'。

3.2 Tushare Pro:专业选手的首选

Tushare需要注册获取token,但数据质量确实高。我一般用它来做基本面分析,因为字段非常全,从营收到现金流,一应俱全。

import tushare as ts

# 初始化(token需要去官网申请)
ts.set_token('你的token')
pro = ts.pro_api()

# 获取利润表
df = pro.income(
    ts_code='600519.SH',
    start_date='20230101',
    end_date='20231231',
    fields='ts_code,end_date,revenue,operate_profit,net_profit'
)

print(df.head())

我的经验:Tushare的积分制度有点坑,免费用户每天只能调100次。建议把数据缓存到本地SQLite,别每次都去拉。

3.3 PyMuPDF:PDF财报的解析利器

很多上市公司只发PDF版财报,这时候就得靠PyMuPDF(也就是fitz)了。它能把PDF里的文字、表格都提取出来。

import fitz  # PyMuPDF

def extract_pdf_text(pdf_path):
    doc = fitz.open(pdf_path)
    full_text = ""
    
    for page_num in range(len(doc)):
        page = doc[page_num]
        text = page.get_text()
        full_text += text + "\n"
    
    doc.close()
    return full_text

# 解析一份财报PDF
text = extract_pdf_text("2023年报.pdf")
print(text[:500])  # 只看前500字

注意:PDF里的表格提取出来经常是乱序的。我建议用page.get_text("blocks")按坐标排序,再拼接成表格。

3.4 BeautifulSoup:网页爬虫的瑞士军刀

有些数据既没API,也没PDF,只挂在网页上。这时候就得爬虫上场了。BeautifulSoup配合requests,基本能搞定90%的静态网页。

from bs4 import BeautifulSoup
import requests

def crawl_financial_news(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
    }
    
    resp = requests.get(url, headers=headers)
    soup = BeautifulSoup(resp.text, 'html.parser')
    
    # 找到所有新闻标题
    titles = soup.find_all('h3', class_='news-title')
    
    for title in titles[:10]:
        print(title.get_text(strip=True))

# 爬取财经新闻列表
crawl_financial_news('https://finance.eastmoney.com/a/czqyw.html')

小技巧:遇到动态加载的网页,先看看Network面板里有没有XHR请求。很多时候数据是JSON格式直接返回的,比解析HTML省事多了。

3.5 知识体系总览

下面这张图,是我自己梳理的数据源接入框架。你想想看,从数据获取到清洗入库,其实就这几步。

投研Agent数据源接入架构 结构化API 东方财富 / Tushare 非结构化文档 PDF财报 (PyMuPDF) 公开网页 爬虫 (BeautifulSoup) 数据解析与清洗 JSON解析 → 文本提取 → 表格重构 → 异常值处理 本地存储 SQLite / CSV / Parquet 投研Agent模型输入

3.6 实战对比:该用哪个?

数据源 适用场景 优点 缺点
东方财富API 实时行情、快速验证 免费、无需注册 字段有限、有反爬风险
Tushare Pro 基本面分析、历史数据 字段全、质量高 需要积分、有调用限制
PyMuPDF PDF财报、招股说明书 本地解析、隐私安全 表格提取需后处理
BeautifulSoup 无API的公开数据 灵活、可定制 维护成本高、易被反爬

我的建议:别想着一个工具打天下。我一般先用Tushare拉基础数据,缺的字段用东方财富补,PDF和网页作为最后手段。这样效率最高。

嗯,数据源这块就聊到这儿。记住一个原则:能用API就别爬虫,能结构化就别PDF。下一节咱们开始讲数据清洗,那才是真正考验耐心的地方。

专注资料整理