第一章:数据准备与清洗——量化分析的基石

做量化投资这些年,我踩过最大的坑,就是数据问题。你想想看,策略再牛,模型再炫,数据是脏的,结果全是扯淡。所以第一章,咱们先把地基打牢。

1.1 数据源选择:选对工具,事半功倍

我个人习惯把数据源分成三类:金融终端、开源库、商业平台。各有各的脾气。

数据源 优点 缺点 适合场景
Wind 数据全、更新快、机构标配 贵、接口复杂、本地部署 机构实盘、高频研究
Tushare 免费、社区活跃、文档清晰 有调用限制、稳定性一般 个人研究、策略回测
聚宽 一站式平台、数据+回测+交易 数据深度有限、定制化弱 快速原型、入门学习
我的建议:刚开始做研究,用Tushare就够了。等策略跑通了,再上Wind做精细验证。别一上来就买几万块的终端,没必要。

1.2 股票池构建:选对样本,才有意义

股票池决定了你的研究范围。全A股、沪深300、中证500,差别大了去了。

  • 全A股:样本多,但噪音也大。小市值股票流动性差,容易出假信号。
  • 沪深300:大盘蓝筹,流动性好,适合做低频因子。
  • 中证500:中盘成长股,弹性大,适合做动量类因子。

我在项目中遇到过一个问题:用全A股做因子测试,结果发现收益全来自那些市值不到10亿的股票。换到沪深300上,因子直接失效。所以,选股票池一定要跟你的策略风格匹配。

避坑指南:我曾经用全A股跑了一个价值因子,效果特别好。结果一查,全是ST股和微盘股贡献的收益。后来我加了市值和价格过滤,才把噪音去掉。

1.3 数据清洗流程:脏数据是量化的大敌

数据清洗,说白了就是「去伪存真」。我一般分三步走:缺失值、异常值、复权处理。

1.3.1 缺失值处理

股票停牌、数据源漏传,都会产生缺失值。常见的处理方式有三种:

  • 向前填充:用上一个交易日的数据补。适合价格类数据。
  • 插值法:线性插值或样条插值。适合财务指标。
  • 直接删除:缺失太多就扔掉。别心疼。
# 向前填充示例(Python)
import pandas as pd

df['close'].fillna(method='ffill', inplace=True)
注意:千万别用均值填充金融时间序列。你想想看,股票价格是随机游走的,用均值填进去,等于凭空造数据,回测结果全是假的。

1.3.2 异常值处理

异常值通常来自数据录入错误或极端行情。我常用的方法是MAD(中位数绝对偏差)法。

def mad_outlier_detection(series, threshold=5):
    median = series.median()
    mad = (series - median).abs().median()
    return (series - median).abs() > threshold * mad

嗯,这里要注意:阈值设多少合适?我一般设5倍MAD。太严会把正常波动砍掉,太松又漏掉异常。

1.3.3 复权处理

复权是个大坑。很多新手直接用后复权数据做回测,结果发现策略收益高得离谱。为什么?因为后复权价格包含了分红和送股,但实际交易中你拿不到那个价格。

我个人习惯用前复权做回测,用后复权做长期趋势分析。千万别混用。

# 前复权计算(简化版)
adj_factor = df['adj_factor']  # 复权因子
df['close_adj'] = df['close'] * adj_factor / adj_factor.iloc[-1]

1.4 数据对齐与频率统一

不同数据源的频率不一样。日频、分钟频、Tick级数据,对齐起来很麻烦。我一般遵循一个原则:低频对齐高频,高频降采样

  • 日频数据:直接用日期索引对齐。
  • 分钟数据:用时间戳对齐,注意时区问题。
  • 财务数据:按季度对齐到交易日。
一个小技巧:用pandas的reindex方法,可以快速对齐不同频率的数据。记得先排序,再对齐。
# 数据对齐示例
df_daily = df_daily.reindex(df_minute.index, method='ffill')

知识体系总览

下面这张图,是我做数据准备时的核心流程。你可以把它当成一个检查清单。

数据准备与清洗核心流程 数据源选择 Wind / Tushare / 聚宽 股票池构建 全A / 沪深300 / 中证500 数据清洗 缺失值 / 异常值 / 复权 数据对齐与频率统一 低频对齐高频 / 高频降采样 干净、对齐的因子数据

这张图把整个流程串起来了。从数据源开始,到股票池,再到清洗和对齐,最后输出干净数据。每一步都不能跳过。

核心要点:数据准备占整个因子研究工作量的60%以上。别嫌麻烦,这一步做扎实了,后面的分析才有意义。

专注资料整理