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 数据清洗流程:拿到数据后,第一步做什么?

数据拿到手,别急着算因子。先做清洗。我见过太多人,数据里一堆空值和异常值,算出来的因子排名全是错的。

清洗流程我总结为四步:

  1. 格式统一:日期格式、股票代码格式、字段命名规范。
  2. 缺失值处理:空值怎么填?是删还是补?
  3. 异常值处理:涨停跌停、停牌、复权错误。
  4. 去重与对齐:重复数据、不同数据源的时间对齐。

嗯,这里要注意:清洗的顺序不能乱。先统一格式,再处理缺失值,最后处理异常值。否则你可能会把异常值当成正常数据。

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 知识体系总览

下面这张图,是我自己画的数据清洗流程。你可以把它当成一个检查清单,每次拿到数据都过一遍。

数据清洗流程 数据获取 Wind / Tushare / JoinQuant 格式统一 日期 / 代码 / 字段名 缺失值处理 向前填充 / 插值 / 删除 异常值 MAD / 截尾 常见问题与处理 • 缺失值:停牌、节假日、数据源漏采 • 异常值:涨停跌停、复权错误、录入错误 • 去重:同一数据源多次拉取导致重复行 • 对齐:不同数据源的时间戳不一致

你看,整个流程其实不复杂。但每一步都马虎不得。我刚开始做因子研究时,就因为没处理停牌数据,导致因子回测结果虚高。后来复盘才发现,那些「超额收益」全是停牌股票复牌后补涨带来的假象。

所以,数据清洗不是「锦上添花」,而是「雪中送炭」。你花在清洗上的每一分钟,都会在后续的因子分析中加倍回报给你。

核心要点:数据源选对,清洗流程走对,缺失值和异常值处理到位。这三件事做好了,你的因子研究就成功了一半。

好了,这一章就到这里。数据清洗是个细活,别急,慢慢来。下一章咱们聊聊因子计算,到时候你会感谢自己把数据洗得这么干净。