3. 数据源与采集:宏观经济数据、行业数据、公司财务数据、新闻舆情数据、数据清洗与预处理

做投资分析,说白了就是跟数据打交道。我见过太多人,模型建得花里胡哨,结果数据源一塌糊涂,最后全白搭。这一章,咱们就聊聊数据从哪来、怎么拿、拿到手之后怎么收拾干净。

3.1 宏观经济数据

宏观经济数据是投资的「大气候」。你想想看,利率一上调,股市大概率要抖三抖。我个人习惯,先看这几个核心指标:

  • GDP增速 — 经济冷热的体温计
  • CPI/PPI — 通胀的晴雨表
  • PMI — 制造业的先行指标
  • 社融数据 — 市场流动性的总闸门
  • 利率与汇率 — 资金成本与跨境流动

这些数据去哪拿?我推荐几个靠谱渠道:

数据源 特点 获取方式
国家统计局 官方权威,但更新偏慢 官网下载Excel
中国人民银行 金融数据最全 API接口/PDF报告
Wind/东方财富 商业数据库,实时性好 付费API
FRED(美联储) 全球宏观数据,免费 RESTful API
我的小技巧: 宏观数据发布有固定时间表。我习惯在日历上标出来,比如每月10号左右看CPI,15号看社融。提前蹲点,比事后追数据强得多。

3.2 行业数据

行业数据是投资的「赛道图」。你选对了赛道,猪都能飞起来。我这些年踩过的坑,多半是行业数据没吃透。

行业数据分两类:

  • 公开数据 — 行业协会、发改委、工信部发布的产量、销量、库存
  • 第三方数据 — 咨询公司报告、电商平台销量、招聘数据、专利数据

举个例子,研究新能源汽车行业,我会同时看:

  1. 中汽协的月度产销数据
  2. 乘联会的周度上险数据
  3. 电池级碳酸锂价格(来自生意社)
  4. 充电桩保有量(来自中国充电联盟)
避坑指南: 我曾经只看官方数据,结果发现行业已经拐头了,官方数据还在涨。后来我养成了习惯——官方数据做「锚」,第三方数据做「先行信号」。两者交叉验证,准确率高得多。

3.3 公司财务数据

公司财务数据是投资的「体检报告」。嗯,这里要注意,财报数据有滞后性,而且可能被「修饰」过。

核心数据源:

  • 巨潮资讯网 — 证监会指定披露平台,最权威
  • 上交所/深交所官网 — 原始PDF财报
  • Wind/Choice — 结构化数据,方便做量化
  • SEC EDGAR — 美股财报,支持XBRL格式

我一般用Python批量抓取财报数据,核心代码长这样:

import akshare as ak

# 获取A股利润表
df = ak.stock_profit_sheet_by_report_em(
    symbol="600519",  # 贵州茅台
    date="20231231"
)
print(df.head())
注意: 财务数据采集最怕「数据口径不一致」。比如「营业收入」,有的公司含增值税,有的不含。我建议统一用「合并报表口径」,并且做同比时注意会计政策变更。

3.4 新闻舆情数据

新闻舆情是投资的「情绪温度计」。市场短期波动,很多时候不是基本面变了,是情绪变了。

我常用的舆情数据源:

  • 财经新闻 — 财联社、华尔街见闻、Reuters
  • 社交媒体 — 微博热搜、雪球讨论、Twitter
  • 政策文件 — 国务院、发改委官网
  • 研报 — 东方财富、同花顺的券商研报

采集新闻舆情,我推荐用爬虫框架:

import requests
from bs4 import BeautifulSoup

url = "https://finance.eastmoney.com/a/czqyw.html"
headers = {"User-Agent": "Mozilla/5.0"}
resp = requests.get(url, headers=headers)
soup = BeautifulSoup(resp.text, "html.parser")

# 提取新闻标题
for item in soup.select(".news-item"):
    title = item.get_text(strip=True)
    print(title)
经验之谈: 新闻数据噪声很大。我一般会做「情感分析」,把正面、负面、中性分出来。但别完全依赖机器打分——有一次模型把「业绩暴雷」判成正面,因为「暴雷」这个词在训练数据里跟「爆炸性增长」混了。

3.5 数据清洗与预处理

数据清洗,说白了就是「把垃圾变成黄金」。我见过最夸张的一次,一个团队花了两周建模,结果发现数据里日期格式是乱的,模型全废了。

清洗流程我总结成四步:

  1. 缺失值处理 — 删掉?填充?还是用插值?
  2. 异常值检测 — 3σ原则、箱线图、业务规则
  3. 格式统一 — 日期格式、数值单位、编码方式
  4. 去重与对齐 — 不同数据源的时间戳对齐

实战代码示例:

import pandas as pd
import numpy as np

# 加载原始数据
df = pd.read_csv("macro_data.csv")

# 1. 缺失值处理
df["gdp_growth"].fillna(method="ffill", inplace=True)

# 2. 异常值检测(3σ)
mean = df["cpi"].mean()
std = df["cpi"].std()
df = df[(df["cpi"] > mean - 3*std) & (df["cpi"] < mean + 3*std)]

# 3. 格式统一
df["date"] = pd.to_datetime(df["date"], format="%Y-%m-%d")

# 4. 去重
df.drop_duplicates(subset=["date", "indicator"], inplace=True)

print(f"清洗后数据量: {len(df)} 条")
血的教训: 我曾经处理美股数据时,没注意「拆股」和「分红」对价格的影响。回测结果漂亮得不行,实盘一跑就亏。后来才加上复权处理。记住:价格数据一定要用「后复权」。

知识体系总览

下面这张图,是我自己梳理的数据采集与清洗全流程。你照着这个框架走,基本不会漏东西。

数据源与采集 · 知识体系 宏观经济数据 行业数据 公司财务数据 新闻舆情数据 数据清洗与预处理 缺失值处理 异常值检测 格式统一 去重与对齐 高质量数据集 数据源 → 清洗 → 可用数据,缺一不可

数据采集这件事,看起来是体力活,其实最考验耐心和细心。我做了这么多年,最大的感悟就是:数据质量决定分析质量的上限。你模型再牛,数据是脏的,结果就是垃圾。

最后说一句: 别想着一步到位。先跑通一个最小数据集,验证逻辑没问题了,再扩大数据范围。我早期犯的错,就是一开始就想搞「全量数据」,结果光清洗就花了一个月,项目直接黄了。

公众号:蓝海资料掘金营,微信deep3321