第三章 数据源与采集:上市公司公告、行业数据库、物流与订单数据的获取方法

做量化选股,尤其是供应链视角的选股,最头疼的问题是什么?

不是模型不够复杂,也不是策略不够聪明。而是——数据从哪来?

我早年刚入行时,花了大半年时间,天天泡在数据清洗里。那时候我天真地以为,只要把Wind的数据拖下来就能跑模型。结果呢?数据缺失、口径不一致、公告里的关键信息藏在PDF图片里……嗯,踩过的坑比吃过的盐还多。

今天这一章,我就把这三类核心数据源——上市公司公告、行业数据库、物流与订单数据——的获取方法,掰开了讲清楚。你想想看,搞懂了这些,你的策略就有了“活水”。

核心观点:数据采集不是体力活,而是技术活。选对源、用对法、避对坑,你的量化之路就成功了一半。

3.1 上市公司公告:最硬核的基本面数据源

上市公司公告,说白了就是企业自己“交代”的家底。年报、季报、临时公告、关联交易、股权变动……这些信息里藏着供应链的蛛丝马迹。

3.1.1 公告的获取渠道

  • 巨潮资讯网(CNINFO):证监会指定的披露平台,免费、权威、全量。我个人习惯用这个作为主力源。
  • 上交所/深交所官网:数据更原始,但接口不太友好,适合做爬虫的同学。
  • Wind、Choice等金融终端:付费,但结构化程度高,适合批量处理。

我的小技巧:巨潮资讯网虽然免费,但它的PDF公告经常是扫描件。我建议你用Python的pdfplumber库配合OCR(比如Tesseract)来提取文字。别问我怎么知道的——我曾经为了提取一份年报里的前五大客户数据,手动抄了三个小时……后来再也不干了。

3.1.2 公告中挖掘供应链信息

公告里哪些内容跟供应链相关?我列几个重点:

  • 前五大客户/供应商:直接反映上下游集中度。如果某公司前五大客户占比超过50%,那它的供应链风险就很高。
  • 存货与应收账款:存货周转率、应收账款周转天数,这些指标能看出供应链效率。
  • 关联交易:尤其是与母公司或子公司的交易,往往藏着利益输送的线索。

举个例子,我曾在某家电企业的年报里发现,它对单一供应商的采购占比突然从10%飙升到40%。后来一查,那家供应商是它大股东控制的关联公司。嗯,这就是典型的供应链风险信号。

3.2 行业数据库:宏观与中观的“上帝视角”

行业数据库,说白了就是给你一个“上帝视角”。你不仅能看一家公司,还能看整个产业链的冷暖。

3.2.1 常见的行业数据库

数据库名称 覆盖范围 获取方式 我的评价
Wind行业中心 A股全行业,细分到三级行业 付费API/Excel插件 数据全,但贵。适合机构
同花顺iFinD 行业、产业链、宏观 付费API 性价比不错,产业链数据有特色
国家统计局 宏观、工业、物流 免费,但需要爬虫 权威,但更新慢,格式不友好
海关总署 进出口贸易数据 免费/付费接口 做外贸供应链必看

避坑指南:我曾经用国家统计局的工业增加值数据做模型,结果发现数据发布时间滞后了两个月。你想想看,用两个月前的数据预测股价,那不是刻舟求剑吗?所以,一定要关注数据的时效性

3.2.2 如何用行业数据辅助选股

我个人习惯把行业数据分成三类:

  1. 价格类:比如钢材价格、原油价格、芯片价格。这些直接影响上游成本。
  2. 产量/销量类:比如汽车销量、手机出货量。这些反映下游需求。
  3. 物流类:比如港口吞吐量、公路货运量。这些是供应链的“体温计”。

举个例子,2020年疫情初期,我通过监测港口集装箱吞吐量数据,发现某条航线的运力骤降。我立刻联想到,依赖这条航线的进口原材料企业可能会面临断供风险。后来果然有几家公司的股价因此大跌。这就是行业数据的价值。

3.3 物流与订单数据:最“鲜活”的供应链信号

物流与订单数据,是供应链数据里最实时、最细粒度的。说白了,就是企业“正在发生什么”。

3.3.1 物流数据的获取

  • 快递物流平台:比如菜鸟、顺丰、京东物流的开放API。可以获取包裹量、运输时长、签收率等。
  • 港口/机场数据:比如上海港、宁波港的集装箱吞吐量。这些数据通常由地方港务局发布。
  • 公路/铁路货运数据:比如交通运输部的“全国货运物流数据”周报。

