数据准备与清洗:获取财报数据的常见渠道
做财报分析,第一步不是算指标,而是找数据。我见过太多人一上来就急着算ROE、算毛利率,结果数据源都是错的——那分析得再漂亮也是白搭。今天咱们就聊聊,怎么把财报数据搞到手,再把它收拾得干干净净。
一、数据从哪来?三个主流渠道
我个人习惯把数据源分成三类:官方渠道、金融终端、开源平台。每个都有它的脾气,咱们一个个说。
1. 巨潮资讯网(官方首选)
这是证监会指定的信息披露网站。说白了,所有A股上市公司的年报、季报、临时公告,都得在这里首发。我建议你把它当成第一数据源。
- 优点:数据最权威,PDF原件可下载,法律效力强
- 缺点:格式不统一,有的PDF是扫描件,没法直接复制
- 适用场景:做深度分析、写研报、需要引用原文时
2. 同花顺iFinD(金融终端)
同花顺、Wind、东方财富Choice,这三家是金融圈的主流。它们把财报数据整理成了结构化表格,直接导出Excel就能用。我在项目里遇到最爽的一次,就是用同花顺的API直接拉了三年的利润表,5分钟搞定。
- 优点:数据已清洗,字段标准化,支持导出
- 缺点:收费(个人版一年几千到上万),数据可能有延迟
- 适用场景:批量分析、快速建模、日常跟踪
3. 开源数据(Tushare、AkShare)
如果你不想花钱,或者想练练Python,开源库是个好选择。Tushare和AkShare是国内比较成熟的两个。我记得有一次帮朋友做回测,用AkShare拉了500只股票的财务数据,代码不到30行。
- 优点:免费(部分接口需要积分),灵活,可编程
- 缺点:数据质量参差不齐,接口可能变动
- 适用场景:个人研究、量化策略、学习练手
二、数据清洗与标准化——这才是重头戏
数据拿到手,别急着分析。你想想看,不同渠道的数据格式能一样吗?巨潮的PDF里「营业收入」可能叫「营业总收入」,同花顺里叫「营业收入」,Tushare里叫「revenue」。不统一的话,你后面所有计算都是错的。
1. 字段名称标准化
我习惯建一个映射表,把不同来源的字段名统一成一套标准名称。比如:
| 标准名称 | 巨潮PDF | 同花顺 | Tushare |
|---|---|---|---|
| 营业收入 | 营业总收入 | 营业收入 | revenue |
| 净利润 | 归属于母公司股东的净利润 | 净利润 | n_income |
| 总资产 | 资产总计 | 总资产 | total_assets |
2. 数据类型与格式统一
嗯,这里要注意。从PDF里复制出来的数字,经常带着逗号、空格、甚至「万元」单位。比如「1,234.56万元」,你得先去掉逗号,再判断单位是元还是万元,最后统一转成数值型。
我曾经遇到过一个坑:某只股票的「每股收益」字段,有的季度是「0.56」,有的季度是「0.5600」,还有的是「0.560」。Excel里看着一样,但Python一读,有的是字符串,有的是浮点数。你说气不气人?
3. 缺失值与异常值处理
财报数据里,缺失值很常见。比如某季度没披露某个指标,或者数据源漏了。我的处理原则是:
- 连续缺失不超过2期:用前后平均值填充
- 连续缺失超过2期:标记为缺失,不强行填充
- 异常值:比如毛利率突然变成负数,或者营收暴增1000%,先查原始PDF确认,再决定是否剔除
三、Excel与Python的准备工作
工具选哪个?我的答案是:都准备着。Excel适合快速查看和手动调整,Python适合批量处理和自动化。
1. Excel准备工作
如果你用Excel做数据清洗,我建议你做好这几步:
- 建立模板工作簿:包含标准字段名、数据格式、颜色标记规则
- 使用数据验证:限制输入类型,防止手误
- 条件格式:自动标记异常值(比如营收同比变化超过±50%的标红)
- 透视表:快速汇总和对比不同季度的数据
2. Python准备工作
用Python的话,我推荐这几个库:
- pandas:数据处理的核心,读写Excel、清洗、合并都靠它
- numpy:数值计算,处理缺失值和异常值很方便
- openpyxl:读写Excel文件,支持格式设置
- pdfplumber:从PDF里提取表格数据(巨潮的PDF常用)
下面是一个简单的数据清洗示例:
import pandas as pd
import numpy as np
# 读取原始数据
df = pd.read_excel('财报原始数据.xlsx')
# 统一字段名
df.rename(columns={
'营业总收入': '营业收入',
'归属于母公司股东的净利润': '净利润'
}, inplace=True)
# 去除数字中的逗号和空格
df['营业收入'] = df['营业收入'].str.replace(',', '').str.strip()
# 统一单位为元(假设原始数据是万元)
df['营业收入'] = df['营业收入'].astype(float) * 10000
# 处理缺失值
df['净利润'].fillna(method='ffill', inplace=True)
# 标记异常值
df['营收同比'] = df['营业收入'].pct_change()
df.loc[df['营收同比'].abs() > 0.5, '异常标记'] = '需核实'
print('数据清洗完成,共处理', len(df), '条记录')
四、知识体系总览
说了这么多,咱们用一张图把整个流程串起来。这张图是我自己画的数据准备与清洗框架,你照着这个思路走,基本不会漏掉关键步骤。
这张图把整个流程分成了四步:数据获取、数据清洗、工具准备、输出结果。每一步都有对应的渠道和方法。你照着这个框架走,基本不会出大问题。
好了,数据准备这块就聊到这儿。记住一句话:数据质量决定分析质量。花在清洗上的时间,后面都会加倍还给你。
公众号:蓝海资料掘金营,微信deep3321