2、数据获取与准备:如何从公开渠道获取财报数据、数据清洗与标准化、常用数据源对比
做同行业财报对比,最头疼的往往不是分析本身,而是数据从哪里来、怎么弄干净。我刚开始做这行的时候,花在数据准备上的时间,比真正分析的时间还多。说白了,数据质量决定了分析的上限。今天我就把这几年的经验捋一捋,聊聊怎么高效搞定数据获取和清洗。
2.1 公开渠道:数据从哪来?
公开财报数据,主要就这几个渠道。我个人习惯是优先用官方渠道,实在不行再考虑第三方。
| 数据源 | 特点 | 适用场景 | 我踩过的坑 |
|---|---|---|---|
| 巨潮资讯网 | 证监会指定披露平台,PDF原件最全 | 需要原始报表、附注细节 | 下载速度慢,偶尔有乱码 |
| 上交所/深交所官网 | 权威性高,数据更新及时 | 核对关键数据、查看公告原文 | 搜索功能不太好用 |
| 东方财富网 | 结构化数据好,接口丰富 | 批量获取、快速对比 | 部分数据有延迟或计算口径不同 |
| 同花顺iFinD | 专业终端,数据清洗程度高 | 机构级分析、复杂模型 | 收费,个人用户门槛高 |
| 新浪财经/网易财经 | 免费,界面友好 | 快速查看、小规模分析 | 数据字段不全,历史数据有限 |
我的小建议: 如果你只是做10家以内的对比,巨潮资讯网+东方财富网基本够用。要是做行业批量分析,建议用东方财富的API或者直接买iFinD的数据服务。
2.2 数据清洗:脏数据怎么处理?
从公开渠道拿到的数据,基本没有直接能用的。我遇到过的情况包括:数字格式不统一(有的用“万”,有的用“元”)、缺失值、重复行、甚至科目名称都不一样。嗯,这里要注意,清洗是必须的步骤。
2.2.1 常见脏数据类型
- 格式不一致: 比如“1,234.56”和“1234.56”混在一起,或者“2023年”写成“2023-12-31”。
- 缺失值: 有些公司不披露某些科目,或者数据源没抓取到。
- 重复数据: 同一份财报被下载了两次,或者不同来源的数据重复了。
- 科目名称差异: 比如“营业收入”和“主营业务收入”其实是同一个东西。
避坑指南: 我曾经因为没注意“营业收入”和“营业总收入”的区别,导致对比结果差了20%。后来我养成了一个习惯:先拉出所有公司的科目清单,手动统一名称。
2.2.2 清洗步骤(我常用的流程)
- 去重: 按“公司代码+报告期”去重,保留最新版本。
- 格式统一: 把所有数字转成float,日期转成标准格式(YYYY-MM-DD)。
- 缺失值处理: 如果缺失比例小于5%,用行业均值填充;超过20%,直接删除该指标。
- 科目映射: 建立统一的科目字典,把不同来源的科目名映射到标准名称。
举个例子,我写过一个简单的Python脚本做清洗,核心逻辑是这样的:
import pandas as pd
# 读取原始数据
df = pd.read_csv('raw_financial_data.csv')
# 去重
df = df.drop_duplicates(subset=['company_code', 'report_date'])
# 格式统一:数字列去掉逗号,转成float
for col in ['revenue', 'net_profit']:
df[col] = df[col].str.replace(',', '').astype(float)
# 缺失值处理:用行业均值填充
industry_mean = df.groupby('industry')['revenue'].transform('mean')
df['revenue'].fillna(industry_mean, inplace=True)
# 科目映射:统一名称
name_mapping = {
'主营业务收入': '营业收入',
'营业总收入': '营业收入',
'净利润': '归母净利润'
}
df['item_name'] = df['item_name'].replace(name_mapping)
经验之谈: 清洗这一步,我建议你写一个可复用的脚本。每次拿到新数据,跑一遍就行。别每次都手动改,太容易出错了。
2.3 数据标准化:让不同公司的数据能直接对比
不同公司的财报,科目口径、会计政策可能都不一样。比如折旧方法,有的用直线法,有的用加速折旧法。直接对比原始数据,结果会有偏差。标准化就是解决这个问题的。
2.3.1 标准化要做什么?
- 会计政策调整: 比如把不同折旧方法下的利润调整到同一口径。
- 单位统一: 全部转成“元”或“万元”,别混着用。
- 时间对齐: 如果有的公司用自然年,有的用财年,需要统一到同一时间窗口。
- 比率计算: 把绝对值转成比率(比如毛利率、净利率),这样不同规模的公司才能比。
注意: 标准化不是万能的。有些差异(比如业务结构不同)是标准化不了的。这时候你要在分析结论里说明。
2.4 常用数据源对比:一张图看懂
为了让你更直观地理解不同数据源的优劣,我画了一张对比图。这张图从数据完整性、更新速度、获取成本、清洗难度四个维度做了评估。
从图上能看出来:巨潮资讯网在数据完整性上最好,但清洗难度高;东方财富网更新快、易用性好,但完整性稍差;同花顺iFinD各方面都比较均衡,但成本高。我个人建议,如果你预算有限,用东方财富网做主力,巨潮资讯网做补充。
2.5 实操建议:我的数据准备流程
最后,我分享一下我现在用的流程,供你参考:
- 确定分析范围: 先想清楚要对比哪些公司、哪些指标、哪个时间段。
- 选择数据源: 如果是A股,优先用东方财富网API;如果是港股或美股,用Yahoo Finance或Bloomberg。
- 批量下载: 写脚本自动抓取,别手动一个一个下载。
- 清洗+标准化: 用我上面给的脚本模板,跑一遍。
- 验证数据: 随机抽几家公司,跟原始财报核对一下关键数字。
核心要点: 数据准备不是一次性工作。每次分析前,都要重新检查数据质量。我见过太多人因为数据没弄干净,得出完全相反的结论。
好了,这一章的内容就这些。数据获取和准备是基本功,但也是最容易出问题的地方。你想想看,如果数据都是错的,再牛的分析模型也没用。下一章我们会聊怎么用这些数据做对比分析,到时候见。