4. 数据获取与清洗:数据源选择、数据清洗流程、缺失值处理、异常值处理
做量化投资,有一句话我特别认同:「垃圾进,垃圾出」。你策略再牛,模型再复杂,数据源要是脏的,结果就是白忙活。这一章,咱们就聊聊数据从哪来,拿到手之后怎么洗。
4.1 数据源选择:三大主流平台怎么选?
国内做量化,绕不开三个数据源:Wind、Tushare、JoinQuant。我个人的习惯是,生产环境用Wind,研究阶段用Tushare,回测平台用JoinQuant。为什么这么分?咱们一个个说。
4.1.1 Wind(万得)
Wind是机构标配,数据全、质量高、更新快。但缺点也很明显——贵。一年几万块的费用,个人玩家基本扛不住。我在私募的时候,公司买了Wind终端,那数据接口确实稳,但说实话,很多功能你用不上。
适用场景:机构、私募、需要高频或实时数据的场景。
4.1.2 Tushare
Tushare是个人开发者的福音。免费、开源、社区活跃。我刚开始做因子研究时,就是靠Tushare起家的。它覆盖了A股、基金、期货、宏观经济等数据,基本够用。
不过要注意,Tushare的免费版有调用频率限制,每分钟最多200次。如果你要批量拉数据,得自己控制节奏。
import tushare as ts
# 设置token(注册后获取)
ts.set_token('your_token_here')
pro = ts.pro_api()
# 获取日线行情
df = pro.daily(ts_code='000001.SZ', start_date='20230101', end_date='20231231')
print(df.head())
4.1.3 JoinQuant(聚宽)
JoinQuant是回测平台,也提供数据API。它的优势在于数据与回测环境无缝对接。你写策略的时候,直接调它的数据接口,不用自己搭数据库。但如果你要做离线研究,数据导出不太方便。
我的建议:如果你刚开始学因子投资,先用Tushare练手。等策略成型了,再迁移到JoinQuant做回测。
4.2 数据清洗流程:拿到数据后,第一步做什么?
数据拿到手,别急着算因子。先做清洗。我见过太多人,数据里一堆空值和异常值,算出来的因子排名全是错的。
清洗流程我总结为四步:
- 格式统一:日期格式、股票代码格式、字段命名规范。
- 缺失值处理:空值怎么填?是删还是补?
- 异常值处理:涨停跌停、停牌、复权错误。
- 去重与对齐:重复数据、不同数据源的时间对齐。
嗯,这里要注意:清洗的顺序不能乱。先统一格式,再处理缺失值,最后处理异常值。否则你可能会把异常值当成正常数据。
4.3 缺失值处理:空值不是小事
缺失值在金融数据里太常见了。停牌、节假日、数据源漏了,都会产生空值。处理方式有三种:
| 方法 | 适用场景 | 缺点 |
|---|---|---|
| 直接删除 | 缺失比例很小(<5%) | 可能丢失信息 |
| 向前填充 | 时间序列数据(如日线) | 会引入滞后偏差 |
| 插值法 | 连续型数据(如收益率) | 计算量较大 |
我个人最常用的是向前填充。比如某只股票停牌一天,第二天复牌,我会用停牌前的数据填充。为什么?因为停牌期间没有交易,价格不变,这是最合理的假设。
import pandas as pd
# 假设df是日线数据,包含'close'列
df['close'].fillna(method='ffill', inplace=True)
4.4 异常值处理:那些「离谱」的数据
异常值,说白了就是数据里那些「离谱」的值。比如某只股票一天涨了1000%,或者市盈率是负数。这些数据如果不处理,因子计算会直接崩掉。
4.4.1 常见的异常值类型
- 涨停/跌停:价格被限制,但数据源可能记录为0或空值。
- 复权错误:除权除息后,价格没调整好。
- 数据录入错误:比如成交量多了一个0。
4.4.2 处理方法
我常用的方法是MAD(中位数绝对偏差)。它比3σ更稳健,因为中位数不受极端值影响。
import numpy as np
def mad_outlier_detection(series, threshold=3.5):
median = series.median()
mad = np.median(np.abs(series - median))
modified_z_scores = 0.6745 * (series - median) / mad
return np.abs(modified_z_scores) > threshold
# 标记异常值
df['outlier'] = mad_outlier_detection(df['pe_ratio'])
我曾经遇到过一只股票,因为数据源问题,市盈率被记录为-9999。用MAD方法一检测,直接标红。这种数据如果不处理,算出来的因子排名会把它当成「价值股」,结果就是策略亏钱。
4.5 知识体系总览
下面这张图,是我自己画的数据清洗流程。你可以把它当成一个检查清单,每次拿到数据都过一遍。
你看,整个流程其实不复杂。但每一步都马虎不得。我刚开始做因子研究时,就因为没处理停牌数据,导致因子回测结果虚高。后来复盘才发现,那些「超额收益」全是停牌股票复牌后补涨带来的假象。
所以,数据清洗不是「锦上添花」,而是「雪中送炭」。你花在清洗上的每一分钟,都会在后续的因子分析中加倍回报给你。
好了,这一章就到这里。数据清洗是个细活,别急,慢慢来。下一章咱们聊聊因子计算,到时候你会感谢自己把数据洗得这么干净。