我的经验:如果你做的是电商供应链相关的选股,菜鸟的物流指数是个宝藏。它不仅有包裹量,还有“物流时效指数”,能反映供应链的顺畅程度。我曾经用这个指数提前两周预测了一家快递公司的业绩超预期。

3.3.2 订单数据的获取

订单数据比较敏感,但也不是完全没门路:

  • 上市公司自愿披露:有些公司会在公告里披露“在手订单”或“新签订单”。比如光伏、新能源车行业。
  • 招标信息:比如中国政府采购网、各企业的招标平台。可以从中挖掘企业的业务扩张信号。
  • 第三方数据服务商:比如“生意社”、“我的钢铁网”等,会提供一些行业性的订单指数。

避坑指南:订单数据的水很深。我曾经从某第三方平台买过一份“企业订单数据”,结果发现里面掺杂了大量重复和虚假订单。后来我学乖了——一定要交叉验证。比如,把订单数据跟企业的产能数据、库存数据放在一起看,逻辑上能自洽的才可信。

3.4 数据采集的实战框架

说了这么多,我们来画一张图,把整个数据采集的体系串起来。

供应链数据采集框架 上市公司公告 行业数据库 物流与订单数据 采集方法 PDF解析 + OCR API爬虫 结构化提取 采集方法 付费API调用 Excel插件 政府网站爬虫 采集方法 物流平台API 招标信息爬虫 第三方数据采购 供应链数据仓库 选股信号 → 策略模型

这张图你看懂了吗?三个数据源各自有各自的采集方法,最终汇聚到数据仓库里,再输出选股信号。我个人建议,不要只依赖单一数据源。公告数据虽然权威,但更新慢;物流数据虽然实时,但噪音大。三者结合,才能形成完整的供应链画像。

3.5 代码示例:用Python抓取巨潮资讯网公告

光说不练假把式。我写一段简单的Python代码,演示如何从巨潮资讯网抓取某只股票的公告列表。

import requests
from bs4 import BeautifulSoup
import json

def get_cninfo_announcements(stock_code, page=1):
    """
    从巨潮资讯网获取上市公司公告列表
    :param stock_code: 股票代码,如 '000001'
    :param page: 页码
    :return: 公告列表
    """
    url = f'http://www.cninfo.com.cn/new/disclosure/stock?stockCode={stock_code}&pageNum={page}'
    
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36'
    }
    
    try:
        response = requests.get(url, headers=headers, timeout=10)
        response.encoding = 'utf-8'
        
        # 解析HTML
        soup = BeautifulSoup(response.text, 'html.parser')
        
        # 提取公告列表(实际项目中需要根据页面结构调整)
        announcements = []
        for item in soup.select('.announcement-item'):
            title = item.select_one('.title').text.strip()
            date = item.select_one('.date').text.strip()
            link = item.select_one('a')['href']
            
            announcements.append({
                'title': title,
                'date': date,
                'link': f'http://www.cninfo.com.cn{link}'
            })
        
        return announcements
    
    except Exception as e:
        print(f'抓取失败:{e}')
        return []

# 示例:抓取平安银行(000001)的公告
ann_list = get_cninfo_announcements('000001')
for ann in ann_list[:5]:
    print(f'{ann["date"]} - {ann["title"]}')

注意:巨潮资讯网的反爬机制比较严格。我建议你加上随机延时、代理IP等策略。另外,不要高频抓取,否则IP会被封。我曾经因为写了个死循环,把公司IP封了三天……嗯,那三天我都在手动下载公告。

3.6 数据质量:比数据量更重要的事

最后,我想强调一点:数据质量 > 数据量

你想想看,如果数据是错的,再牛的模型也是白搭。我见过太多人,花大量时间堆数据,结果模型跑出来一塌糊涂。为什么?因为数据里有脏数据、缺失值、口径不一致。

所以,我建议你在采集数据的同时,就建立一套数据质量检查机制:

  • 完整性检查:有没有缺失值?时间序列有没有断点?
  • 一致性检查:不同来源的数据是否矛盾?比如,公告里的营收数据跟行业数据库里的对不上?
  • 时效性检查:数据是不是最新的?有没有滞后?

我的血泪教训:曾经有一次,我用海关总署的进出口数据做模型,结果发现数据里混入了大量“转口贸易”的数据,导致我对某条产业链的供需判断完全错误。从那以后,我每次拿到新数据,都会先做一轮“数据体检”。

好了,这一章的内容就到这里。数据采集是量化选股的“地基”,地基不牢,地动山摇。希望你能把这些方法用起来,少踩坑,多赚钱。


公众号:蓝海数据掘金营,微信deep3321