投资数据采集与清洗:数据源分类、爬虫伦理与合规、数据清洗流程、缺失值处理
大家好,我是你们的老朋友。今天咱们聊聊投资分析里最基础、也最磨人的一环——数据采集与清洗。
说实话,我见过太多人一上来就搞什么深度学习、量化模型,结果数据源都没搞清楚,最后模型跑出来的结果,连自己都不敢信。嗯,这活儿看着不起眼,但做不好,后面全是白搭。
数据源分类:财报、新闻、行情
投资数据,说白了就三大类。我习惯把它们比作「体检报告」、「朋友圈」和「心电图」。
- 财报数据:这是最「硬」的数据。营收、利润、现金流,都是上市公司自己报的,有审计背书。我个人习惯用
pandas-datareader或者直接去巨潮资讯网扒。注意,A股财报有季报、中报、年报,时间节点不一样,千万别搞混了。 - 新闻数据:这玩意儿最「软」。利好利空、政策解读、行业八卦,全在里面。我曾在项目里用爬虫抓了某财经网站一个月的新闻,结果发现一半是标题党。所以,新闻数据一定要做情感分析,不然就是噪音。
- 行情数据:这是「实时」的。开盘价、收盘价、成交量、换手率。你想想看,做量化交易,缺了这个就等于瞎子摸象。我一般用 Tushare 或者 AKShare 来拿,免费且稳定。
核心观点:三类数据各有各的脾气。财报看「质」,新闻看「势」,行情看「量」。缺一不可。
爬虫伦理与合规:别踩红线
做数据采集,最怕的不是技术问题,而是法律问题。我曾经有个朋友,为了做量化策略,把某交易所的实时行情全爬下来了,结果被人家法务找上门……嗯,那滋味不好受。
这里我给大家几个避坑指南:
- 遵守 robots.txt:这是最基本的礼貌。网站说不能爬,你就别硬来。
- 控制请求频率:别把人家服务器搞崩了。我一般设置 1-2 秒的延迟,加个随机 sleep。
- 不要爬取个人隐私数据:比如股民的个人信息、交易记录。这玩意儿碰了就是刑事犯罪。
- 注意版权:有些新闻网站的数据是有版权的,你拿来商用,小心吃官司。
警告:我曾经见过有人为了省事,直接爬了某付费数据平台的接口。结果被对方反爬机制锁了 IP,还发了律师函。记住,免费的才是最贵的。
数据清洗流程:从脏数据到干净数据
数据拿到手,你以为就能用了?太天真了。我做过一个统计,从网上直接扒下来的数据,平均有 20% 是脏的。缺失、重复、异常、格式不统一……什么妖魔鬼怪都有。
我的清洗流程一般是这样的:
- 去重:同一只股票,同一天的数据,出现了两次?删掉一个。
- 格式统一:日期格式有的是
2024-01-01,有的是2024/01/01,全部转成标准格式。 - 异常值检测:比如某只股票收盘价突然变成 0 元,或者市盈率变成负数。这种明显是错的,要么删掉,要么标记。
- 缺失值处理:这个单独讲,下面细说。
这里我贴一段我常用的清洗代码,供大家参考:
import pandas as pd
# 假设 df 是原始数据
df = df.drop_duplicates() # 去重
df['date'] = pd.to_datetime(df['date']) # 统一日期格式
df = df[(df['close'] > 0) & (df['pe'] > 0)] # 过滤异常值
小技巧:清洗数据时,我习惯每做一步就打印一下数据形状。比如 print(df.shape),这样能清楚看到每一步删掉了多少数据,心里有数。
缺失值处理:别让「空」毁了你的模型
缺失值,说白了就是数据里出现了「空」。为什么会这样?可能是数据源没更新,可能是网络传输丢包,也可能是股票停牌了。
处理缺失值,我常用的方法有四种:
| 方法 | 适用场景 | 缺点 |
|---|---|---|
| 直接删除 | 缺失比例很小(<5%) | 会损失样本量 |
| 均值/中位数填充 | 数值型数据,分布较均匀 | 会降低数据方差 |
| 前向/后向填充 | 时间序列数据(如股价) | 可能引入滞后偏差 |
| 插值法 | 数据有趋势或季节性 | 计算量较大 |
我个人最常用的是前向填充。你想想看,股票今天停牌了,明天复牌,用今天的收盘价填充昨天的,逻辑上说得通。但如果是财报数据,我建议用均值填充,因为财报没有「连续性」这一说。
避坑指南:我曾经在做一个回测模型时,用了均值填充来处理缺失的成交量数据。结果模型跑出来,收益曲线漂亮得不像话。后来一查,原来是填充后的数据把波动抹平了,导致模型「过度乐观」。所以,缺失值处理一定要结合业务逻辑,别瞎填。
知识体系总览
下面这张图,是我自己总结的数据采集与清洗的完整流程。你可以把它当成一张「地图」,做项目时对照着来,基本不会出错。
好了,这一章的内容就到这里。数据采集与清洗,说白了就是「磨刀不误砍柴工」。你花 80% 的时间把数据搞干净,后面 20% 的时间建模,结果反而更好。别问我怎么知道的,都是血泪教训。